|
1.概述 Modbus通訊協議是施耐德電氣開發並對外完全公布其細節的開放式通訊協議,得到眾多廠商的廣泛支持,從而有大量的第三方設備支持Modbus通訊,目前Modbus協議已經成為事實上的工業通訊標準,並被我國列為國標之一。 在目前工業控製中使用Modbus協議越來越普遍的情況下,一台PLC與多台支持Modbus協議的設備進行通訊的應用也成為目前的一種趨勢,在這種應用中通過一條或數條Modbuszongxian,lianjieduogeshebei,tidailaoshishebeizhongdemoniliangjiashuziliangdekongzhifangshi,jinenggengjialinghuodiwanchengkongzhiyaoqiu,younengjieyuedaliangdemoniliangjiashuziliang,congerjiangdishebeidechengben。 雖然在PLC中對Modbus通訊編程非常簡單,但如果在Modbus總線上有多個子站需要通訊時,PLC中程序的篇幅會非常長,並占用很多PLC的內部寄存器資源。
2 在施耐德電氣的PLC編程軟件中的更好的實現方法 在這裏以施耐德電氣的Twido係列PLC為例進行介紹。基於編程語言的相似性,以下程序實現方法在施耐德電氣的Micro及Premium係列PLC(PL7 Pro平台下)很容易移植。 先看一下在Twido中實現與一個Modbus子站(以施耐德電氣的ATV31變頻器為例)通訊的程序段:

在上麵的示範程序中,主要為Modbus通訊所需的數據區填寫相應的內容,詳細說明請參考Twido的手冊或其幫助文件。 數據區準備完成後需要用下麵指令將該數據區發送出去: 
如果與多個Modbuszizhantongxunshi,jiuyaobianxieduogeyushangshuchengxuduanchangduxiangtongerneironglveyoubutongdechengxuduan。zaizhongfuzuozhebufenchengxushi,shichengxudepianfudadajiachang,zhanyongdaliangdeneibuziyuan(如內部字MW),並使得PLC的掃描周期加長,這樣一來,使編程者需要考慮如何優化這類的程序,使之更加簡潔高效。 分析上麵的通訊程序,會得到幾個提示: 1、 不同子站Modbus通訊的數據區除子站地址部分外是完全一樣的; 2、 數據區發送出去的交換指令格式是完全一樣的 3、 在某一時刻,PLC隻能做一條讀或寫操作(廣播方式除外) 4、 讀操作讀回的數據在數據區起始位置的偏移量為6處開始 (請參考相應資料)
從上麵幾點分析著手,完全可以將與多個Modbus子(zi)站(zhan)通(tong)訊(xun)優(you)化(hua),隻(zhi)要(yao)處(chu)理(li)好(hao)在(zai)某(mou)一(yi)時(shi)刻(ke)將(jiang)要(yao)與(yu)之(zhi)通(tong)訊(xun)的(de)子(zi)站(zhan)地(di)址(zhi)填(tian)寫(xie)好(hao),在(zai)通(tong)訊(xun)數(shu)據(ju)區(qu)用(yong)交(jiao)換(huan)指(zhi)令(ling)發(fa)送(song)出(chu)去(qu)之(zhi)後(hou),及(ji)時(shi)將(jiang)讀(du)回(hui)來(lai)的(de)數(shu)據(ju)取(qu)出(chu)並(bing)保(bao)存(cun)好(hao)即(ji)可(ke)。 下麵對實現這一功能的程序的部分程序段做一說明,在這個程序中以讀施耐德電氣的3台ATV31變頻器的狀態及輸出頻率,並通過通訊控製ATV31的運行頻率。為減小本文的長度,在這個程序ATV31的啟停及正反轉控製用端子實現,在實際應用中,用通訊完成變頻器的啟停及正反轉控製也是完全沒有問題的。 與每一個子站通訊的時間長度控製,其中M2由係統時鍾位S5產生:

在程序中需要使用一個計數器來控製PLC與某一台ATV31的具體的通訊:

此計數器的作用在後麵的程序中可以體現出來。
填(tian)寫(xie)通(tong)訊(xun)數(shu)據(ju)區(qu)中(zhong)每(mei)個(ge)子(zi)站(zhan)不(bu)相(xiang)同(tong)的(de)部(bu)分(fen),這(zhe)部(bu)分(fen)數(shu)據(ju)必(bi)須(xu)存(cun)放(fang)兩(liang)個(ge)連(lian)續(xu)的(de)數(shu)據(ju)區(qu)中(zhong),以(yi)使(shi)後(hou)麵(mian)的(de)數(shu)據(ju)取(qu)出(chu)程(cheng)序(xu)能(neng)使(shi)用(yong)間(jian)接(jie)尋(xun)址(zhi)的(de)方(fang)式(shi),這(zhe)也(ye)是(shi)優(you)化(hua)程(cheng)序(xu)的(de)一(yi)個(ge)比(bi)較(jiao)關(guan)鍵(jian)之(zhi)處(chu)。 在這一例子程序中,將變頻器的輸出頻率值的控製簡化了,使3台變頻器的速度全部為30Hz,實際使用時,可能參考後麵的讀操作返回數據的保存方式,運用間接尋址方式編寫出相應的代碼: 
根據調度計數器的當前值,將與之對應的子站數據調入(使用了間接尋址):

