一、Modbus協(xié)議簡介
S7-200 CPU上的通信口Port0支持Modbus RTU協(xié)議。要實(shí)現(xiàn)Modbus RTU通信,需要STEP 7-Micro/WIN32 V3.2以上版本的編程軟件,而且須安裝STEP 7-Micro/WIN32 V3.2 Instruction Library(指令庫)。Modbus RTU功能是通過指令庫中預(yù)先編好的程序功能塊實(shí)現(xiàn)的。
Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。它已經(jīng)成為通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。
協(xié)議用于主從查詢模式,進(jìn)行數(shù)據(jù)通訊。此協(xié)議定義了控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),結(jié)構(gòu)形式如下所示:
常用的功能碼如下:
代碼 | 名稱 | 作用 |
01 | 讀取線圈狀態(tài) | 取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF) ,功能 01 返回任意個(gè)數(shù)輸出點(diǎn)(Q)的 ON/OFF 狀態(tài)。 |
02 | 讀取輸入狀態(tài) | 取得一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF),功能 02 返回任意個(gè)數(shù)輸入點(diǎn)(I)的 ON/OFF 狀態(tài)。 |
03 | 讀取保持寄存器 | 讀取單個(gè)/多個(gè)保持寄存器。功能 03 返回 V 存儲(chǔ)區(qū)的內(nèi)容。在 Modbus 協(xié)議下保持寄存器都是'字'值,在一次請(qǐng)求中可以讀取最多 120 個(gè)字的數(shù)據(jù)。 |
04 | 讀取輸入寄存器 | 讀取單個(gè)/多個(gè)輸入寄存器。功能 04 返回 S7-200 的模擬量數(shù)據(jù)值。 |
05 | 強(qiáng)置單線圈 | 寫單個(gè)線圈(離散量輸出點(diǎn))。功能0 5 用于將離散量輸出點(diǎn)設(shè)置為指定的值。這個(gè)點(diǎn)不是被強(qiáng)制的,用戶程序可以覆蓋 Modbus 通信請(qǐng)求寫入的值。 |
06 | 預(yù)置單寄存器 | 寫單個(gè)保持寄存器。功能 06 寫一個(gè)值到 S7-200 的 V 存儲(chǔ)區(qū)的保持寄存器中。 |
07 | 讀取異常狀態(tài) | 取得8個(gè)內(nèi)部線圈的通斷狀態(tài) |
15 | 強(qiáng)置多線圈 | 寫多個(gè)線圈(離散量輸出點(diǎn))。功能 15 把多個(gè)離散量輸出點(diǎn)的值寫到 S7-200 的輸出映像寄存器(Q 區(qū))。輸出點(diǎn)的地址必須以字節(jié)邊界起始(如 Q0.0 或 Q2.0),并且輸出點(diǎn)的數(shù)目必須是 8 的整數(shù)倍。這是此 Modbus RTU 從站指令庫的限制。些點(diǎn)不是被強(qiáng)制的,用戶程序可以覆蓋 Modbus 通信請(qǐng)求寫入的值。 |
16 | 預(yù)置多寄存器 | 寫多個(gè)保持寄存器。功能 16 寫多個(gè)值到 S7-200 的 V 存儲(chǔ)區(qū)的保持寄存器中。在一次請(qǐng)求中可以寫最多 120 個(gè)字的數(shù)據(jù)。 |
17 | 報(bào)告從機(jī)標(biāo)識(shí) | 可使主機(jī)判斷編址從機(jī)的類型及該從機(jī)運(yùn)行指示燈的狀態(tài) |
舉例說明:主機(jī)要從17號(hào)從機(jī)讀3個(gè)采集到的基本數(shù)據(jù)U1、U2、U3,U1的地址為0000H, U2的地址為0001H,U3的地址為0002H。主機(jī)發(fā)送的命令格式是:110300000003075B
其中11是16進(jìn)制數(shù)表示的地址是17號(hào)從站,03表示查詢命令,0000是查詢的寄存器起始地址,0003是要查詢的寄存器末地址,075B是CRC校驗(yàn)值。
當(dāng)主機(jī)的信息幀到達(dá)終端設(shè)備時(shí),從機(jī)讀取數(shù)據(jù),如果沒有錯(cuò)誤,就執(zhí)行數(shù)據(jù)所請(qǐng)求的任務(wù),然后,它將自己生成的數(shù)據(jù)幀返回給主機(jī)。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請(qǐng)求數(shù)據(jù)(Data)和校驗(yàn)碼(Check)。如上例中主機(jī)發(fā)送110300000003075B,從機(jī)響應(yīng)格式是:11030603E803E703E9FD9C,其中11是地址(16進(jìn)制數(shù)),03是功能碼,06是返回的字節(jié)數(shù),03E803E703E9(U1=03E8H,U2=03E7H,U3=03E9H)是返回的6個(gè)字節(jié)數(shù)據(jù),F(xiàn)D9C是CRC校驗(yàn)碼。
另一個(gè)例子是請(qǐng)求17號(hào)從機(jī)0040H的值為2717。主機(jī)發(fā)送命令:110600400A9D4D87
其中11是地址,06是功能碼(預(yù)設(shè)單寄存器),0040是寄存器地址,0A9D是數(shù)據(jù),等于十進(jìn)制的2717,4D87是CRC校驗(yàn)碼。從機(jī)對(duì)于預(yù)置單寄存器請(qǐng)求的正常響應(yīng)是在寄存器值改變以后將接收到的數(shù)據(jù)傳送回去。從機(jī)返回的數(shù)據(jù)是:110600400A9D4D87。
例如單片機(jī)作為主機(jī)要讀s7-200的V存儲(chǔ)區(qū)數(shù)據(jù),需要發(fā)送0C0300320004E4DB讀取保持寄存器(功能碼03)此例是要在12號(hào)從機(jī)的存儲(chǔ)區(qū)起始地址是0032h地址讀4個(gè)數(shù)據(jù),返回8個(gè)字節(jié)。0C03080092009200000000A46F,若要讀PLC輸入狀態(tài)(功能碼02),發(fā)送0C0200000001返回0C02010162E4,若要讀PLC的輸出狀態(tài)(功能碼01),發(fā)送0C0100000001返回0C01010192E4。
二、51單片機(jī)作為主機(jī)讀寫S7-200數(shù)據(jù)的程序
在主程序中調(diào)用下面子程序即可。
51單片機(jī)讀PLC輸入狀態(tài)I0.0的子程序如下:
FFJ02: MOV B,#10H ;讀PLC輸入狀態(tài)I0.0
FJ4: MOV 2DH,#0CH ;地址;;;;;;;;;;;;
MOV 2EH,#02H ;功能碼02h
MOV 2FH,#00H ;起始開關(guān)量地址
MOV 30H,#00H ;起始寄存器地址
MOV 31H,#00H ;寄存器個(gè)數(shù),最多25個(gè)
MOV 32H,#01H
ORL AUX,#80H ;p1.6p1.7當(dāng)串口
CLR EA
SETB P3.7
MOV CRCCD,#06H
LCALL CRC
MOV R2,#08H
MOV R0,#2DH;2CH
FJ1: MOV SBUF,@R0
JNB TI,$
CLR TI
INC R0
DJNZ R2,FJ1
LCALL PDOK1 ;讀返回的DI,DO值
JNZ FJ0 ;如果沒有檢測到OK,重復(fù)發(fā)
CALL DELAY
DJNZ B,FJ4
FJ0: SETB FLAG_1
SETB EA
RET
51單片機(jī)讀V存儲(chǔ)區(qū)數(shù)據(jù)的子程序如下:
FFJ03: MOV B,#10H ;'讀V存儲(chǔ)區(qū)數(shù)據(jù)
FJ7: MOV 2DH,#0CH ;地址
MOV 2EH,#03H ;功能碼03h
MOV 2FH,#00H ;起始寄存器地址高位
MOV 30H,#32H ;起始寄存器地址低位
MOV 31H,#00H ;寄存器個(gè)數(shù),最多25個(gè)
MOV 32H,#04H
ORL AUX,#80H ;p1.6p1.7當(dāng)串口
CLR EA
SETB P3.7
MOV CRCCD,#06H
LCALL CRC
MOV R2,#08H
MOV R0,#2DH
AJMP FJ1
51單片機(jī)讀S7-200輸出狀態(tài)Q0.0的子程序如下:
FFJ033: MOV B,#10H ;讀'Q狀態(tài)
FJ9: MOV 2DH,#0CH ;地址;;;;;;;;;;;;
MOV 2EH,#01H ;功能碼02h
MOV 2FH,#00H ;起始開關(guān)量地址
MOV 30H,#00H ;起始寄存器地址
MOV 31H,#00H ;寄存器個(gè)數(shù),最多25個(gè)
MOV 32H,#01H
ORL AUX,#80H ;p1.6p1.7當(dāng)串口
SETB P3.7
CLR EA
MOV CRCCD,#06H
LCALL CRC
MOV R2,#08H
MOV R0,#2DH
AJMP FJ1
PDOK1: MOV R0,#35H
MOV R2,#11D
CLR P3.7
SETB REN
FXL2: CLR RI ;軟件清除串口中斷標(biāo)記
LCALL PDRI1 ;等待下一個(gè)串口數(shù)據(jù)
MOV A,SBUF ;將串口寄存器中接收到de數(shù)據(jù)給A
MOV @R0,A
INC R0
DJNZ R2,FXL2
MOV R0,#0C0H
CLR RI ;軟件清除串口中斷標(biāo)記
LCALL PDRI1 ;等待下一個(gè)串口數(shù)據(jù)
MOV A,SBUF ;將串口寄存器中接收到de數(shù)據(jù)給A
MOV @R0,A ;CRC存放首址
INC R0
CLR RI ;軟件清除串口中斷標(biāo)記
LCALL PDRI1 ;等待下一個(gè)串口數(shù)據(jù)
MOV A,SBUF ;將串口寄存器中接收到de數(shù)據(jù)給A
MOV @R0,A ;CRC校驗(yàn)碼第二字節(jié)
MOV R0,#35H ;對(duì)發(fā)來的數(shù)據(jù)進(jìn)行CRC校驗(yàn),
MOV CRCCD,#11D;
LCALL CRC1
MOV R0,#0C0H ;AAH-ABH存放下位機(jī)發(fā)來的CRC校驗(yàn)碼
MOV A,@R0 ;CRC校驗(yàn)碼首字節(jié)
CJNE A,06H,SB1 ;CRC校驗(yàn)碼首地址 06H=R6
INC R0
MOV A,@R0 ;CRC校驗(yàn)碼第二字節(jié)
CJNE A,07H,SB1 ;07H=R7
MOV A,#0FFH ;檢測到OK,對(duì)A置1
AJMP SB2
SB1: CLR A ;沒有檢測到OK,對(duì)A清零
SB2: CLR RI ;清除有串口數(shù)據(jù)標(biāo)志
SETB EA
RET
一、S7-200程序
1、 安裝Modbus協(xié)議庫
下載Modbus協(xié)議庫,打開目錄,點(diǎn)擊
進(jìn)行安裝。
安裝成功后左側(cè)瀏覽條的“庫”中如下圖:
2、S7-200程序
S7-200程序如下圖,首先調(diào)用MBUS_INIT模塊,初始化有關(guān)參數(shù),如波特率,奇偶校驗(yàn)等要與主機(jī)一致。每一項(xiàng)的含義如下所示:
Mode: 模式選擇,啟動(dòng)/停止MODBUS,1=啟動(dòng);0=停止
Address: 從站地址,MODBUS從站地址,取值1~247
Baud: 波特率,可選1200,2400,4800,9600,19200,38400,57600,115200
Parity: 奇偶校驗(yàn),0=無校驗(yàn);1=奇校驗(yàn);2=偶校驗(yàn)
Delay: 延時(shí),附加字符間延時(shí),缺省值為0
MaxIQ: 最大I/Q位,參與通信的最大I/O點(diǎn)數(shù),S7-200的I/O映像區(qū)為128/128,缺省值為128
MaxAI: 最大AI字?jǐn)?shù),參與通信的最大AI通道數(shù),可為16或32
MaxHold: 最大保持寄存器區(qū),參與通信的V存儲(chǔ)區(qū)字(VW)
HoldStart: 保持寄存器區(qū)起始地址,以&VBx指定(間接尋址方式)
Done: 初始化完成標(biāo)志,成功初始化后置1
Error: 初始化錯(cuò)誤代碼
在本例子中,設(shè)置從站地址為3
Port0 通訊波特率為9600
無校驗(yàn)
可以使用的S7-200最大數(shù)字量輸入輸出點(diǎn)數(shù)為128
可以使用的S7-200最大模擬量輸入寄存器字?jǐn)?shù)為32
可以使用的V區(qū)寄存器地址字?jǐn)?shù)為100, 起始地址為VB1000
SM0.0是s7-200的特殊寄存器,RUN監(jiān)控,PLC在運(yùn)行狀態(tài)時(shí),SM0.0總為ON。
本程序初始化完成后,還調(diào)用了MBUS_SLAVE子程序,它屬于協(xié)議庫的一部分。此程序是加密的。如下圖左面有一個(gè)鎖,在“查看”選屬性后會(huì)彈出密碼保護(hù)如下圖。
注意:本例子中,Modbus RTU 從站指令使用的庫存儲(chǔ)為VB0---VB779,這段寄存器地址不能再被程序中的任何指令使用,包括MBUS_INIT 和 MBUS_SLAVE 指令在內(nèi)。
聯(lián)系客服