西门子S7200MODBUS通信协议和支持MODBUSRTU协议的电磁流量计超声波流量计的通信实例.docx
《西门子S7200MODBUS通信协议和支持MODBUSRTU协议的电磁流量计超声波流量计的通信实例.docx》由会员分享,可在线阅读,更多相关《西门子S7200MODBUS通信协议和支持MODBUSRTU协议的电磁流量计超声波流量计的通信实例.docx(13页珍藏版)》请在冰豆网上搜索。
![西门子S7200MODBUS通信协议和支持MODBUSRTU协议的电磁流量计超声波流量计的通信实例.docx](https://file1.bdocx.com/fileroot1/2022-12/9/441310e1-e14f-42a9-b664-a4d1002eb76e/441310e1-e14f-42a9-b664-a4d1002eb76e1.gif)
西门子S7200MODBUS通信协议和支持MODBUSRTU协议的电磁流量计超声波流量计的通信实例
西门子S7_200MODBUS通信协议和支持MODBUSRTU协议的电磁流量计、超声波流量计的通信实例
S7_200系列PLC有一个通信口的也有两个通信口的,这两个口都支持MODBUS通信协议,不过要添加MODBUS库文件(SP6版本的step7micro/win软件自带有MODBUS库文件)。
下面根据具体的项目来说明MODBUS的使用:
在项目中要采集进水流量的瞬时流量、日累计、月累计、年累计量,流量计本身有4~20mA信号输出和脉冲信号输出,这些输出信号都是瞬时量,只能转换为瞬时流量,而累积量就要通过编写程序来累加,而且信号的传输衰减和计算过程产生的误差就会造成和实际的流量相差很多,现在很多的流量计(包括其他的测量设备)都设计有通讯口,尤其是支持MODBUS协议,所以首选通信方式采集数据,这样可以直接读取我们想要的数据,只需做稍微的数据转换就可以的,同时也减小了工作量提高准确性(实际是按照流量收取费用的)。
实际的硬件连接:
10套s7-200组成PPI网络(其中一个200站做主站),有一个从站要采集两个不同厂家的流量计的相关信息。
PPI网络层已经用去了一个端口0,还剩下一个端口1,那么就用这个端口并设置为自由口协议,在程序中调用MODBUS程序块并填写好必要的信息就可以了(其实调用MODBUS程序块时,程序块内就已经设置好端口为自由口协议了)。
图1.MODBUS库文件
图2.控制指令
图3.控制指令
这里MBUS_CTRL_P1指令要一直调用,有一点要指明:
图2中的程序是读取其中一台流量计的,图3是读取另一台流量计的,这两个流量计是不一样的。
这里最重要的是MBUS_MSG_P1指令中地址“Addr”的填写,其实这里要填写Modbus从站的寄存器地址(该地址内有我们需要的信息),那么这个地址要怎么填写呢,填写多少呢?
这就要查看从站设备(这里是流量计)的“通信手册”了,因为每个厂家的设备都不一样,所以相同信息的寄存器地址也不一样。
下面是流量计厂家要的通讯手册上的信息:
RTU消息帧基本定义
0
1
2
3
4
5
6
7
设备地址
功能编码
地址1
地址0
数据1
数据0
CRC
CRC
8位字节
8位字节
8位字节
8位字节
8位字节
8位字节
8位字节
8位字节
一、参数读出命令
1、主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
03
0
00--35
0
1
XX
XX
2、从机回应格式
0
1
2
3
4
5
6
设备地址
功能代码
长度
数据1
数据0
CRC
CRC
1~99
03
2
高字节
低字节
XX
XX
数据=数据1数据0;
注意:
读出时,参数编号加1(MODBUS协议规定),如主机命令中参数编号为08,读出的参数编号为09。
二、读出瞬时流量、流速、百分比、空管比、报警
1、主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
04
0
0
0
5
XX
XX
2、从机回应格式
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
设备地址
功能代码
字节数量
流量高位
流量低位
单位数点
流速高位
流速低位
百分比高
百分比低
空管比高
空管比低
报警状态
crc
crc
1-99
04
10
三、读出累计总量
1、主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
04
0
5
0
5
XX
XX
2、从机回应格式
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
设备地址
功能代码
字节数量
正向总量3
正向总量2
正向总量1
正向总量0
反向总量3
反向总量2
反向总量1
反向总量0
总量单位
保留
Crc
Crc
1-99
04
10
0
有的通信手册并没有给出例子,而是只有寄存器地址如另一台流量计的通信手册:
:
好了,有了对应的寄存器地址我们就可以参照它来填写指令中的地址“Addr”,注意一点:
指令中的地址不能直接填写对应寄存器的地址,s7-200中是这样规定的:
我们读取的就是从站的保持寄存器的地址,所以要在从站寄存器地址加上数字40000。
例如第二个流量计的地址是40001和40113(在图3中),实际是读取了从站的从第一个和第113个寄存器开始的信息。
功能码是03。
再来看一下第一个流量计中的地址是以3开头的地址,即30011和30015,这里的程序是没有错的,这就要看通信手册中具体要主站发送的数据帧格式和功能码,如下:
可以看到功能码是04,这里的功能码04也是读取保持寄存器的,那么如何让PLC发出04这个功能码呢?
正常读取从站时发出的功能码是03(这也是MODBUS协议给定好的)
3、主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
04
0
0
0
5
XX
XX
其实MODBUS标准协议中也有04这个功能指令,该指令命名为“读取输入寄存器”而不是“保持寄存器”。
MODBUS协议当然可以发送04这个指令,问题是s7-200中的MODBUS协议库如何发送04这个指令呢?
MODBUS指令要填写的信息如下:
这里的RW只能填写0或1代表读和写,并不是具体的读写指令01、02、03还是04。
其实这里的RW功能就是告诉s7-200是读还是写,至于是具体读什么或具体写什么并不是从这里来确定的,是按照它下面的地址“Addr”来区分的。
在step7micro/win软件的帮助中是这样规定的:
所以,在我们要读取的MODBUS从站的寄存器地址的基础上加上40000,我们最终要输入的地址就是4000x了(注意地址是从40001开始的而不是40000)。
这样输入后,PLC在执行MODBUS指令时就会判断并发送的指令是03。
同样如果我们输入的地址数据是3000x,PLC就会发送04这个指令了,也可以这样理解,s7-200MODBUS指令通过判断输入的信息地址“Addr”的最高位来发送具体的功能指令(03、04或其他)的。
在设备和PLC通信之前最好先用调试软件来调试设备通信是否正常,是否能采集到数据,然后再编写PLC程序。
下面这个软件就是模拟了PLC执行MODBUS指令,从下面图中可以看到30001对应的F(功能指令)是04。
还有一点就是编程时要注意MODBUS指令的调用:
MBUS_CTRL_P1指令要一直调用,MBUS_MSG_P1同一条指令使能在没有完成时要一直有效,要想再次调用该指令必须将使能端无效一次扫描让完成标志位复位。
SMB30和SMB130的停止位是1位,其他参数可以修改的。
ModBus功能码
功能码
名称
作用
01
读取线圈状态
取得一组逻辑线圈的当前状态(ON/OFF)
02
读取输入状态
取得一组开关输入的当前状态(ON/OFF)
03
读取保持寄存器
在一个或多个保持寄存器中取得当前的二进制值
04
读取输入寄存器
在一个或多个输入寄存器中取得当前的二进制值
05
强置单线圈
强置一个逻辑线圈的通断状态
06
预置单寄存器
把具体二进值装入一个保持寄存器
07
读取异常状态
取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
08
回送诊断校验
把诊断校验报文送从机,以对通信处理进行评鉴
09
编程(只用于484)
使主机模拟编程器作用,修改PC从机逻辑
10
控询(只用于484)
可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
11
读取事件计数
可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
12
读取通信事件记录
可是主机检索每台从机的ModBus事务处理通信事件记录。
如果某项事务处理完成,记录会给出有关错误
13
编程(184/384484584)
可使主机模拟编程器功能修改PC从机逻辑
14
探询(184/384484584)
可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
15
强置多线圈
强置一串连续逻辑线圈的通断
16
预置多寄存器
把具体的二进制值装入一串连续的保持寄存器
17
报告从机标识
可使主机判断编址从机的类型及该从机运行指示灯的状态
18
(884和MICRO84)
可使主机模拟编程功能,修改PC状态逻辑
19
重置通信链路
发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
20
读取通用参数(584L)
显示扩展存储器文件中的数据信息
21
写入通用参数(584L)
把通用参数写入扩展存储文件,或修改之
22~64
保留作扩展功能备用
65~72
保留以备用户功能所用
留作用户功能的扩展编码
73~119
非法功能
120~127
保留
留作内部作用
128~255
保留
用于异常应答
ModBus网络只是一个主机,所有通信都由他发出。
网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。
采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
表2是ModBus各功能码对应的数据类型。
表2ModBus功能码与数据类型对应表
代码
功能
数据类型
01
位
02
读
位
03
读
整型、字符型、状态字、浮点型
04
读
整型、状态字、浮点型
05
写
位
06
写
整型、字符型、状态字、浮点型
08
N/A
重复“回路反馈”信息
15
写
位
16
写
整型、字符型、状态字、浮点型
17
读
字符型