通訊數據區中相同部分的填寫(注意其中MW202及MW232由上麵程序完成了): 
將通訊數據區用交換指令發送出去,MW481用來控製讀或寫操作:

下麵是比較關鍵的一步,將通訊讀回的數據保存起來,如1號變頻器的狀態及輸出頻率分別放在MW301及MW331中,2號變頻器數據放入MW302及MW332,3號變頻器數據放入MW303及MW333。

程序中%MW206<>0處用來指定讀操作有正確返回數據時,才將相應數據保存起來;%MW481=1的處理是為防止與前一子站通訊的數據影響與下一子站的通訊數據,同時配合%MW206<>0處的指令,使下一次與同一站點的通訊能地在有正確的返回數據後才被保存。 下麵為本程序的指令表,將之複製到一文本文件中,導入到Twidosoft新建的程序中,並將通訊端口配置好就可以正常使用。 在我編寫的一個由Twido PLC實現將22台TeSysU馬(ma)達(da)控(kong)製(zhi)器(qi)的(de)狀(zhuang)態(tai)及(ji)電(dian)流(liu)等(deng)數(shu)據(ju)上(shang)傳(chuan)到(dao)上(shang)一(yi)級(ji)網(wang)絡(luo)的(de)程(cheng)序(xu)中(zhong),使(shi)用(yong)本(ben)文(wen)介(jie)紹(shao)的(de)方(fang)法(fa),可(ke)以(yi)使(shi)程(cheng)序(xu)減(jian)小(xiao)到(dao)用(yong)常(chang)規(gui)方(fang)式(shi)編(bian)寫(xie)的(de)程(cheng)序(xu)的(de)二(er)十(shi)分(fen)之(zhi)一(yi),並(bing)使(shi)程(cheng)序(xu)中(zhong)使(shi)用(yong)的(de)MW字的使用量減少為可以使程序減小到用常規方式編寫的程序的二十分之一,同時使程序長度大為減小,增加程序的可讀性,加快PLC的掃描周期,效果非常明顯。
(* 初始化,0.1秒及1秒脈衝產生 *) LD 1 MPS AND( %S0 OR %S1 OR %S13 ) ST %S0 ST %M0 MRD AND %S4 ST %M1 MRD AND %S5 ST %M2 MPP AND %S6 ST %M3 (* 單條通訊時間長短控製 *) BLK %C0 LD [ %C0.V >= %C0.P ] R LD %M2 CU END_BLK (* 控製與PLC通訊的子站點及通訊類型的調度 *) BLK %C1 LD [ %C1.V >= %C1.P ] OR %M0 R LD %C0.D CU END_BLK (* 3台VSD的讀的地址及讀命令 *) LD 1 [ %MW401 := 16#0103 ] [ %MW402 := 16#0203 ] [ %MW403 := 16#0303 ] (* 3台VSD的寫的地址及寫命令 *) LD 1 [ %MW431 := 16#0110 ] [ %MW432 := 16#0210 ] [ %MW433 := 16#0310 ] (* 為便於簡化說明本程序,三台VSD的LFR設為一樣,並隻通過通訊控製VSD的LFR並不控製其運行停止 *) (* 如需要控製VSD的運行,同樣通過間接尋址將控製值通過C0.V的值分別送入 *) LD 1 [ %MW236 := 300 ] (* 根據通訊分配計數器C0的值判定對通訊端口發送讀數據區或寫數據區 *) LD 1 [ %MW481 := %C1.V REM 2 ] [ %MW482 := %C1.V / 2 ] (* 根據通訊分配計數器C0的值對通訊端口發送讀數據區或寫數據區寫入地址信息 *) (* MW481會決定發送讀還是寫指令,所以在任意時間MW202與MW232的內容一樣沒有影響 *) LD 1 MPS AND [ %MW481 = 0 ] [ %MW202 := %MW401[%MW482] ] MPP AND [ %MW481 = 1 ] [ %MW232 := %MW431[%MW482] ] (* 讀不同站號的VSD的ETA及RFR數據區相同部分 *) LD 1 [ %MW200 := 16#0106 ] [ %MW201 := 16#0300 ] [ %MW203 := 16#0C81 ] [ %MW204 := 2 ] (* 寫不同站號的VSD的LFR數據區相同部分 *) LD 1 [ %MW230 := 16#010A ] [ %MW231 := 16#0007 ] [ %MW233 := 16#2136 ] [ %MW234 := 16#0001 ] [ %MW235 := 16#0002 ] (* 通訊,STAT作通訊狀態指示,可去掉 *) LD 1 MPS AND %MSG2.D MPS AND [ %MW481 = 0 ] [ EXCH2 %MW200:9 ] MPP AND [ %MW481 = 1 ] [ EXCH2 %MW230:10 ] MPP ANDN %MSG2.D ST %S69 (* 得到3台VSD的ETA及RFR *) LD 1 MPS AND [ %MW481 = 0 ] AND [ %MW206 <> 0 ] [ %MW301[%MW482] := %MW207 ] [ %MW331[%MW482] := %MW208 ] MPP AND [ %MW481 = 1 ] [ %MW205:4 := 0 ]
|