第三集:MODBUS功能码发送和返回报文的实测解析(三菱PLC)
发布时间:2023-07-25 09:33:16 作者:PLC爱好者 浏览量:89
文章撰写不易,各位看官慢慢欣赏,看完记得给我点赞关注转发收藏哦,先谢谢了!抱拳~
-------------------------------------------------------------------------------------------------------------------
思索再三,还是觉得以图文的形式将功能码的解析展现出来会比较好,因为图文形式可以直接去到某个功能码去查看,这样更直观,不像视频查找起来比较慢。当然了,如果大家想看视频演示的话,可以在底下评论区留言,我看看大家的意见后再决定是否水一期视频。
记住:以下所有的数据,都是以16进制体现的!!!
01H功能码:线圈读出,可以读出1个或多个线圈的状态(ON/OFF)
例1:读取FX3U的M0-M10这11个线圈的当前状态,我们在PLC中将M0-M10都设置为1
主站发送报文如下:01 01 00 00 00 0B 7D CD
从站返回报文如下:01 01 02 FF 07 B9 CE
例2:读取FX3U的Y0-Y7这8个线圈的当前状态,我们将Y3置为0,其余置为1
主站发送报文如下:01 01 33 00 00 08 32 88
从站返回报文如下:01 01 01 F7 10 0E
例3:读取FX3U的Y10单个线圈的当前状态,我们将Y10置为1
主站发送报文如下:01 01 33 08 00 01 73 4C;这里要注意的是Y10的地址,由于Y线圈是8进制的,而Y线圈的MODBUS地址是十进制的,因此这里的Y10的地址应该是H3308(3300+8)
从站返回报文如下:01 01 01 01 90 48
重点:这里的字节数是以8个位为单位,不足8位的数据,字节数依旧为1个字节数。比如M0-M10,这里有11个位,11=8+3,后面的3不足8位,因此依旧是要写成2个字节数的!!!
02H功能码:读出1个或多个离散输入的状态(ON/OFF)
例1:读取FX3U的X0-X10这9个输入点的当前状态,当前的X2, X5 X10都点亮,其余为灭。
主站发送报文如下:01 02 34 00 00 09 B6 3C
从站返回报文如下:01 02 02 24 01 63 78
例2:读取FX3U的X11单个输入的当前状态,当前X11是点亮的。
主站发送报文如下:01 02 34 09 00 01 67 F8;这里也要注意X11的地址
从站返回报文如下:01 02 01 01 60 48
03H功能码:读出1个或多个保持寄存器的值
例1:读取FX3U的D1000-D1010这11个寄存器的值,D1000=100, D1001=101, D1002=102, D1003=103, D1004=104, D1005=105, D1006=106, D1007=107, D1008=D108, D1009=109,D1010=110
主站发送报文如下:01 03 03 E8 00 0B 84 7D;(11个寄存器,就是11个点数,11换成16进制就是0B)
从站返回报文如下:01 03 16 00 64 00 65 00 66 00 67 00 68 00 69 00 6A 00 6B 00 6C 00 6D 00 6E F0 39
例2:读取FX3U的D1100单个寄存器的值
主站发送报文如下:01 03 04 4C 00 01 44 ED
从站返回报文如下:01 03 02 00 63 F8 6D
04H:读出1个或多个输入寄存器的值。
例1:读取FX3U的D1000-D1010这11个寄存器的值
主站发送报文如下:01 04 03 E8 00 0B 31 BD
从站返回报文如下:01 04 16 00 64 00 65 00 66 00 67 00 68 00 69 00 6A 00 6B 00 6C 00 6D 00 6E 66 13
例2:读取FX3U的D1100单个寄存器的值
主站发送报文如下:01 04 04 4C 00 01 F1 2D
从站返回报文如下:01 04 02 00 63 F9 19
在FX3U中输入寄存器和保寄存器是同一个寄存器。而在FX5U中,输入寄存器是不存在的。并且通过测试结果可知,H03和H04功能码的功能是一样的,怪不得FX5U中把输入寄存器给取消掉了呢。
05H:在1个线圈中写入值(ON/OFF)
例1:将FX3U中的M100置1
主站发送报文如下:01 05 00 64 FF 00 CD E5
从站返回报文如下:01 05 00 64 FF 00 CD E5
例2:将FX3U中的M100置0
主站发送报文如下:01 05 00 64 00 00 8C 15
从站返回报文如下:01 05 00 64 00 00 8C 15
06H:在1个保持寄存器中写入值。
例1:将FX3U中的D0写入100
主站发送报文如下:01 06 00 00 00 64 88 21
从站返回报文如下:01 06 00 00 00 64 88 21
例2:将FX3U中的D0写入-100
主站发送报文如下:01 06 00 00 FF 9C C8 53
从站返回报文如下:01 06 00 00 FF 9C C8 53
特别注意:我这里的-100是根据PLC里的-100的二进制数再手动转换为16进制数后填入到报文中的。真正在进行数据交换的时候,直接在主站的寄存器中填入-100即可,然后从站接收到的寄存器数据直接拿来用即可。
另外还有一点,由于06H功能码只能写入1个保持寄存器,因此它的数据范围只能是-32768到32767,且不能为浮点数。因为浮点数需要2个寄存器(即4个字节)来表示。
0FH:在批量(1个或多个)线圈中写入值(ON/OFF)
例1:将FX3U中的M0-M10的这11个线圈分别写入:(M10)101 0111 0011(M0)
5 7 3
根据手册,它的写入顺序是先低位,再高位,因此73放在前,05放在后。大家也可以尝试将05放前,73放后看看是你想要的结果,或者说是否按照先低后高的顺序写入的?
主站发送报文如下:01 0F 00 00 00 0B 02 73 05 01 F7;
从站返回报文如下:01 0F 00 00 00 0B 14 0C
例2:将FX3U中的M0单个线圈置1
主站发送报文如下:01 0F 00 00 00 01 01 01 EF 57;这里黄色标记的是让M0置为1的数值,并且只能填01,不能填00 01,因为它的前面是01,表示1个字节,如果填了00 01,那就是2个字节,就会出现下面的异常返回码:01 8F 03 04 31
从站返回报文如下:01 0F 00 00 00 01 94 0B
例3:将FX3U中的M0单个线圈置0
主站发送报文如下:01 0F 00 00 00 01 01 00 2E 97
从站返回报文如下:01 0F 00 00 00 01 94 0B
10H:在批量寄存器中写入值。
例1:将FX3U中的D1000-D1007这8个寄存器分别写入值:1.2,65535.0,-100.0,-35.99
由于浮点数需要占用2个寄存器,因此一共需要8个寄存器。
其中,D1000-D1001存储1.2,并且1.2在32位寄存器中的值的表示方式如下图所示,因此D1000=999A,D1001=3F99
根据这个方法,下面的几个数据也可以按照高低寄存器的方式来存储。
D1002-D1003存储65535.0
D1002=FF00, D1003=477F
D1004-D1005存储-100.0
D1004=0000, D1005=C2C8
D1006-D1007存储-36.99
D1006=F5C3, D1007=C20F
主站发送报文如下:01 10 03 E8 00 08 10 99 9A 3F 99 FF 00 47 7F 00 00 C2 C8 F5 C3 C2 0F ED B8
从站返回报文如下:01 10 03 E8 00 08 41 BF
例2:将FX3U中的D2000单个寄存器写入值:-3.14
主站发送报文如下:01 10 07 D0 00 02 04 F5 C3 C0 48 4B 05;虽然是单个,但是浮点数需要2个寄存器来存储,因此实际还是对2个寄存器进行写入。
从站返回报文如下:01 10 07 D0 00 02 41 45
17H:进行批量保持寄存器的读出/写入。处理过程为实施写入后再进行读出。
例1:将FX3U中的D0-D10写入值:0,1,2,3,4,5,6,7,8,9,10
读出D20-D30的值:预设100,101,102,103,104,105,106,107,108,109,110
主站发送报文如下:01 17 00 14 00 0B 00 00 00 0B 16 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 71 26
从站返回报文如下:01 17 16 00 64 00 65 00 66 00 67 00 68 00 69 00 6A 00 6B 00 6C 00 6D 00 6E 4F 79
例2:将FX3U中的D50写入值:555(想验证是否可以读取1个寄存器)
读出D52的值:预设666
主站发送报文如下:01 17 00 34 00 01 00 32 00 01 02 02 2B 50 E9
从站返回报文如下:01 17 02 02 9A 3C BF
好了,以上就是各个功能码的实际收发报文时的情况,大家可以尝试着去做做。
下一集,我会讲讲MODBUS主站功能,通过2台三菱PLC来进行主从通信。
敬请关注
收藏