最近做个小项目,1200带10个 变频器,采用MODBUS通信方式,由于每个变频器除控制起停以外,还要读取,电压、电流、状态等参数,因此数据量也不小,而MODBUS通信只能做轮询,所以写参数的时候会有延迟,轮询时间超过1S估计客户很难接受,所以考虑尽可能缩短轮询时间,从网上查了一些资料,总结一下思路吧。
采用类似于步进的方式,用MB_COMM_LOAD的done引脚作为开始步进标志位,利用MB_COMM_MASTER的done和error引脚做步进标志。 在第1条轮询的基础上,采用读或写连续地址,减少master功能块的数量,此种方法受功能码的限制,以本次项目为例说明,本项目控制的变频器,写报文为06H功能码,读为03H功能码(据了解设备厂家很少支持所有的功能码,可能跟芯片价格有关,再者编程工作量也比较大),06H功能码数据长度为1个WORD不能写到连续多个地址,03H可以读多个连续地址,写的不可避免要增加工作量。 利用FB多重背景和间接寻址来做,将MB通信块放入FB选择多重背景,LOAD功能块可以建立常量,MASTER功能块引脚MB_ADDR、MODE、DATA_ADDR、DATA_LEN、DATA_PTR分别建立到STRUCT数组里面,利用数组索引,给这些参数赋不同的值,从而读或写MB数据,本次项目中DATA_PTR长度不同,STRUCT数组是统一的数据长度,定义接收数据长度时,我按我需要的最长4个WORD定义的,由于写只能是1WORD所以可能会有问题,后来实测我只写到第一个WORD即可写过去,不知道这样做会不会有问题,目前运行正常。 利用串口服务器或者类似设备转为TCP通信,串口服务器据说可以自动轮询,效果无法用数据表达,数据量大有条件可以使用。
|