分享

S7-200 CPU上的通信口Port0支持Modbus RTU协议

 打遍天下的酱油 2018-05-20

一、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 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

协议用于主从查询模式,进行数据通讯。此协议定义了控制器能认识使用的消息结构,结构形式如下所示:

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

常用的功能码如下:

代码名称作用
01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF) ,功能 01 返回任意个数输出点(Q)的 ON/OFF 状态。
02读取输入状态取得一组开关输入的当前状态(ON/OFF),功能 02 返回任意个数输入点(I)的 ON/OFF 状态。
03读取保持寄存器读取单个/多个保持寄存器。功能 03 返回 V 存储区的内容。在 Modbus 协议下保持寄存器都是'字'值,在一次请求中可以读取最多 120 个字的数据。
04读取输入寄存器读取单个/多个输入寄存器。功能 04 返回 S7-200 的模拟量数据值。
05强置单线圈写单个线圈(离散量输出点)。功能0 5 用于将离散量输出点设置为指定的值。这个点不是被强制的,用户程序可以覆盖 Modbus 通信请求写入的值。
06预置单寄存器写单个保持寄存器。功能 06 写一个值到 S7-200 的 V 存储区的保持寄存器中。
07读取异常状态取得8个内部线圈的通断状态
15强置多线圈写多个线圈(离散量输出点)。功能 15 把多个离散量输出点的值写到 S7-200 的输出映像寄存器(Q 区)。输出点的地址必须以字节边界起始(如 Q0.0 或 Q2.0),并且输出点的数目必须是 8 的整数倍。这是此 Modbus RTU 从站指令库的限制。些点不是被强制的,用户程序可以覆盖 Modbus 通信请求写入的值。
16预置多寄存器写多个保持寄存器。功能 16 写多个值到 S7-200 的 V 存储区的保持寄存器中。在一次请求中可以写最多 120 个字的数据。
17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态

举例说明:主机要从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协议库,打开目录,点击

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

进行安装。

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

安装成功后左侧浏览条的“库”中如下图:

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

2、S7-200程序

S7-200程序如下图,首先调用MBUS_INIT模块,初始化有关参数,如波特率,奇偶校验等要与主机一致。每一项的含义如下所示:

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

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子程序,它属于协议库的一部分。此程序是加密的。如下图左面有一个锁,在“查看”选属性后会弹出密码保护如下图。

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

S7-200  CPU上的通信口Port0支持Modbus  RTU协议

注意:本例子中,Modbus RTU 从站指令使用的库存储为VB0---VB779,这段寄存器地址不能再被程序中的任何指令使用,包括MBUS_INIT 和 MBUS_SLAVE 指令在内。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多