下面是网友youareold提的问题:
廖老师,请问一下modbus代表存储器(应为保持寄存器,廖注)的地址是40001~4xxxx,请求帧的16进制数地址应该怎么写呢?您在s7-1200书上的例7-6将数据16#aa55写入db3的数组元素aray[4]中,对应的modbus地址是16#0004,modbus的存储器地址不是40001~4xxxx吗?为什么这里储存器的地址是16#0004,就算转化为10进制也不是4xxxx啊?
下面是对上述问题的回答:
modbus地址为包含数据类型和偏移量的6个字符的数值。左边两个字符决定数据类型,右边四个字符是该数据类型中的序号。使用modbus地址时应注意下述问题:
1)你说的40001~4xxxx是美国modicon公司和ge公司plc使用的modbus地址,它是基于1的地址,即同类元件的首地址为1。西门子plc的modbus地址是基于0的地址。
2)美国的modbus地址左起第2位用来表示元件的类型,例如i0.0的modbus地址为010001。因为数据类型已经包含在功能码中了,西门子的i0.0的modbus地址实际上为000000,i2.0的modbus地址为000016(或十六进制数16#0010),而不是010017。
例7-6的例程ob1中的mb_slave指令的输入参数mb_hold_reg设置的保持寄存器的起始地址为p#db3.dbx0.0,例7-6的db3中的数组为array[0..9]of word,数组的字元素aray[4]在db3中的寄存器字的编号为4(第1个寄存器字aray[0]的编号为0),因此aray[4]的modbus地址为4。
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=130041&Name=liaochangchu