技术论坛

跑在以太网上的Modbus rtu

作者 主题
侠圣

经验值: 2433
发帖数: 292
精华帖: 4
主题:跑在以太网上的Modbus rtu
推荐帖


只看楼主 楼主 2021-07-29 15:31:10

大家看到标题以为我要讲ModbusTCP吧,不是的,我这里要讲的是使用PLC的开放式通信连接串口服务器进而与ModbusRTU的从站通信。

好处有哪些:

1、可为PLC增加串口。通常1200PLC最多可以装4个串口(1个信号板3个通信模块)。若是使用串口服务器,可同时与8个串口建立起开放式连接进行通信,如果分时可建立的串口通信数量是非常可观的。1500可以同时建立更多的开放式连接,如:256个。

2、经济性。将1200的四个串口选购齐全了价格挺高的,这时选一个多口的串口服务器会比较经济。有朋友会说配ModbusTCP转ModbusRTU网关也可以,确实是这样的,但网关还是比串口服务器价格高。

下面以moxa串口服务器为例,讲述通信的实现。

对moxa串口服务中最重要的是串口的操作模式,上图:


这里注意三个设置

1、操作模式:我们这里要给串口选择TCP Server操作模式

2、TCP端口号:这个端号对应相应的串口,记下来,编程时需要用到

3、强制传输:这个功能是指将串口接收到的数据存储到TCP/IP的缓存区中 ,当间隔时间到达Force Transmit设定的时间时,才发送到网口上。这里主要是为了让从站返回的数据形成一个数据帧。这个可以使用250ms,也可以短一点,前提是你得知道你通信的数据帧大小,并根据速率计算出来。

串口服务器的其它设置,请根据实际情况进行设置。

如果使用的是其它品牌的串口服务器,如:周立功,可能没有设置强制传输时间这一项,但其有根据最后一个字节后延时时间来判断一个数据帧的结束。

下面讲讲PLC方面的程序

一、   概述

本文描述的程序文件可以在西门子1200、1500PLC通过开放式通信连接串口服务器实现MODBUS RTU 主站通信。

本程序特点:

1.     实现MODBUS RTU 功能号1、2、3、4、5、6、15、16。

2.     支持单台CPU下多台串口服务器,一个串口使用一套程序,互不干扰。

3.     可单条或多条 轮询指令 离线,即从站掉电,可手动让其离线,减少轮询时间。

4.     可控制每条指令间的时间间隔。

5.     程序量再大也不必担心CPU扫描时间,因为未运行的指令会跳过。

6.     每条指令单独返回错误信息。

7.     不必担心程序块和数据块多,支持多重背景。

8.     程序组态直观,简单,方便,灵活。

9.    无需要配置开放式连接参数,指令内集成通信配置指令,发送和接收配置指令,外部只需简单参数即可。

二、   硬件网络施工

关于通信网络施工,尽量选择西门子485紫皮电缆,你胡弄网络,网络就胡弄你,所以质量可靠的硬件是保证通信正常的前提。若通信线路过长,请使用RS485中继器,但请不要西门子RS485中继器,因为不支持MODBUS通信。具体接线方式请查阅相关资料。网线也尽量选用西门子的,这样问题少。

三、      程序说明及使用方法

1. 您得到的程序如图:



这是由TIA V16归档后文件,打开TIA V16后,打开此文件,会提示新建文件夹,恢复后会看到项目已经打开。


2.     程序工作原理



3.     程序块功能说明:

MBrtuOnIEMaster1500PointerDB1:用户数据块。非优化数据块。可以是单个数据块,也可以是多个数据块。从站返回的数据保存在这个数据里,向从站写入的数据也在这个数据块里。

MBrtuOnIEMaster1500BufferDB1:缓冲区数据块。非优化数据块一个缓冲区数据块对应一个串口。将要发送的数据在这里进行校验操作,接收回的数据同样在这里校验操作。

MBrtuOnIEMaster1500Msg:主站轮询指令功能块。可以单个块运行,也可以多个块轮流运行。根据输入参数决定把哪些用户数据放入缓冲区数据块,再将从站返回数据放回用户数据块。注意:同一时刻只允许一个主站轮询指令工作,否同返回9006错误。

MBrtuOnIEMaster1500Crtl:主站通信控制功能块。一个通信控制功能块对应一个串口。主要功能为发送和接收与从站的通信的报文。


4.     功能块参数说明

MBrtuOnIEMaster1500Crtl

