李桐滿,丁文捷,韓小龍,洪 斌,郁 凱
(1.武漢烽火技術(shù)服務(wù)有限公司,湖北 武漢 430070;2.寧夏大學(xué) 機(jī)械工程學(xué)院,寧夏 銀川 750021;3.寧夏水利科學(xué)研究院,寧夏 銀川 750021)
基于STM32、樹莓派、89C51 和自由開發(fā)的邏輯控制器經(jīng)常出現(xiàn)程序“跑飛”“死鎖”的情況,主要原因是程序邏輯結(jié)構(gòu)和內(nèi)存使用不規(guī)范,編寫的C 程序其功能和數(shù)據(jù)邏輯驗(yàn)證往往存在不足,致使代碼執(zhí)行的邏輯可靠性出現(xiàn)問題[1]。而工業(yè)PLC 使用了限制性內(nèi)存變量及逐行式掃描邏輯結(jié)構(gòu),因此其控制邏輯可靠、信號處理過程穩(wěn)定[2]。
國際電工委員會在IEC 61131—3 標(biāo)準(zhǔn)中統(tǒng)一了軟邏輯控制器的編程方法和規(guī)則,提出可以利用計(jì)算機(jī)或嵌入式控制器的軟件和硬件資源來實(shí)現(xiàn)硬PLC 的功能,這種技術(shù)被稱為軟邏輯[3]。近幾年,歐洲地區(qū)已有70%~80% 的工程師在使用基于IEC 61131—3 標(biāo)準(zhǔn)編制的工業(yè)編程軟件[4]。國內(nèi)很多學(xué)者也在利用該標(biāo)準(zhǔn)編制軟件,如雷路路[5]設(shè)計(jì)了三菱FX 系列嵌入式PLC 系統(tǒng),該系統(tǒng)以STM32 為控制核心,利用PLC 編程工具開發(fā)了代碼,并且成功實(shí)現(xiàn)了嵌入式PLC 的通信。林江靜[6]給出了符合IEC 61131—3 標(biāo)準(zhǔn)的由梯形圖到C 語言的轉(zhuǎn)換算法,轉(zhuǎn)化后的程序下載控制器可實(shí)現(xiàn)嵌入式PLC 功能。因此,基于IEC 61131—3 標(biāo)準(zhǔn)開發(fā)具有端口輪詢處理功能、逐行式掃描邏輯結(jié)構(gòu)、異常監(jiān)測機(jī)制、變量規(guī)范、程序邏輯結(jié)構(gòu)和功能塊穩(wěn)定運(yùn)行等特點(diǎn)的編程規(guī)范就顯得極為重要了。編程規(guī)范可以滿足工業(yè)領(lǐng)域?qū)刂破魈岢龅耐ㄓ眯詮?qiáng)、可靠性高、運(yùn)行速度快和控制功能完善等需求,從而實(shí)現(xiàn)其應(yīng)用價值。
為了高效利用水資源,減少灌溉期巡查管理模式下管理人員的工作量,本文提出了一種便于農(nóng)戶自助使用的田間閘門鎖控制器系統(tǒng)[7-8]。該控制器基于文中提出的軟邏輯編程規(guī)范及北斗通信協(xié)議對田間閘開閘和合閘過程進(jìn)行了硬件設(shè)計(jì),并且能夠?qū)崿F(xiàn)對系統(tǒng)的遠(yuǎn)程控制。
輪詢處理是IEC 61131—3 標(biāo)準(zhǔn)中規(guī)定的控制器管理輸入輸出接口的方式[9]。輪詢是指CPU 主動發(fā)出詢問,并且依序詢問每一個輸入輸出接口需要的相關(guān)數(shù)據(jù)傳輸服務(wù)請求。當(dāng)設(shè)備的標(biāo)志位指示為“準(zhǔn)備正?!睜顟B(tài)時,CPU 會向該設(shè)備提供輸入輸出接口服務(wù)。
IEC 61131—3 標(biāo)準(zhǔn)要求CPU 設(shè)置一部分應(yīng)用數(shù)據(jù)存儲單元來存儲應(yīng)用程序執(zhí)行期間輸入/輸出(I/O)映像的數(shù)據(jù)狀態(tài)及定時器、計(jì)數(shù)器、條件設(shè)定值等信息,程序執(zhí)行過程如圖1 所示。由圖1 可知,程序按順序執(zhí)行代碼,但上一條指令是否成功執(zhí)行不會影響下一條指令的執(zhí)行。
圖1 程序執(zhí)行過程
軟邏輯編程需要使用看門狗功能塊,用于監(jiān)視程序執(zhí)行過程中出現(xiàn)的異常情況。當(dāng)系統(tǒng)受到外部干擾或程序進(jìn)入死循環(huán)時會自動激活看門狗功能并中止當(dāng)前任務(wù)和對應(yīng)程序,然后重新啟動系統(tǒng)[10]。
變量規(guī)范開發(fā)主要包括兩個步驟,具體如下。
(1)定義接口變量。接口變量包括輸入口單元IO、輸出口單元QO、位存儲器單元M 變量、定時器接口變量及計(jì)數(shù)器接口變量。本文使用C 語言中的位域定義了字節(jié)中的位操作,同時采用了關(guān)鍵字volatile 指令,該指令不會因編譯器的優(yōu)化而被省略且程序執(zhí)行時會直接讀取變量值。此外,系統(tǒng)規(guī)定接口變量的輸入輸出狀態(tài)分為有輸入(“1”)和無輸入(“0”)兩種。輸入存儲器的4 種引用方法如表1所示。
表1 輸入存儲器引用方法
(2)本地變量聲明。本地變量分為局部存儲器單元與全局存儲器單元,其僅供程序內(nèi)邏輯使用,不需要和外部串口及網(wǎng)絡(luò)進(jìn)行通信。
I/O 端口需要進(jìn)行初始化邏輯定義,其端口配置如表2 所示。
硬PLC 的編程語言中大量使用了if…else 等選擇語句及for…while 等循環(huán)語句,并且有嚴(yán)格的使用規(guī)范,如for 語句的循環(huán)嵌套最多為8 層[11]。本文根據(jù)IEC 61131—3 標(biāo)準(zhǔn)制定了軟邏輯編程語言的邏輯規(guī)范:if…else 條件判斷語句可嵌套2 層,for 循環(huán)語句可嵌套2 層,while 主循環(huán)語句有且只有1個;條件判斷式可使用接口變量和本地變量。
2.4.1 定時器功能塊函數(shù) 系統(tǒng)設(shè)定定時器的定時值為pt,定時單位值為acc,則定時時間T=pt×acc,單位為ms。定時器設(shè)定情況見表3。
表3 定時器設(shè)定表
本文以定時器2 為例來說明定時器調(diào)用程序的流程(圖2)。調(diào)用定時器2 時,首先打開定時器中斷TIM2_Control(1);然后調(diào)用定時器封裝函數(shù),確定T[2].bits._0 的值;最后再執(zhí)行后續(xù)的程序體。此外,定時器使用結(jié)束后要關(guān)閉定時器中斷TIM2_Control(0),目的是減少定時器中斷之間的串?dāng)_。
圖2 定時器2調(diào)用程序流程圖
2.4.2 計(jì)數(shù)器功能塊函數(shù) 硬PLC 計(jì)數(shù)器是實(shí)現(xiàn)次數(shù)動作的計(jì)數(shù)器。編程規(guī)范規(guī)定計(jì)數(shù)器共有3 種類型,即加計(jì)數(shù)器、減計(jì)數(shù)器和加減計(jì)數(shù)器,計(jì)數(shù)值為pv,其規(guī)范如表4 所示。
表4 計(jì)數(shù)器規(guī)范
以下為部分軟邏輯規(guī)范實(shí)例化程序。
頭文件#include “PLC.h”
全局變量聲明;
程序單元(本地變量)
{本地變量聲明;
設(shè)備初始化;
while(1)
{I_filter(1);//輸入口掃描函數(shù);
程序邏輯主體;
PLC_IO_Refresh();}}//調(diào)用輸出刷新函數(shù);
……
本文基于軟邏輯規(guī)范設(shè)計(jì)了田間閘門鎖控制系統(tǒng)。該系統(tǒng)通過北斗通信設(shè)備與服務(wù)器及用戶終端相互配合[12],其組成示意圖如圖3 所示。
圖3 田間閘門控制系統(tǒng)組成示意圖
田間閘門鎖控制系統(tǒng)硬件設(shè)計(jì)步驟:北斗通信模塊將檢測到的水量數(shù)據(jù)傳輸至服務(wù)器,服務(wù)器接收水量數(shù)據(jù)并儲存;服務(wù)器通過北斗通信模塊傳送閘門操作指令,控制器操控第一霍爾傳感器接收磁塊靠近信號和超聲波傳感器距離減少信號來實(shí)現(xiàn)開閘操作,或者是控制器操控第二霍爾傳感器接收磁塊靠近信號和超聲波傳感器距離增加信號來實(shí)現(xiàn)合閘操作;電磁鎖配合完成閘門開合,從而實(shí)現(xiàn)農(nóng)戶自助灌溉管理和灌溉過程中水量的精確統(tǒng)計(jì)。田間閘門鎖控制器硬件連接示意圖如圖4 所示。
圖4 控制器硬件連接示意圖
3.2.1 開合閘 開合閘流程圖見圖 5。由圖5 可知:首先控制器接收開鎖指令,控制電磁鎖開鎖;然后農(nóng)戶對水閘裝置進(jìn)行相應(yīng)的操作;傳感器配合電磁鎖實(shí)現(xiàn)水閘裝置的開閘或合閘動作,同時向服務(wù)器發(fā)送水量數(shù)據(jù),包括瞬時流量、累計(jì)流量和當(dāng)前水位,數(shù)據(jù)為IEEE—754 標(biāo)準(zhǔn)浮點(diǎn)數(shù),即先將單精度浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換為16 進(jìn)制數(shù)據(jù)報(bào)文,再發(fā)送至服務(wù)器。
圖5 開合閘流程圖
圖6 關(guān)閉電磁鎖流程圖
圖7 主循環(huán)程序流程圖
圖8 開閘應(yīng)答程序流程圖
3.2.2 打開電磁鎖 控制器接收到服務(wù)器發(fā)送的開閘或合閘指令后,控制電磁鎖的鎖銷從掛環(huán)中脫離,實(shí)現(xiàn)閘門動作。
3.2.3 關(guān)閉電磁鎖 田間閘門鎖控制器的感應(yīng)距離L會隨著閘門的升起和放下而發(fā)生變化。首先,控制器控制電磁鎖打開,閘門在低位時的第一預(yù)設(shè)距離為140 mm 連接外部設(shè)備的I/O 端口分配表見表5。系統(tǒng)功能參數(shù)數(shù)據(jù)表見表 6。 表5 I/O端口分配表 表6 系統(tǒng)功能參數(shù)數(shù)據(jù)表 本文采用Keil MDK V5 軟件進(jìn)行了系統(tǒng)程序編制,主要涉及輸入輸出初始化PLC_IO_config()、RS 485_Init(19 200)、定時器初始化TIM_config_Init()、ADC 初始化Adc_Init()、超聲波初始化Ultrasonic_Init()、看門狗初始化IWDG_Init(7,1 000)等函數(shù)。主循環(huán)程序流程圖如圖 7 所示。 相比傳統(tǒng)程序,軟邏輯程序只使用了1 個主循環(huán)while 結(jié)構(gòu),并且采用逐行循環(huán)掃描方式實(shí)現(xiàn)了輸入接口掃描、程序體執(zhí)行及輸出接口刷新過程。此外,程序中的if 邏輯判斷語句只嵌套了1 層。綜上可知,程序設(shè)計(jì)中的變量規(guī)范且采用了看門狗監(jiān)測程序,符合軟邏輯編程規(guī)范。 開閘程序也采用了1 個主循環(huán)while 結(jié)構(gòu)及逐行循環(huán)掃描方式,并且接口變量規(guī)范。其中,定時器4用來配合監(jiān)測超聲波距離值,并且看門狗監(jiān)測程序等內(nèi)容符合規(guī)范要求。開閘應(yīng)答程序流程圖如圖 8所示。 田間閘門鎖控制器的測試工作主要包括以下幾個部分。 (1)內(nèi)存變量測試。程序編譯后,內(nèi)存變量所占存儲空間為28 856 字節(jié),未超出總內(nèi)存。此外,程序中無動態(tài)內(nèi)存變量申請,內(nèi)存變量的使用符合內(nèi)存管理規(guī)范。 (2)端口程序測試。測試中,Q00 端口輸出高電平,固態(tài)繼電器電路導(dǎo)通并控制電磁鎖打開,實(shí)物見圖9。此外,超聲波傳感器、霍爾傳感器、液位傳感器可以正常采集數(shù)據(jù),并且以上傳感器采集數(shù)據(jù)的邏輯判斷過程符合程序邏輯結(jié)構(gòu)設(shè)計(jì)流程。 圖9 硬件連接實(shí)物圖 (3)通信程序測試。經(jīng)測試,RS485端口可以穩(wěn)定接收與發(fā)送北斗報(bào)文數(shù)據(jù)。串口1監(jiān)測傳感器數(shù)據(jù)的界面如圖10所示,其中左側(cè)數(shù)據(jù)監(jiān)測區(qū)用于檢查閘門操作信息,右側(cè)通信數(shù)據(jù)區(qū)用于檢查服務(wù)器通信報(bào)文。 圖10 串口1監(jiān)測界面 (4)功能塊測試。經(jīng)過測試,采用超聲波觸發(fā)信號的定時器能夠正常工作。測量距離數(shù)據(jù)見圖10。 (5)程序可靠性測試。系統(tǒng)進(jìn)行了168 h的串口測試(圖10),串口共接收424 375 937條數(shù)據(jù)。本文通過查看數(shù)據(jù)記錄,可知程序執(zhí)行過程中沒有觸發(fā)異常監(jiān)測機(jī)制,程序沒有出現(xiàn)“跑飛”“卡死”等故障,即長時間運(yùn)行測試達(dá)到了預(yù)期的可靠性目標(biāo)。以上程序測試的主要結(jié)果如表7所示。 表7 程序測試結(jié)果 本文給出了軟邏輯編程規(guī)范,并且根據(jù)田間閘門鎖控制器的控制要求,制定了利用北斗通信協(xié)議對開閘和合閘過程進(jìn)行控制的硬件設(shè)計(jì)方案,制定了控制器的主循環(huán)程序和開閘應(yīng)答程序,實(shí)現(xiàn)了遠(yuǎn)程控制電磁鎖打開和關(guān)閉的操作。主要結(jié)論如下。 (1)定時器4 實(shí)現(xiàn)了超聲波觸發(fā)信號每隔20 μs重復(fù)開關(guān)1 次的操作。此外,程序可連續(xù)運(yùn)行168 h,驗(yàn)證了編程模型邏輯、變量規(guī)范、端口初始化配置、程序邏輯結(jié)構(gòu)、定時器功能塊函數(shù)、異常監(jiān)測機(jī)制和其他功能函數(shù)的可靠性。 (2)經(jīng)項(xiàng)目組調(diào)整,庫文件程序的正確率提高了20%,為C 程序庫文件的便捷調(diào)用提供了依據(jù),并且解決了由定時器觸發(fā)中斷時間短、模式選擇多,傳感器數(shù)據(jù)采集不到位,輸出端口和開合閘指令設(shè)計(jì)不足等因素引發(fā)的運(yùn)行穩(wěn)定性及程序移植穩(wěn)定性問題。4 程序開發(fā)
4.1 主循環(huán)程序
4.2 開閘應(yīng)答程序
5 系統(tǒng)測試
6 結(jié)論