主要內(nei) 容:
-
S7-200 PLC Modbus通訊概述
-
S7-200 PLC Modbus通訊指令,STEP7
-
S7-200 PLC Modbus通訊常問問題
(1)Modbus通訊
S7-200的Modbus通訊:
-
S7-200隻支持Modbus RTU協議,不支持Modbus ASCII協議;
-
Modbus是一種單主站的主/從(cong) 通信模式。一條Modbus網絡上同時隻能有一台主站,從(cong) 站可以有若幹個(ge) (如下圖所示)。從(cong) 站的地址範圍為(wei) 1-247;

-
一個(ge) Modbus通訊的傳(chuan) 輸字符應包括一個(ge) 起始位,8個(ge) 數據位,1個(ge) 或0個(ge) 校驗位(奇偶校驗或無校驗可選擇),以及一個(ge) 停止位
-
在S7-200 CPU通信口上實現的是RS485半雙工通信,使用的是S7-200的自由口功能。

上圖是一個(ge) 典型的主站和從(cong) 站的網絡結構,對於(yu) Modbus主站而言可以對從(cong) 站進行讀或者寫(xie) 的操作,其中它所支持的功能碼(FC,Function Code)包括主站左側(ce) 表格中所述功能,例如功能碼為(wei) '01'時表示讀取單個(ge) /多個(ge) 線圈(DO)狀態或功能碼為(wei) '04'時表示讀取單個(ge) /多個(ge) 輸入寄存器(AI)狀態。而對於(yu) 從(cong) 站,我們(men) 隻需要把Modbus的標準地址和從(cong) 站的地址對應關(guan) 係建立好就可以了,S7-200的從(cong) 站與(yu) Modbus標準的對應關(guan) 係如從(cong) 站右側(ce) 表格所示。表中左側(ce) 是Modbus標準地址碼,其中1-128對應於(yu) S7-200的Q0.0-Q15.7,10001-10128對應於(yu) S7-200的I0.0-I15.7,30001-30032對應於(yu) AIW0-AIW62,40001-4xxx對應的是S7-200的保持寄存器(V區),它的範圍是T-T+2*(xxxx-1),T表示的是V區的起始地址,這一點由Modbus從(cong) 站的指令所決(jue) 定的。

Modbus的主站指令叫做MBUS_MSG,通過這條指令可以將Modbus的標準報文發給從(cong) 站,例如在上圖例子當中從(cong) 站的第一個(ge) 字節是03,表示的是從(cong) 站的地址,FC功能碼為(wei) 03,表示的是讀取單個(ge) /多個(ge) 保存寄存器,Modbus標準地址是40001,長度是10。隨著功能碼的不同,報文的格式會(hui) 發生相應的變化,具體(ti) 的報文格式需要去參閱Modbus的通訊手冊(ce) 。

從(cong) 站的指令時MBUS _SLAVE,在接到主站發給它的報文後會(hui) 根據報文的需求返回報文,比如在上圖例子中返回的格式是第一個(ge) 字節為(wei) 從(cong) 站的地址,第二個(ge) 為(wei) 功能碼,第三個(ge) 是數據返回給主站,這樣就完成了一次Modbus通訊的請求與(yu) 應答的過程。
(2)STEP7中Modbus庫文件的安裝和調用
如果想要應用Modbus指令庫,那麽(me) 首先需要到因特網上或者向西門子的客服人員申請名稱為(wei) 'Toolbox_V32-STEP 7-Micro WIN' 的指令庫,將它解壓並且安裝到Micro WIN當中就可以使用了,安裝後會(hui) 在Micro WIN的庫文件當中出現上圖標記的三個(ge) 庫,其中Port0和Port1都可以做Modbus Master,而Slave隻有Port0口可以做。
(3)Modbus庫文件的使用

使用方法很簡單,打開Modbus主站指令庫會(hui) 有相應的指令塊出現,直接把指令塊拖拽到程序當中進行調用就可以了。

在調用Modbus庫指令的時候,需要注意一定記得為(wei) Modbus庫文件分配庫存儲(chu) 區。具體(ti) 的方法是右鍵單擊庫,然後選擇庫存儲(chu) 區,在彈出來的對話框當中可以選擇建議地址,自動分配一個(ge) 程序裏麵不會(hui) 用到的地址區間,也可以人為(wei) 地手動填寫(xie) 起始地址,這個(ge) 區間在程序當中不可以和其他的數據區相衝(chong) 突,否則Modbus功能將不正常。所謂的庫存儲(chu) 區其實就是Modbus指令庫能夠正常工作所必須的一部分背景數據,隻要給它分配好區間並保證不與(yu) 程序當中其他的地址相衝(chong) 突就可以了。
(4)Modbus從站指令,MBUS_INIT初始化和MBUS_SLAVE從站指令

