第28课 · 地址对不上全白干:Modbus 地址与数据格式

信捷指令讲堂 · 6 段 · 共 3:38 · 正文 1089 字 · 完全免费

这节课专治"看起来都写了,就是读不出来"。Modbus 的地址有三套编号方式,差一个偏移就全错——这节课把三套编号一次对齐。

完整课程 · 智慧屏 + 数字人讲师加载较慢?先看下面的图文
正在加载数字人讲师 …
首次打开约需 30~60 秒(3D 模型较大,只在电脑上加载)
加载期间可以先往下看图文讲解
这台设备暂时跑不了完整课程需要支持 WebGL 的浏览器(多数电脑浏览器都支持)
下面是同一节课的图文讲解 + 音频,内容完全一样

📱 手机上看不到完整课程(数字人讲师需要电脑浏览器的 3D 支持)。下面是这节课的图文讲解 + 音频,内容完全一样,手机上也能完整学完。想体验完整课程,用电脑打开这一页即可。
仍然在手机上试试完整课程

1/6

四个区:同一个地址,读出来不一样

0:36

同一个地址,四个区就是四样东西

  • 四个区各有一本账线圈 / 输入线圈 / 保持寄存器 / 输入寄存器
  • 同一个编号,四处不同值地址零:线圈区是一,寄存器区是二百五十六
  • 一个回通断,一个回数值线圈区给开关量,寄存器区给数字
  • 区选错,数全错,还不报错设备不会告诉你读错了区
地址对不上全白干:Modbus 地址与数据格式 · 四个区:同一个地址,读出来不一样 梯形图 同一个地址零:读线圈是一,读寄存器是256

同一个地址零:读线圈是一,读寄存器是256

上一课我们把数写出去、再读回来,用的是同一个地址。可仔细一看就发现问题:同样写地址零,读线圈区回来是一,读寄存器区回来却是二百五十六。原因在对面那台设备:它的地址空间分成四个区,线圈区、输入线圈区、保持寄存器区、输入寄存器区,各有一本账。同一个编号零,落在不同区就是四样东西。线圈区回来的是通和断,寄存器区回来的是数值。区要是选错,数就全错,而且不报错。

2/6

八个功能码:读四条、写四条

0:35

八个功能码:四条读、四条写

  • 八个号,读四写四读 01/02/03/04,写 05/06/0F/10
  • 名字末尾定读还是写末尾 R = 读,末尾 W = 写
  • COLR / INPR / REGR / INRR四条读:线圈、输入线圈、寄存器、输入寄存器
  • COLW / REGW / MCLW / MRGW四条写:单线圈、单寄存器、多线圈、多寄存器
地址对不上全白干:Modbus 地址与数据格式 · 八个功能码:读四条、写四条 梯形图 功能码 06H 写一个,03H 再读回来

功能码 06H 写一个,03H 再读回来

定了区,还要说清是读还是写。Modbus 给每个动作编了个号,叫功能码。读的四个号是一到四,写的四个是五、六,另外两个两位数写一串。信捷把八个号做成八条指令,看名字就能分:末尾是 R 的读,末尾是 W 的写。COLR、INPR、REGR、INRR 是四条读;COLW、REGW、MCLW、MRGW 是四条写。读的四条、写的四条,一条一条对上。

3/6

★ 地址是十六进制:Y0 是 6000H,不是 6000

0:38

手册的地址全是十六进制

  • 手册地址是十六进制M0 和 D0 都是零,X0 是 5000H,Y0 是 6000H
  • ★ Y0 是 6000H,不是 60006000H 换成十进制 = 24576
  • 写成 K6000 就跑到别处位置全错,程序还不报错
  • 同一指令,两个数差得远H6000 出 24832,K6000 出 6256
地址对不上全白干:Modbus 地址与数据格式 · ★ 地址是十六进制:Y0 是 6000H,不是 6000 梯形图 H6000 出 24832,K6000 出 6256

H6000 出 24832,K6000 出 6256

再看地址本身。手册那张对照表里的地址全是十六进制。M0 是零,D0 也是零;X0 是 5000H,Y0 是 6000H,T0 是 A000H,C0 是 B000H。最容易栽的是 Y0:它的地址 6000H,换成十进制是两万四千五百七十六,不是六千。你要是写成 K6000,读到的是另一个地方。看这一屏:写 H6000 读回来两万四千八百三十二,写 K6000 读回来只有六千二百五十六。

4/6

数值不看进制:三种写法一样

0:37

数值不分进制,只看值相不相等

  • 地址看进制,数值不看只要值相等,三种写法都行
  • B10000 = K16 = H10手册原话:三条指令功能相同
  • 二进制 111110100 = 500换成十六进制就是 1F4
  • 读回来三个都是 500写法不同,结果一模一样
地址对不上全白干:Modbus 地址与数据格式 · 数值不看进制:三种写法一样 梯形图 三种写法送 500,读回三个都是 500

三种写法送 500,读回三个都是 500

地址要按十六进制写,可数值反过来,怎么写都行,只要值相等。手册上专门讲了一条:B10000、K16、H10 是同一个值,所以这三条写指令效果完全一样。看这一屏,三个不同的地址,分别用 B111110100、K500、H1F4 三种写法送数。111110100 这个二进制数,换成十进制是五百,换成十六进制就是 1F4。三条指令跑完,读回来三个都是五百。写程序挑顺手的写法,别在这儿跟自己较劲。

5/6

装不下占两格:32 位数据

0:34

32 位装不进一格,就占两格

  • 一格只有十六位最大 65535,再大就装不下
  • 装不下就拆两格低字在前、高字在后,这就是双字
  • 字节数 = 个数 × 2手册 6-2-4 的明规矩
  • 两格一起送,一起回4464 和 1,原样过去原样回来
地址对不上全白干:Modbus 地址与数据格式 · 装不下占两格:32 位数据 梯形图 32 位占两格:低字 4464,高字 1

32 位占两格:低字 4464,高字 1

还有一种情况会让地址对不上:数值太大。一格寄存器只有十六位,最大装到六万五千五百三十五。想送七万,一格装不下,得拆成两格,这就是双字。手册上讲,多个寄存器写的时候,字节数等于个数乘二,一个寄存器占两个字节。看这一屏:先把七万装进 D40、D41 两格,低字在前、高字在后,读出来是四千四百六十四和一。再把这两格送到对面,读回来一模一样。

6/6

线上一串数:站号、功能码、地址、数据、校验

0:38

一串数 = 站号 + 功能码 + 地址 + 数据 + 校验

  • 手册的现成例子一串十六进制,五段拼起来
  • 对 D2 写 5000D2 的地址是 2,功能码 06H
  • 5000 就是 13 88数据也按十六进制看
  • 发什么、回什么,才算成功通讯监视面板上一条条看
地址对不上全白干:Modbus 地址与数据格式 · 线上一串数:站号、功能码、地址、数据、校验 梯形图 写 D2 的地址是 H2,数据是 H1388

写 D2 的地址是 H2,数据是 H1388

最后看看这一串数在线上长什么样。手册上有个现成例子:对 D2 写五千。D2 的地址是二,功能码零六,数据五千换成十六进制是 13 88,再加两字节 CRC 校验。合起来就是:01 06 00 02 13 88,后面跟两个校验字节。上位机发这一串,PLC 原样回这一串,就说明写成功了。地址和数据都按十六进制对,看错一位就写错地方。这一串在通讯监视面板上能一条一条看到。

想亲手试一下?

这门课的电路,已经给你摆好了。不用装软件,点开就能按按钮、看线圈亮。