1.概述 Modbus通訊協(xié)議是施耐德電氣開發(fā)并對外完全公布其細(xì)節(jié)的開放式通訊協(xié)議,得到眾多廠商的廣泛支持,從而有大量的第三方設(shè)備支持Modbus通訊,目前Modbus協(xié)議已經(jīng)成為事實上的工業(yè)通訊標(biāo)準(zhǔn),并被我國列為國標(biāo)之一。 在目前工業(yè)控制中使用Modbus協(xié)議越來越普遍的情況下,一臺PLC與多臺支持Modbus協(xié)議的設(shè)備進行通訊的應(yīng)用也成為目前的一種趨勢,在這種應(yīng)用中通過一條或數(shù)條Modbus總線,連接多個設(shè)備,替代老式設(shè)備中的模擬量加數(shù)字量的控制方式,既能更加靈活地完成控制要求,又能節(jié)約大量的模擬量加數(shù)字量,從而降低設(shè)備的成本。 雖然在PLC中對Modbus通訊編程非常簡單,但如果在Modbus總線上有多個子站需要通訊時,PLC中程序的篇幅會非常長,并占用很多PLC的內(nèi)部寄存器資源。
2 在施耐德電氣的PLC編程軟件中的更好的實現(xiàn)方法 在這里以施耐德電氣的Twido系列PLC為例進行介紹;诰幊陶Z言的相似性,以下程序?qū)崿F(xiàn)方法在施耐德電氣的Micro及Premium系列PLC(PL7 Pro平臺下)很容易移植。 先看一下在Twido中實現(xiàn)與一個Modbus子站(以施耐德電氣的ATV31變頻器為例)通訊的程序段:

在上面的示范程序中,主要為Modbus通訊所需的數(shù)據(jù)區(qū)填寫相應(yīng)的內(nèi)容,詳細(xì)說明請參考Twido的手冊或其幫助文件。 數(shù)據(jù)區(qū)準(zhǔn)備完成后需要用下面指令將該數(shù)據(jù)區(qū)發(fā)送出去: 
如果與多個Modbus子站通訊時,就要編寫多個與上述程序段長度相同而內(nèi)容略有不同的程序段。在重復(fù)做這部分程序時,使程序的篇幅大大加長,占用大量的內(nèi)部資源(如內(nèi)部字MW),并使得PLC的掃描周期加長,這樣一來,使編程者需要考慮如何優(yōu)化這類的程序,使之更加簡潔高效。 分析上面的通訊程序,會得到幾個提示: 1、 不同子站Modbus通訊的數(shù)據(jù)區(qū)除子站地址部分外是完全一樣的; 2、 數(shù)據(jù)區(qū)發(fā)送出去的交換指令格式是完全一樣的 3、 在某一時刻,PLC只能做一條讀或?qū)懖僮?廣播方式除外) 4、 讀操作讀回的數(shù)據(jù)在數(shù)據(jù)區(qū)起始位置的偏移量為6處開始 (請參考相應(yīng)資料)
從上面幾點分析著手,完全可以將與多個Modbus子站通訊優(yōu)化,只要處理好在某一時刻將要與之通訊的子站地址填寫好,在通訊數(shù)據(jù)區(qū)用交換指令發(fā)送出去之后,及時將讀回來的數(shù)據(jù)取出并保存好即可。 下面對實現(xiàn)這一功能的程序的部分程序段做一說明,在這個程序中以讀施耐德電氣的3臺ATV31變頻器的狀態(tài)及輸出頻率,并通過通訊控制ATV31的運行頻率。為減小本文的長度,在這個程序ATV31的啟停及正反轉(zhuǎn)控制用端子實現(xiàn),在實際應(yīng)用中,用通訊完成變頻器的啟停及正反轉(zhuǎn)控制也是完全沒有問題的。 與每一個子站通訊的時間長度控制,其中M2由系統(tǒng)時鐘位S5產(chǎn)生:

在程序中需要使用一個計數(shù)器來控制PLC與某一臺ATV31的具體的通訊:

此計數(shù)器的作用在后面的程序中可以體現(xiàn)出來。
填寫通訊數(shù)據(jù)區(qū)中每個子站不相同的部分,這部分?jǐn)?shù)據(jù)必須存放兩個連續(xù)的數(shù)據(jù)區(qū)中,以使后面的數(shù)據(jù)取出程序能使用間接尋址的方式,這也是優(yōu)化程序的一個比較關(guān)鍵之處。 在這一例子程序中,將變頻器的輸出頻率值的控制簡化了,使3臺變頻器的速度全部為30Hz,實際使用時,可能參考后面的讀操作返回數(shù)據(jù)的保存方式,運用間接尋址方式編寫出相應(yīng)的代碼: 
根據(jù)調(diào)度計數(shù)器的當(dāng)前值,將與之對應(yīng)的子站數(shù)據(jù)調(diào)入(使用了間接尋址):

通訊數(shù)據(jù)區(qū)中相同部分的填寫(注意其中MW202及MW232由上面程序完成了): 
將通訊數(shù)據(jù)區(qū)用交換指令發(fā)送出去,MW481用來控制讀或?qū)懖僮鳎?BR>

下面是比較關(guān)鍵的一步,將通訊讀回的數(shù)據(jù)保存起來,如1號變頻器的狀態(tài)及輸出頻率分別放在MW301及MW331中,2號變頻器數(shù)據(jù)放入MW302及MW332,3號變頻器數(shù)據(jù)放入MW303及MW333。

程序中%MW206<>0處用來指定讀操作有正確返回數(shù)據(jù)時,才將相應(yīng)數(shù)據(jù)保存起來;%MW481=1的處理是為防止與前一子站通訊的數(shù)據(jù)影響與下一子站的通訊數(shù)據(jù),同時配合%MW206<>0處的指令,使下一次與同一站點的通訊能地在有正確的返回數(shù)據(jù)后才被保存。 下面為本程序的指令表,將之復(fù)制到一文本文件中,導(dǎo)入到Twidosoft新建的程序中,并將通訊端口配置好就可以正常使用。 在我編寫的一個由Twido PLC實現(xiàn)將22臺TeSysU馬達(dá)控制器的狀態(tài)及電流等數(shù)據(jù)上傳到上一級網(wǎng)絡(luò)的程序中,使用本文介紹的方法,可以使程序減小到用常規(guī)方式編寫的程序的二十分之一,并使程序中使用的MW字的使用量減少為可以使程序減小到用常規(guī)方式編寫的程序的二十分之一,同時使程序長度大為減小,增加程序的可讀性,加快PLC的掃描周期,效果非常明顯。
(* 初始化,0.1秒及1秒脈沖產(chǎn)生 *) 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通訊的子站點及通訊類型的調(diào)度 *) 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設(shè)為一樣,并只通過通訊控制VSD的LFR并不控制其運行停止 *) (* 如需要控制VSD的運行,同樣通過間接尋址將控制值通過C0.V的值分別送入 *) LD 1 [ %MW236 := 300 ] (* 根據(jù)通訊分配計數(shù)器C0的值判定對通訊端口發(fā)送讀數(shù)據(jù)區(qū)或?qū)憯?shù)據(jù)區(qū) *) LD 1 [ %MW481 := %C1.V REM 2 ] [ %MW482 := %C1.V / 2 ] (* 根據(jù)通訊分配計數(shù)器C0的值對通訊端口發(fā)送讀數(shù)據(jù)區(qū)或?qū)憯?shù)據(jù)區(qū)寫入地址信息 *) (* MW481會決定發(fā)送讀還是寫指令,所以在任意時間MW202與MW232的內(nèi)容一樣沒有影響 *) LD 1 MPS AND [ %MW481 = 0 ] [ %MW202 := %MW401[%MW482] ] MPP AND [ %MW481 = 1 ] [ %MW232 := %MW431[%MW482] ] (* 讀不同站號的VSD的ETA及RFR數(shù)據(jù)區(qū)相同部分 *) LD 1 [ %MW200 := 16#0106 ] [ %MW201 := 16#0300 ] [ %MW203 := 16#0C81 ] [ %MW204 := 2 ] (* 寫不同站號的VSD的LFR數(shù)據(jù)區(qū)相同部分 *) LD 1 [ %MW230 := 16#010A ] [ %MW231 := 16#0007 ] [ %MW233 := 16#2136 ] [ %MW234 := 16#0001 ] [ %MW235 := 16#0002 ] (* 通訊,STAT作通訊狀態(tài)指示,可去掉 *) 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 ]
|