摘 要:數(shù)組變量在編程中能起到很好的簡化程序的作用,避免大量雷同程序段落,降低發(fā)生錯誤的可能性。
關鍵詞:UniPro;PLC;開發(fā)技巧;流量儀累積流量
使用的編程軟件為施耐德公司的UniPro開發(fā)軟件,該軟件支持以下硬件型號:
Modicon M340;
Premium;
Atrium;
Quantum;
支持的編程語言為;
功能塊圖 FBD;
梯形圖(LD)語言;
指令列表 IL;
結構化文本 ST;
序列控制 SFC;
1 背景知識
1.1 數(shù)組變量
數(shù)組變量是UniPro編程中能使用的一種數(shù)據(jù)類型,它可以是一組布爾(BOOL)字、一組UINT整數(shù)字、一組WORD表等。
1.2 表達式
在編程中以如下形式表達:
(1)數(shù)組頭地址:數(shù)組長度
舉例:以地址%M10作為數(shù)組起始,長度為5,表達式為%M10:5。
(2)數(shù)組頭地址[偏移量]
數(shù)組中的某一個位置可以用此方法表達,無需事先定義一個數(shù)組。
舉例:地址%M10作為數(shù)組起始,讀取%M12時,表達式為%M10[2]。
數(shù)組變量可以用以上兩種表達式表達,但在使用前要做如下設置。
工具→項目設置→“語言擴展”標簽欄→勾選虛線框內內容
2 實例
2.1 數(shù)組映射
在處理外部輸入的信號時,為了方便對數(shù)據(jù)進行處理,我通常會將外部輸入映射到PLC內存地址中。
現(xiàn)假設有一個位于1#背架,8#插槽的8路離散量輸入模塊,為了將這個模塊采集的存入%M30至%M37中。普遍的做法為將輸入數(shù)據(jù)與內存地址做一對一賦值,形成如下表達式:
%M30:=%I1.8.0;
%M31:=%I1.8.1;
%M32:=%I1.8.2;
%M33:=%I1.8.3;
%M34:=%I1.8.4;
%M35:=%I1.8.5;
%M36:=%I1.8.6;
%M37:=%I1.8.7;
但應用數(shù)組變量,表達式可簡化為:
%M20:8:=%I0.5.0:8
其工作原理如下:
2.2 與功能塊的配合使用
在傳統(tǒng)的流量儀數(shù)據(jù)的采集中,采用的是4-20mA傳輸實時流量和脈沖信號計數(shù)傳輸累計流量的方法。在此方法中使用脈沖信號計數(shù)的方法在實際中存在隨時間增長而增長的誤差,故新型的流量儀一般都使用ModBus或其他總線通訊的方式來實現(xiàn)數(shù)據(jù)傳輸,通過讀取流量以內的特定地址數(shù)據(jù)并配合廠方提供的換算公式來得到準確的度數(shù)。
接下來以科?。↘ROHNE)流量儀為例,介紹使用ModBus協(xié)議讀取流量儀數(shù)據(jù)的方法,該方法包含了數(shù)組變量與自定義功能塊(功能塊的相關說明此處不做贅述,可參見UniPro說明文檔)。
根據(jù)科隆提供的說明資料,我們從流量儀讀到的瞬時流量為兩個字(WORD類型),累積流量為四個字。
首先參照流量儀制造商提供的換算公式編寫一個功能塊,輸入為流量儀特定地址的值,輸出為換算后的儀表讀數(shù)。示意圖如下:
建立完成功能塊之后,就可以使用數(shù)組變量來簡化編程,在一個項目中流量儀往往有許許多多,每遇到一個就引用一次功能塊不僅在編程的效率上比較低,還容易出現(xiàn)漏項缺項,重復建立等等認為錯誤,而使用數(shù)組變量來給功能塊的輸入輸出賦值就能避免上述問題。
舉例:
INDEX1:=0; (*輸入索引*)
INDEX2:=0; (*輸出索引*)
NUMBER:=6; (*設備臺數(shù)*)
REPEAT (*循環(huán)下方程序*)
F_INPUT_H:=%MW345[INDEX1]; (*瞬時流量數(shù)據(jù)占兩個字,將高16位讀入功能塊*)
F_INPUT_L:=%MW346[INDEX1]; (*將低16位讀入功能塊*)
F_INPUT_H_1:=%MW347[INDEX1]; (*累計流量數(shù)據(jù)占四個字,分別讀入功能塊*)
F_INPUT_L_1:=%MW348[INDEX1];
F_INPUT_H_2:=%MW349[INDEX1];
F_INPUT_L_2:=%MW350[INDEX1];
FLOW(EN:=1,INPUTH:=INT_TO_WORD(F_INPUT_H),INPUTL:=INT_TO_WORD(F_INPUT_L));
(*調用瞬時流量計算功能塊*)
RESULT:=FLOW_10.OUTPUT;(*取出瞬時結果*)
FLOWTOTAL(EN:=1,INPUT1H:=INT_TO_WORD(F_INPUT_H_1),INPUT1L:=INT_TO_WORD(F_INPUT_L_1),INPUT2H:=INT_TO_WORD(F_INPUT_H_2),INPUT2L:=INT_TO_WORD(F_INPUT_L_2));
(*調用累計流量計算功能塊*)
RESULT1:=FLOWTOTAL_10.OUTPUT;(*取出累積流量結果*)
%MF50[INDEX2]:=RESULT;(*瞬時流量計算結果自%MF50開始*)
%MF52[INDEX2]:=RESULT1; (*累計流量計算結果自%MF52開始*)
INDEX1:=INDEX1+6;(*輸入索引加6,每個設備含6個字的數(shù)據(jù)(瞬時2+累計4),一次循環(huán)后%MW345[INDEX1]所對應的地址為%MW351*)
INDEX2:=INDEX2+2;(*%MF占32位,%MF50[2]為%MF54*)
UNTIL INDEX1 = 6*NUMBER(*循環(huán)次數(shù)等于設備臺數(shù)后退出循環(huán)*)END_REPEAT;
在這個實例中前文提到的偏移量由一個變量“INDEX1”和“INDEX2”來代替
Index1的作用為將地址區(qū)右移一臺設備。
當輸入索引(INDEX1)等于“0”時,第一臺設備的數(shù)據(jù)被送到了功能塊的輸入接口上,通過功能塊內部的程序得出該組數(shù)據(jù)換算后的讀數(shù)并輸出,隨后下一臺設備的數(shù)據(jù)接著被送入功能塊,直到所有設備的數(shù)據(jù)都得到了換算。
在今后的改造過程中如有流量儀的增減,只需要改動設備臺數(shù)(NUMBER變量)即可,需要指出的是在編程時適當?shù)亓舫鲞B續(xù)空余的地址將有利于程序變動。
3 結束語
在編程中使用數(shù)組變量一是能降低工作強度,二來能避免人為失誤,還能節(jié)省程序體積。既降低了人力成本,又能通過縮減程序體積來降低處理器內存的使用以降低設備成本。綜上作者認為該方法是值得大力推廣的,故在此與大家分享,歡迎各位的意見與建議。