名称类型数据类型说明允许值,说明
iCpuHWIDInputHW_SUBMODULECPU硬件标识符 设备组态》CPU》系统常数》名称:Local类型:Hw_SubModule的硬件标识符
iOpenIEConActiveInputBool开放式通信激活
iInterfaceIdInputHW_ANYTCON_IP_v4本地网络接口的硬件标识符(值范围:0 到 65535)。
iIDInputCONN_OUCTCON_IP_v4引用该连接(取值范围:1 到 4095)。该参数将唯一确定 CPU 中的连接。指令“MB_CLIENT”的每个实例都必须使用唯一的 ID。
iADDR1InputUSInt连接伙伴的 IP 地址,例如USint#192
iADDR2InputUSInt连接伙伴的 IP 地址,例如USint#168
iADDR3InputUSInt连接伙伴的 IP 地址,例如USint#0
iADDR4InputUSInt连接伙伴的 IP 地址,例如USint#10
iRemotePortInputUInt远程连接伙伴的端口号(取值范围:1 - 49151)
iSendTimeInputTime发送前定时时间值可以很大,但没有必要
iRcvTimeOutInputTime接收信息超时时间值可以很大,但没有必要
iMbusBufferDBNumberInputUDIntMODBUS缓冲区数据块号如:UDINT#3000
iMbusBufferInputVariantMODBUS缓冲区指针如:"MBrtuOnIEMaster1500BufferDB1".Buffer
qLicenseOutputBool授权
qOpenIEConDoneOutputBool开放式通信建立连接指令 0: 作业尚未开始或仍在运行 1: 无错执行作业
qOpenIEConBusyOutputBool开放式通信建立连接指令 BUSY = 1:作业尚未完成BUSY = 0:作业完成
qOpenIEConErrorOutputBool开放式通信建立连接指令 ERROR = 1:处理作业期间出现错误。STATUS返回有关错误类型的详细信息
qOpenIEConStatusOutputWord开放式通信建立连接指令 STATUS状态参数:错误信息详见TCON指令帮助
qOpenIEDisconDoneOutputBool开放式通信终止连接指令0: 作业尚未开始或仍在运行 1: 无错执行作业
qOpenIEDisconBusyOutputBool开放式通信终止连接指令 BUSY = 1:作业尚未完成BUSY = 0:作业完成
qOpenIEDisconErrorOutputBool开放式通信终止连接指令 ERROR = 1:处理作业期间出现错误。STATUS返回有关错误类型的详细信息
qOpenIEDisconStatusOutputWord开放式通信终止连接指令 STATUS状态参数:错误信息详见TDISCON指令帮助
qWorkingSlaveOutputUInt正在通信中的从站地址
qDoneOutputBool完成标志

MBrtuOnIEMaster1500Msg

名称类型数据类型说明允许值,说明
iInstructionActiveInputBool真为激活指令,假为不激活指令
iNewRequestInputBool读写请求位每一个新的读写请求必须使用脉冲触发
iSlaveInputUSInt从站地址1到247
iReadWriteInputUSInt0=读,1=写

1. 开关量输出和保持寄存器支持读和写功能

2. 开关量输入和模拟量输入只支持读功能
iAddressInputUDInt读写从站的数据地址

选择读写的数据类型

00001 至 0xxxx - 开关量输出

10001 至 1xxxx - 开关量输入

30001 至 3xxxx - 模拟量输入

40001 至 4xxxx - 保持寄存器

400001 至 465535 - 保持寄存器
iCountInputUInt数据个数

通讯的数据个数(位或字的个数)

Modbus主站可读/写的最大数据量为120个字(是指每一个 MBrtuMasterMsg 指令)
iBufferDBNumberInputUDIntMODBUS缓冲区数据块号如:UDINT#3000
iPointerDBNumberInputUDIntMODBUS读写数据块号如:UDINT#2000
iPointerByteInputUInt用户数据块字节地址

1. 如果是读指令,读回的数据放到数据区这个字节开始的区域中

2. 如果是写指令,要写出的数据从这个字节开始的数据区取出
qDoneOutputBool完成位此位为脉冲信号,需要保持信号,用户自行加起保停程序,完成位为启动,读写请求位为停止即可。
qBusyOutputBool指令工作中BUSY = 1:作业尚未完成。BUSY = 0:作业完成
qErrorOutputWord通信错误

错误规范

0000 命令完成没有错误

7000 指令未执行

7001 指令开始工作

9003 接收超时

9004 输入参数错误

9005 Modbus未激活

9006 忙 其它指令在工作

9007 功能号不符

9008 CRC校验错误

9009 本指令未启用

900A 发送错误

900B 发送超时

900C 接收错误

900D 接收的数据长度与预计长度不符

900E 签名错误

91XX 从站返回的错误

qSendStatusOutputWord发送指令状态及错误见TSEND发送指令规范
qRevStatusOutputWord接收指令状态及错误见TRCV发送指令规范


MBrtuOnIEMaster1500BufferDB1

非优化数据块。缓冲区数据块是一个400(不可小于400)个字节数据块,可以复制,可改符号,可改绝对地址


MBrtuOnIEMaster1500PointerDB1

非优化数据块用户数据块用户可自行定义,无要求。


三、      程序注意

符号地址和绝对地址都可更改。

当功能号为5时,用户数据块的字节地址的第0位有效。

当功能号为1,2,15时,用户数据块的字节地址的从第0位开始有效。

程序可在仿真器内工作。



四、      程序高级应用


1.当有多台从站执行相同操作时,如读取相同数据寄存器。这时可将指令的完成位连接到读写请求位,将从站地址和用户数据块字节号做成变量,使用完成位改变这两个变量,就可以实现单指令轮询多主站。

