|
项目调试需要跟空气悬浮鼓风机通讯,一般用Modbus-RTU或TCP方式。以前为了方便都是直接采用Modbus-TCP的方式由上位机软件读取,上位软件做Modbus-TCP通讯一般不区分读写命令,只需要配置寄存器地址,直接支持对同一个寄存器读写。比如鼓风机的开度设置,上位机配置为读写,那么用一个变量既能显示开度也能修改开度,现场通过触摸屏修改了开度值也能同步在上位显示。
这次的项目没有采用直接跟上位通讯的方式,而是先跟plc通讯,然后上位机再读取PLC的地址。因为PLC的Modbus通讯指令是区分读写的,那能像上位机通讯那样利用PLC的一个变量跟鼓风机的一个变量同时读写吗?感觉是不行的,因为如果实时读,那么PLC侧可能还没修改数据就被重新刷新了,根本没法把新的数据写到鼓风机从站里。最后的解决方式就是用两个变量,一个存储从子站读的数据,一个存储写给子站的数据,读和写都指向子站的同一个寄存器,读命令周期执行,写命令只在数据变化时执行。这样另一个问题就出现了,如果子站通过触摸屏修改了开度,读变量能显示当前开度,但是写变量还是保持上次的设置值,为了同步显示只能记录开度的历史值,如果跟当前值不一致就把当前值复制给开度设置,并且这个操作只能在判断不一致时执行一次,不能一直执行。这样如果鼓风机开度变化会执行如下过程:MB读命令读取新开度值显示——新开度与历史开度不一致,将新开度复制给历史开度和开度设定——开度设定变化再执行一次写命令,把同样的开度再写给MB子站——读写数据一致,写命令停止执行。
|
|