【
EVB-335X-II
试用体验】之
EVB-335X-II
通过
Modbus-RTU
协议控制西门子
S7-200 Smart
系列
PLC(
真正的工业级应用案例
)
从拿到EVB-335X-II
开发板,开始上电测试板载的基本功能,然后搭建开发环境,编写基于寄存器的GPIO驱动程序,编写Linux GPIO库的蜂鸣器控制驱动程序,再到移植QT,软键盘测试,My SQL的移植及远程调用,My SQL数据库的图片存取,最后到Modbus从站在开发板上的应用开发,以及boa的Web服务调用,这一系列的功能应用,为我的车间级、工业级的数据采集服务器做了很好的技术铺垫。这篇试用报告,将结合我手头上的实际项目,综合应用QT+libmodbus库,完成对车间内的基于PLC的工业设备的远程控制与数据采集。
我现在正在做的项目是一个铸造车间的铁液熔炼控制项目,需要上位机系统实时采集熔炼炉中铁液的温度,以及当前铸造工件的模具温度。对于工业设备的自动化控制,由于编写PLC程序简单、快速、高效,以及其抗干扰能力强,当前国内主流方法,还是采用基于PLC的DCS系统控制,我当前的项目也不例外,我的电气控制方式是S7-1500+S7-200 Smart相结合的方式。
其中S7-200 Smart系列PLC天然支持Modbus RTU通讯协议,即可配置为主站,也可配置为从站。
在这篇使用报告中,我们将S7-200 PLC作为Modbus RTU从站,即作为被控制方和数据提供方,我们的EVB-335X-II作为Modbus-RTU主站,完成远程控制西门子PLC的Digital Output。
主要通过EVB-335X-II的QT界面控制PLC的输出接点输出或断开,并通过Modbus协议的线圈读取命令,读取PLC的输出状态。
有些网友可能觉得奇怪,为什么总是写控制GPIO的帖子?我想说的是,如果你真正做过工业过程控制项目,如果你从实际工作中的大部分项目的实际需求出发,不难发现,过程控制中,无非就是GPIO的输入、输出,以及模拟量的输入、输出,再加上相应的通讯,一个项目也就我完成了,并非一定要用到那些所谓的高大上的技术,比如OPencv视觉识别,这些对于一般的项目我们很少会用到,即使有这方面的需求,靠我们一个人两个人搞的一些入门级的测试,根本就过不了关,而是买一些应用比较成熟、稳定可靠的产品,通过标准的接口协议集成的我们的系统中。所谓的标准接口协议,无非就是profinet profibus dp canopen devicenet和我们谈到的主角Modbus,相比较其他的通讯协议,Modbus最简单,最通用,也更容易实现,可以说,把Modbus搞定,我们去集成其他的第三方仪器仪表,一点儿问题没有,分分钟搞定。闲话少说,开始这次的试用之旅。
1.
西门子
S7-200PLC
侧
Modbus RTU
从站的程序分析与编写
1. 1
西门子
S7-200PLC
侧
Modbus RTU
从站的程序分析
我们知道,对于PLC的控制程序开发,主要是采用梯形图编程语言,以电气工程师设计电气控制流程图的方式设计开发程序,即一系列的自锁、互锁等。S7-200 PLC本身就集成了Modbus RTU的库,我们只需要简单的几步即可是PLC工作在主站或从站模式。
首先启动PLC的编程软件,如图所示:
在菜单项中,点击“帮助-帮助”打开编程说明文档,定位到库编程章节,如图所示:
这一章节详细介绍了Modbus主站、从站的相关设置。我们主要关注从站的设置。
首先看一下S7-200支持的Modbus命令:
其他的命令都很好理解,唯有5和15这两个命令比较特殊。对于PLC来讲,主要涉及到过程控制稳定与安全,虽然S7-200支持通过Modbus RTU通讯协议的线圈写入命令来直接控制Q的输出状态,但是实际应用中,西门子是不会将通过Modbus 命令写入的对Q的控制直接驱动硬件,比如说,就是你通过命令,要求Q0.0输出1,命令可以执行成功,但是物理PLC上急速没有输出,只是西门子PLC设计人员故意这样做的。这么做的理由很简单,Q的输出,如果过程控制的逻辑判断,很可能造成工作现场人员的伤害,所以我是无法直接通过命令写线圈的状态来改变Q的输出。
配置Modbus从站只需两个步,初始从站模块的参数设置,启动Modbus命令监听。
1
)通讯、寄存器参数设置
初始化参数的子功能块如图所示:
关于每个引脚的定义与说明,请查看帮助文档,主要完成:从站地址、波特率、奇偶校验、PLC RS485接口、保持寄存对应的V区起始地址等。
2
)启动监听
配置好参数后,在PLC的每个扫描周期中执行如下功能块:
1. 2
西门子
S7-200PLC
侧
Modbus RTU
程序编写
1)参数设置
我们设置PLC作为从站的地址为1,开发上位机主站时,也要在访问从机的函数中设置从站地址为1。波特率为9600,无校验,VB起始地址从VB0开始,共2000个字节,即1000个字,程序如下所示:
2)启动服务监听
3)Q的输出控制
通过上面的分析,我们无法直接操作线圈COIL命令来控制PLC的Q输出,我们这里采用一种通过写入保存寄存器的数据,即将数据写入V区,由V区的位控制Q的输出。对于西门子PLC,以VW0Q为例,其高字节放置VB0,低字节放在VB1,如果我们想通过VW0控制Q0.0-Q0.7,对应关系应该为V1.0-V1.7与Q0,.0-Q0.7对于,控制程序如图所示:
1. 3
硬件连接
S7-200与上位机通讯需要专用的PPI电缆,对通讯原理比较熟悉的应该知道,所谓的PPI电缆,说白了,就是一根RS232转RS485电缆,我们这里采用一根简易的RS232转RS485电缆,将S7-200 PLC与EVB-335X-II开发板相连,如图所示:
2. EVB-335X-II
侧
QT
上位机软件开发
EVB-335X-II开发板上运行QT上位机程序,作为Modbus RTU主站,这里我们采用前面移植好的libmodbus库,如何创建基于libmodbus的QT工程请看我之前的试用报告。
软件主界面如图所示:
构造函数中初始化libmodbus库,并绑定checkbox与按钮的槽函数:
用户点击checkbox复选框,系统将判断该复选框是选择状态还是取消选择状态,进而控制PLC上的Q输出,程序如图所示:
为了验证我们的QT Modbus主机是否能够通过读取线圈命令,返回PLC输入或输出信息,我们这里采用读取8个Q输出的当前值,以检查读取的值是否和PL上Q输出指示灯相一致,读取函数如下所示:
如果PLC先启动,并且设置了Q的输出,我们后启动QT程序时,如果我们不做一些细节处理,8个复选框都处于未选中状态,无法真实反映当前PLC Q的真是情况,所以,在QT启动后,首选通过Modbus协议读取PLC的Q输出信息,并根据Q的输出为1还是为0,设置相应的复选框的选中状态,程序代码如下:
程序编译结果如图所示:
将
libmodbus_s7-smart-plc_rtu
拷贝到
NFS
共享目录
3.
上电测试
1
)给
PLC
和
EVB-335X-II
上电
上电效果,机系统初始状态如图所示:
2
)配置
EVB-335X-II
设置EVB-335X-II的IP:
ifconfig eth0 192.168.1.221
挂载NFS文件系统:
mount -t nfs 192.168.1.109:/nfsshare /mnt-o nolock
3
)启动
QT
程序并测试
cd /mnt
./ libmodbus_s7-smart-plc_rtu
QT程序界面如图所示:
初始状态Q0.0-Q0.7均没有输出,复选框都处于未被选中状态。
我在EVB-335X-II触摸屏上选中Q0.2 Q0.4 Q0.7,发现PLC的输出LED灯依次被点亮,如图所示:
来张PLC的特写:
我们点击查看按钮,查看PLC的Q0.0-Q0.7的输出状态结果,如图所示:
来张读取Q状态的特写:
从读取PLC上的Q输出状态,以及物理PLC的指示灯状态,与我们在触摸屏上选中的复选框对应的Q编号是一致的。
4.
小结
通过前面对libmodbus的移植,结合西门子S7-200 PLC的特点,成功的完成了基于
ARM的开发板QT程序对PLC的控制,做了EVB-335X-II工业应用的基本尝试,测试效果达到 了我当前项目的通讯要求。写下来,看似很简单,中间分析、测试S7-200的从站线圈、保持寄存器的起始地址,以及线圈的写入不成功的分析,和线圈读取数据的测试,话费了一晚上的时间,只好白天补一觉,下一篇我们将做EVB-335X-II做Modbus TCP主站与西门子S7-1500的通讯测试,S7-1500是西门子PLC中、高端产品,是原来S7-300/S7-400的升级版,期待下一篇测试报告吧,今天就聊这么多,洗洗睡觉去。
0