PLC 與“軟件PLC“
早期的PLC 是使用繼電器實現邏輯控制的。也就是說,它們完全是硬件實現的。當微處理器出現之后,PLC 內部使用了CPU和程序來實現控制邏輯。現代PLC中也使用了實時操作系統以及各種網絡協議。自動控制行業的專家總是將在通用操作系統上運行的PLC控制程序成為“軟件PLC”,普遍認為軟件PLC 沒有PLC 設備可靠,實時性沒有PLC設備強。
這其實是一種誤解。某種意義上講,現代的PLC 都是軟件PLC。它們之間的唯一差別是PLC設備是在特定硬件平臺上實現的實時操作系統和程序具有更高的實時性,確定性和穩定性。它們經過了廠商預先反復的測試。確保了軟硬件匹配的的更好。如果重視軟硬件的相互匹配,在通用硬件平臺上,同樣能夠實現可靠運行的PLC 系統。比如倍福公司的工業電腦就是在微軟公司為其定制的windows 下運行。同樣非常的可靠。
在實時性方面,大多數PLC 使用實時操作系統(RTOS),比如VxWorks OS。這是一個可靠性,實時性極強的實時操作系統。不過,RTOS的處理能力也是有限的,設想編寫一個“巨大”的程序在PLC上運行, 也會出現性能下降問題。只是PLC 設備預留了足夠的資源來保證在特定的應用中的需要,通俗地講,“就是殺雞用牛刀”。
實時操作系統本質上是操作系統,只是內部調度算法上考慮了對外部事件的響應事件而已。但是令人遺憾的是,幾乎所有的OS 調度算法都只是“盡力而為”。PLC 的做法是預留了足夠的硬件算力,來確保應用程序滿足實時性的要求。為了提高PLC 的算力,高性能的PLC內部采用了FPGA 來實現實時性要求高的功能,例如產生高速PWM 和脈沖輸出,運動控制模塊,脈沖計數,電機編解碼器等。
開放性的挑戰
現代控制系統對PLC 提出了越來越高的要求,例如導入更復雜的控制算法,AI模塊和云端交互功能,它們對PLC 內部CPU/FPGA 提出更高的算力需求,另一方面,控制系統朝著開放性方向發展。第三方開發者和最終用戶參與PLC 功能塊的開發。在PLC 的生命周期內會變更程序和功能塊升級。如此一來,PLC廠商其實能難預估應用程序對算力的預估。并且難以承諾產品的實時性。而是又第三方開發者和用戶能夠更高效地方式來保證系統的實時性能。
IEC61499 的實時性
目前大多數的IEC61499 功能塊和運行時是軟件實現,并且在PC或者Linux 設備上運行。因此IEC61499 目前是一個典型的“軟”控制器。
問題的確是存在的,IEC61499 運行時的實時性和確定性的確令人擔心的。為了解決這個問題,可以吸取PLC 的方式
提高設備內部的SOC算力的富余量
采取FPGA 對功能塊加速
硬件實現實時功能塊網絡。
采取FPGA 對功能塊加速
通過對一些對算力比較大的功能塊使用FPGA 實現,能夠縮短功能塊的執行時間。提高功能塊網絡的實時性。
功能塊內部的算法由FPGA IP來實現。FB實現PS/PL 之間的數據交換。類似的FB包括:
高速PWM 發生器
高速脈沖計數器
FFT 快速傅里葉
數字濾波器
不過這種方式具有局限性,功能塊之間的數據和事件的傳遞和功能塊的調度仍然是由軟件實現的,存在著非確定性。對于像高速電機控制中,控制環由多個功能塊構造而成,如果由軟件實現功能塊之間的數據傳遞,整個系統的實時性,確定性難以保證。
硬件實現實時功能塊網絡
將實時處理要求高的一端功能塊網絡(譬如一個PID 環控制)使用FPGA來實現,而配置,監控和事務交互功能塊仍然由軟件實現。這樣完整的硬件實現,避免了軟件的干預而造成不確定性和實時性。并且能夠高速地處理控制算法和信號處理。
某一段功能塊網絡的硬件實現最好的方法是將這些硬件功能塊網封裝成為復合功能塊。通過工具軟件將這個復合功能塊轉換成為FPGA 硬件語言(HDL,verilog等)。由FPGA開發工具vivado 轉換成FPGA 比特流。
IEC61499 硬件功能塊的實現
筆者初步開始嘗試FPGA 實現IEC61499 的方法,使用xilinx zynq 作為SOC平臺。由于IEC61499 并不普及,網絡上相關的文章非常少。也只能自己慢慢摸索
在IEC61499 運行時的實現中,功能塊大多數采用了C++ 類實現,因此我們希望采用HLS 來實現C++類為基礎的IEC61499 功能塊,但是發現HLS 幾乎是為復雜算法而準備的,使用C++類的介紹非常少,如果去實現與數字邏輯非常接近的功能塊,好像不如verilog 語言更簡單。
verilog 語言以module 為一個編程單元,相當于C語言中的一個函數(function),但是由于硬件的特殊性,所有的變量都是靜態分配的,所以與C++的類又有幾分相似,內部實現ECC狀態機和算法十分方便。與此同時,verlog 的功能塊能夠實例化。在另外的模塊中實現實例。與IEC61499 功能塊實例化十分相像。使用verilog 語言編寫IEC61499 硬件功能塊更加合適。
例子1-E_CTD 功能塊
下面是筆者使用verilog 實現的一個E_CTD 計數器
`timescale 10ns / 1ns module e_ctd(cd,ld,cdo,ldo,pv,cv,q); input cd,ld; input [15:0] pv; output reg q,cdo,ldo; output reg [15:0] cv; reg [15:0] v; always@(posedge cd) begin if (cv==0)begin cv <= v; ? ? ? ? ? #5 q=1; ? ? ? ? ? end else ? ? ? ? ? begin ? ? ? ? ? ? cv <= cv - 1; ? ? ? ? ? #5 q=0; ? ? ? ? ? end ? ? ? #5 cdo=1; ? ? ? #5 cdo=0; ? end ? always@(posedge ld) ? begin ? ? ? v <= pv; ? ? ? cv <= pv; ? ? ? ldo=1; ? ? ? #10 ldo=0; ? end endmodule
在上面的程序中,忽略了ECC 的實現。module e_ctd是功能塊,下面的test 是仿真程序
仿真的結果
IEC61499 基本功能塊都是底層邏輯構建得,使用verilog 語言描寫非常合適,如果要深入研究IEC61499 功能塊硬件化得課題,需要開發 hardware function block 庫。在這個基礎上開發一些構建工具(XML->verilog)
例2 -E_CYCLE 功能塊
`timescale 10ns / 1ns module e_cycle(start,stop,eo); input start,stop; output reg eo; parameter FREQ = 100000; // in constraint_mode parameter DUTY = 50; // in percentage parameter clk_pd = 1.0/(FREQ * 1e3) * 1e9; parameter clk_on = DUTY/100.0 * clk_pd; parameter clk_off = (100.0 - DUTY)/100.0 * clk_pd; reg start_clk; initial begin eo <= 0; ? start_clk <= 0; end always @(posedge start) begin ? if (start) ? ? start_clk=1; end ? always @(posedge stop) begin ? if (stop) ? ? start_clk=0; end ? ? always @(posedge start_clk) begin if (start_clk) begin while (start_clk) begin ? ? #(clk_on) eo=1; ? ? #(clk_off) eo=0; ? ? ? ? end ? ? ? ? end end ? endmodule
例3 -E_T_FF
`timescale 10ns / 1ns module E_T_FF(clk,eo,q); input clk; output reg eo,q; initial begin q=0; eo=0; end always @(posedge clk) begin if (clk) begin q <=~q; ? ? eo=1; ? ? #2 eo=0; ? ? end end endmodule
測試程序
測試程序完成IEC61499 功能塊網絡。
`timescale 10ns / 1ns module test(); reg cd,ld; wire cdo,ldo,q,q2; wire [15:0] cv; wire ecycle_eo,e_t_ff_eo; reg start,stop; E_CYCLE #(.FREQ(200000)) ecycle1(start,stop,ecycle_eo); E_CTD #(.PV(8)) etcd1(ecycle_eo,ld,cdo,ldo,cv,q); E_T_FF e_t_ff(cdo,e_t_ff_eo,q2); initial begin #5 ld =0; #5 ld=1; #5 start=1; #5 start=0; end initial $monitor("at time %t ,",$time,"CDO=%b,LDO=%b,Q=%b,CV=%b",ecycle_eo,ldo, q,q2); endmodule
仿真結果
軟硬件接口
實現IEC61499 硬件功能塊,需要設計一個統一的軟硬件接口。如下圖所示。
IEC61499 運行時通過HFB API 訪問硬件功能塊
API 包括:
Event_Action() 向硬件FB 發送事件
Put_Data 向FB 發送數據
Get_Data讀取FB數據
Event_Notify() 處理FB 輸出的事件中斷。(也可以是查詢方式)
ARM 處理器通過AXI-lite 接口與PL 端的AXI 外設IP 通信
write Register
readRegister
interrupt processing
AXI 外設寄存器
輸入事件寄存器(Input Event register)
輸出事件寄存器(Output Event register)
輸入數據寄存器(Input Data Register)
輸出數據寄存器(Output Data Register)
操作過程
事件輸入
當需要向功能塊注入事件時,運行時向輸入事件寄存器對應的bit 位置 1,硬件FB 檢測輸入事件寄存器的狀態,一旦發現變化,轉向事件處理。完成后,清除對應的狀態位。
事件輸出
當功能塊輸出一個事件時,在輸出事件寄存器相關位置1,并產生一個中斷信號。由運行時軟件讀取事件寄存器,并且清零。
數據輸入/輸出
由軟件直接寫入或讀取數據輸入寄存器。這一點與軟件實現有所不同,軟件FB 處理時是通過 getDataIn根據connection 去數據源功能塊中讀取的。對于硬件FB,當事件來臨時,API要根據事件-數據關聯性,調用getDataIn 讀取數據后需要寫入數據輸入寄存器中。
結束語
這只是一個開頭,還有許多工作要做
1 軟件功能塊與硬件功能塊的接口的實現方式
2 如何將IEC61499 復合功能塊的XML 描述轉換成verilog 的模塊。
3 如何調用HLS 產生的IP
審核編輯:劉清
-
FPGA
+關注
關注
1631文章
21806瀏覽量
606598 -
PLC控制
+關注
關注
9文章
251瀏覽量
27399 -
編解碼器
+關注
關注
0文章
268瀏覽量
24326 -
RTOS
+關注
關注
22文章
821瀏覽量
119939
原文標題:IEC61499 在FPGA中的實現
文章出處:【微信號:ZYNQ,微信公眾號:ZYNQ】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
什么是FB功能塊?為什么要使用FB功能塊?如何制作一個FB功能塊?
![什么是FB<b class='flag-5'>功能塊</b>?為什么要使用FB<b class='flag-5'>功能塊</b>?如何制作一個FB<b class='flag-5'>功能塊</b>?](https://file1.elecfans.com/web2/M00/AD/41/wKgaomVMlDiAKv11AAF4xq0wQf4632.jpg)
資料下載:從PLC 到IEC61499 控制器
漫談工業軟件IEC61499 功能塊
基于IEC61131的PLC和IEC61499兼容型控制器之間有何差別
基于FF現場總線的先進PID功能塊設計
基于EPA的PID功能塊的設計及實現
騰控MODBUS主站功能塊通迅詳解
![騰控MODBUS主站<b class='flag-5'>功能塊</b>通迅詳解](https://file.elecfans.com/web2/M00/49/FA/pYYBAGKhvIGAO3HWAAA2_sQMrMg453.png)
PLCopen軸組運動功能塊研究
![PLCopen軸組運動<b class='flag-5'>功能塊</b>研究](https://file.elecfans.com/web1/M00/48/02/o4YBAFqmLSWAaMyDAADdcvDV1WE067.jpg)
評論