從(cong) 站指令一共有兩(liang) 條,第一條是從(cong) 站的初始化指令(MBUS_INIT),另一條是MBUS_SLAVE從(cong) 站指令,在Modbus從(cong) 站的初始化指令當中涉及哪些內(nei) 容呢?首先,第一個(ge) 引腳Mode表示等於(yu) 1的時候是啟動Modbus,等於(yu) 0的時候是關(guan) 閉Modbus,Addr表示的是這個(ge) 從(cong) 站的從(cong) 站地址,Baud表示波特率,Parity是奇偶校驗,0是無校驗,1是奇校驗,2是偶校驗,Delay是附加字符之間的延遲,MaxIQ表示的是最大I/Q地址(默認128),MaxAI表示的是最大AI長度(默認32),MaxHold表示的是最大的V存儲(chu) 區(VW),最關(guan) 鍵的是HoldStart,表示的是V區起始地址(對應40001),在之前已經提到過S7-200作為(wei) 從(cong) 站的時候,它的V區地址對應於(yu) Modbus標準地址的起始地址是可更改的,那麽(me) 就在這裏進行設定,在本例中如果HoldStart寫(xie) 的是VB0,那麽(me) 40001對應的地址就是VW0,40002對應的地址是VW2,40003對應的地址是VW4,以此類推,每一個(ge) 標準的Modbus地址碼對應的是一個(ge) Word,以字為(wei) 單位,同樣如果這裏設的是VB100,那麽(me) 40001對應的就是VW100,40002對應的是VW102,以此類推。這一條初始化指令隻需要調用一次就可以了,所以在上圖中用的是SM0.1在上電的時候執行一次就可以了。
MBUS_SLAVE這個(ge) 功能塊必須要用前麵的條件必須是一直為(wei) 1的,上圖中用SM0.0。
(5)Modbus主站指令,MBUS_CTRL

Modbus主站指令當中的第一個(ge) 塊叫做MBUS_CTRL,MBUS_CTRL有哪些內(nei) 容呢?我們(men) 來看一下引腳定義(yi) 的說明:首先Mode寫(xie) 1的時候是選擇Modbus,寫(xie) 0的時候是選擇PPI;Baud表示波特率;Parity是奇偶校驗,0是無校驗,1是奇校驗,2是偶校驗,這與(yu) 從(cong) 站的設置相類似;Timeout表示的是主站等待從(cong) 站響應的時間(ms);Done位是初始化完成;Error位表示的是故障代碼。其中值得一提的是Timeout這個(ge) 時間,主站等待從(cong) 站響應的時間指的是什麽(me) 呢?讓我們(men) 來看一下主站和從(cong) 站之間通訊的過程:

首先,主站會(hui) 發一幀讀寫(xie) 請求給從(cong) 站,在主站的讀寫(xie) 請求發出後,從(cong) 站應當在Timeout指定的時間內(nei) 返回應答;如果在此時間內(nei) 從(cong) 站沒有應答,則主站發第2次讀寫(xie) 請求,第2次還不行發第3次讀寫(xie) 請求,如果連續3次在此時間內(nei) 從(cong) 站沒有應答,則主站認定從(cong) 站無相應,放棄該從(cong) 站並報錯。

下麵來看主站的讀寫(xie) 命令(MBUS_MSG),看一下引腳說明:首先First指的是讀寫(xie) 請求觸發(沿觸發),每當First這一端來了一個(ge) 沿,Modbus指令便會(hui) 做出一次讀或者寫(xie) 請求,RW標示的是這一次的命令是讀還是寫(xie) ,0表示讀,1表示寫(xie) ;Addr表示的是從(cong) 站數據地址(Modbus標準地址格式),0開頭、1開頭、3開頭和4開頭的;Count指的是通訊數據的長度,最大120個(ge) 字,單位可能是bit或word;DataPtr指的是參與(yu) 通訊的本方數據區,如果是讀指令標示的是讀回來的指令放在本地的哪一塊數據區,如果是寫(xie) 命令表示的是把本地的哪一塊數據發給對方;Done位和Error位分別是功能完成和故障代碼。

