【工業樹莓派】使用結構化文本作PLC控制交通燈號

▍前言

使用一段簡單的結構化文本PLC程序便可在RevPi Core 3上運行以控制交通號誌燈。將RevPi Core 3和DIO安裝在DIN導軌上並使其啟動運行,作為『概念驗證』,我們將實驗模擬簡單的交通號誌燈設置。

圖1、Revpi Core 3與DIO模塊搭建的實驗平台

Revpi core 3是KUNBUS基於樹莓派開發的小型工控機產品,除做數據採集外,作為PLC也是其主要的應用之一,主要依賴於軟PLC軟體,虹科電子與宏虹電子作為KUNBUS的中華區總代理,攜手推廣樹莓派在工業上的應用。本文主要帶大家了解樹莓派工控機與logi.CAD 3工業編程軟體的結合。

結構化文字(ST)語言

有3種主要的標準語言用於創建PLC的控制程序—結構化文本語言(ST),梯形圖邏輯和功能塊圖(FBD)。後兩者顧名思義,它們具有更多的圖形界面,但不如結構化文本靈活,RevPi附帶的免費版本logi.CAD 3僅支持ST,因此我們需要使用它。

儘管結構化文本是受行業標準IEC 61131-3管轄的標準語言,並且該語言的核心都保持一致,但是每個PLC供應商都有自己的獨特特點和添加項。我們在網上找到了有用的入門教程,這使我們更容易入門。對於那些熟悉計算機語言的人來說,ST源自PASCAL,他們會更加熟悉一些。

logi.CAD3 軟體

除了處理新語言外,還需要使用新的編程軟體。對於logi.CAD 3軟體,以下一些術語對於我們在理解並在必要時進行參考還是是很有用的:

1、對象—logi.CAD 3的項目瀏覽器中對象位於文件夾中,它是此文件夾的子級。該對象相當於文件系統上的文件。

2、項目—項目是logi.CAD 3的項目瀏覽器中文件夾的一種特殊類型。預設情況下,項目是項目瀏覽器中的根目錄。

應用程序項目作為一個完整的內容,不僅包括包含您編寫的代碼的STL文件,還包括了一些配置文件,以及全局變量和所使用的特定PLC庫。

在使用logi.CAD 3的過程中,有時候會發現logi.CAD 3無法構建應用程序,即使其語法和一切都正常的情況下。在這些情況下,透過點擊『項目』菜單下的『清理』選項來清理項目很有用,讓logi.CAD 3執行其操作,然後構建並加載好應用程序。

圖2、logiCAD 3

簡單的LED燈閃爍

首先我們可以先設計出一個簡單的應用程序,該應用程序可以實現閃爍一個LED燈的功能。

PROGRAM RevolutionPiCounterProgram

VAR

      value : BOOL;  

END_VAR

VAR_EXTERNAL

      Red_1 : BOOL;

      Yellow_2 : BOOL;

      Green_3 : BOOL;

END_VAR

IF value THEN

       Red_1 := False;

       value := False;

ELSE

       Red_1 := True;

       value := True;

END_IF;

END_PROGRAM

在此示例中,LED燈會持續閃爍。這是因為PLC應用程序會自動重複此邏輯語句。“End_Program”實際上是指回到開頭並重新開始,也就是說當PLC到達END_PROGRAM語句時,PLC掃描週期將再次開始,並且程序將循環自身。

▍完整的紅綠燈程序

現在,需要弄清楚如何使LED指示燈按照標準的交通號誌燈順序閃爍—紅色、紅色和黃色;綠色,黃色並返回紅色。

首先可以想到的是透過簡單地在配置文件中編輯一個值來更改指示燈閃爍的速度,但這會改變整個掃描週期的速度,只會降低應用程序中所有的速度。另外如果能夠獨立更改不同燈光的速度這也是我們想做的。事實證明,這比預期要困難很多。

TON函數(計時器延遲)提供了需要的延遲操作,但在實際過程中卻很難使代碼產生預期的效果。即使可以讓LED發光一段給定的時間,然後熄滅,然後再也不亮,或者閃爍,但無法指定關閉時間。這裡我們尋找到CASE語句。在學習和了解有關CASE語句的訊息,最終用CASE編寫了示例代碼。

圖3、Revpi Core 3控制交通號誌燈

最終得到的程式碼如下:

PROGRAM RevolutionPiProgram

VAR  

wait : TON;

count : INT;

END_VAR

VAR_EXTERNAL

      Red_1 : BOOL;

      Yellow_2 : BOOL;

      Green_3 : BOOL;

END_VAR

CASE count OF

0: //init

      count := count + 1;

1: // Red

     Red_1 := True;

     Yellow_2 := False;

     Green_3 := False;

     wait(IN:=TRUE, PT:=T#5s);

     IF wait.Q THEN

          wait(IN:=FALSE);

          count := count + 1;

     END_IF;

2: // Red and Yellow

      Red_1 := True;

      Yellow_2 := True;

      Green_3 := False;

       wait(IN:=TRUE, PT:=T#5s);

       IF wait.Q THEN

             wait(IN:=FALSE);

             count := count + 1;

      END_IF;

3: // Green

      Red_1 := False;

      Yellow_2 := False;

      Green_3 := True;

      wait(IN:=TRUE, PT:=T#5s);

      IF wait.Q THEN

             wait(IN:=FALSE);

             count := count + 1;

      END_IF;

4: // Yellow

      Red_1 := False;

      Yellow_2 := True;

      Green_3 := False;

      wait(IN:=TRUE, PT:=T#5s);

      IF wait.Q THEN

             wait(IN:=FALSE);

             count := count + 1;

      END_IF;

      ELSE

             count := 0;

      END_CASE;

END_PROGRAM

如果出現特定的整數值,則使用CASE執行語句。在此示例中,創建了一個名稱為“count”的整數變量,該整數變量將在每次PLC掃描時增加1,直到運行到最後以及ELSE將其設置回零為止。TON用於運行每個語句5秒鐘。可以透過編輯以下行中的5s值輕鬆更改此值:

wait(IN:=TRUE, PT:=T#5s);

如果需要,也可以為每個序列的燈光分配不同的時間(如將它們全部更改為2秒)。該程式碼也可以輕鬆擴展以添加更多的燈光。

另外值得一提的是,我們也可以用Codesys來做這項工作,Codesys是軟PLC的代表,也是logi.CAD3的替代產品,需要注意的是Codesys所使用的ST語法與logi.CAD 3還是存在一些小小的差異,需要根據需求去調整。

總結

掌握一種新的計算機語言和一個陌生的軟體始終是一個挑戰,但是我們對最終找到解決方案感到興奮和滿意。儘管最終使用起來的燈可能不完全符合實際的交通狀況,但我們可以從這次示例中看到如何透過一些實踐將它們開發出來,以在諸如表演等其他行業或類似場合的一次性活動中進行簡單的交通控制。同時我們也可以看到樹莓派用作工業控制上面的廣闊前景。

瞭解更多工業樹莓派技術文檔/應用案例


聯繫我們