Modbus通訊標準協議可以通過各種傳(chuan) 輸方式傳(chuan) 播,如RS-232C、RS-485、光纖、無線電等。Modbus具有兩(liang) 種串行傳(chuan) 輸模式,ASC2和RTU模式。支持Modbus協議的一般都支持RTU模式,通信雙方(主站和從(cong) 站)必須同時支持上述模式中的一種。一般都使用RTU模式。
Modbus是一種單主站的主/從(cong) 通信模式,Modbus網絡上隻能有一個(ge) 主站存在(注意和PPI協議的區別),主站在Modbus網絡上沒有地址,從(cong) 站的地址範圍為(wei) 0-247,其中0為(wei) 廣播地址,從(cong) 站的實際地址範圍為(wei) 1-247。
主站
NO.1 初始化
使用MODBUS通訊協議,必須首先初始化程序,使用MBUS_CTRL可初始化、監視或禁用Modbus通訊,在使用MBUS_MSG指令之前,必須正確執行MBUS_CTRL指令。指令完成後立即設定'完成'位,才能繼續執行下一條指令。在每次掃描且 EN輸入打開時執行該指令。
MBUS_CTRL指令必須在每次掃描時(包括首次掃描)被調用,
Mode('模式')輸入數值選擇通訊協議。輸入值1(可用SM0.0替代或者直接用數值1)將CPU端口分配給Modbus協議並啟用該協議。輸入值0將CPU端口分配給PPI係統協議並禁用Modbus協議。
Baud (波特率)一般選擇9600。
Parity (奇偶校驗) 參數被設為(wei) 與(yu) Modbus從(cong) 站奇偶校驗相匹配。所有設置使用一個(ge) 起始位和一個(ge) 停止位。一般選擇偶校驗2.
Timeout('超時')參數設為(wei) 等待來自從(cong) 站應答的毫秒時間數。'超時'數值可以設置的範圍為(wei) 1毫秒到32767毫秒。典型值是1000毫秒(1秒)(一般都設定為(wei) 1000)
。'超時'參數應該設置的足夠大,以便從(cong) 站有時間對所選的波特率作出應答。
'超時'參數用於(yu) 確定Modbus從(cong) 站是否對請求做出應答。'超時'值確定Modbus主設備在發送了請求的最後一個(ge) 字符後,將要等待多長時間才會(hui) 有應答的第一個(ge) 字符。如果在'超時'規定的時間內(nei) 至少收到應答的一個(ge) 字符,Modbus主設備將從(cong) Modbus從(cong) 站接收到整個(ge) 應答。
Done(完成) MBUS_CTRL指令完成時,'完成'輸出打開。
Error(錯誤) 輸出包含執行該指令的結果。下表定義(yi) 了在執行MBUS_CTRL指令時會(hui) 產(chan) 生的錯誤條件。指定一個(ge) 字節來存放錯誤代碼。
錯誤代碼 說明
0 無錯誤
1 奇偶校驗選擇無效
2 波特率選擇無效
3 超時選擇無效
4 模式選擇無效
初始化完成!
NO.2 啟動Modbus協議
讀操作
MBUS_MSG(端口0使用)指令(或用於(yu) 端口1的MBUS_MSG_P1)用於(yu) 啟動對Modbus從(cong) 站的請求並處理應答。
當EN輸入和'首次'輸入打開時,BUS_MSG指令啟動對Modbus從(cong) 站的請求。發送請求、等待應答、並處理應答通常需要多次掃描。EN輸入必須打開以啟用請求的發送,並應該保持打開直到'完成'位(M10.1)被置位。
First(首次啟動),在有新請求要發送時才打開以進行一次掃描,通過一個(ge) 邊沿檢測元素(例如上升沿)打開,這將導致請求被傳(chuan) 送一次。
Slave(從(cong) 站地址) 從(cong) 站的地址,允許的範圍是0到247,地址0是廣播地址,隻能用於(yu) 寫(xie) 請求。不存在對地址0的廣播請求的應答。從(cong) 站的實際地址範圍為(wei) 1-247(從(cong) 站的地址(Slave)在1-247範圍內(nei) 任選一個(ge) 數即可,但需要和從(cong) 站程序中的地址對應,否則通訊失敗)。主站在Modbus網絡上沒有地址。
RW('讀寫(xie) ') 指定是用來讀取還是寫(xie) 入該消息。'讀寫(xie) '參數允許使用下列兩(liang) 個(ge) 值。
0 讀
1 寫(xie)
Addr (地址) 是指向讀取或寫(xie) 入的起始Modbus地址,'地址'的指定取值範圍基於(yu) Modbus從(cong) 站支持的地址。一般都取40001。
Count (計數) 指定在該請求中讀取或寫(xie) 入的數據元素的數目,MBUS_MSG指令將讀取或寫(xie) 入最大120個(ge) 字或1920個(ge) 位(240字節的數據)。'計數'的實際限值將取決(jue) 於(yu) Modbus從(cong) 站中的限製。
DataPtr(地址指針) 指向S7-200 CPU的V存儲(chu) 器中與(yu) 讀取或寫(xie) 入請求相關(guan) 的數據的間接地址指針。DataPtr值作為(wei) 間接地址指針傳(chuan) 遞到MBUS_MSG。例如,如果要寫(xie) 入Modbus從(cong) 站的數據從(cong) S7-200 CPU中的地址VW200開始,則DataPtr的數值將會(hui) 是&VB200 (VB200的地址)。指針必須始終是VB類型,即使它們(men) 指向字數據。
Done(完成位) 輸出在發送請求和接收應答時關(guan) 閉。'完成'輸出在應答完成或MBUS_MSG指令因錯誤而中止時打開。完成信息存入輔助寄存器中(如M10.1)
Error(錯誤) 輸出僅(jin) 當'完成'輸出打開時有效,反饋錯誤代碼,存入輔助位寄存器中(如MB6)
MBUS_MSG。
錯誤代碼 說明
0 無錯誤
1 應答時奇偶校驗錯誤:僅(jin) 當使用偶校驗或奇校驗時才會(hui) 發生。傳(chuan) 輸被幹擾,可能會(hui) 收到不正確的數據。該錯誤通常是由電氣故障(例如錯誤接線或者影響通訊的電噪聲)引起的。
2 未使用
3 接收超時:在'超時'時間內(nei) ,沒有來自從(cong) 站的應答。可能有以下一些原因:與(yu) 從(cong) 站的電氣連接有問題、主設備和從(cong) 站設置為(wei) 不同的波特率/奇偶校驗設置,以及錯誤的從(cong) 站地址。
4 請求參數出錯:一個(ge) 或多個(ge) 輸入參數(從(cong) 站、讀寫(xie) 、地址或計數)被設置為(wei) 非法值。檢查文檔中輸入參數的允許值。
5 Modbus主設備未啟用:在調用MBUS_MSG前,每次掃描時都調用MBUS_CTRL。
6 Modbus忙於(yu) 處理另一個(ge) 請求:一次隻能激活一條MBUS_MSG指令。
7 應答時出錯: 收到的應答與(yu) 請求不相關(guan) 。這表示從(cong) 站中出現了某些錯誤,或者錯誤的從(cong) 站應答了請求。
8 應答時CRC錯誤: 傳(chuan) 輸被幹擾,可能會(hui) 收到不正確的數據。該錯誤通常是由電氣故障(例如錯誤接線或者影響通訊的電噪聲)引起的。
101 從(cong) 站不支持在該地址處所請求的功能:請參閱'使用Modbus主設備指令'幫助主題中的所需Modbus從(cong) 站功能支持表。
102 從(cong) 站不支持數據地址:'地址'加上'計數'所要求的地址範圍超出了從(cong) 站所允許的地址範圍。
103 從(cong) 站不支持數據類型:該'地址'類型不被從(cong) 站支持。
104 從(cong) 站故障
105 從(cong) 站已接受消息但應答延遲:這是MBUS_MSG的錯誤,用戶程序應在稍後重新發送請求。
106 從(cong) 站忙,因此拒絕消息:可以再次嚐試相同的請求,以獲得應答。
107 從(cong) 站因未知原因而拒絕消息。
108 從(cong) 站存儲(chu) 器奇偶校驗錯誤:從(cong) 站中有錯誤。
低位編號的錯誤代碼(1到8)是由MBUS_MSG指令檢測到的錯誤。這些錯誤代碼通常指示與(yu) MBUS_MSG指令的輸入參數有關(guan) 的問題,或接收來自從(cong) 站的應答時出現的問題。奇偶校驗和CRC錯誤指示存在應答但是數據未正確接收。這通常是由電氣故障(例如連接有問題或者電噪聲)引起的。
高位編號的錯誤代碼(從(cong) 101開始)是由Modbus從(cong) 站返回的錯誤。這些錯誤指示從(cong) 站不支持所請求的功能,或者所請求的地址(或數據類型或地址範圍)不被Modbus從(cong) 站支持。
由於(yu) 一次隻能激活一條MBUS_MSG指令。所以在第一條MBUS_MSG指令完成後,啟動第二條指令,同時必須複位第一條指令。如果啟用了多條MBUS_MSG指令,則將處理所執行的第一條MBUS_MSG指令,之後的所有MBUS_MSG指令將中止並產(chan) 生錯誤代碼6。
寫(xie) 操作
M10.0動作之後啟動第二條MBUS_MSG指令(寫(xie) 指令)(所謂通訊就是主/從(cong) 的讀、寫(xie) 或者讀寫(xie) 的交互過程),將主站的數據寫(xie) 入到從(cong) 站的處理器中。
Slave(從(cong) 站地址) 同讀操作不變,地址與(yu) 從(cong) 站相一致。
RW寫(xie) 1,啟動“寫(xie) ”功能。
Addr 不能與(yu) “讀”地址重合。
Count 同上。
DataPtr 同上,不能與(yu) 讀操作地址重複。
Done 同上,存儲(chu) 器不能重複。
Error 同上,位寄存器最好不要重複。
寫(xie) 操作完成後,置位讀操作,複位寫(xie) 操作。
讀寫(xie) 循環執行
數據傳(chuan) 送,(進行對話)
從(cong) 站
MBUS_INIT指令被用於(yu) 啟用和初始化或禁止Modbus通訊。在使用MBUS_SLAVE指令之前,必須正確執行MBUS_INIT指令。指令完成後立即設定'完成'位,才能繼續執行下一條指令。
Mode(模式) 為(wei) 1,啟用Modbus協議。
Addr(地址) 與(yu) 主站的尋址對應一致。
Baud (波特率)一般選擇9600。
Parity (奇偶校驗) 參數被設為(wei) 與(yu) Modbus從(cong) 站奇偶校驗相匹配。所有設置使用一個(ge) 起始位和一個(ge) 停止位。一般選擇偶校驗2.(和主站保持一致)
Delay('延時')參數通過將指定的毫秒數增加至標準Modbus信息超時的方法延長標準Modbus信息結束超時條件。該參數的典型數值在有線網絡上應為(wei) 0。
MaxIQ 參數將供Modbus地址0xxxx和1xxxx使用的I和Q點數設為(wei) 0至128之間的數值。建議使用的MaxIQ數值是128,該數值可在S7-200中存取所有的I和Q點。
MaxAI參數將供Modbus地址3xxxx使用的字輸入(AI)寄存器數目設為(wei) 0至32之間的數值。
建議使用的MaxAI數值如下,這些數值可允許存取所有的S7-200模擬輸入:(根據CPU型號選擇數值)
0用於(yu) CPU 221
16用於(yu) CPU 222
32用於(yu) CPU 224、224XP、226和226XM。
MaxHold 參數設定供Modbus地址4xxxx使用的V存儲(chu) 器中的字保持寄存器數目。例如,為(wei) 了允許主設備存取2000個(ge) 字節的V存儲(chu) 器,將MaxHold 設為(wei) 1000個(ge) 字的數值(保持寄存器)。
HoldStart參數是V存儲(chu) 器中保持寄存器的起始地址,Modbus主設備可存取V內(nei) 存MaxHold個(ge) 字數,從(cong) HoldStart開始。
Done(完成)MBUS_INIT指令完成時,'完成'輸出打開。
Error(錯誤)'錯誤'輸出字節包含執行指令的結果。
錯誤代碼 說明
0 無錯誤
1 內(nei) 存範圍錯誤
2 非法波特率或奇偶校驗
3 非法從(cong) 屬地址
4 非法Modbus參數值
5 保持寄存器與(yu) Modbus從(cong) 屬符號重疊
6 收到奇偶校驗錯誤
7 收到CRC錯誤
8 非法功能請求/功能不受支持
9 請求中的非法內(nei) 存地址
10 從(cong) 屬功能未啟用
MBUS_SLAVE指令被用於(yu) 為(wei) Modbus主設備發出的請求服務。
如果'完成'關(guan) 閉,錯誤參數不會(hui) 改變。
40001至4xxxx是映射至V存儲(chu) 器的保持寄存器。
所有Modbus地址均以1為(wei) 基位。
下表顯示映射至S7-200地址的Modbus地址。
4xxxx HoldStart+2 x (xxxx-1)。
40011 1000+2*(11-1)=1020 。
接收數據