兩臺S7-200通過Modbus實現(xiàn)通訊
從站設(shè)置:
需要使用MBUS_INIT、MBUS_SLAVE即可;
MBUS_INIT指令被用于啟用和初始化或禁止Modbus通訊。(這一步在程序的前面,配置類的程序基本都放在程序前面)。在S7-200中,通訊的程序塊調(diào)用都需要設(shè)定完成為,確保通訊的完整性,只有把完整的數(shù)據(jù)格式發(fā)送或接收,才可以實現(xiàn)通訊,因此完成位是必須要有的。在每次掃描且EN輸入打開時執(zhí)行該指令。應(yīng)當(dāng)在每次通訊狀態(tài)改變時執(zhí)行 MBUS_INIT指令。一般程序設(shè)計僅在首次掃描時執(zhí)行。功能塊圖如下:
MODE:模式選擇位,1表示將port0指定給Modbus協(xié)議并啟用協(xié)議;0表示將port0指定給PPI;
!!!注意:指定給Modbus后,該端口不可以下載上傳程序,因此在程序設(shè)計中,可以加入控制位,串聯(lián)給I點即可,例程中未加入,可以自己嘗試;
Addr:從站地址1~247;
Baud:波特率設(shè)置1200、2400、4800、9600、19200、38400、57600或 115200;
Parity:校驗位0- 無校驗,1- 奇數(shù)校驗,2- 偶數(shù)校驗;
Delay:時延,通過將指定的毫秒數(shù)增加至標(biāo)準(zhǔn) Modbus信息超時的方法延長標(biāo)準(zhǔn)Modbus信息結(jié)束超時條件。該參數(shù)的典型數(shù)值在有線網(wǎng)絡(luò)上應(yīng)為 0。如果您在使用帶有糾錯功能的調(diào)制解調(diào)器,將時延設(shè)為50至100毫秒的數(shù)值。如果您在使用擴(kuò)展頻譜無線電,將時延設(shè)為10至100毫秒的數(shù)值。數(shù)值可以是0至32767毫秒。
MaxIQ:參數(shù)將供 Modbus地址 00xxxx 和 01xxxx 使用的I和Q點數(shù)設(shè)為0至128之間的數(shù)值。數(shù)值0禁止所有向輸入和輸出的讀取。建議使用的MaxIQ數(shù)值是128,該數(shù)值可在S7-200中存取所有的I和Q點。
MaxAI:參數(shù)將供 Modbus地址 03xxx 使用的字輸入(AI)寄存器數(shù)目設(shè)為0至32之間的數(shù)值。數(shù)值0禁止模擬輸入的讀數(shù)。建議使用的 MaxAI數(shù)值如下,這些數(shù)值可允許存取所有的S7-200模擬輸入。0 用于 CPU 221,16 用于 CPU 222,32 用于 CPU 224、 226 和 226XM;
MaxHold:參數(shù)設(shè)定供 Modbus地址04xxx使用的V內(nèi)存中的字保持寄存器數(shù)目。例如,為了允許主設(shè)備存取200字節(jié)的V內(nèi)存,將MaxHold設(shè)為100個字的數(shù)值(保持寄存器);
HoldStart: 參數(shù)是V內(nèi)存中保持寄存器的起始地址。該數(shù)值一般被設(shè)為VB0,因此 HoldStart 參數(shù)被設(shè)為&VB0(VB0地址)。其他V內(nèi)存地址可指定為保持寄存器的起始地址,以便在項目的其他地方使用VB0。Modbus主設(shè)備可存取V內(nèi)存MaxHold個字?jǐn)?shù),從 HoldStart開始。
Done:完成標(biāo)志位;
Error:錯誤代碼,字節(jié);
MBUS_SLAVE 指令被用于為Modbus主設(shè)備發(fā)出的請求服務(wù),并且必須在每次掃描時執(zhí)行,以便允許該指令檢查和回答Modbus請求。在每次掃描且EN輸入開啟時執(zhí)行該指令。MBUS_SLAVE指令無輸入?yún)?shù)。當(dāng)MBUS_SLAVE指令對Modbus請求作出應(yīng)答時, " 完成"輸出打開。如果沒有需要服務(wù)的請求時, "完成"輸出關(guān)閉。"錯誤"輸出包含執(zhí)行該指令的結(jié)果。該輸出只有在"完成"打開時才有效。如果"完成"關(guān)閉,錯誤參數(shù)不會改變。
通俗講法:將程序?qū)懺谶@個地方就可以了。
測試Network程序:
主站設(shè)置:
主站的設(shè)置通過MBUS_CTRL和MBUS_MSG子程序?qū)崿F(xiàn)通訊;
MBUS_CTRL如下
Mode模式:為 1 時,使能 Modbus 協(xié)議功能;為 0 時恢復(fù)為系統(tǒng) PPI 協(xié)議
Baud波特率:支持的通訊波特率為1200,2400,4800,9600,19200,38400,57600,115200。
Parity校驗:校驗方式選擇
0=無校驗
1=奇較驗
2=偶較驗
Timeout超時:主站等待從站響應(yīng)的時間,以毫秒為單位,典型的設(shè)置值為 1000 毫秒(1 秒),允許設(shè)置的范圍為 1 - 32767。
注意: 這個值必須設(shè)置足夠大以保證從站有時間響應(yīng)。
Done完成位:初始化完成,此位會自動置1。可以用該位啟動 MBUS_MSG 讀寫操作(見例程)
Error初始化錯誤代碼(只有在 Done 位為1時有效):
0= 無錯誤
1= 校驗選擇非法
2= 波特率選擇非法
3= 模式選擇非法
MBUS_MSG:
EN使能:同一時刻只能有一個讀寫功能(即 MBUS_MSG)使能
注意:建議每一個讀寫功能(即 MBUS_MSG)都用上一個 MBUS_MSG 指令的 Done 完成位來激活,以保證所有讀寫指令循環(huán)進(jìn)行(見例程)。
First讀寫請求位:每一個新的讀寫請求必須使用脈沖觸發(fā)
Slave從站地址:可選擇的范圍 1 - 247
RW從站地址:0 = 讀, 1 = 寫
注意:
1. 開關(guān)量輸出和保持寄存器支持讀和寫功能
2. 開關(guān)量輸入和模擬量輸入只支持讀功能
Addr讀寫從站的數(shù)據(jù)地址:
選擇讀寫的數(shù)據(jù)類型
00001 至 0xxxx - 開關(guān)量輸出
10001 至 1xxxx - 開關(guān)量輸入
30001 至 3xxxx - 模擬量輸入
40001 至 4xxxx - 保持寄存器
Count數(shù)據(jù)個數(shù)
通訊的數(shù)據(jù)個數(shù)(位或字的個數(shù))
注意: Modbus主站可讀/寫的最大數(shù)據(jù)量為120個字(是指每一個 MBUS_MSG 指令)
DataPtr數(shù)據(jù)指針:1. 如果是讀指令,讀回的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中
2. 如果是寫指令,要寫出的數(shù)據(jù)放到這個數(shù)據(jù)區(qū)中
Done完成位讀寫功能完成位
Error錯誤代碼:
只有在 Done 位為1時,錯誤代碼才有效
0 = 無錯誤
1 = 響應(yīng)校驗錯誤
2 = 未用
3 = 接收超時(從站無響應(yīng))
4 = 請求參數(shù)錯誤(slave address, Modbus address, count, RW)
5 = Modbus/自由口未使能
6 = Modbus正在忙于其它請求
7 = 響應(yīng)錯誤(響應(yīng)不是請求的操作)
8 = 響應(yīng)CRC校驗和錯誤
-
101 = 從站不支持請求的功能
102 = 從站不支持?jǐn)?shù)據(jù)地址
103 = 從站不支持此種數(shù)據(jù)類型
104 = 從站設(shè)備故障
105 = 從站接受了信息,但是響應(yīng)被延遲
106 = 從站忙,拒絕了該信息
107 = 從站拒絕了信息
108 = 從站存儲器奇偶錯誤
常見的錯誤:
- 如果多個 MBUS_MSG 指令同時使能會造成 6 號錯誤
- 庫存儲區(qū)被程序其它地方復(fù)用,有時也會造成6 號錯誤
- 從站 delay 參數(shù)設(shè)的時間過長會造成主站 3 號錯誤
- 從站掉電或不運行,網(wǎng)絡(luò)故障都會造成主站 3 號錯誤
例程: