一、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)識使用的消息結(jié)構(gòu),結(jié)構(gòu)形式如下所示: 常用的功能碼如下:
舉例說明:主機(jī)要從17號從機(jī)讀3個(gè)采集到的基本數(shù)據(jù)U1、U2、U3,U1的地址為0000H, U2的地址為0001H,U3的地址為0002H。主機(jī)發(fā)送的命令格式是:110300000003075B 其中11是16進(jìn)制數(shù)表示的地址是17號從站,03表示查詢命令,0000是查詢的寄存器起始地址,0003是要查詢的寄存器末地址,075B是CRC校驗(yàn)值。 當(dāng)主機(jī)的信息幀到達(dá)終端設(shè)備時(shí),從機(jī)讀取數(shù)據(jù),如果沒有錯誤,就執(zhí)行數(shù)據(jù)所請求的任務(wù),然后,它將自己生成的數(shù)據(jù)幀返回給主機(jī)。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請求數(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è)例子是請求17號從機(jī)0040H的值為2717。主機(jī)發(fā)送命令:110600400A9D4D87 其中11是地址,06是功能碼(預(yù)設(shè)單寄存器),0040是寄存器地址,0A9D是數(shù)據(jù),等于十進(jìn)制的2717,4D87是CRC校驗(yàn)碼。從機(jī)對于預(yù)置單寄存器請求的正常響應(yīng)是在寄存器值改變以后將接收到的數(shù)據(jù)傳送回去。從機(jī)返回的數(shù)據(jù)是:110600400A9D4D87。 例如單片機(jī)作為主機(jī)要讀s7-200的V存儲區(qū)數(shù)據(jù),需要發(fā)送0C0300320004E4DB讀取保持寄存器(功能碼03)此例是要在12號從機(jī)的存儲區(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存儲區(qū)數(shù)據(jù)的子程序如下: FFJ03: MOV B,#10H ;'讀V存儲區(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 ;對發(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,對A置1 AJMP SB2 SB1: CLR A ;沒有檢測到OK,對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: 模式選擇,啟動/停止MODBUS,1=啟動;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存儲區(qū)字(VW) HoldStart: 保持寄存器區(qū)起始地址,以&VBx指定(間接尋址方式) Done: 初始化完成標(biāo)志,成功初始化后置1 Error: 初始化錯誤代碼 在本例子中,設(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è)鎖,在“查看”選屬性后會彈出密碼保護(hù)如下圖。 注意:本例子中,Modbus RTU 從站指令使用的庫存儲為VB0---VB779,這段寄存器地址不能再被程序中的任何指令使用,包括MBUS_INIT 和 MBUS_SLAVE 指令在內(nèi)。 |
|