在 Modbus 协议中,字节、位 和 寄存器 之间有着紧密的关系。为了更好地理解它们之间的联系,我们需要详细解释每个概念及其相互关系。
1. 位(Bit)
- 位 是数据的最小单位,通常表示一个二进制数字(0 或 1)。
- 在 Modbus 协议中,位常常用于表示单独的 开关状态 或 布尔值,例如某个设备的开/关状态、传感器的启用状态等。
- Modbus 协议中的一些数据结构(如 离散输入 和 线圈输出)是基于位来组织的,每个位代表一个独立的状态。
2. 字节(Byte)
- 字节 由 8 位 组成。
- 每个字节可以表示一个 8 位的数字,范围从
0x00
(0)到0xFF
(255)。字节是处理和传输数据的基本单位。 - 在 Modbus 中,每个字节包含 8 个连续的位,这些位可能代表开关的状态或多个数字的组合。
3. 寄存器(Register)
- 在 Modbus 协议中,寄存器 是数据的基本单位,通常由 16 位(即 2 字节)组成。
- 16 位寄存器可以存储较大的数值或多个数据位。它常常用来表示 整数、浮点数的一部分 或 多个开关的状态。
4. Modbus 寄存器、字节和位之间的关系
在 Modbus 中,不同类型的寄存器和数据通常通过字节和位来组织:
4.1 离散输入与线圈输出(Bit-based)
-
离散输入(Discrete Input)和线圈输出(Coil)是基于 位 的数据结构,每个位代表一个单独的开关状态(0 或 1)。
-
离散输入和线圈输出并不以 字节 或 寄存器 传输,而是以 位 为单位。Modbus 设备在传输这些数据时,通常按 1 位为单位进行请求和响应。
地址范围 类型 描述 0-9999 线圈(Coils) 1 位(0 或 1)表示开/关 10000-19999 离散输入(Discrete Inputs) 1 位(0 或 1)表示开/关
4.2 输入寄存器与保持寄存器(16-bit Register-based)
-
输入寄存器(Input Register)和保持寄存器(Holding Register)是 Modbus 中的 16 位寄存器,即每个寄存器包含 2 字节(16 位) 数据。
-
每个寄存器由 16 位(2 字节)组成,常常表示一个 整数值 或 多个开关的状态(每个位表示开关的状态)。
地址范围 类型 描述 30001-39999 输入寄存器(Input Registers) 16 位,通常用于表示传感器数据等 40001-49999 保持寄存器(Holding Registers) 16 位,用于存储设备的配置信息等
例如,一个 16 位的寄存器 0x1234
:
- 高字节:
0x12
- 低字节:
0x34
这个 16 位寄存器可以存储一个整数值 0x1234
,也可以表示多个开关状态。如果寄存器表示多个开关,低位(0x34
)和高位(0x12
)中的每一位可以表示一个开关状态。
4.3 字节和寄存器的传输
- 在 Modbus 协议中,每个寄存器由 2 字节(16 位) 组成,传输时它会被拆分为两个字节,在 大端模式 下传输,即 高字节 先发送,低字节 后发送。
- 一个 16 位的寄存器,比如
0x1234
,在传输时会被拆分成两个字节:高字节0x12
和 低字节0x34
。
5. 位、字节和寄存器的关系示例
让我们通过一个例子来解释位、字节和寄存器之间的关系:
假设一个 保持寄存器 的地址为 1,它的值为 0x1234
。
位 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
寄存器值(16 位) | 0x12 | 0x34 | 低字节 0x34 | 高字节 0x12 |
- 16 位的 寄存器 由 两个字节(8 位每个字节)组成。
- 每个字节又由 8 位 组成,分别表示不同的开关或状态。
- 0x1234(十进制的4660)
- 0x12--00010010
- 0x34--00110100
- 00010010(0x12)和00110100(0x34)最终拼接起来就是4660
- Modbus--大端模式下传输,即 高字节0x12 先发送,低字节0x34 后发送,接收者按照大端模式将其拼接起来就可以得到完整数据4660
6. 总结
- 位 是 Modbus 中最小的数据单元,通常表示一个开关或布尔值(0 或 1)。
- 字节 是由 8 位组成的单位,在 Modbus 中,字节用来传输离散输入和线圈输出等数据。
- 寄存器 是由 16 位(2 字节)组成的数据单元,通常用于表示传感器数据、控制信息、配置信息等。
- 16 位的 寄存器 内部的数据可以是多个 位 的组合,每个位可以表示一个单独的开关状态。
通过这些关系,你可以理解 Modbus 协议如何通过不同的位、字节和寄存器来组织和传输数据。
7.补充(Byte=byte)
7.1M等于多少字节byte(1MB=1024(KB)*1024byte)--个byte--千K--兆M
1MB等于1048576字节。算法是: 1byte(字节)=8bit(位),1KB=1024byte(字节),1MB=1024KB,1GB=1024MB1TB=1024GB,一个汉字要占用2个字节,如果换算成中文汉字那么就是1M=524288个汉字
带宽的单位一般有两种表现形式;第一种是B/s、KB/s或MBs,表示单位时间(秒)内传输的数据量(字节、千字节、兆字节),第二种是bps (或称b/s) 、Kbps (或称Kb/s) 或Mbps (或称Mb/s) ,表示单位时间(秒)内传输的数据量(比特、千比特、兆比特)。这两种带宽的换算公式是: B/s=8bps (b/s) 、1KB/s=8Kbps (Kb/s)1MB/s=8Mbps (Mb/s)
7.2.关于C#中Byte和byte区别
通过查询Java API 发现,Byte是类,byte是基本数据类型,准确来说Byte是byte的封装类。
因此Byte[ ]本身就不存在。而byte[ ]是字符类型的数组,可以用来存放数据。