Modbus简介以及NModbus学习分享

Modbus简介以及NModbus学习分享Modbus 简介 以及用 C 实现数据操作 包括读写 通过 NModebus nmodbus

大家好,欢迎来到IT知识分享网。

Modbus以及上位机软件实际运用

Demo代码

Modbus简介

协议版本

ModbusRTU

Modbus RTU是一种紧凑的,采用二进制表示数据的方式,使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和(CRC)。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。

ModbusASCII

Modbus ASCII是一种人类可读的,冗长的表示方式。使用串行通信(serial communication)方式。ASCII格式采用纵向冗余校验的校验和(LRC)。相比之下,RTU格式的协议较为常用。

Modbus/TCP

对于通过TCP/IP(例如以太网)的连接,存在多个Modbus/TCP变种,这种方式不需要校验和计算,目前较为广泛运用的是Modbus/TCP。

通讯简析

错误通讯

其中的异常码如下表所示:

寄存器/暂存器

寄存器分四类

类别 区号 读写 值范围
线圈状态 0区 可读可写布尔量 00001-09999
离散输入状态 1区 只读布尔量 10001-19999
输入寄存器 3区 只读寄存器 30001-39999
保持寄存器 4区 可读可写寄存器 40001-49999

RTU协议帧结构

CRC校验

CRC占用两个字节包含了一个16位的二进制值,如上表所示的CRCL和CRCH。这两个值在发出的时候已经由发出的设备计算得出,然后附加到数据帧尾部,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等就判断数据发生了错误。

功能码

上位机代码实例

ModbusSlave

TCP协议

在这里插入图片描述

功能码如下:

  1. 线圈寄存器:实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01 0x05 0x0f
  2. 离散输入寄存器:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。所以功能码也简单就一个读的 0x02
  3. 保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,所以功能码有对应的三个:0x03 0x06 0x10
  4. 输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。对应的功能码也就一个 0x04

Modebus封装——NModbus

读取线圈数据

读取线圈数据首先要将模拟器设置成线圈

在这里插入图片描述
在这里插入图片描述

读取离散线圈数据

读取保存寄存器

读取输入寄存器

写入单线圈

写入单寄存器

写入多线圈

写入多寄存器

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111769.html

(0)
上一篇 2026-01-22 19:46
下一篇 2026-01-22 20:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信