技术论坛

 通过以太网UDP协议经串口服务器进行ModbusRTU通信的SCL源码

返回主题列表
作者 主题
宝冬
至圣

经验值:10035
发帖数:1523
精华帖:29
楼主    2021-11-03 03:48:28
主题:通过以太网UDP协议经串口服务器进行ModbusRTU通信的SCL源码 精华帖  精编帖 

1、这是之前练习测试写的,框架是完整的。目的是为了与串口设备进行通信的时候,取代官方的ModbusTCP的Client指令。官方的体积太大了,一个FB代码就占20K工作内存。

另外与串口设备通信,都是轮询,用TCP开销大,且从道理上讲没有意义。而且TCP慢,尤其是连接通道的建立和断开。

UDP不怕网线的插拔,不怕有线和无线之间的切换,这是无连接通信的好处。断两小时也没事,插上网线立马恢复通信。用用下面这个块就知道了。

因为是给自己用的,如果解析中的数据类型不符合需求,各位自行修改。


2、把串口服务器设置为UDP Server。把网关功能关闭,串口侧不做协议转换,直接是UDP拆包之后或打包之前的数据部分透传往来。这数据部分就是完整的ModbusRTU报文。

如果是ModbusTCP,网关做的转换是:把报文前面的MAP(Modbus Application Protocal)的6字节报文头添加或去掉,报文后面的CRC16去掉或添加。


3、指令接口与Modbus指令类似,但是需要一个UDP连接的ID,而不是485端口。还需要包含串口服务器的地址端口信息的一个结构化参数。用博途V14 SP1写的。你可以把它改写成任何自定义的串口协议。

ModbusUDP.rar


4、这个指令需要一个UDP连接。关于建立连接这件事,说起来还是有点小讲究的,所以额外提供一个如何建立连接的指令块源码。其中的道理不只是对UDP,对TCP连接一样,具体看源码。其实这个也是我从全球库中德国工程师写的改的。理念保持一样,但是原来的组织方式我觉得代码之间的耦合有点高,就重新改写了。你会看到残留的变量注释。

BuildConnection.rar


5、博途中所说的以太网连接,其实是指在PLC后台一个独立运行的通信线程。

了解一点上位机开发的知道,你自己用比如C#建立一个socket对象进行通信的时候,都是把它单独放在一个线程里。每个Socket用一个线程,大家都在同时监听各自的端口。所谓异步,就是指并行的线程,各干各的不等别人。

PLC中连接资源的限制,就是指后台可以运行的通信线程的数量限制。这就解释了,为什么UDP是无连接通信,但它还要占用一个连接资源。它必须要占用一个线程。


6、关于以太网连接,除了TCON和TDISCON,还有两条指令。

一个是T_DIAG,可以知道某个连接的状态和属性。我觉得作用一般,你还是得需要健壮的策略能成功新建、断开、重建,另建才行。

另一个是T_RESET,这个很有用。它可以把阻塞的连接重新建立起来,也就是对应的线程被憋死了需要重现。这在串口应用很少,在常规以太网中很有用,阻塞不少见。


7、关于如何使用这个块建立UDP连接和一些参数设置,参考下图。最终得到的连接ID在Connect结构变量里面的ID,把它连接到modbusUDP模块的管脚就可以了。包含串口服务器的地址端口信息的结构化参数,也要连接到modbusUDP模块的管脚。


8、有兴趣研究的朋友,建议买个带端口镜像的交换机,一百多块钱。以太网侧用wireshark抓包,串口侧用串口助手抓包,可以实时对比观察协议报文的细节和转换,还有时间因素等。

通信的东西说到底,要落到网络报文的内容上。无论出现任何问题,抓包看报文,是高效靠谱的排查手段,单靠软件很多时候就是猜测。

UDP在抓包诊断上有绝对优势。使用UDP的通信,底层往来的场景是非常干净的。没有TCP内在那些复杂度。一看就知道应用层的问题出在哪。


9、UDP真正有魅力的地方是自建应用层协议实现可靠传输,这是当前的发展趋势,TCP有点落伍了。腾讯抖音快手,鸿蒙软总线等都有UDP在里面。你在家wifi玩游戏,走到外面已经切换到手机4G了,但是游戏依然不会掉线,这后面都是UDP。

在PLC中同样可以自建协议实现可靠传输。单个UDP连接复用,组播。可以很大程度替代TCP。如果PLC通信全部是UDP,网络被堵死的可能性大大降低。参考下面这个帖子。

UDP的可靠传输与应用


10、这个ModbusUDP指令的地位和使用方式,与官方Master指令、自己用PtP做的Master指令、官方ModbusTCP指令是一样的。做为不同的Modbus通道方式,都是设备功能执行的资源选项。我通常把这些指令做为参数传递到设备FB内部供调度机制使用,图例如下。




宝冬
至圣

经验值:10035
发帖数:1523
精华帖:29
43楼    2022-07-15 21:12:04
精编帖  主题:回复:通过以太网UDP协议经串口服务器进行ModbusRTU通信的SCL源码

这个FB块的目的,就是把通信当作普通IO对待,为嵌入到大的设备FB中作为资源。


多种设备FB的多样化功能需求,从多个FB的工艺界面进入,转化成各自的动态任务集合,再被调度机制按时序发送给,多设备FB之间公共唯一的底层通信执行通道。这个过程中,底层通信的工作负荷只占10%,其余的90%全都是需求的处理和转化。无论是ModbusTCP,ModbusUDP,ModbusRTU,或是PtP自由口,或者是其他通信管道,在大的架构中都一样。


从梯形图起步,普遍都是习惯把逻辑作为思考中心。如果逐渐的习惯以数据载体对象来作为核心,就习惯SCL了。再往后就是习惯以架构为出发点。这就是面向对象的缘起。


好的SCL表达结构设计,可以把调试局限化,而不是满篇到处找变量关联。这就是要善用数据结构,来把逻辑局限化。


逻辑跟着数据走,数据跟着架构走。架构先行。在理念上这是不断的“退一步”的过程。


yming
至圣

经验值:126850
发帖数:21990
精华帖:824
51楼    2023-12-16 13:56:33
精编帖  主题:回复:通过以太网UDP协议经串口服务器进行ModbusRTU通信的SCL源码

因为我不使用串口服务器,一直没明白写这个功能块的实际作用。

现在才明白、理解写这个功能块的作用。

这个是使用串口服务器的基础功能。

在使用485串口服务器,下挂多台从站时,不要直接使用MODBUS _TCP客户端功能块。而要使用这个功能块。它是MODBUS_TCP_RTU串口 功能块。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。