2.当用通信控制设备启停等操作时,或多从站时快速刷新单个从站数据时,要求响应时间快一些,而有些程序没有这方面考虑。本程序在应对此方面可以将单一轮询指令的激活位置真,其它指令置假(用上升沿,仅一个扫描即可),这时不管其它指令在什么状态都会将串口使用权让出,优先让激活的指令运行。


链接:https://pan.baidu.com/s/1lUb0vPdmuPbsc2CqcQ9Rbw 提取码:ulg7










13478405725
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1707428&b_id=66

侠圣

经验值: 4981
发帖数: 978
精华帖: 6
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 1楼 2021-07-29 16:14:07

编辑方式让人舒适...............排版看着太舒服了


养活一团春意思,撑起两根穷骨头
以下网友喜欢您的帖子:

  
侠圣

经验值: 2510
发帖数: 647
精华帖: 3
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 2楼 2021-07-29 16:38:07

网关,串口服务器等各种中间环节设备,起到关键作用,为互联互通立下汗马功劳


路漫漫其修远兮,吾将上下而求索!!!
以下网友喜欢您的帖子:

  
侠士

经验值: 1859
发帖数: 663
精华帖: 1
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 4楼 2021-07-29 16:56:17

非常善于总结

下载下来仔细拜读了一下,可能楼主写的功能比较全,用起来不够傻瓜。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 11699
发帖数: 1754
精华帖: 0
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 5楼 2021-07-30 08:15:12


  不错  感谢分享。


邮箱 yongquancun@126.com
以下网友喜欢您的帖子:

  
侠士

经验值: 1859
发帖数: 663
精华帖: 1
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 6楼 2021-07-30 08:44:36

没有其他意思,就是和楼主探讨下模块使用的便利性,还是非常赞赏楼主的研究和分享精神的。

我目前一直在用的是一个封闭的FB块,(RTU串口,RTU以太网,Modbus on TCP都是一样的,软件差异性估计100行都不到)。FB块的输入就是从站IP地址和端口号、通讯队列的间隔时间、通讯队列的有效数量、每个队列的具体参数(功能码,起始地址,读写长度)。配置好这些,或者在线修改配置也可以,其他就不用管了。用户只需要把要写出去的数据放到相应队列的缓冲区,或者从相应缓冲区把数据读出来就可以了。

相信每个人都有自己实现的思路,但是我觉得这种简单通讯协议的实现还是操作简便的好,否则宁愿多花个几百,把串口服务器改成网关,用西门子自己的功能块来做岂不更省事。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 6166
发帖数: 1000
精华帖: 0
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 7楼 2021-07-30 14:46:39

mark一下,做个记号啊


认真学习,努力工作
以下网友喜欢您的帖子:

  
奇侠

经验值: 6703
发帖数: 1324
精华帖: 0
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 8楼 2021-07-30 17:42:25


很好,值得学习。


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2748
发帖数: 433
精华帖: 1
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 9楼 2021-07-30 17:43:22


跟着学习了。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10919
发帖数: 1222
精华帖: 0
回复:跑在以太网上的Modbus rtu
推荐帖


只看楼主 10楼 2021-07-30 18:37:31

内容值得学习


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7780
发帖数: 715
精华帖: 0
回复:跑在以太网上的Modbus rtu


只看楼主 11楼 2021-07-31 08:21:52

 

整洁,干净,丰富!

你值的拥有!


海纳百川,厚德务实!
以下网友喜欢您的帖子:

  
侠士

经验值: 1440
发帖数: 196
精华帖: 1
回复:跑在以太网上的Modbus rtu


只看楼主 12楼 2021-07-31 08:29:18


马克一下,回头研究研究,感谢分享


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5568
发帖数: 294
精华帖: 0
回复:跑在以太网上的Modbus rtu


只看楼主 13楼 2021-08-02 08:23:16


值得学习!


 
以下网友喜欢您的帖子:

  
版主

经验值: 12356
发帖数: 1797
精华帖: 39
回复:跑在以太网上的Modbus rtu


只看楼主 14楼 2021-08-02 10:42:36

 提供了一种新的解决方案


下面观点表示大力支持
关于通信网络施工,尽量选择西门子485紫皮电缆,你胡弄网络,网络就胡弄你,所以质量可靠的硬件是保证通信正常的前提。若通信线路过长,请使用RS485中继器,但请不要西门子RS485中继器,因为不支持MODBUS通信。具体接线方式请查阅相关资料。

但是 有些观点不敢苟同
网线也尽量选用西门子的,这样问题少。用西门子网线竟然问题多了


人生就像一场旅行!
以下网友喜欢您的帖子:

  
侠士

经验值: 1440
发帖数: 196
精华帖: 1
回复:跑在以太网上的Modbus rtu


只看楼主 15楼 2021-08-02 14:32:07

不懂就问系列:楼主,这文件库还加着密码呢吗?




 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
跑在以太网上的Modbus rtu
×
扫描打开手机版
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。