其中值得一提的是Count,剛才講過它的單位可能是bit或word,究竟是bit或word取決(jue) 於(yu) 當時所用的Modbus標準的地址碼是用的哪一塊,如果對於(yu) 1-128而言這是一個(ge) DO的輸出,對於(yu) 1開頭的是一個(ge) DI的輸入點,這個(ge) 時候Count的單位指的是bit,而對於(yu) 3開頭和4開頭的,那麽(me) 是AI和保存寄存器,它們(men) 的單位是word。需要注意的是當Count的單位是Bit時,一定Count的數值設置為(wei) 8的整數倍,否則會(hui) 出錯,這是因為(wei) 一個(ge) 基本傳(chuan) 輸的字符是包含8個(ge) 數據位的,沒有辦法隻傳(chuan) 送一個(ge) 或幾個(ge) bit。
(6)Modbus主從站輪詢

當存在Modbus多主站輪詢的時候,在程序當中我們(men) 應當如何處理呢?上圖中展示了這種方法。例如第一個(ge) MBUS_MSG指令我們(men) 可以利用它的Done位(本例中為(wei) M2.1),把它作為(wei) 第二條MBUS_MSG指令的First前麵的激活端,也就是說第一個(ge) MBUS_MSG完成的時候才會(hui) 去激活下一條MBUS_MSG指令,那麽(me) 同樣,第二條指令完成時我們(men) 把它作為(wei) 第三條MBUS_MSG指令的激活條件,在最後又把第三條指令的完成位還給第一條網絡,這樣的話就構成了一個(ge) 循環的輪詢方式。
(7)Modbus FAQ
Q1:S7-200是否支持Modbus ASCII模式?
答:S7-200可以支持上述模式,但是沒有現成的指令庫,需要用戶自己利用自由口的方式編程。
Q2:項目編譯後為(wei) 何出現很多錯誤?
答:使用指令庫時,若編譯後出現很多錯誤,一般是因為(wei) 未指定庫指令數據存儲(chu) 區。
Q3:Modbus從(cong) 站的網絡地址與(yu) S7-200的CPU網絡地址有何關(guan) 係?
答:沒有關(guan) 係。支持網絡通信的通信協議必須有其自己的網絡尋址規定。Modbus從(cong) 站的地址隻是它在Modbus網絡上的地址,而通常所說的S7-200 CPU地址是CPU在西門子的PPI網絡上的站地址。
Q4:MBUS_MSG指令中代表數據長度的COUNT引腳單位是什麽(me) ?
答:對於(yu) Modbus地址=0xxxx或1xxxx的,引腳單位為(wei) Bit;對於(yu) Modbus地址=3xxxx或4xxxx的,引腳單位為(wei) Word。
Q5:如何訪問大於(yu) 9999的保持寄存器地址?
答:Modbus Master協議庫支持超過9999的保持寄存器地址。地址範圍為(wei) 400001-465536。隻需在調用MBUS_MSG子程序時給Addr參數賦相應的值即可,如416768。
Q6:為(wei) 何有些HMI軟件使用Modbus RTU讀取S7-200中的實數會(hui) 出現錯誤?
答:不同的廠家關(guan) 於(yu) 浮點數格式定義(yi) 的不同,西門子的PLC遵循的是高位低存的規律,和其他的廠家有可能會(hui) 不一樣,這樣讀回來的實數或整數的高低字節會(hui) 發生反轉,這個(ge) 時候可以通過監控、判斷,在程序當中把它掉過來就可以了。
Q7:MBUS_MSG顯示Error 6#?
答:Error 6#表示Modbus正在忙於(yu) 其它請求。MBUS_MSG指令同時隻能允許有一個(ge) 讀寫(xie) 操作處於(yu) 運行過程,如果在一個(ge) 讀寫(xie) 操作尚未完成時啟用另外一個(ge) 讀寫(xie) 請求,就會(hui) 發生Error 6#。利用Done位可以對規避這一問題。
Q8:MBUS_MSG顯示Error 3#?
答:Error 3#表示從(cong) 站無應答。即主站的讀寫(xie) 請求發出後,從(cong) 站沒有在Timeout時間內(nei) 返回報文。多種原因可以引起此故障,包括:
-
硬件故障(線路,端口等問題)。
-
錯誤的從(cong) 站地址,波特率,奇偶校驗。
-
從(cong) 站不支持此功能碼,或不能被從(cong) 站識別的從(cong) 站數據地址。
-
Timeout時間過短(從(cong) 站響應較慢),通過延長Timeout可以解決(jue) 這個(ge) 問題。
關(guan) 注本公眾(zhong) 號,可提高PLC技術,拓寬PLC知識。