一、Modbus协议简介 S7-200 CPU上的通信口Port0支持Modbus RTU协议。要实现Modbus RTU通信,需要STEP 7-Micro/WIN32 V3.2以上版本的编程软件,而且须安装STEP 7-Micro/WIN32 V3.2 Instruction Library(指令库)。Modbus RTU功能是通过指令库中预先编好的程序功能块实现的。 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 协议用于主从查询模式,进行数据通讯。此协议定义了控制器能认识使用的消息结构,结构形式如下所示: 常用的功能码如下:
举例说明:主机要从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H, U2的地址为0001H,U3的地址为0002H。主机发送的命令格式是:110300000003075B 其中11是16进制数表示的地址是17号从站,03表示查询命令,0000是查询的寄存器起始地址,0003是要查询的寄存器末地址,075B是CRC校验值。 当主机的信息帧到达终端设备时,从机读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据帧返回给主机。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和校验码(Check)。如上例中主机发送110300000003075B,从机响应格式是:11030603E803E703E9FD9C,其中11是地址(16进制数),03是功能码,06是返回的字节数,03E803E703E9(U1=03E8H,U2=03E7H,U3=03E9H)是返回的6个字节数据,FD9C是CRC校验码。 另一个例子是请求17号从机0040H的值为2717。主机发送命令:110600400A9D4D87 其中11是地址,06是功能码(预设单寄存器),0040是寄存器地址,0A9D是数据,等于十进制的2717,4D87是CRC校验码。从机对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。从机返回的数据是:110600400A9D4D87。 例如单片机作为主机要读s7-200的V存储区数据,需要发送0C0300320004E4DB读取保持寄存器(功能码03)此例是要在12号从机的存储区起始地址是0032h地址读4个数据,返回8个字节。0C03080092009200000000A46F,若要读PLC输入状态(功能码02),发送0C0200000001返回0C02010162E4,若要读PLC的输出状态(功能码01),发送0C0100000001返回0C01010192E4。 二、51单片机作为主机读写S7-200数据的程序 在主程序中调用下面子程序即可。 51单片机读PLC输入状态I0.0的子程序如下: FFJ02: MOV B,#10H ;读PLC输入状态I0.0 FJ4: MOV 2DH,#0CH ;地址;;;;;;;;;;;; MOV 2EH,#02H ;功能码02h MOV 2FH,#00H ;起始开关量地址 MOV 30H,#00H ;起始寄存器地址 MOV 31H,#00H ;寄存器个数,最多25个 MOV 32H,#01H ORL AUX,#80H ;p1.6p1.7当串口 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,重复发 CALL DELAY DJNZ B,FJ4 FJ0: SETB FLAG_1 SETB EA RET 51单片机读V存储区数据的子程序如下: FFJ03: MOV B,#10H ;'读V存储区数据 FJ7: MOV 2DH,#0CH ;地址 MOV 2EH,#03H ;功能码03h MOV 2FH,#00H ;起始寄存器地址高位 MOV 30H,#32H ;起始寄存器地址低位 MOV 31H,#00H ;寄存器个数,最多25个 MOV 32H,#04H ORL AUX,#80H ;p1.6p1.7当串口 CLR EA SETB P3.7 MOV CRCCD,#06H LCALL CRC MOV R2,#08H MOV R0,#2DH AJMP FJ1 51单片机读S7-200输出状态Q0.0的子程序如下: FFJ033: MOV B,#10H ;读'Q状态 FJ9: MOV 2DH,#0CH ;地址;;;;;;;;;;;; MOV 2EH,#01H ;功能码02h MOV 2FH,#00H ;起始开关量地址 MOV 30H,#00H ;起始寄存器地址 MOV 31H,#00H ;寄存器个数,最多25个 MOV 32H,#01H ORL AUX,#80H ;p1.6p1.7当串口 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 ;软件清除串口中断标记 LCALL PDRI1 ;等待下一个串口数据 MOV A,SBUF ;将串口寄存器中接收到de数据给A MOV @R0,A INC R0 DJNZ R2,FXL2 MOV R0,#0C0H CLR RI ;软件清除串口中断标记 LCALL PDRI1 ;等待下一个串口数据 MOV A,SBUF ;将串口寄存器中接收到de数据给A MOV @R0,A ;CRC存放首址 INC R0 CLR RI ;软件清除串口中断标记 LCALL PDRI1 ;等待下一个串口数据 MOV A,SBUF ;将串口寄存器中接收到de数据给A MOV @R0,A ;CRC校验码第二字节 MOV R0,#35H ;对发来的数据进行CRC校验, MOV CRCCD,#11D; LCALL CRC1 MOV R0,#0C0H ;AAH-ABH存放下位机发来的CRC校验码 MOV A,@R0 ;CRC校验码首字节 CJNE A,06H,SB1 ;CRC校验码首地址 06H=R6 INC R0 MOV A,@R0 ;CRC校验码第二字节 CJNE A,07H,SB1 ;07H=R7 MOV A,#0FFH ;检测到OK,对A置1 AJMP SB2 SB1: CLR A ;没有检测到OK,对A清零 SB2: CLR RI ;清除有串口数据标志 SETB EA RET 一、S7-200程序 1、 安装Modbus协议库 下载Modbus协议库,打开目录,点击 进行安装。 安装成功后左侧浏览条的“库”中如下图: 2、S7-200程序 S7-200程序如下图,首先调用MBUS_INIT模块,初始化有关参数,如波特率,奇偶校验等要与主机一致。每一项的含义如下所示: Mode: 模式选择,启动/停止MODBUS,1=启动;0=停止 Address: 从站地址,MODBUS从站地址,取值1~247 Baud: 波特率,可选1200,2400,4800,9600,19200,38400,57600,115200 Parity: 奇偶校验,0=无校验;1=奇校验;2=偶校验 Delay: 延时,附加字符间延时,缺省值为0 MaxIQ: 最大I/Q位,参与通信的最大I/O点数,S7-200的I/O映像区为128/128,缺省值为128 MaxAI: 最大AI字数,参与通信的最大AI通道数,可为16或32 MaxHold: 最大保持寄存器区,参与通信的V存储区字(VW) HoldStart: 保持寄存器区起始地址,以&VBx指定(间接寻址方式) Done: 初始化完成标志,成功初始化后置1 Error: 初始化错误代码 在本例子中,设置从站地址为3 Port0 通讯波特率为9600 无校验 可以使用的S7-200最大数字量输入输出点数为128 可以使用的S7-200最大模拟量输入寄存器字数为32 可以使用的V区寄存器地址字数为100, 起始地址为VB1000 SM0.0是s7-200的特殊寄存器,RUN监控,PLC在运行状态时,SM0.0总为ON。 本程序初始化完成后,还调用了MBUS_SLAVE子程序,它属于协议库的一部分。此程序是加密的。如下图左面有一个锁,在“查看”选属性后会弹出密码保护如下图。 注意:本例子中,Modbus RTU 从站指令使用的库存储为VB0---VB779,这段寄存器地址不能再被程序中的任何指令使用,包括MBUS_INIT 和 MBUS_SLAVE 指令在内。 |
|