S7-200作MODBUS RTU主站和从站例程教学
0前提&注意
S7-200 Modbus RTU 通信
為了在S7-200上應(yīng)用MODBUS RTU通信協(xié)議,Micro/WIN的軟件版本應(yīng)當(dāng)是STEP 7-Micro/WIN V3.2以上,并安裝Micro/WIN32 V3.2的Instruction Library(指令庫)軟件包(通常沒有被預(yù)裝):
此外,只有Port 0支持MODBUS RTU從站模式;Port 0和Port1都支持MODBUS RTU主站模式。
1 S7-200 MODBUS協(xié)議指令簡介
1.1 MODBUS主站協(xié)議指令
包括MBUS_CTRL和MBUS_MSG指令。
MBUS_CTRL指令
該指令用于主站通信初始化,主要針對(duì)S7-200 PORT0端口,需要在每個(gè)掃描周期調(diào)用,以便監(jiān)視MBUS_MSG指令啟動(dòng)的任何突發(fā)消息進(jìn)程。
MBUS_MSG指令
該指令用于啟動(dòng)MODBUS從站的請(qǐng)求并處理應(yīng)答。同一時(shí)刻僅能有一個(gè)MBUS_MSG指令執(zhí)行,因此執(zhí)行多個(gè)該指令時(shí),通常每個(gè)讀寫指令都用上一個(gè)指令的Done位激活,以此保證所有讀寫指令循環(huán)進(jìn)行。當(dāng)EN輸入?yún)?shù)和First輸入?yún)?shù)都為1時(shí),MBUS_MSG指令啟動(dòng)對(duì)MODBUS從站的請(qǐng)求。
部分指令輸入/輸出端意義
1.2 MODBUS從站協(xié)議指令
包括MBUS_INIT指令后MBUS_SLAVE指令。
MBUS_INIT指令
該指令用于啟用和初始化或禁止MODBUS從站通信。在使用MBUS_SLAVE指令之前必須正確執(zhí)行MBUS_INIT指令。應(yīng)在每次通信狀態(tài)改變時(shí)執(zhí)行該指令,因此EN輸入應(yīng)當(dāng)通過一個(gè)邊沿脈沖打開或僅在首次掃描時(shí)執(zhí)行。
部分指令輸入/輸出端意義
MBUS_SLAVE指令
該指令用于為MODBUS主設(shè)備發(fā)出的請(qǐng)求服務(wù),每次掃描時(shí)執(zhí)行,以便該指令檢查和回答Modbus。
部分指令輸入/輸出端意義
Done:MODBUS執(zhí)行通信中時(shí)為1,否則為0
2 MODBUS指令庫的添加方法
2.1添加指令庫
通常組態(tài)軟件沒有附帶指令庫,需額外下載。在官網(wǎng)下載壓縮包后,直接按提示安裝,然后重進(jìn)軟件即可。
2.2分配主站庫儲(chǔ)存區(qū)
從站庫儲(chǔ)存區(qū)的分配方法與本章所述方法一致。
調(diào)用STEP 7 - Mciro/WIN32 V3.2 Instruction Library(指令庫)需要分配庫指令數(shù)據(jù)區(qū)(Library Memory)。庫指令數(shù)據(jù)區(qū)是相應(yīng)庫的子程序和中斷程序所要用到的變量存儲(chǔ)空間。如果在編程時(shí)不分配庫指令數(shù)據(jù)區(qū),編譯時(shí)會(huì)產(chǎn)生許多相同的錯(cuò)誤。
●注意庫儲(chǔ)存區(qū)不得與其它儲(chǔ)存區(qū)重疊。
分配方法:
右擊【program block】,在菜單中選擇【library memory】,在彈出的選項(xiàng)中選擇【suggest address】,即可進(jìn)行地址的自動(dòng)分配(一般建議手動(dòng)分配)。
●該功能只考慮到了其他一般尋址,而未考慮到諸如Modbus數(shù)據(jù)保持寄存器區(qū)等的設(shè)置。應(yīng)當(dāng)確保不與其他任何已使用的數(shù)據(jù)區(qū)重疊、沖突。不應(yīng)重復(fù)按Suggest Address按鈕,否則也會(huì)造成混亂。
3 S7-200作MODBUS RTU主站例程
兩臺(tái)S7-200 PLC通過Modbus進(jìn)行通信時(shí),一臺(tái)為從站,一臺(tái)為主站,當(dāng)主站I0.2為ON時(shí),可通過Modbus方式讀取從站S7-200 PLC的I0.0~I0.7的數(shù)值。
3.1接線
使用RS485通信電纜連接主從站的PORT0口。
3.2編程
3.3測(cè)試結(jié)果
將PC-PPI編程線纜接入主站的PORT1口,改變從站IB0狀態(tài),接著撥主站I0.2為ON,在狀態(tài)表中對(duì)VB200進(jìn)行監(jiān)控,其值與從站IB0結(jié)果相對(duì)應(yīng)。
需注意的是由于程序限制(執(zhí)行MBUS_MSG指令需要EN和First同時(shí)為1,但是First參數(shù)只在I0.2為ON的上升沿為1,此后為0),若從站IB0狀態(tài)改變,需要手動(dòng)將主站I0.2復(fù)位然后再置位,狀態(tài)表才能刷新,否則將一直保持上一次的值。
若希望可以自動(dòng)刷新,可以對(duì)程序做如下改進(jìn):
即增加了重復(fù)計(jì)時(shí)的定時(shí)器來自動(dòng)刷新MBUS_MSG的指令。需注意定時(shí)器刷新周期過短可能會(huì)漏掉一些信息。
可以直接將VB200內(nèi)的信息傳送到QB0上通過指示燈顯示(即實(shí)現(xiàn)從站IB0控制主站QB0),免去了在軟件上監(jiān)控的麻煩:
如果要實(shí)現(xiàn)主站對(duì)從站的寫(主站IB0控制從站QB0),可添加如下程序:
此時(shí)程序中出現(xiàn)了兩個(gè)MBUS_MSG指令,同一時(shí)刻僅能有一個(gè)MBUS_MSG指令執(zhí)行,因此通常每個(gè)讀寫指令都用上一個(gè)指令的Done位(此處為M2.1)激活來保證所有讀寫指令循環(huán)進(jìn)行。
3.4注意及問題
●MODBUS從屬協(xié)議通信指定端口0,當(dāng)端口0被用于MODBUS從屬協(xié)議通信時(shí),就無法用于任何其他用途,包括與組態(tài)軟件通信。因此若要在CPU處于RUN時(shí)監(jiān)控程序或下載程序,可使用PORT1。
在實(shí)驗(yàn)過程(源程序)中MBUS_MSG指令接連出現(xiàn)了6號(hào)錯(cuò)誤、4號(hào)錯(cuò)誤和3號(hào)錯(cuò)誤。
3=接收超時(shí)(從站無響應(yīng))
4=請(qǐng)求參數(shù)錯(cuò)誤(slave address,Modbus address,count,RW)
6=Modbus正在忙于其它請(qǐng)求
僅能實(shí)現(xiàn)對(duì)部分問題的復(fù)現(xiàn):
觸發(fā)6號(hào)錯(cuò)誤的情況:從站沒有輸入(IB0均處于復(fù)位狀態(tài)時(shí))
3號(hào)問題和4號(hào)問題出現(xiàn)的情況未知,但是可以確定的是,在接線和程序正確的情況下,連續(xù)改變I0.2的值可消除此類問題。
4 S7-200作MODBUS RTU從站例程補(bǔ)充說明
本文是對(duì)官方文檔S7-200 Modbus RTU 通信的補(bǔ)充。
由于官方文檔并未提供從建立工程到使用MODSCAN 32進(jìn)行測(cè)試的完整步驟,這里再提供一篇更為完整的教程:
ModScan(主站)與200PLC(從站)的Modbus通訊
4.1梯形圖
由于官方教程已包含例程,可以直接引用官方例程,無需自己創(chuàng)建。
這里要注意MBUS_INIT的Addr(從站地址)、MaxHold(最大保持寄存器區(qū))和HoldSt~(保持寄存器區(qū)起始地址)。
從站地址取值1~247,不可與其它從站沖突。
由子程序參數(shù)HoldStart和MaxHold指定的保持寄存器區(qū),是在S7-200 CPU的V數(shù)據(jù)存儲(chǔ)區(qū)(CPU型號(hào)不同V數(shù)據(jù)存儲(chǔ)區(qū)大小不同)中分配,其中MaxHold規(guī)定了保持寄存器區(qū)的大小,HoldSt規(guī)定了保持寄存器區(qū)起始地址,默認(rèn)為VB0。要注意的是MaxHold以字為單位(VW),HoldSt以字節(jié)為單位(VB),而1W=2B。當(dāng)HoldStart = VB0,MaxHold=1000時(shí),保持寄存器區(qū)并非VB0~VB999,而是VB0~VB1999共2000個(gè)字節(jié)。
Modbus RTU 從站地址與S7-200的地址對(duì)應(yīng)關(guān)系如下表所示:
舉例,若HoldStart為VB1000,則按照公式,40001對(duì)應(yīng)VB1000,40002對(duì)應(yīng)VB10002;更確切的說VB1000和VB1001對(duì)應(yīng)40001,VB1002和VB1003對(duì)應(yīng)40002。
注意!:不同設(shè)備的Modbus協(xié)議起始地址不一定一樣,有些從0開始,有些從1開始;建議從0開始的設(shè)備地址加1,也從1開始。
庫指令區(qū)
庫指令數(shù)據(jù)區(qū)不能和保持寄存器區(qū)有任何重疊,否則在運(yùn)行時(shí)會(huì)產(chǎn)生錯(cuò)誤,不能正常通信。
庫指令數(shù)據(jù)區(qū)是相應(yīng)庫的子程序和中斷程序所要用到的變量存儲(chǔ)空間,如果在編程時(shí)不分配庫指令數(shù)據(jù)區(qū),編譯時(shí)會(huì)產(chǎn)生許多相同的錯(cuò)誤。該區(qū)缺省情況下是從VB0開始。建議不要使用"Suggest Address"按鈕進(jìn)行自動(dòng)分配,容易造成混亂。
向V數(shù)據(jù)儲(chǔ)存區(qū)的變量寫值
默認(rèn)情況下該區(qū)變量的值為0,若想要改變變量值,需要使用MOV_B指令。
當(dāng)HoldStart=VB1000時(shí),若想令40001=0102H,則:
特別提示
Modbus 指令庫啟動(dòng)后(即將MODBUS程序下載進(jìn)PLC并啟動(dòng)CPU后),將無法通過同一個(gè)通信端口進(jìn)行 CPU 監(jiān)控,也無法下載新工程。如要重新下載程序,必須先將CPU手動(dòng)置STOP再進(jìn)行下載或者使用Port1口進(jìn)行下載。
MODSCAN 32也是同樣的道理,使用STEP 7-Micro/WIN下載完成后如果不退出軟件,MODSCAN將無法與PLC建立通信;同理,MODSCAN與PLC建立通信后,即使將PLC的CPU撥至STOP也無法建立通信。
總結(jié)
以上是生活随笔為你收集整理的S7-200作MODBUS RTU主站和从站例程教学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宏杉科技的“存储七项式”方法论
- 下一篇: 从.Net到Java学习第四篇——spr