首页  > 百科热搜  > 第三集:MODBUS功能码发送和返回报文的实测解析(三菱PLC)

第三集:MODBUS功能码发送和返回报文的实测解析(三菱PLC)

发布时间:2023-07-25 09:33:16     作者:PLC爱好者     浏览量:89    

松下plc

文章撰写不易,各位看官慢慢欣赏,看完记得给我点赞关注转发收藏哦,先谢谢了!抱拳~

-------------------------------------------------------------------------------------------------------------------

松下plc

思索再三,还是觉得以图文的形式将功能码的解析展现出来会比较好,因为图文形式可以直接去到某个功能码去查看,这样更直观,不像视频查找起来比较慢。当然了,如果大家想看视频演示的话,可以在底下评论区留言,我看看大家的意见后再决定是否水一期视频。

松下plc

这张是FX3U做为从站时,各软元件的MODBUS地址

记住:以下所有的数据,都是以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来进行主从通信。

敬请关注

收藏文章

收藏

文章标签: 第三集     MODBUS     PLC    
上一篇:开关电源(DC/DC)原理介绍 下一篇:梵克雅宝四叶草项链的颜色寓意