寄存器和输入寄存器,如下图所示:
Mod_Data_Coils0数据表为线圈数据,适用于功能码1、5和15。 Mod_Data_Contacts1数据表为离散输入数据,适用于功能码2。
Mod_Data_HoldReg4数据表为保持寄存器数据,适用于功能码3、6和16。 Mod_Data_InpReg3数据表为输入寄存器数据,适用于功能码4。
当Modbus主站从某些从站读取到位或字类型的数据时,它们被放置到了哪里?怎么让这些数据像我们希望的那样在分类数据表中放置?当Modbus主站要向某些从站写入位或字类型的数据时,它们应该被放置到哪里?如何准确地将数据写入到从站的正确位置?
在这里要提到命令中的两个标签:Mod_Commands[x].AddressOffsetinMaster和Mod_Commands[0].StartingAddress。前一个表示在主站数据表的地址偏移,后一个表示相应从站的起始地址。两个标签都是以字为单位进行操作的。
实例1:读取5个离散输入状态(功能码2)
情况一:
Mod_Commands[x].AddressOffsetinMaster=0 Mod_Commands[0].StartingAddress=0 命令设置如下:
主站读取的离散量状态放置位置图,如下: 在这种情况下,
从站数据没
有任何偏置,主站数据表的数据也没有偏移。
情况二:
Mod_Commands[x].AddressOffsetinMaster=2 Mod_Commands[0].StartingAddress=0 命令设置如下:
主站读取的离散量状态放置位置图,如下:
在这种情况下,从站数据没有任何偏置,主站数据表的数据偏移2个字。
情况三:
Mod_Commands[x].AddressOffsetinMaster=0 Mod_Commands[0].StartingAddress=3 命令设置如下:
主站读取的离散量状态放置位置图,如下:
在这种情况下,从站数据偏置3位,主站数据表的数据偏移3位。
情况三:
Mod_Commands[x].AddressOffsetinMaster=2 Mod_Commands[0].StartingAddress=3 命令设置如下:
主站读取的离散量状态放置位置图,如下:
在这种情况下,从站数据偏置3位,主站数据表的数据偏移2个字3位。
实例2:向从站写5个保持寄存器(功能码16)
情况一:
Mod_Commands[x].AddressOffsetinMaster=0 Mod_Commands[0].StartingAddress=0 命令设置如下:
主站向从站写保持寄存器数据位置如下:
在这种情况下,从站保持寄存器不偏移,主站保持寄存器数据表也不偏移。
情况二:
Mod_Commands[x].AddressOffsetinMaster=2 Mod_Commands[0].StartingAddress=0 命令设置如下:
主站向从站写保持寄存器数据位置如下:
在这种情况下,从站保持寄存器不偏移,主站保持寄存器数据表偏移2个字。
情况三:
Mod_Commands[x].AddressOffsetinMaster=0 Mod_Commands[0].StartingAddress=3 命令设置如下:
主站向从站写保持寄存器数据位置如下:
在这种情况下,从站保持寄存器偏移3个字,主站保持寄存器数据表偏移3个字。
情况四:
Mod_Commands[x].AddressOffsetinMaster=2 Mod_Commands[0].StartingAddress=3 命令设置如下:
主站向从站写保持寄存器数据位置如下:
在这种情况下,从站保持寄存器偏移3个字,主站保持寄存器数据表偏移5