以下是针对cp1e-n20dr-a 而言的
PLC提供了A640.00,A640.01,A640.02三个内部寄存器对通讯进行监控
A640.01:MODBUS_RTU主站执行错误标志
A640.02:MODBUS_RTU主站执行正常标志
通讯正在执行时这两个标志均为OFF
A640.00:MODBUS_RTU主站通讯执行控制位 通过用户程序SET命令置ON,清除接收缓冲区D1250-D1259,启动MODBUS_RTU主站命令数据发出并等待从站响应,此时维持ON状态,在接收到响应(不管正确与否)或接收超时后该位自动置OFF,在接收缓冲区中会有从站响应回来的数据(未接收到响应时D1252的数据为HEX:0080表示响应超时,其他数据缓冲区维持0态),用户程序勿对其置OFF。
明白了以上过程,通过在发送缓冲区D1200-D1249预置MODBUS命令帧数据,并根据A640.00的状态进行监控即可实现MODBUS主站的通讯。发送,接收缓冲区的数据和MODBUS_RTU协议密切相关可参考PLC的软件手册和MODBUS_RTU协议去理解,如感兴趣的人多的话我会后续跟帖稍作说明。
楼主最近还看过
举个读03从站输入寄存器的例子来说明发送,接收缓冲区的数据
读4个从地址0(MODBUS定义的地址是30001)开始的输入寄存器,根据MODBUS_RTU协议主站发出的命令是:从站地址、功能码、起始地址高字节、起始址低字节、欲读输入寄存器个数高字节、欲读输入寄存器个数低字节、CRC校验码
也就是这么一串数据:03 、04、00、00、00、04、F0 2B
它存放在CP1E的发送缓冲区是这样的:D1200:0003 从站地址
D1201:0004 功能码
D1202:0004 与D1200,1201定义的MODBUS通讯命令相关的还有4个字节的数据参与定义,即后续的D1203,1204
D1203:0000 起始地址
D1204:0004 要读出的输入寄存器个数
CRC校验码是PLC根据前面的数据自动计算出来的
再举个写01从站从地址1(MODBUS定义的地址是40002)开始的2个保持寄存器的例子,写入数据为0001,0258
它的MODBUS_RTU命令帧是:从站地址、功能码、起始地址高字节、起始字节低字节、欲写入保持寄存器个数高字节、欲写入保持寄存器个数低字节、欲写入字节数、欲写入数据(根据欲写入字节数多少而变化)、CRC校验码
也就是这么一串数据:01、10 、00 、01 、00 、02 、04 、(00 、01 、02 、58 )、63 39
对应到PLC的是D1200: 0001 从站地址
D1201: 0010 功能码16写多个保持寄存器
D1202: 0009 即D1203开始的后续9个字节参与定义该通讯命令
D1203: 0001 起始地址(对应的是保持寄存器40002)
D1204: 0002 要写入的保持寄存器个数
D1205: 04///00 04 4个字节///00 保持寄存器40002高字节
D1206: 01///02 01 保持寄存器40002低字节///02 保持寄存器40003高字节
D1207: 58///XX 58 保持寄存器40003低字节///可为任意数据
CRC校验码是PLC根据前面的数据自动计算出来的
按照1楼数据主站发出的命令,03号从站在正常通讯时会响应回30001-30004 4个输入寄存器的数据8个字节
根据MODBUS_RTU协议响应的数据帧是:从站地址、功能码、读出的数据字节个数、数据、CRC校验码
也就是这么一串数据:03 、04 、08 、AA 、aa 、BB 、bb 、CC 、cc 、DD 、dd 、CRC校验码
对应到PLC的接收缓冲区D1250-1299则D1250: 0003 从站地址
D1251: 0004 功能码04读输入寄存器
D1252:错误码,具体参见后述
D1253:0009 即D1254开始的后续9个字节提供读响应的信息数据
D1254:08///AA 08 响应字节数///AA 输入寄存器30001高字节
D1255: aa///BB aa 输入寄存器30001低字节///BB 输入寄存器30002高字节
D1256: bb///CC bb 输入寄存器30002低字节///CC 输入寄存器30003高字节
D1257:cc///DD cc 输入寄存器30003低字节///DD 输入寄存器30004高字节
D1258:dd///00 dd 输入寄存器30004低字节///发送命令时被清0