在S7-200中,
若使用了MODBUS主站库,则调用MBUS_MSG指令实现对从站的访问,MODBUS通信中的功能码由指令自行转换。
如果访问4xxxxx保持寄存器,有三种类型的功能码03H(读单个或多个寄存器)、06H(写单个寄存器)、10H(写多个寄存器)。
下面是一个简单的MBUS_MSG指令的应用示例:
各参数意义如下:
1.EN使能:同一时刻只能有一个读写功能(即MBUS_MSG)使能,
注意:建议每一个读写功能(即MBUS_MSG)都用上一个MBUS_MSG指令的Done
完成位来激活,以保证所有读写指令循环进行(见例程)。
2.First读写请求位:每一个新的读写请求必须使用脉冲触发
3.Slave从站地址:可选择的范围1-247
4.RW从站地址:0=读,1=写
注意:
●开关量输出和保持寄存器支持读和写功能
●开关量输入和模拟量输入只支持读功能
5.Addr读写从站的选择读写的数据类型
数据地址:
00001至0xxxx-开关量输出
10001至1xxxx-开关量输入
30001至3xxxx-模拟量输入
40001至4xxxx-保持寄存器
6.Count数据个数通讯的数据个数(位或字的个数)
注意:Modbus主站可读/写的最大数据量为120个字(是指每一个MBUS_MSG指令)
7.DataPtr数据指针:
●如果是读指令,读回的数据放到这个数据区中
●如果是写指令,要写出的数据放到这个数据区中
8.Done完成位读写功能完成位
9.Error错误代码:只有在Done位为1时,错误代码才有效
0=无错误
1=响应校验错误
2=未用
3=接收超时(从站无响应)
4=请求参数错误(slaveaddress,Modbusaddress,count,RW)
5=Modbus/自由口未使能
6=Modbus正在忙于其它请求
7=响应错误(响应不是请求的操作)
8=响应CRC校验和错误
101=从站不支持请求的功能
102=从站不支持数据地址
103=从站不支持此种数据类型
104=从站设备故障
105=从站接受了信息,但是响应被延迟
106=从站忙,拒绝了该信息
107=从站拒绝了信息
108=从站存储器奇偶错误
常见的错误:
●如果多个MBUS_MSG指令同时使能会造成6号错误
●从站delay参数设的时间过长会造成主站3号错误
●从站掉电或不运行,网络故障都会造成主站3号错误
我想问的就是这三种类型的功能码03H(读单个或多个寄存器)、06H(写单个寄存器)、10H(写多个寄存器)在哪用?怎么知道我是用的03还是10
当你的数据地址为4xxxxx时,
若RW=0时,发出报文中的功能码就是03H;
若RW=1时,且COUNT=1,发出报文中的功能码就是06H;
若RW=1时,且COUNT>1,发出报文中的功能码就是10H;