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