采用Modbus轮询方式对同一子站的分段访问

2018-02-27 15:04王一村
电子技术与软件工程 2018年19期

王一村

摘要

在西门子PCS7 DCS系统中,基于Modbus RTU通讯协议并采用PLC轮询通讯方式与施耐德空壓机进行数据传输,PCS7作为主站,对同一子站的不同地址进行分段访问。经现场实际调试,数据传输稳定,无传输延迟或丢包等现象。

【关键词】PCS7 DCS Modbus RTU通讯协议轮询通讯 分段访问

本次项目使用的是PCS7 DCS作为主站,基于Modbus RTU通讯方式与四台空压机进行数据传输,并且采用的是PLC轮询通讯方式,轮询访问方式一般常用于PLC中,且按照一定的时序分别与几个子站进行数据的发送与接收,编程方式也是基于梯形图或是STL编程语言,而本次PCS7 DCS只与一个子站进行数据的传输,但由于子站所要传输的通讯点地址跨度大,通讯地址分散,而且每次通讯访问寄存器的最大长度是254字节(127字),所以使用PLC编程方式对同一子站的不同段地址进行轮询访问,读取需要的数字量与模拟量数据并在上位机上进行显示与报警。

1 系统硬件组成与组态

1.1 硬件组成

PCS7 DCS采用冗余CPU414-5H作为主站控制器,并通过Profibus-DP与三个分布式10进行通讯,Modbus通讯卡件CP341位于第三个分布式IO的第11个卡槽中,卡件在插入卡槽前需要装有dongle,并且需要安装驱动,激活CP341需要先停止CPU在进行相应的硬件下装。CP341与子站通讯卡件之间通过DP线(带有屏蔽的双绞线)与15PIN的通讯接头进行两线方式的连接。

1.2 硬件组态

PCS7 DCS作为主站,在CP341卡件中需要设置通讯协议的类型,波特率,相应监测时间,数据位,停止位,奇偶校验,操作模式,预设接收线路等,本项目分别设置的是Master,9600bps,2000ms,8bit,lbit,None,Half-duplex(RS 485)Two-WireOperation,Signal R(A)0 Volt与Signal R(A)5 Volt。配置完参数后要进行编译和下装,然后将系统切换到在线模式,观察卡件状态是否正常。

2 轮询通讯方法与编程

2.1 轮询通讯方法

本文中采用CP341 Modbus RTU主站轮询方式,利用PLC自带的系统功能块FB7(接收块),FB8(发送块),和创建的累加器和超时计时器等,在PCS7 DCS中当主站向从站发送请求指令,从站收到主站请求后发送相应数据,主站接收块将从站相应的数据送回给CPU处理,发送作业完成后DONE置位,我们将接收到的数据保存的在相应的DB块中(如一个WORD类型的模拟量),同时累加器加一并执行下一段程序,如果主站发送的请求数据大于从站要发送的数据长度,此时FB8(发送块)功能无法完成,FB8上的ERROR置位,判断出此次发送任务失败,系统会更新发送区地址和接收区地址来启动下一次发送作业,如果FB8的DONE和ERROR由于某些原因都无法置位,那么通讯将处于锁死状态,所以在启动发送作业同时启动超时定时器(本文中超时定时器设置为2100ms),当定时器计时完成时如果DONE或者ERROR仍然没有置位,那么说明此次发送任务失败,将更新发送区地址和接收区地址来启动下一个发送作业。

本文中的程序用来接收六段不同的地址数据,我们只把用来接收第一段地址的程序放到这里,其余五段的程序同第一段,为了防止第一段数据发送失败从而影响其余五段,在程序里我们没有把FB8(发送块)的DONE位作为下一段程序的触发位,这样也保证了六段程序的发送和接收都是相互独立的,这里还需要注意的是超时计时器的时间必须大于预设的从站响应时间,并且预设的从站响应时间应大于等于主站发出请求到接收到从站响应数据的时间最大值,从站响应时间可以在CP341卡件的硬件组态中设置,默认值为2000ms。

2.2 轮询通讯编程

