1、测试背景在使用Modbus与第三方设备通信时,第三方设备方仅支持功能码“03”和“06”,因此无法使用QJ71MB91模块的自动刷新功能,需要使用MBREQ指令。同时,为了确保远程/本地控制方式,对远程设备的写入需要采用触发方式;读取采用循环方式。2、MBREQ指令MBREQ指令是QJ71MB91模块专用指令,使用该指令可以实现Modbus任意功能码的读写控制。但是,相对于自动刷新功能和MBRW指令,MBREQ指令使用较为复杂,需要根据功能码生成报文、进行字内数据交换等编程工作。MBREQ指令结构如下图。使用时,需要准备控制数据(S1)和报文数据(S2),反馈报文存储在(D1)中,(D2)为执行结果。2.1控制数据(S1)控制数据主要包括使用通道、目标站号、断线检测时间等参数,如下表所示使用通道2,访问1号站,超时检测为50ms的程序如下图所示。2.2报文数据(S2)(S2)+0中为报文长度,(S2)+1以后为报文内容。根据功能码不同,报文数据不同,因此(S2)的长度不固定。下图为使用功能码“03”时的报文结构。使用“03”码读取地址“0000”起始的1个寄存器的程序如下图所示。2.3反馈报文(D1)执行MBREQ指令后,如果子站及网络正常。将会在(D1)中收到反馈报文。其中,(D1)+0中为反馈报文长度,(D1)+1以后为报文内容。同(S2)中的发送报文一样,反馈报文也因功能码不同而不同。下图为使用“03”功能码时的反馈报文结构。程序运行后,1号站的反馈报文如下:2.4执行结果(D2)执行结果(D2)占用两个位元件,其中(D2)+0为执行完成标志位,(D2)+1为执行异常标志位,如下图所示。当MBREQ指令执行完成时,(D2)+0会置位1个扫描周期,如果执行异常,(D2)+1会同时置位1个扫描周期。3、编程客户对于编程的要求主要有2点:循环读取和触发写入。程序正常运行时,主站依次读取各站数据信息,仅当有写入请求时,执行1次数据写入操作。根据客户要求,设计程序流程如下:其中各站读取与写入指令间,采用MBREQ指令的执行完成标志位((D2)+0)进行连锁触发。当执行完最后一个站的读取时,检测是否有写入请求。如果有,执行1次写入操作,没有则返回读取第一个站。4、测试测试时共连接了4个从站,系统构成如下主站:Q04UDEH+QJ71MB91从站1:Q04UDEH+QJ71MB91从站2:FX3U-32MT+FX3U-485ADP-MB从站3:RKC温控仪FB-400从站4:RKC温控仪FB-400使用MBREQ指令,通过“03”功能码可以循环读取各个从站中的数据,如下图所示。其中FBK_DATE_1~4为从站1~4的反馈报文。使用MBREQ指令,通过“06”码写入一次,结果如下。其中FBK_DATE_WR为写入执行结果的反馈报文。5、后续工作由于Modbus报文是以字节为单位,因此使用MBREQ指令时,报文数据(S2)和反馈报文数据(D1)中的数据都存在着高低字节数据交换的问题。例如下图中的反馈报文,实际读取到的数据应为1080对应十六进制数H438,而实际接收到的数据是H3804。根据报文结构不同,还会出现一个字的数据出现在两个连续数据寄存器中的情况。例如下图中的“06”功能码的反馈报文,实际读取的寄存器地址是1287,对应十六进制H507,而实际收到的数据是H0506和H0007,地址数据分别存储在两个数据寄存器中。因此报文数据的转换还需要编写相应的外部程序。附:FB-400温控仪Modbus通信设定方法1、相关参数需要设定以下参数:站号、波特率、数据&停止位及校验方式、通信协议。其中,通信协议在FB60参数中,需要将温控仪切换到停止方式才能设置。2、外部接线FB-400采用两线制485,接线方式如下图。其端子的定义与我们的模块相反,即T/R(A)接我们模块的RDB/SDB,T/R(B)接我们模块的RDA/SDA,请务必注意!3、支持的功能码FB-400支持的功能码如下表所示: