查看: 2924|回复: 0

【EVB-335X-II】I通过Modbus-RTU协议控制

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-16 22:20:06 | 显示全部楼层 |阅读模式
    分享到:
    【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的编程软件,如图所示:

    1.png

    在菜单项中,点击“帮助-帮助”打开编程说明文档,定位到库编程章节,如图所示:

    2.png

    这一章节详细介绍了Modbus主站、从站的相关设置。我们主要关注从站的设置。
    首先看一下S7-200支持的Modbus命令:

    3.png

    其他的命令都很好理解,唯有5和15这两个命令比较特殊。对于PLC来讲,主要涉及到过程控制稳定与安全,虽然S7-200支持通过Modbus RTU通讯协议的线圈写入命令来直接控制Q的输出状态,但是实际应用中,西门子是不会将通过Modbus 命令写入的对Q的控制直接驱动硬件,比如说,就是你通过命令,要求Q0.0输出1,命令可以执行成功,但是物理PLC上急速没有输出,只是西门子PLC设计人员故意这样做的。这么做的理由很简单,Q的输出,如果过程控制的逻辑判断,很可能造成工作现场人员的伤害,所以我是无法直接通过命令写线圈的状态来改变Q的输出。
    配置Modbus从站只需两个步,初始从站模块的参数设置,启动Modbus命令监听。
    1)通讯、寄存器参数设置
    初始化参数的子功能块如图所示:

    4.png

    关于每个引脚的定义与说明,请查看帮助文档,主要完成:从站地址、波特率、奇偶校验、PLC RS485接口、保持寄存对应的V区起始地址等。
    2)启动监听
    配置好参数后,在PLC的每个扫描周期中执行如下功能块:

    5.png

    1. 2西门子S7-200PLC侧Modbus RTU程序编写
    1)参数设置
    我们设置PLC作为从站的地址为1,开发上位机主站时,也要在访问从机的函数中设置从站地址为1。波特率为9600,无校验,VB起始地址从VB0开始,共2000个字节,即1000个字,程序如下所示:

    6.png

    2)启动服务监听

    7.png

    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对于,控制程序如图所示:

    8.png

    1. 3硬件连接
    S7-200与上位机通讯需要专用的PPI电缆,对通讯原理比较熟悉的应该知道,所谓的PPI电缆,说白了,就是一根RS232转RS485电缆,我们这里采用一根简易的RS232转RS485电缆,将S7-200 PLC与EVB-335X-II开发板相连,如图所示:

    9.png

    2. EVB-335X-II侧QT上位机软件开发
    EVB-335X-II开发板上运行QT上位机程序,作为Modbus RTU主站,这里我们采用前面移植好的libmodbus库,如何创建基于libmodbus的QT工程请看我之前的试用报告。
    软件主界面如图所示:

    10.png

    构造函数中初始化libmodbus库,并绑定checkbox与按钮的槽函数:

    11.png

    用户点击checkbox复选框,系统将判断该复选框是选择状态还是取消选择状态,进而控制PLC上的Q输出,程序如图所示:

    12.png

    为了验证我们的QT Modbus主机是否能够通过读取线圈命令,返回PLC输入或输出信息,我们这里采用读取8个Q输出的当前值,以检查读取的值是否和PL上Q输出指示灯相一致,读取函数如下所示:

    13.png

    如果PLC先启动,并且设置了Q的输出,我们后启动QT程序时,如果我们不做一些细节处理,8个复选框都处于未选中状态,无法真实反映当前PLC Q的真是情况,所以,在QT启动后,首选通过Modbus协议读取PLC的Q输出信息,并根据Q的输出为1还是为0,设置相应的复选框的选中状态,程序代码如下:

    14.png

    程序编译结果如图所示:

    15.png

    将libmodbus_s7-smart-plc_rtu拷贝到NFS共享目录
    3. 上电测试
    1)给PLC和EVB-335X-II上电
    上电效果,机系统初始状态如图所示:

    16.png

    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程序界面如图所示:

    17.png

    初始状态Q0.0-Q0.7均没有输出,复选框都处于未被选中状态。
    我在EVB-335X-II触摸屏上选中Q0.2 Q0.4 Q0.7,发现PLC的输出LED灯依次被点亮,如图所示:

    18.png

    来张PLC的特写:

    19.png

    我们点击查看按钮,查看PLC的Q0.0-Q0.7的输出状态结果,如图所示:

    20.png

    来张读取Q状态的特写:

    21.png

    从读取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的升级版,期待下一篇测试报告吧,今天就聊这么多,洗洗睡觉去。

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 01:56 , Processed in 0.111592 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.