詹 俊,龍 辛,黃 波,楊杰軍,陳雄姿
(1.湘潭大學(xué) 信息工程學(xué)院 電氣工程系,湖南 湘潭 411105;2.湘電風(fēng)能有限公司,湖南 湘潭411105;3.長沙金博聯(lián)信息技術(shù)有限公司,湖南 長沙 410000)
PLC在工業(yè)控制領(lǐng)域扮演十分重要的角色,區(qū)別于傳統(tǒng)的PLC,軟PLC系統(tǒng)具有通用性強(qiáng)、操作方便、開發(fā)周期短等多方面的優(yōu)點,逐漸成為未來工業(yè)控制器的主力軍。
軟PLC主要分為基于PC軟PLC系統(tǒng)和基于嵌入式操作系統(tǒng)的軟PLC系統(tǒng)。其中后者以其實時性能的優(yōu)勢成為主流。Vx Works操作系統(tǒng)作為一款具有強(qiáng)實時性能的嵌入式操作系統(tǒng),能根據(jù)需求靈活地對其進(jìn)行裁剪,所以目前被廣泛應(yīng)用在基于嵌入式操作系統(tǒng)的軟PLC開發(fā)上[1]。CodeSys是由3S公司開發(fā)的一種功能強(qiáng)大的PLC軟件編程工具,它支持IEC61131-3標(biāo)準(zhǔn),通過其runtime庫可以與底層操作系統(tǒng)很好地鏈接[2]。二者結(jié)合不僅可以很好地保證系統(tǒng)的實時性能,同時也可大大地縮短開發(fā)周期。
遠(yuǎn)程監(jiān)控系統(tǒng)由基于Vx Works的數(shù)據(jù)采集與發(fā)送模塊、上位機(jī)監(jiān)控及數(shù)據(jù)分析處理模塊和基于CodeSys的輸出信息函數(shù)庫三大部分組成。遠(yuǎn)程監(jiān)控系統(tǒng)結(jié)構(gòu)如圖1所示。
上位機(jī)與被監(jiān)控設(shè)備直接采用UDP協(xié)議進(jìn)行通信,以減少對系統(tǒng)資源的消耗,同時提高處理的速度。被監(jiān)控目標(biāo)系統(tǒng)循環(huán)偵聽請求,一旦接收到上位機(jī)發(fā)送過來的監(jiān)控請求即以固定頻率收集信息并發(fā)送,如果接收到其他控制請求則進(jìn)行其他操作。
圖1 遠(yuǎn)程監(jiān)控系統(tǒng)結(jié)構(gòu)圖
Vx Wor ks系統(tǒng)中通過啟動數(shù)據(jù)采集發(fā)送任務(wù)(TInf Send)及PLC信息采集任務(wù)(Get Log Data)實現(xiàn)全部信息的收集發(fā)送工作。主要任務(wù)包括:任務(wù)信息采集、CPU及內(nèi)存使用信息采集、系統(tǒng)異常處理、程序計數(shù)器計數(shù)值采集、PLC應(yīng)用程序輸出信息采集、信息發(fā)送。數(shù)據(jù)采集發(fā)送主程序流程見圖2。
1.2.1 系統(tǒng)任務(wù)信息
Vx Works操作系統(tǒng)函數(shù)庫提供了taskInfo庫函數(shù)用于用戶獲取所有任務(wù)的信息,其中主要的信息包括:任務(wù)ID、任務(wù)名稱、入口地址、優(yōu)先級、當(dāng)前狀態(tài)、堆棧值等。系統(tǒng)是根據(jù)可以唯一識別任務(wù)的ID號來檢索任務(wù)相關(guān)信息的,通過函數(shù)taskId List Get()可以獲取到當(dāng)前系統(tǒng)運行的所有任務(wù)的ID,同時系統(tǒng)提供根據(jù)ID檢索任務(wù)信息的函數(shù)taskInfo Get(),獲取的信息以TASK_DESC結(jié)構(gòu)體格式存儲[3],提取其中有用的信息存于構(gòu)建的TASK_INFO結(jié)構(gòu)體中,打包成發(fā)送數(shù)據(jù)包的格式,實現(xiàn)了任務(wù)信息的采集。任務(wù)信息數(shù)據(jù)結(jié)構(gòu)如下所示:
typedef struct/*TASK_INFO-任務(wù)結(jié)構(gòu)體 */
{
int td_id;/* 任務(wù)ID*/
Char td_na me[12];/* 任務(wù)名稱 */
int td_priority;/* 優(yōu)先級 */
int td_status;/* 任務(wù)當(dāng)前狀態(tài) */
int td_stack Size;/* 堆棧大小 */
int td_stack Current;/* 當(dāng)前堆棧大小 */
int td_error Status;/*任務(wù)錯誤狀態(tài) */
}TASK_INFO;
圖2 數(shù)據(jù)采集發(fā)送主程序流程圖
1.2.2 資源信息
系統(tǒng)資源包括CPU資源和內(nèi)存資源,Vx Works提供的系統(tǒng)工具直接將這些信息定位到文件或指定IO輸出。這里通過構(gòu)建函數(shù)截取CPU資源的信息,并且通過修改系統(tǒng)函數(shù)直接將內(nèi)存使用信息定位到指定的內(nèi)存區(qū)域。
Vx Works提供了spy Lib庫函數(shù)用于監(jiān)控CPU的使用情況,spy利用輔助時鐘的中斷服務(wù)程序,并且為每個任務(wù)維護(hù)一個計數(shù)器,這樣在特定的時間周期內(nèi)即可統(tǒng)計出每個任務(wù)的CPU占用率。在庫的源程序中提供了spy Report Co mmon(FUNCPTR print-Rtn)用于系統(tǒng)工具(Shell等)獲取CPU信息,這里通過構(gòu)建print Rtn函數(shù)[4],直接將信息格式輸出到指定的內(nèi)存區(qū)域,相關(guān)函數(shù)代碼如下所示:
Void spy Ptn Func(const char*fmt Ptn)
{
va_list va1;
va_start(va1,f mt Pt n);
/*Cpu Dt Buf存儲CPU信息的全局變量*/
vsprintf(Cpu Dt Buf,f mt Pt n,va1);
va_end;
}
Vx Wor ks對內(nèi)存信息進(jìn)行統(tǒng)計,系統(tǒng)提供的memshow()函數(shù)直接將信息定位標(biāo)準(zhǔn)輸出,目前的辦法一般都是將其定位到文件再從中讀取。本文通過重新構(gòu)建函數(shù)庫,然后獲取CPU信息的辦法可以將信息定位到指定的區(qū)域,主要函數(shù)代碼如下:
STATUS jbl_mem Part Show(PART_ID part Id ,int type ,F(xiàn)UNCPTR print Pt n)
{
Int nu mBlocks;
Unsigned total Bytes=0;
Unsigned biggest words=0;
...
/* 調(diào)用系統(tǒng)函數(shù)獲取總大小及內(nèi)存塊參數(shù) */
If((total Bytes= mem Prat Available(patr Id,&biggest Words,type))== ERROR)
{...;
}...
nu m Blocks=dll Count(&part Id->free List);
...
/* 格式化輸出到指定位置 */
If(nu m Blocks?。?)
{
(* print Ptn)("free%10u%9u%10u%10u\n",total Bytes,nu m Blocks,total Bytes/nu m Blocks,2*biggest Words);
}...
}
1.2.3 PLC應(yīng)用程序信息
以Vx Works加CodeSys模式構(gòu)建的軟PLC系統(tǒng),在脫離在線編程模式時很難獲取客戶運行的PLC程序相關(guān)信息,因此在程序中安插信息輸出函數(shù),使PLC程序運行到指定位置時如果滿足輸出要求即輸出一條消息,這樣就能像在C語言中加printf函數(shù)一樣獲取到程序不同位置的信息[5]。本設(shè)計中構(gòu)建基于ST語言的PLC函數(shù)庫、Util_LogInfo()函數(shù)和Util_Log Wr n()函數(shù),其用法如以下ST代碼所示:
(* 變量定義 *)
PROGRA M PLC_PRG
VAR
...
Log Msg:STRING:='Rd Data is:';
Log Msg2:STRING:='Gd Su m2- Gd Su m =';
END_VAR
(* 程序?qū)嵗?*)
...
My_Log Msg:= CONCAT(Log Msg,DINT_TO_STRING(Gd-Su m));
Util_LogInf o(My_Log Msg);
My_Log Msg2:= CONCAT(Log Msg2,DINT_TO_STRING(Gd Su m - Gd Su m2));
Util_LogInf o(My_Log Msg2);
…
底層基于Vx Wor ks消息機(jī)制,接口函數(shù)定義為:jbl_Log Msg(char*f mt,int ar g1,...,int ar g6)。CodeSys通過RUNTI ME SYSTEM調(diào)用此接口函數(shù),系統(tǒng)同時開辟任務(wù)Get Log Data用于獲取來自PLC應(yīng)用程序的輸出信息,并且將其定向到指定的內(nèi)存區(qū)域和記錄到日志文件里面。輸出信息格式定義見表1。
表1 PLC應(yīng)用程序的輸出信息格式
1.2.4 信息發(fā)送
設(shè)計中對每幀網(wǎng)絡(luò)包的數(shù)據(jù)區(qū)進(jìn)行重新定義,這就保證了上位機(jī)對數(shù)據(jù)進(jìn)行準(zhǔn)確的解析,數(shù)據(jù)包格式見表2。
表2 數(shù)據(jù)包格式
基于Windows開發(fā)上位機(jī)程序,項目中已經(jīng)搭建了基于Vx Works加CodeSys的軟PLC系統(tǒng),在系統(tǒng)初始化階段啟動信息采集任務(wù),并且運行上位機(jī)程序監(jiān)控到如圖3所示數(shù)據(jù)。
Vx Works提供一個異常處理句柄(handler)和一個名為t Exc Task的任務(wù)來處理異常。異常出現(xiàn)后任務(wù)將變?yōu)閽炱馉顟B(tài)(suspend),并且不能轉(zhuǎn)變?yōu)槠渌麪顟B(tài),通過任務(wù)信息窗口STAT可以準(zhǔn)確觀測到任務(wù)的狀態(tài),選擇相應(yīng)任務(wù),通過點擊左側(cè)按鈕欄對任務(wù)進(jìn)行掛起、恢復(fù)、刪除處理。
圖3 上位機(jī)監(jiān)控主界面
程序非法執(zhí)行或訪問內(nèi)存越界等都會發(fā)生任務(wù)異常,通過異常處理函數(shù)打印輸出的信息反映了當(dāng)前異常的具體信息。
運行一段時間,點擊繪制曲線按鈕可得到free內(nèi)存的柱狀圖(如圖4所示)和其中TInf Send任務(wù)CPU占用率曲線圖(如圖5所示)。由圖5可直觀看到一段時間內(nèi)CPU占用率為8%,所以此時可以直觀觀測系統(tǒng)運行情況。
圖4 內(nèi)存使用信息柱狀圖
圖5 CPU使用信息圖(以采集任務(wù)為例)
通過測試,系統(tǒng)在開發(fā)和運行階段通過網(wǎng)線簡單連接目標(biāo)板和上位機(jī)即可準(zhǔn)確及時獲取到軟PLC系統(tǒng)運行的各項參數(shù),同時可以對數(shù)據(jù)進(jìn)行分析,方便技術(shù)人員及時排查故障和優(yōu)化應(yīng)用程序,具有一定的使用價值。下一步將進(jìn)一步優(yōu)化故障處理,增加可控項目,使系統(tǒng)實用性更強(qiáng)。
[1] 李峰,應(yīng)宏.利用TCP/IP實現(xiàn) Windows與Vx works的通信[J].微計算機(jī)信息,2006(5):80-82.
[2] 王麗麗,康存鋒,馬春敏,等.基于codesys的嵌入式軟PLC系統(tǒng)的設(shè)計與實現(xiàn)[J].現(xiàn)代制造工程,2007(3):54-56.
[3] 汪毅,顧曉霞,奚宏明.Vx Works嵌入式系統(tǒng)遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].科學(xué)技術(shù)與工程,2011(27):6747-6755.
[4] Bollerslev T.PLC and PSTN based expert system for long-distance fault diagnosis of can-body resistance welding machine[J].Review of Economics and Statistics,2007,72:498-505.
[5] Mohammad Abu Zalata,Tariq M Younes,Mohammad A K Alia.Development of equivalent virtual instruments to PLC functions and net works[J].Journal of Soft ware Engineering and Applications,2011(3):172-180.