发布于 2013-06-11 15:12:05
19楼
【从机通讯地址】一般是指从机的站地址。也就是说在一个Modbus通讯线上每个从站必须规定一个本机地址,
主站才能通过不同的从站地址访问不同的Modbus设备上的数据。如果从站地址相同将导致通讯混乱。就好比
每个中国良民都有一个身份证号码,通过身份证号码可以查阅这个人的详细信息。如果有两个人的身份证号码
一致将导致那些所谓的执法者不知道去找谁做替死鬼。
还有一个就是【寄存器地址】,其实Modbus协议里面并没有死规定数据寄存器地址吧。
西门子给出的Modbus地址通常写作包含数据类型和偏移量的5个字符的数值。
第一个字符决定数据类型,最后四个字符在数据类型中选择适当的数值。
然后,Modbus主设备指令将地址映射至正确的功能,以便发送到从站。
Modbus主设备指令支持下列Modbus地址:
00001至09999是离散输出(线圈)
10001至19999是离散输入(触点)
30001至39999是输入寄存器(通常是模拟量输入)
40001至49999是保持寄存器
如果别人问"保持寄存器"地址,那么应该说是xxxxx,而不是4xxxxx。因为人家问的是【保持寄存器】地址而非映射地址;
但是如果别人问"温度设定"/"实时温度"等你自己定义的寄存器的地址,那么应该说是4xxxxx,而不是xxxxx。因为人家问的
是映射地址,你说地址是xxxxx人家不知道你用的是保持寄存器啊?还是输入寄存器。但是你说4xxxxx,人家就知道是保持
寄存器地址,可以用03、16功能码来访问。
做Modbus从站,需要知道:
1 通讯口参数配置(波特率、数据位、校验类型、停止位)。比如9600,8,E,1;
2 通讯协议类型。常用的就是ACSII和RTU;
3 从站的通讯地址。范围1~254;
4 从机支持哪几个Modbus功能码。常见的就是保持寄存器读写功能码03/06/16、线圈读写01/05/15;
知道了上面那些,你就知道该怎么去写从站代码了吧?
比如RTU主机发指令01 03 00 00 00 02 cr cr过来,当从机收到这一帧完整且正确的数据后,就把自己定义的保持寄存器0和
保持寄存器1的值返回给主机,响应数据01 03 04 ah al bh bl cr cr。对于小内存的单片机系统,是没那么多的内存映射所有
的功能码对应的寄存器的,所以只根据通讯请求返回相应的数据就可以了,完全可以无视映射地址。
建议去把Modbus标准规范完整吃透了,对简单的Modbus通讯就得心应手了。