时间跨度整整一个月。
我在上个月曾经写文章【万泉河】MODBUS并行通讯实现 提到过这件事情。后来经过这一个月紧张的调试,包含期间我去处理了一些别的事情。 现在,终于搞定了。对我来说一块石头算落了地。
块的使用方法:
建立用于通讯的缓冲区的数据块BUFF,我的习惯是给每个数据区10个int,因为我认为一次数据读或者写10个数值就足够了。 而其实你也可以按照MODBUS协议的规范,任意定义数据区的大小。
我这里定义了100的数组,也成功扔掉了UDT,直接用数组就可以。
然后是MODBUS通讯程序块的调用,每一块数据,调用一次,生成一个实例背景数据块即可。读写都可以。
每个管脚的定义:
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串口通讯的应用场合,可以很快速的拿出来应用,可以多次重复使用。 避免临阵搞不定慌了马脚。也不容易搞精确。
这才是模块化设计工作的本意。 那些把一个项目内所有设备分成一个个区域, 然后谓之曰模块化的,是假的模块化。
这部分技术储备,主要为了自己用。 将来在应用需求时,可以快速精准实现,那么我们的设计团队自然更有竞争力。
如若转载,请注明出处:https://www.daxuejiayuan.com/23388.html