关于modbus rtu通讯调试过程的那些事2
接上一个贴【关于Modbus rtu通讯调试过程的那些事1】,https://www.ad.siemens.com.cn/club/bbs/post_1950268_50_0_4.html#anch 说到采用调试软件调试Modbus rtu通讯,及基本步骤和方法。主要是利用串口调试软件主要是能够规避初次应用的用户,在调用通讯指令时可能性出现的错误,造成对用户的编程思想暂时困惑,本贴重新来说道说道Modbus rtu通讯中并不起眼的功能码问题。主要还是为了结合集中采集数据时,作为主站侧需要的是采用功能码方式向从站侧方式数据,而不是触发诸如MSG指令时填写的Addr和Count管脚那种方式。
功能码:
关于Modbus rtu通讯中的功能码,如果不使用调试软件或者通讯调用的是库指令,用户基本上不需要理解这个问题,通讯调用库指令时,通讯指令的管脚并没有对功能码有明确的规范要求,而只需理解Addr(数据区)和Count(数据长度)管脚含义即可。常用的读、写寄存器功能码有:03、06、16。
功能码03:读取一个或者多个数据。
读取从站寄存器数据,串口调试软件发送编辑区发送:Hex 05 03 00 00 00 02
05:从站地址;5#从站
03:读取从站数据的功能码;读取
00 00:寄存器地址; 从寄存器开始地址读取
00 02:读取寄存器数据的长度,2个字,此处相当于一个浮点数。
数据发送到s7-1200,读取5#从站寄存器起始的第一个浮点数数据,图示;

S7-1200返回的第一个寄存器数据,图示:

串口调试软件接收数据区接收到Hex 05 03 04 3F 80 00 00 B2 0F
其中,
05表示是读取到的数据发送自5#从站;
03表示读取从站的功能码;
04表示读取的数据4个字节长度;
3F 80 00 00表示读取到的有效数据;
B2 0F表示读取数据的校验码。
多个数据读取,上一个帖子有例子,也就是上面00 02读取数据长度的变化。
功能码06:单个寄存器数据写入。
写入从站寄存器数据,串口图示软件发送比较区,写入Hex 05 06 00 00 FF FF数据,
05表示写入到5#从站;
06表示写的功能码;
00 00表示写入的寄存器开始地址,是从第0个字开始的;
FF FF表示写入的数据数值。
由串口图示软件向s7-1200从站寄存器第0个寄存器写了数据FF FF,图示:

发送数据后,s7-1200的寄存器到第0个数据,DB3.DBW0的数据由Hex 3F 80 变为Hex FF FF ,图示:

Hex FF FF数据被写入DB3.DBW0中。
目前暂时只用到这些功能码,实际上其它功能码按注释理解也是容易的,思想上的理解结合实际的测试很容易上手了的。