西门子PLC的“ModbusRTU通讯”和“轮询”
Modbus是PLC应用中常用的通讯手段,轮询是在进行一个控制器连接多个从站的通讯时常用的编程手段,由于ST语言在数据处理上的优势,此方法变得更为简单。下面以西门子S7 1214C PLC的ModbusRTU通讯为例,展现ST语言下的modbus通讯和轮询。
硬件连接
要准备的硬件和软件:
1.西门子PLC 1214C;
2.通讯板CB1241;
3.USB转RS485转换器;
4.Modscan2/Modsim32电脑模拟软件模拟主/从站,
5.SPU(serial port Utility),监视通讯报文。
PLC作为主站,使用软件Modsim32模拟从站,使用两芯线(最好是带屏蔽双绞线)进行连接:
硬件连接
将通讯板的AB两端与转换器的AB两端进行连接,要注意AB两端区分正负极,反接不会烧坏设备,但是无法正常通讯。
编写程序
1.设备组态
在博图软件中配置西门子PLC和通讯板。modbus通讯需要设置波特率、数据位、停止位和校验位等通讯参数,在博图中的设备组态中设置此参数,主从站设置一致即可通讯。
通讯参数
设置波特率9600,数据位8位,停止位1位,无校验,在PLC离线模式下下载硬件组态。
下载组态信息
2.调用modbus功能块
西门子的通讯一般都需要调用系统功能块,在“指令”-“通信”-“通信处理器”下可以找到modbus通讯功能块:
通讯功能块
可以看到这里提供两套modbus通讯模块,这两套都可以使用(暂不清楚具体的区别),本文选用的是下面的版本较低的模块。
新建程序段,将配置模块MB_COMM_LOAD和主站模块MB_MASTER拖入程序中:
调用功能块
功能块调用后要对必要的引脚进行赋值,各个引脚的功能可以按F1查看,建立一个DB数据块,声明一些变量连接功能块的引脚:
声明变量
上面声明了两个容量为5的字数组,用于数据的发送和接受,这个容量可以根据需求任意设置。然后将这写变量写入模块引脚:
模块赋值
配置模块MB_COMM_LOAD的触发REQ只需要在连接时触发一次啊,因此直接将系统内置的变量“firstscan”写入即可,上电后执行一次。
由于通讯的读和写都由主站模块MB_MASTER完成,因此我们对这个模块进行两次赋值,第一次实现读的功能,由modbus地址40100开始,读5个数据,写入"ModbusData".Read_Data中;第二次实现写的功能,将"ModbusData".Sent_Data中的数据写入由modbus地址40110开始的5个数据中。
程序写到这里已经可以进行通讯了,如果想要在线实验一下,可以将变量写入监控表,手动触发读写触发引脚变量,观察模块的输出状态,这里就不演示了。
3.编写轮询程序
所谓轮询就是依次询问,假设我们有3个设备作为modbus从站,从站地址(站号)依次为1,2,3,使用case语句依次对这3个设备进行读写操作,而读出和写入的数据分别存入3套不同的变量当中。
建立设备变量
使用一个结构体来描述一个设备的所有信息,包括5个状态字(states:Array[0..4] of Word)和5个控制字(ctrl:Array[0..4] of Word),将结构体声明为数量为3的数组,存放3个设备的数据。
在整个循环开始前,设定起始设备地址,然后按照“读操作触发,读数据,读设备地址+1,延时,写数据,写操作触发,写设备地址+1,延时” 的顺序持续循环,按照设备地址号选择上面的结构体变量:
读操作
iStep=0时,关闭读写触发,设定读写设备地址为1;
iStep=10时,读操作触发,模块发出读数据命令,模块置位busy信号;
iStep=11时,等待读操作完成,模块读到设备数据后会置位done信号,复位busy信号,根据信号状态将读到的数据(Read_Data)写入设备数据结构体(DeviceData.states),如果设备地址=1,则写入DeviceData[1].states,设备地址变化,写入的结构体也会相应的变化,保证不同设备的数据不会互相干涉。这里加一个判断,一段时间读不到数据返回10步骤重新进行读操作。
iStep=12时,用计数的方式做一个简单的延时功能,避免因读写频率太快导致设备反应不过来。
写操作
向设备写入信息,在写入操作触发前要先将相应设备结构体中的数据(DeviceData.ctrl)写入发送数据缓存区(Sent_Data),然后再进行写操作,与读操作类似,写入完成后设备地址+1,跳转下一步骤。
运行程序
将程序编译写入后重启PLC,可以看到通讯板的指示灯已经开始闪烁,而轮询步骤iStep始终在10,11两步,证明读数据命令已经发出,但是没有接受到设备的反馈,始终在进行第一个设备的读操作。
虽然能够看到通讯灯在闪,但我们仍然不能直观的看到这个网络中的状态,这是就需要前面提到的SPU软件,监视串口网络中的报文。
监视报文
设定端口号,选择Hex数据格式,点击开始,可以看到当前网络中所有报文,根据modbus协议的规格(可以自行百度),可以判断这些报文就是plc发出的读命令。
想要读到数据必须要有从站,我们使用modsim软件模拟出3个从站:
modsim
将3个模拟从站地址分别设为1,2,3,起始modbus地址与程序设为一致:40100,长度设为20,这样读写地址都能看到。点击connection设定通讯参数(波特率,数据位,停止位,校验位与程序中设为一致)。点击确定后能后看到通讯板和转换器的接受发送指示灯开始闪烁,程序中的设备地址也在1-3中循环变化:
通讯指示灯
由于动图的帧率选的较低,会漏掉几个灯的状态。。。
变化的设备地址
监看程序中设备地址,能够看到地址在1-3之间循环变化。可惜的是modsim与SPU不能共用一个串口,看不到modsim反馈的报文了。
接下来我们在modsim中改变几个地址的值,看看PLC的设备数据结构体中能否进行相应的变化,将设备1的数据设定为:
40100设置为110,
40101设置为111,
40102设置为112,
40103设置为113,
40104设置为114,
设定数据
数据设定后在PLC的DB块中监视DeviceData的值:
读取数据
可以看到DeviceData[1].states的值已经变化(16进制),而DeviceData[2]和DeviceData[3]并没有变化。
下面进行写数据的验证,在程序中将DeviceData[2].ctrl任意赋值,然后再modsim中查看:
写入数据赋值
写入成功
可以看到modsim 3中相应地址的数据也已经变化,而其他模拟设备中并没有改变。
其他
在实际的项目中,例如变频器控制,通讯参数和数据地址一般都是设备(从站)规定好的,我们需要查阅设备手册,在程序中做相应的设置即可,通过通讯获取的数据可以有触摸屏显示出来,方便操作人员监控设备状态,也可以做一写判断,用于设备的报警等处理。
0401 【万泉河】征集需要做MODBUS轮询编程的PLC型号和配置
0401 【万泉河】征集需要做MODBUS轮询编程的PLC型号和配置
MODBUS是一种报文全公开的通讯协议(包括RTU和TCP)。
所以在PLC行业目前实现MODBUS协议主要有两大流派。
把MODBUS当成自由口通讯中的一种特殊的自由口通讯协议,需要在PLC中编程实现通讯功能。把MODBUS当成总线协议的一种,只需要在组态时配置好站点参数和要访问的数据区,这些MODBUS数据就自然被映射到PLC的I/Q了。程序逻辑中可以直接使用,而无需再做任何编程工作。其中后者主要是一些新兴PLC系统提供的功能,比如ANYCONTROL和CODESYS中的某些新品牌(倍福等旧品牌还不行)。
把MODBUS当作自由口通讯功能的主要是一些传统PLC品牌, 如西门子,三菱,倍福等等。 这些品牌中有时候虽然PLC的软件平台会提供一些封装的通讯函数,然而只是实现对一个报文问答的通讯,而对于一条总线上通常有多个通讯站点,从站或者服务器,对这些站点的通讯不能同时进行, 所以需要规划轮询策略。
比如,一些网络文章,会详细介绍通讯实现包括硬件接线的方法,然而对轮询策略通常尚未提及。 比如有按照定时轮询或者按照完成位触发下一个站点的访问。
但都是存在很大问题的。 前者在站点数量比较多的时候,整个周期就拉长了。 数据刷新时间会被拉长到无可忍受。 而后者,在个别站断电不在线时,会连续超时,而当设备运行久了, 有大量站点被永远关停之后, 整个通讯系统也就变得非常糟糕也同样不可忍受了。
所以是需要做轮询策略优化的。 比如,坏站要从轮询队列中排除,一些不重要的数据采集站,也要降低访问频次,以把更多的访问机会留给更重要的需要及时响应的数据。
那些网络文章只是简单实现了通讯功能的作者,可能都还没有来得及认识到轮询策略的重要性,或者还没有精力时间去完善这一点。
前几天我的文章《0329 【万泉河】天花板级标准化封装的MODBUS RTU程序》发出后, 就有批评者评价说,MODBUS是最简单的入门级的应用,只要入门一两年的PLC工程师,都会用了。 还搞什么GML库, 纯粹是骗小白。
我说,有这种认知的,才是还没入门或者刚刚入门的小白, 还没有吃过MODBUS的苦,没有认识到优化通讯功能,以及提高调试效率的重要性。 我给了一个比喻:
如果你入行10年,10年后所写的MODBUS通讯程序和10年前写的基本相同,没有两样,或者你10年前调试一套N个站点的MODBUS通讯网络系统,和10年后调试同样规模的系统,花费的时间一样多,那说明:__________________。
答案会是你在10年前刚入门的时候就登峰造极达到天花板的顶点了吗?肯定不会。 反而更应该说明了你10年没有进步。 这才大概率是那些喷子们的真相。
不信大家还可以思考个具体的问题, 是一位前来购买GML的用户提出来的。 他的问题是问我,有没有实现MODBUS通讯任务中的“写”优先?
我的回答是没有,以前从来没有人跟我提及过,我自己的项目应用也从来没有过这样的需求,所以我从来没想过。 但我承诺他,我会在稍后思考完善“写优先”的策略后,对现有的GML V4.0进行升级,并把升级后的版本V5.0分发给所有的买家们。
如果有人吹牛他20年前就已经登峰造极了, 那回答我一个问题,在写优先的策略下,如果某个站的设定数据连续不停的修改,需要写入更新, 那么同网络上的那些读的站,是不是会永远不会被读取,永远得不到刷新了?该如何避免?
GML现在发布了2个版本,分别是TIA PORTAL版本的GML,以及SMART 200的GML。发布后发现还是蛮受欢迎的。 说明同行们还是深受MODBUS编程之苦了。
那么,我计划把GML的产线系列拓展开, 用同样的实现方法拓展移植到其它需要的品牌平台。 现在征集这些品牌的型号和配置。
比如谁现在用的某个品牌的MODBUS通讯,深受其苦,每次做项目都要在其上耗费大量时间和精力,那么可以提交给我,我来做封装完成。
你需要做的是:
搞一套完整的硬件配置,借给我或者二手价格卖给我。提供传统MODBUS通讯实现的例程给我,我在做不通的时候要有能力帮助我。然后我做成之后,可以免费或者以第一优惠的价格把这个版本的GML库交给你。 具体细节可以私下沟通。
有不少人在跟我沟通GML时,还问到了MODBUS之外的自由口协议通讯的问题,能不能用同样的方法实现,我的回答:可以的。只需要把库函数中调用的原装的MODBUS通讯块替换为自由口通讯的库通讯块即可。 当然,也还需要不小的调试工作量。 如果有人有需要,也可以在留言中提出来。
谈一下GML库与西门子以及其它传统厂商平台的关系。
已经有多个案例,项目中需要有较多的MODBUS通讯需求,设计者因为头疼西门子PLC中编程麻烦而选用了更好用的新势力PLC产品了。 因为不再需要花费时间编程,只需要简单配置就能实现, 那效率的提高,足以令其放弃原本爱不释手的TIA PORTAL软件平台。
所以我做的GML是在降低在西门子或者其他传统平台中优雅实现MODBUS通讯的门槛,所以从更广泛意义上,是在帮助西门子。
能做这些, 我还是挺骄傲的。
参考文章:
0329 【万泉河】天花板级标准化封装的MODBUS RTU程序
相关问答
plc轮询程序详解?
PLC轮询程序是在控制器内部循环执行的程序,用于读取输入信号、处理逻辑运算、控制输出信号等。其详解如下:PLC轮询程序是PLC控制器内部循环执行的程序。PLC控...
modbus读写程序要轮询吗?
Modbus是一种串行通信协议,用于在设备之间进行通信,例如传感器、控制器、电机控制器等等。Modbus协议支持多个设备之间的通信,因此可以用于多个设备的读写操作...
二维码扫描到plc怎么显示?
由于PLC不像电脑有底层驱动来解析扫码枪数据,所以PLC要想获取扫码枪数据的话需要连接个转换模块,转换模块解析到扫码枪数据再通过RS232或者485,或者存在寄存器...
tcp开放式通信用不用轮询?
视情况决定是否轮询。串口通信,需要轮询,以太网通信,不需轮询。对4台PLC均使用PUT/GET向导,就可以对每台PLC进行读写组态,最后把向导生成的执行文件在程序...
plc网络一网络二网络三的区别?
plc网络采用3级总线复合型结构,最底一级为远程I/O链路,负责与现场设备通信,在远程I/O链路中配置周期I/O通信机制。中间一级为Profibus现场总线或主从式多点链...
计算机专业的学生最应该学习的课程前五位是什么?
1.英语英语是万金油,学习计算机的你,无论以后打算考研还是工作,英语的好处不言而喻。去那些纯英文的编程网站,BBS,讨论组,个人博客,增长见识的同时,也可...修...
帮个忙,profibus专业电缆怎么样
[回答]PROFIBUS-DP是目前速度最快的RS485(通信速率在12Mbps时,可以传输90米),采用轮询方式通信,一主多从结构。缺点是中间某一节点故障,后面的节点就会无...
急需帮忙 汕头放心的SCADA系统,SCADA系统专不专业,都来说说?
[回答]SCADA在工厂自动化系统中,位处PLC与MES之间,由于自动化系统的整合需求越来越高,因此SCADA也出现往上与MES整合的趋势,多数厂商都认为SCADA的‘MES’...