xm小马宝莉第九季(小马宝莉第九季)

【万泉河】自带轮询功能的MODBUS并行通讯已实现

时间跨度整整一个月。

我在上个月曾经写文章【万泉河】MODBUS并行通讯实现 提到过这件事情。后来经过这一个月紧张的调试,包含期间我去处理了一些别的事情。 现在,终于搞定了。对我来说一块石头算落了地。

块的使用方法:

建立用于通讯的缓冲区的数据块BUFF,我的习惯是给每个数据区10个int,因为我认为一次数据读或者写10个数值就足够了。 而其实你也可以按照MODBUS协议的规范,任意定义数据区的大小。

我这里定义了100的数组,也成功扔掉了UDT,直接用数组就可以。

xm小马宝莉第九季(小马宝莉第九季)

然后是MODBUS通讯程序块的调用,每一块数据,调用一次,生成一个实例背景数据块即可。读写都可以。

xm小马宝莉第九季(小马宝莉第九季)

每个管脚的定义:

PORT , BAUD , PARITY 分别是485接口的地址,通讯波特率以及奇偶校验。现在流行设置9600,8,N。不乱。

MinCycle,一个大循环的最小的轮询时间。通常缺省设置为500MS,在站数比较多的时候, 轮询时间超过这个数值可以,但如果站和站数据都比较少,循环周期太短的情况下,会等一等,凑足500ms之后才进行下一次循环。 遇到过有的人工写的从站程序, 主站去刷的频率太快了,它受不了, 会被刷死。

上述这4个参数只对第一次调用管用,后面调用其实不起作用。 但为整齐起见,每次调用都填入相同的参数,没毛病。

MB_ADDR : 从站地址;

MODE : 0=读,1=写;

DATA_ADDR : 数据地址;

DATA_LEN : 数据长度

上述都是标准的MODBUS通讯的参数, 按常规使用即可。

Slow_IN : 预设的同步或者异步轮询方式。0=同步, 1=异步。 如果为1,用于对刷新速度要求不高的场合, 每个轮询周期内,除了同步站以外,每次会访问2个异步站。 同步站如果长时间通讯中断,也会被切换为异步站,直到通讯正常后,会切回同步模式。但前提是输入这里要求是同步,即为0 。

BUFF 通讯缓冲区,必须是全局数据块内的数据, 如我上面已经建立好的。 读与写都可以使用。

XMB_COMM_LOAD : MODBUS 功能块FB1080的背景数据块,手动建立一个,重复使用即可。

MASTER: MODBUS功能块FB1081的背景数据块,同上。

D: 用于协调多个站调用的功能块的背景数据块, 也同上。

上述三个背景数据块在对一个串口通讯的时候,每次调用使用相同,如果对多个串口通讯, 则只需要另外重新建立一套即可。 当然,前面的PORT参数也要同步修改。

输出部分的管脚:

QID : 每个实例的计数标志。 通常第一个调用的ID=1, 但如果在运行中增加或减少实例,会导致乱掉, 需要检查前面的通讯接口数据只对ID=1的站有效。

ACTIVE: 轮询到本站时,本站为1;

NDR : 收到(或者发送)一次数据成功,缓冲区数据真实有效。

Error:本站通讯故障。

StationTime: 本站通讯时间

CycleTime: 轮询总时间(仅在ID=1有效)

程序块在S7-1212 调试通过,所以支持S7-1500自然没有问题。

这项工作是整个的标准化架构的一部分,把这部分工作模块提前完成封装以后,再有遇到MODBUS串口通讯的应用场合,可以很快速的拿出来应用,可以多次重复使用。 避免临阵搞不定慌了马脚。也不容易搞精确。

这才是模块化设计工作的本意。 那些把一个项目内所有设备分成一个个区域, 然后谓之曰模块化的,是假的模块化。

这部分技术储备,主要为了自己用。 将来在应用需求时,可以快速精准实现,那么我们的设计团队自然更有竞争力。

    
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 cloud@ksuyun.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.daxuejiayuan.com/23388.html