本次通讯只需要读取空压机的运行/故障,空压机排气压力温度等,子站通讯地址分别是4000-40120,40200-40299,40300-40349,40400-40449,40830-40929,42010-42039,所以我们将通讯分为六段,功能代码选用03-读输出寄存器,该功能可以读取从站的各个寄存器,且读取的长度从1-127个寄存器。

2.2.1 创建发送的数据块

DB块(数据块):数据块用来存储变量(如INT,WORD等),这些数据在使用时被其它功能块所调用。本次我们新建了DB1,在DB1中分别定义了从站地址,功能代码,寄存器起始地址,寄存器数四个变量,如表1所示。

2.2.2 创建接收数据块DB

本次我们为六段地址分别创建了六个接收数据块(DB3-DB8),并且在每个数据块中分配了0~1000个字的整形数组,如表2所示。

2.2.3 创建轮询功能块

如图1,首先在PCS7中创建一个逻辑块,如FC1,在逻辑块中我们创建一个指令计数器MW2,将MW进行自加,结果也同时赋给MW2,因为我们将子站地址分为六段去读,所以计数器上限为6,当MW值在1~6之间循环时都会触发程序跳转至MOOOo

如图2,当MW2值小于0或是大于6时都会将MW2赋值为1,并且在MW2=1时,触发第一段(总6段)程序,将本地变量L0.0置位为1。

如图3,当L0.0为1时,则程序将访问1号从站,功能码03,起始地址0,120个寄存器;第一段地址的接收缓冲区为DB3(将3赋给MW4),起始地址。。

如图4,我们要创建一个计时器M0.0来触发一个发送数据请求,当M0.0触发时则跳转至SEND区,同时当计时器时间到时或发送数据结束时(M0.1为标志位,Bool型)或发送出现错误时(M0.2为标位,Bool型)都将复位M0.0,如此循环置位和复位M0.0。

如图5,当图4中M0.0触发一个发送数据请求时,都会跳转到发送块来,其中SF中的S意为发送,LADDR为Modbus通讯模块的硬件起始逻辑地址,REQ为发送数据触发位并且上升沿触发,DB_NO为发送数据块号(DB1),DBB_NO为发送数据的起始地址(0),LEN为发送数据的长度(表1中数据长度为6个字节),R_TYP(‘X为扩展的数据块,此处必须为大写的‘X),R取消通讯,在本项目中始终为初始值FALSE,Done为发送完成位,当发送成功时M0.1为1,ERROR为错误位,当有错误产生时M0.2为1。STATUS为状态字,会标示错误代码。其它管脚在本项目中没有用到。

如图6,EN_R为使能接收位,本项目中始终为1,R取消通讯,本例始终为初始值FALSE,LADDR为Modbus通讯模块的硬件起始逻辑地址,本项目为256,DB_NO为接收数据块号(DB3),DBB_NO为发送数据的起始地址(0),LEN为接收数据的长度,EN_R使能接收位,本项目中始终为1,NDR为接收完成位,当接收完成后置位为1,ERROR为错误位,当有错误产生时置位为1。STATUS为状态字,会标示错误代码。其它管脚在本项目中没有用到。

一般在PLC中建立的功能块最终都要放在OBI(循环组织块)中,CPU周期性地执行组织块OBI的程序,当OBI执行完毕,操作系统再次启动它。CPU启动后,OB1循环执行。但是此次我们的程序是建立在PCS7DCS中,所以我们想用DCS的方式来循环执行程序,于是我们将FC1功能块直接插入到CFC(连续功能图)中,并且处于OB35组织块下,OB35的扫描周期为100ms。

3 结语

本文主要从实际案例出发,因为PCS7DCS作为主站,一次最多只能读取127个寄存器数据,而空压机通讯地址过于分散,无法一次全部读取,所以通过PLC轮询通讯方式,将地址分段读取,程序经现场测试运行稳定可靠。

参考文献

[1]SIEMENS技术文档S7-300/S7-400用于点对点CP的可加载驱动程序MODBUS RTU通讯,2009.

[2]王浩君,谢菊芳,姚明君,王诗琦等.基于Modbus通讯协议的PLC轮询数据通信[J].信息通信,2013(02).