天天看點

從PLC 到IEC61499 控制器

PLC 是工業控制領域被廣泛使用的控制器。并且制定了相關的國際标準IEC61131。于1992年釋出.

  IEC 61131-3  規定了PLC 的程式設計語言

  -梯形圖(Ladder Diagram)

-序列功能圖(Sequential Function Charts)

  -功能塊(Function Block)

  -結構文本(Structure Text)

  -指令表(Instruction List)

    梯形圖是使用最廣泛的PLC程式設計方式.學習PLC程式設計的人大多數是從梯形圖開始的。不過對于複雜的控制系統。梯形圖就難以模組化。這就需要功能塊圖形程式設計。比如運動控制.PLCOpen 就使用功能塊來描述.但是IEC61131-3的功能塊程式設計看來進展并不大.無法滿足複雜工業控制越來越多的需求。也沒有展現.軟體工程的最新技術進步。

    事實上,現代工業自動控制系統大多數是分布式系統。而PLC 是獨立運作的控制裝置。IEC61131 缺乏對分布式系統的支援 .另一方面,PLC 的程式一般都是使用廠家提供的專用開發環境預先編寫,并且編譯好之後,下載下傳到PLC 中運作的.沒有支援動态線上更新和參數設定。也就是說,PLC 沒有支援系統的重配置(reconfiguration).這些性能的确失,導緻了它的表兄-IEC61499 标準的誕生。

 本文我們來讨論基于IEC61131的PLC和IEC61499 相容型控制器之間的差别。

運作模式

PLC 的運作模式

PLC 采取的循環掃描方式運作程式PLC的CPU将使用者程式存儲在記憶體中。當程式執行時,它首先開始我們所謂的PLC  掃描周期。掃描周期将讀取所有輸入并更新輸入狀态檔案。它将其應用于PLC梯形圖邏輯。最後,它更新輸出狀态檔案并将信号發送到适當的輸出以打開或關閉。在整個PLC程式執行過程中,将反複重複此掃描周期。這使PLC能夠實時讀取和寫入輸入和輸出.

掃描周期是一個順序執行的過程,這意味着它一次讀取并執行一行代碼。像梯形圖一樣從左至右讀取程式。CPU不斷更新并執行程式檔案狀态。如果需要其他資料或數學/邏輯,它将停止掃描并從記憶體中調用子例程。這些子例程具有附加的資料檔案,該檔案存儲某些功能(例如計時器和計數器)的值。子例程完成後,它将傳回主使用者程式并繼續掃描周期。

這是基于梯形圖邏輯的PLC程式的基本結構。

IEC61131的功能塊程式設計是為了擴充目前的梯形邏輯程式設計,并且現在越來越多地使用它。它基本上允許程式員将子例程定義為一個資料塊,該子例程可以反複調用和使用,而無需重寫代碼。

語句清單程式設計是一種使用程式設計語句而不是梯形圖邏輯寫入PLC的方法。

兩者都在不斷發展并在市場上占有一席之地,但它們偏離了PLC的梯形邏輯程式設計。不過,它們依然遵循了循序程式執行的模式.每次掃描周期中,讀入所有的輸入信号,并且存儲在記憶體中,然後從左到右地執行一遍功能塊圖,并輸出狀态。

 顯然,輸入沒有變化,功能塊也将會執行一遍.除非标注每個資料是否有變化.當掃描周期确定之後,PLC 的CPU的處理能力決定了一個周期内執行程式指令數.為了提高PLC 的實時性能,也有PLC 通過FPGA 硬體來加速梯形圖的執行速度。

PLC 程式執行的方式是同步方式的.每個時鐘周期,同步地執行所有的功能塊.功能塊的執行順序應該是有程式中的位置來确定的.. 是靜态不變的。

IEC61499 控制器的運作模式

  IEC61499 标準的程式設計方式隻有一種-功能塊圖.不過,它和IEC61131-3 中的功能塊有很大的不同.下面同樣是一個計數器電路.左邊是IEC61131,右邊是IEC61499.可以看出IEC61499 的功能塊多了事件的輸入輸出。

