文档介绍:S7_200系列PLC有一个通信口的也有两个通信口的,这两个口都支持MODBUS通信协议,不过要添加MODBUS库文件(SP6版本的step7 micro/win 软件自带有MODBUS库文件)。下面根据具体的项目来说明MODBUS的使用:
在项目中要采集进水流量的瞬时流量、日累计、月累计、年累计量,流量计本身有4~20mA信号输出和脉冲信号输出,这些输出信号都是瞬时量,只能转换为瞬时流量,而累积量就要通过编写程序来累加,而且信号的传输衰减和计算过程产生的误差就会造成和实际的流量相差很多,现在很多的流量计(包括其他的测量设备)都设计有通讯口,尤其是支持MODBUS协议,所以首选通信方式采集数据,这样可以直接读取我们想要的数据,只需做稍微的数据转换就可以的,同时也减小了工作量提高准确性(实际是按照流量收取费用的)。
实际的硬件连接:10套s7-200组成PPI网络(其中一个200站做主站),有一个从站要采集两个不同厂家的流量计的相关信息。PPI网络层已经用去了一个端口0,还剩下一个端口1,那么就用这个端口并设置为自由口协议,在程序中调用MODBUS程序块并填写好必要的信息就可以了(其实调用MODBUS程序块时,程序块内就已经设置好端口为自由口协议了)。
这里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位字节
参数读出命令
主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
03
0
00--35
0
1
XX
XX
从机回应格式
0
1
2
3
4
5
6
设备地址
功能代码
长度
数据1
数据0
CRC
CRC
1~99
03
2
高字节
低字节
XX
XX
数据= 数据1 数据0;
注意:读出时,参数编号加1(MODBUS协议规定),如主机命令中参数编号为08,读出的参数编号为09。
读出瞬时流量、流速、百分比、空管比、报警
主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
04
0
0
0
5
XX
XX
从机回应格式
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
设备地址
功能代码
字节数量
流量高位
流量低位
单位数点
流速高位
流速低位
百分比高
百分比低
空管比高
空管比低
报警状态
crc
crc
1-99
04
10
读出累计总量
主机命令格式
0
1
2
3
4
5
6
7
设备地址
功能代码
地址1
地址0
数据1
数据0
CRC
CRC
1~99
04
0
5
0
5
XX
XX
从机回应格式
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个寄存器开始的信息。功能