课程中心
HOME
课程中心
正文内容
plc轮询编程 西门子PLC的“ModbusRTU通讯”和“轮询”
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

西门子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程序

相关问答

DP通讯PLC端接IN还是OUT?

要看通讯协议和通讯方式。如果通讯协议是RS485协议,通讯方式是主站主动轮询,则PLC端接IN;如果通讯协议是RS485协议,通讯方式是主站被动响应,则PLC端接OUT...

西门子S7-200SMART通过MODBUS通信控制变频器的起停,如何随时看电流频率?

S7-200SMART提供了免费的MODBUS-RTU库程序,还要知道变频器的启动,停止,频率和电流对应的寄存器地址就可以编写程序了。首先必须保证接线正确,PLC的端口3为+...D...

plc通讯协议标准?

PLC支持的几种通讯协议。一、PPI通讯是西门子公司专为s7-200系列plc开发的通讯协议。内置于S7-200CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以...

西门子PLC通讯设置?

西门子人机界面与PLC变频器的通信一般需要设置地址,以便实现数据交换。其中,人机界面负责向PLC变频器发送控制指令,PLC变频器负责接收指令并控制变频器的...

1号泵正在运行如何切换到2号泵?

把二号泵的线接到原来一号的地方。或者通过接触器互锁的方式也可以自动切换,不只是联锁。不用PLC,当然可以用继电器完成,略微的复杂些。常规的两台水泵控...

大侠们!跪求回答!!PLC通讯不上,通讯如何设置?smart200通讯...

[回答]你的程序如果采用轮询的方式有没有考虑到一个站点通讯不上时的处理,通讯错误时会进入死循环PLC之间用以太网通讯,每个PLC控制2个伺服,程序跟步进差...

计算机专业的学生最应该学习的课程前五位是什么?

1.英语英语是万金油,学习计算机的你,无论以后打算考研还是工作,英语的好处不言而喻。去那些纯英文的编程网站,BBS,讨论组,个人博客,增长见识的同时,也可...修...

哪位行家 求解答:放心智能家居控制器标准,智能家居控制器...

[回答]Modbus是一种串行通信协议,是Modicon(现在的施耐德电气SchneiderElectric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。它有三种类型,ModbusRT...

多个232转485再转1个232肿么接线?-ZOL问答

▶支持128节点轮询网络结构▶自动识别RS-485信号流向,零延时自动转发▶两...本用三菱FX3U系列plc通fx3u-485-bd通信模块做485通信实验通485转232接电脑电脑.....

在座的童鞋 谁明白,腾冲速度快的废旧机械设备回收站点,废...

[回答]靠谱的还得是曲靖市艺豪再生资源回收有限公司,这家公司的情怀服务,效果,以及公司老板和员工,都值得夸赞和推荐。看见跳转指令了,就是这个跳转指令...

 美国沙尘暴  大耳朵图图之小小欢乐魔法师 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部