從PLC 到IEC61499 控制器
從PLC 到IEC61499 控制器

IEC61499 是基于事件的功能塊.圖。當事件來到時,功能塊更據事件的類型和内部的狀态,來決定執行内部的程式(算法)。并且根據執行的結果輸出事件。資料是和事件同步地輸入輸出的(交叉點的小方塊決定了資料和哪一個事件同步。

從PLC 到IEC61499 控制器

下面是一個小例子,實作一個32分頻器。由E_CYCLE功能塊周期性地産生事件,每次施加在計數器上。當計數器到達PV 設定的值時,引起Q 輸出TRUE。E_CTU 複位。

從PLC 到IEC61499 控制器

具有硬體數字電路設計經驗的讀者會發現,IEC61499功能塊的事件類似于數字邏輯電路中的時鐘。整個功能塊圖是在時鐘的驅動和控制下運作的。E_CYCLE 相當于一個内部時鐘源,而所有的輸入接口功能塊。當收到新的輸入信号時,會産生相應的事件。

  在IEC61499 中沒有周期的掃描過程。隻有周期性的事件節拍。上面的例子中,脈沖節拍的周期是1000ms。功能塊執行的循序會應為狀态的變化而改變。

  可以開發IEC61499相容的IEC61131-3 功能塊, 事實上在IEC61499 的開發環境中,也提供了IEC61131的功能塊庫。 同樣地,使用IEC61499 功能塊的事件IO,也可以實作PLC周期掃描的工作方式。

如何支援分布式系統

  PLC 是獨立運作的控制裝置,廠商提供的開發工具是用來開發單個PLC 内部程式的。當需要多個PLC 協同操作時,系統設計師需要定義好PLC互相之間交換資料的方向和格式,每個PLC各自程式設計。然後進行系統聯合調試。

PLC也具有與外界通信的網絡接口,這些網絡包括:

-Modbus

-EtherNet/IP

-Profibus

-ControlNet

-EtherCAT

-HART

  當多台PLC 建構一個控制網絡時,需要設計相關的消息格式和語義。PLC 聯網更多地是通過上位機來實作的,比如SCADA 系統就是通過PC 機建構 一個PLC+上位機的星型網。

  也可以使用額外的網關來實作各種結構的PLC控制網絡。例如,使用一個Modbus/MQTT 網關和MQTT 代理建構一個Publish/Subscribe 釋出/訂閱網絡。能夠實作于雲端的各種協定的通信。現在的許多裝置遠端監控項目大多數是采用這樣的方式。PLC 隻是一個控制末端裝置,通過網關接入物聯網或者雲端系統。

  由于涉及各種協定轉換和異種機互聯,這樣的控制系統的軟體開發和裝置安裝過程是比較複雜和耗費時間精力的。由于各個PLC 産品是一個嚴重依賴廠商的産品。而且是部分符合标準。各廠商提供的網絡接口的使用方式各不相同。而且各種網絡子產品價格不菲。

IEC61499 标準是針對分布式控制系統而開發的,在它的概念下,當你要開發一個有多台控制器構成的分布式系統時,你是建立一個統一的功能塊網絡。可以想象是在一個大的控制器上編寫一個應用程式。當編寫好之後,最後再将功能塊網絡分段映射到不同的控制器中去運作。映射時自動地增加了用于功能塊之間事件和消息交換的通信功能塊。如下圖所示。這些工作是IEC61499開發環境和運作時預先設計好的。應用程式員完全不用關心。隻要網絡是通的。功能塊網絡就能分布在各個控制器中運作。就像在一台大的控制器上運作一樣。當我第一次映射IEC61499 功能塊網絡到幾個樹莓PI 上時,着實吃驚了一次。感覺十分神奇。

從PLC 到IEC61499 控制器

IEC61499 這種系統化設計,分段映射到控制器的程式設計方式帶來的好處是使得系統的修改和重配置變得簡單,比如如果我們希望将某些功能塊從一個控制器轉移到另一個控制器上運作的時候,隻要重新的map一下就可以了。如果在PLC 建構的系統中,這樣的修改是比較費勁的。

硬體平台

  PLC 産品是廠商依賴型産品,各家的硬體平台各不相同。使用者對其硬體不甚了解。甚至它們使用的什麼CPU 都不知道。當然現在也出現了基于通用計算機平台的“軟體PLC”。除了軟體PLC之外,标準PLC 産品的性能擴充是十分有限的,

  相比之下IEC61499 的運作時(runtime)和軟體PLC一樣是基于通用的計算機平台的。通常是可以在一個RT linux OS 加上一些硬體IO子產品就能夠建構一個一個IEC61499 相容的控制器。事實上,我們在瑞芯微RK3399 ,樹莓PI 上都運作了開源項目4diac的IEC61499 的運作時forte。基于開放平台開發的控制器使我們能夠及時地選用最先進的硬體。提高控制器的性能。更多的第三方工業PC 開發上能夠加入開放IEC61499 的行列。形成一個開放型生态系統。使用者可以更加系統設計的需求,選擇各種性能的控制器,它們可以是基于X86 的系統,也可以是單核或者多核Arm 的系統。

功能擴充 

  同樣地,要想在标準PLC 産品上擴充功能隻能等待廠商。比如我們想在PLC 上添加一個AI 算法。目前的方法隻能是外接一台計算機來完成。PLC廠商就像外國警察那樣總是行動遲緩。

  基于Linux OS是一個開放性平台,如果采用IEC61499 開源運作時(例如4diac ),就可以任意地擴充功能。它們包括幾個方面:

1 第三方廠商開發功能塊庫

IEC61499 的開發環境具有功能塊類型的開發工具,它們使用互動界面來設計功能塊的事件輸入/輸出。資料輸入輸出。能夠使用java 或者ST 語言,lua語言 ,C語言開發功能塊的算法。然後結合到IEC61499 的運作時中。這些功能塊庫能夠給使用者使用。

例如著名的IEC61499 廠商nxtControl為建築自動化,過程控制和機器控制編寫的功能塊庫。專業的公司可以将自己的核心算法,KNOW-HOW 編寫到功能塊中,以功能塊的方式提供給客戶使用。

2 使用Lua 編寫控制塊的算法

使用者可以使用Lua 編寫功能塊。不需要編譯在運作時内部解釋執行。在Linux OS 下開發各種服務元件,通過服務接口功能塊通路這些服務元件。

3 使用基本的功能塊編寫複合功能塊

4 編寫外部微服務,通過服務接口功能塊交換消息。

在目前資訊系統領域,容器/微服務技術在雲平台和物聯網邊緣裝置中已經廣泛地應用了。所謂微服務(micro service)技術是将以前大型的單一程式分解成為功能單一的微服務。它們可以獨立的開發,部署,維護和更新。而容器是将微服務的程式以及運作環境打包成為一個容器,在容器環境中運作。目前最流行的容器管理技術是docker技術。微服務之間采用通用的消息平台交換消息。

從PLC 到IEC61499 控制器

 我們可以将IEC61499 運作時打包成為一個容器在docker中運作。并且通過消息系統(比如MQTT)與其它微服務交換資料。提供的微服務可以是基于web 的HMI使用者界面,時間序列資料庫,與雲端的接入,AI 和資料分析等。

事實上,我們在2019年,曾經開發了基于容器技術的小型工業邊緣計算機裝置。采用了Go語言作為主要的程式設計語言,使用RabbitMQ 作為消息系統。其目的是希望像手機App 那樣安裝工業App。但是遇到的問題是盡管已經編寫了各種支援型微服務。使應用程式的編寫更加簡捷。但是畢竟還需要編寫程式。而讓控制工程師編寫程式是困難的。

一種創新的方法是将這兩種方法結合起來,以便在制造裝置上輕松分發和管理軟體子產品,同時利用IEC 61499應用模型來啟用應用程式編排工具。我們已經初步的做了一些嘗試。證明是可行的。

繼續閱讀