MODBUS RTU/ASCII/TCP一网打尽,C语言实战详解不容错过

Modbus协议详解3:数据帧格式 - RTU帧 & ASCII帧的区别 在项目应用中,很多时候多报文帧的接收都会涉及到中断,特别是在通信速率很高的情况下,会频繁的快速中断,对cpu的负担是很重的,这个时候这t1.5和t3.5的时间就会变得很短暂,并不是很好处理。在RTU模式中,为了标识不同的报文帧,在报文帧之间插入一个空闲时间间隔,在两帧报文之间用至少3.5个字符的空闲时间来区分不同的帧,同时标识一帧是否已经完成接收。 阅读详情

第一章:MODBUS通信协议概述

MODBUS是一种广泛应用的工业通信协议,最初由Modicon公司在1979年为PLC设备设计,现已成为工业自动化领域中的开放标准。其主要优势在于简单、可靠且易于实现,支持在多种物理层上传输,如RS-485、以太网(MODBUS TCP)等。

协议特点

  • 采用主从架构,一个主设备可控制多个从设备
  • 数据以寄存器形式组织,包括线圈、离散输入、保持寄存器和输入寄存器
  • 支持功能码操作,例如读取(0x03)、写入(0x06)寄存器
  • 具备良好的兼容性,广泛用于SCADA系统与现场设备间通信

传输模式

MODBUS支持两种主要传输模式:
  1. MODBUS RTU:基于二进制编码,常用于串行通信,具有高效校验机制
  2. MODBUS ASCII:使用ASCII字符编码,便于调试但传输效率较低
  3. MODBUS TCP:运行于TCP/IP之上,适用于以太网环境,端口号通常为502

数据帧结构示例(MODBUS RTU)


// 示例:主设备读取从站0x01的保持寄存器(功能码0x03)
uint8_t request[] = {
    0x01,           // 从站地址
    0x03,           // 功能码:读保持寄存器
    0x00, 0x00,     // 起始地址高字节、低字节
    0x00, 0x01,     // 寄存器数量
    0xC4, 0x0B      // CRC校验(低位在前)
};
该请求表示向地址为1的从设备发送指令,读取起始地址为0的1个保持寄存器。

常用功能码对照表

功能码名称操作说明
0x01读线圈状态读取布尔量输出状态
0x03读保持寄存器读取16位寄存器值
0x06写单个寄存器写入一个16位寄存器
0x10写多个寄存器批量写入保持寄存器
graph TD A[主设备] -->|发送请求帧| B(从设备) B -->|返回响应帧| A style A fill:#4CAF50,stroke:#388E3C style B fill:#FFC107,stroke:#FFA000

第二章:MODBUS RTU协议实现详解

2.1 MODBUS RTU帧结构与校验机制解析

MODBUS RTU是一种广泛应用于工业自动化领域的串行通信协议,其帧结构紧凑且高效。一个完整的RTU帧由设备地址、功能码、数据区和CRC校验四部分组成。
帧结构组成
  • 设备地址(1字节):标识目标从站设备,范围0x00~0xFF
  • 功能码(1字节):定义操作类型,如0x03读保持寄存器
  • 数据区(N字节):包含寄存器地址、数量或写入值
  • CRC校验(2字节):低位在前,用于错误检测
CRC-16校验实现

uint16_t crc16(uint8_t *data, uint16_t len) {
    uint16_t crc = 0xFFFF;
    for (int i = 0; i < len; i++) {
        crc ^= data[i];
        for (int j = 0; j < 8; j++) {
            if (crc & 0x0001) {
                crc = (crc >> 1) ^ 0xA001;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc;
}
该函数逐字节计算CRC-16 Modbus校验值,初始值为0xFFFF,多项式为0xA001。每字节参与异或后进行8位右移,若最低位为1则与0xA001异或,确保传输数据完整性。

2.2 串口通信配置与C语言串口编程基础

串口通信是嵌入式系统中最基础且广泛应用的数据传输方式,通过TX(发送)和RX(接收)引脚实现异步串行通信。在C语言中操作串口,首先需配置波特率、数据位、停止位和校验方式。
串口参数配置说明
常见配置参数如下表所示:
参数典型值说明
波特率9600, 115200每秒传输的比特数
数据位8每次传输的数据位长度
停止位1帧结束标志位数
校验位无用于错误检测
C语言串口初始化示例

#include <termios.h>
#include <fcntl.h>
int fd = open("/dev/ttyS0", O_RDWR);
struct termios serial;
cfmakeraw(&serial);
serial.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
serial.c_iflag = IGNPAR;
serial.c_oflag = 0;
serial.c_lflag = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &serial);
上述代码打开串口设备文件,设置波特率为115200,8位数据位,忽略奇偶校验,无软件流控。`termios`结构体用于配置串口属性,`tcsetattr`将配置应用到设备。

2.3 CRC16校验算法C语言实现与优化

基础CRC16实现原理
CRC16通过多项式除法计算数据校验值,常用多项式为0x8005。逐字节处理时,每比特参与异或运算,生成16位校验码。

uint16_t crc16_basic(const uint8_t *data, size_t len) {
    uint16_t crc = 0xFFFF;
    for (size_t i = 0; i < len; ++i) {
        crc ^= data[i];
        for (int j = 0; j < 8; ++j) {
            if (crc & 0x0001) {
                crc = (crc >> 1) ^ 0xA001;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc;
}
该函数初始CRC寄存器为0xFFFF,每次与数据字节异或后进行8次右移和条件异或(0xA001为0x8005的反射多项式)。
查表法优化性能
使用预计算的256项查找表,将时间复杂度从O(n×8)降至O(n),显著提升处理速度。
索引对应CRC值
0x000x0000
0x010xC0C1
......
0xFF0x0F0F
查表法将每个字节的完整计算结果预先存储,运行时直接索引并更新CRC值。

2.4 主站发送与从站响应报文构造实战

在工业通信协议中,主站与从站的报文交互是实现控制指令与状态反馈的核心环节。正确构造请求与响应报文,是确保系统稳定运行的关键。
主站发送报文结构解析
主站发出的报文通常包含功能码、寄存器地址和数据长度等字段。以Modbus RTU为例:

// 示例:读取保持寄存器(功能码0x03)
uint8_t request[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
其中,0x01为从站地址,0x03表示读寄存器功能码,0x0000为起始地址,0x0002表示读取2个寄存器,最后两字节为CRC校验值。该结构确保了指令的准确寻址与完整性校验。
从站响应报文构造
从站接收到合法请求后,返回包含数据与应答状态的响应报文:
字节位置含义示例值
0从站地址0x01
1功能码0x03
2数据字节数0x04
3-6寄存器数据0x00, 0x0A, 0x01, 0x02
7-8CRC校验0xD5, 0xCA
响应报文中,数据字段按大端序排列,确保主站能正确解析实际物理量。

2.5 RTU模式下多设备轮询与超时处理策略

在RTU模式下,主站需通过串行链路依次轮询多个从设备,合理的轮询机制与超时策略对系统稳定性至关重要。
轮询时序控制
主站按设备地址顺序发送请求,每个请求间插入3.5个字符时间的间隔以区分帧。为避免总线冲突,采用如下轮询逻辑:

// 伪代码示例:带间隔的轮询循环
for (int i = 1; i <= DEVICE_COUNT; i++) {
    send_modbus_request(i);
    delay_ms(INTER_FRAME_GAP); // 建议值:≥3.5字符时间
}
该延迟确保从设备正确识别帧边界,防止数据粘连。
超时处理机制
为应对设备离线或响应延迟,设置两级超时:
  • 响应超时:等待回复的最大时间(通常1~2秒)
  • 重试机制:单设备失败后最多重试2次,避免阻塞整个轮询周期
参数推荐值说明
帧间隔(T_gap)≥3.5字符时间区分前后Modbus帧
响应超时(T_timeout)1500ms避免长时间阻塞

第三章:MODBUS ASCII协议深度剖析

3.1 ASCII模式数据编码原理与帧格式分析

ASCII模式是一种基于字符的通信编码方式,广泛应用于串行通信中。它将每个字节的数据转换为两个ASCII字符表示,提升传输的可读性与调试便利性。
编码机制解析
在ASCII模式下,一个8位二进制数被拆分为高四位和低四位,分别转换为对应的十六进制字符(0-9, A-F)。例如,字节0x3A被编码为字符序列"3A"。

原始字节:0x3A → ASCII编码:'3' (0x33) + 'A' (0x41)
该过程通过查表或位运算实现,确保每个字节均以标准ASCII码安全传输。
帧结构组成
典型ASCII帧以冒号(:)起始,后接地址、功能码、数据与LRC校验,以回车换行(\r\n)结束。
字段说明
:帧起始符(1字节)
AA设备地址(2字符)
CC功能码(2字符)
DD...DD数据域(N×2字符)
LLLRC校验码(2字符)
\r\n帧结束符

3.2 LRC校验C语言实现及ASCII转换技巧

在通信协议中,LRC(纵向冗余校验)常用于检测数据传输错误。其核心思想是对数据块中所有字节进行异或运算,生成一个校验字节。
LRC校验实现

unsigned char calculateLRC(unsigned char *data, int length) {
    unsigned char lrc = 0;
    for (int i = 0; i < length; i++) {
        lrc ^= data[i];  // 异或累积
    }
    return lrc;
}
该函数遍历数据数组,逐字节异或,最终结果即为LRC值。参数data为输入字节数组,length为长度。
ASCII转换技巧
在调试时,常需将二进制数据转为可读ASCII。可通过查表或位运算实现高低四位转换:
  • 高4位:(byte >> 4) & 0x0F
  • 低4位:byte & 0x0F
  • 转ASCII:digit + (digit < 10 ? '0' : 'A' - 10)

3.3 ASCII协议在工业现场的典型应用场景

设备间低复杂度通信
ASCII协议因其可读性强、解析简单,广泛应用于PLC与HMI、传感器与控制器之间的数据交互。尤其在小数据量、低实时性要求的场景中表现突出。
人机界面数据展示
由于ASCII码为文本格式,调试时可通过串口工具直接读取,便于现场维护。例如,称重仪表通过ASCII协议输出如下数据:

+W001,2345.6,KG<CR><LF>
其中+W001表示设备地址,2345.6为重量值,KG为单位,<CR><LF>为结束符,结构清晰,易于识别。
多设备组网通信
在Modbus ASCII模式下,多个从站可通过字符间隔实现帧同步。典型应用如环境监控系统中,温湿度、光照等传感器通过RS-485总线以ASCII格式上传数据,主站轮询处理。
设备类型协议格式传输介质
条码扫描器ASCII字符串RS-232
电子秤定制ASCII帧RJ45转串口

第四章:MODBUS TCP协议开发实战

4.1 MODBUS TCP报文结构与以太网通信基础

MODBUS TCP 是基于以太网的工业通信协议,结合了传统 MODBUS 功能码与 TCP/IP 协议栈,适用于稳定可靠的局域网设备互联。
报文结构解析
一个完整的 MODBUS TCP 报文由七部分组成,其结构如下:
字段长度(字节)说明
事务标识符(Transaction ID)2用于匹配请求与响应
协议标识符(Protocol ID)20 表示 MODBUS 协议
长度字段(Length)2后续数据的字节数
单元标识符(Unit ID)1标识从站设备地址
功能码(Function Code)1定义操作类型(如 0x03 读保持寄存器)
数据字段(Data)n具体参数或寄存器值
典型请求示例
00 01 00 00 00 06 09 03 00 6B 00 03
该报文中,00 01 为事务ID,00 00 为协议ID,00 06 表示后续6字节数据,09 是单元ID,03 为功能码,00 6B 00 03 表示从地址 107 开始读取 3 个寄存器。

4.2 基于Socket编程的TCP客户端/服务器构建

在构建可靠的网络通信系统时,基于Socket的TCP编程是核心基础。它提供了面向连接、可靠的数据传输服务。
服务器端实现流程
服务器需绑定IP与端口,监听连接请求,并为每个客户端创建独立通信通道:
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8080))
server.listen(5)
print("Server listening on port 8080")

while True:
    client, addr = server.accept()
    print(f"Connected by {addr}")
    data = client.recv(1024)
    client.send(b"Echo: " + data)
    client.close()
上述代码中,AF_INET指定IPv4地址族,SOCK_STREAM表示TCP协议。调用listen()将套接字转为监听状态,accept()阻塞等待客户端连接。
客户端基本结构
客户端主动发起连接,发送请求并接收响应:
  • 创建Socket对象
  • 调用connect()连接服务器
  • 通过send()/recv()进行数据交换
  • 通信结束后关闭连接

4.3 MBAP头解析与事务处理机制实现

Modbus协议在TCP传输中依赖MBAP(Modbus Application Protocol)头部进行事务识别与数据封装。该头部包含事务ID、协议标识、长度字段及单元标识,是实现多请求并发控制的关键。
MBAP头部结构定义
type MBAPHeader struct {
    TransactionID uint16 // 用于匹配请求与响应
    ProtocolID    uint16 // 通常为0,表示Modbus协议
    Length        uint16 // 后续字节长度(含UnitID + PDU)
    UnitID        uint8  // 从站设备地址
}
上述结构体映射了MBAP头的四个字段。其中TransactionID由客户端生成,服务端原样返回,用于区分同一连接中的多个并发事务。
事务处理流程
  • 接收TCP流并解析前6字节为MBAP头
  • 校验ProtocolID是否为0
  • 根据Length字段读取后续PDU数据
  • 通过UnitID路由到对应从站处理逻辑
  • 响应时复用TransactionID确保匹配

4.4 跨平台兼容性设计与网络异常恢复机制

在构建分布式系统时,跨平台兼容性是确保服务能在不同操作系统与硬件架构间无缝运行的关键。通过抽象底层差异,采用标准化通信协议(如gRPC)和序列化格式(如Protobuf),可有效提升系统的可移植性。
网络异常恢复策略
为应对不稳定的网络环境,需设计具备自动重连与超时退避机制的客户端。以下是一个基于指数退避的重连逻辑示例:

func exponentialBackoff(retry int) time.Duration {
    if retry < 0 {
        retry = 0
    }
    return time.Duration(1<
该函数计算第 retry 次重试时的等待时间,避免频繁连接导致雪崩效应。参数 retry 表示当前重试次数,返回值为延迟间隔。
兼容性适配层设计
  • 统一API接口,屏蔽平台差异
  • 使用条件编译处理OS特定逻辑
  • 依赖注入实现模块解耦

第五章:总结与工业通信未来展望

边缘计算驱动的实时通信优化
在智能制造场景中,边缘网关部署协议转换服务已成为主流方案。例如,通过在产线PLC旁部署支持OPC UA over TSN的边缘设备,可将Modbus RTU数据以微秒级延迟上传至MES系统。
  • 采用Kubernetes管理边缘节点,实现通信服务的动态扩缩容
  • 使用eBPF技术在Linux内核层捕获工业报文,降低协议解析开销
  • 基于DPDK构建零拷贝数据平面,提升千兆网络吞吐能力
语义互操作性实现路径
{
  "device": "pump_01",
  "semantics": "https://example.org/ids/Pump/v2",
  "properties": {
    "flowRate": { "value": 45.2, "unit": "L/min", "@type": "FlowRate" },
    "status": { "value": "running", "@type": "OperatingState" }
  }
}
通过绑定I4.0 AAS与IEEE 2755标准,某汽车焊装车间实现了12家供应商设备的即插即用配置,调试周期从3天缩短至4小时。
安全架构演进趋势
防护层级传统方案零信任架构
网络边界防火墙ACLSDP控制器+mTLS双向认证
设备身份IP白名单基于TPM的硬件凭证
流程图:5G uRLLC切片在远程操控中的应用
UE → [gNB] → (UPF分流) → 边缘MEC(时延≤8ms)→ 工业交换机 → 机械臂控制器
Modbus Poll/Slave 模拟器使用教程 A1-在工业生产过程中,大量的开关量顺序控制,它按照逻辑条件进行顺序动作,并按照逻辑关系进行连锁保护动作的控制,及大量离散量的数据采集。传统上,这些功能是通过气动或电气控制系统来实现的。1968年美国GM(通用汽车)公司提出取代继电气控制装置的要求,第二年,美国数字公司研制出了基于集成电路和电子技术的控制装置,首次采用程序化的手段应用于电气控制,这就是第一代可编程序控制器,称ProgrammableController(PC)。个人计算机(简称PC)发展起来后,为了方便,也为了反映可编程控制器的功能特点。. 阅读详情

相关推荐

MODBUS-RTU和ASCII模式及CRC和LRC校验方法简述

MODBUS简述 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。 Modbus可将不同厂商生产的控制设备可以连成工业网络,进行集中监控,是一种通用工业标准。Modbus是一个master/slave架构的协议,有一个节点是master节点,其他使用Modbus协议参与通信的节点是

BUG从入门到精通 1万+

MODBUS三种通讯模式RTU,ASCII,TCP,功能码,RCR校验

MODBUS通信模式最主要有两种: RTU模式和ASCII模式。 RTU模式: 地址码 功能码 数据 校验码 一字节 一字节 n字节 两字节(CRC) 从机都有相应的地址码,便于主机识别。其中数据已帧为单位进行数据传输,每帧最长为252字节,最短为0。如果一byte数据的传输时间为T,那么每两帧之间的间隔最小应该要大于3.5T,否则从机不能分辨这是两帧。第二,同一帧连续的两个数据之间的间隔时间不能超过1.5T,否则节点会认为这一帧数据不完整,这说明我们在m

浮若于心 2万+

java 解析 modbus rtu_ModBus-RTU详解

Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。虽然RTU比较简单,但是看协议资料、手册说得太专业了,起初很多内容都很难理解。所谓的协议是什么?就是互相之间的约定嘛,如果不让别人知道那就是暗号。现在就来定义一个新的最简单协议。例如,协议: “A” --“LED灭”“B” --“报警...

weixin_36332642的博客 6396

简说Modbus-RTU与Modbus-ASCII

Modbus在串行总线通信中的协议有RTU和ASCII两种。两种协议的不同之处,孔丙火(微信公众号:孔丙火)认为,最简单的讲,就是:RTU是直接发送数据,二进制代码,其表示的物理意义,需要发送端和接收端进行约定;ASCII发送的数据是用于表示字符的二进制代码。

孔丙火 7384

Modbus RTU和Modbus TCP的区别 深入篇

1、发送指令:01 03 76 83 00 0C AE 6F解析:01为从机地址(地址码),03 为功能码(03表示:读),76 83 为寄存器地址[起始地址][真实的寄存器地址-1],00 0C 为读取寄存器的个数,AE 6F 为CRC校验。2、接收指令:01 03 18 00 55 00 AA FF FF FF FF 01 2D FF FF FF FF FF FF 00 55 FF FF FF FF FF FF BA 58解析:01 为从机地址(地址码),

码灵的博客 1万+

MODBUS--ASCII方式实现(完整版)

此程序是用C语言编写的一个51的程序。 作用是对MODBUS协议进行了实现,用的是ASCII方式,简明易懂。 共实现的1读线圈,2写单个线圈,3写多个线圈,4读寄存器,5写单个寄存器,6写多个寄存器这几个基本的功能,简明易懂,是一个绝佳的MODBUS协议程序。 传输基于最普通的串口通信,严格按照协议说明。 程序中还做和详尽的注解,本人水平有限,难免出错,贻笑大方,献丑了。 多多指教。。。。。。

MODBUS传输模式 ASCII、RTU和TCP

参考自 《机电控制系统》 李勇 《基于MODBUS的RS-485总线通信体系的流量控制协议研究》卢石磊 兰州理工大学 MODBUS控制器能设置为两种传输模式ASCII模式和RTU模式,用户根据需要选择想要的传输模式,设置有关串口通信参数,在配置每个控制器的时候, MODBUS RTU ASCII模式可以使字符发送的时间间隔达到1s而不产生错误;RTU模式可以在相同的波特率下传送更多的数据[6]。ASCII模式如表1所示,RTU模式如

追求。 9421

Android7以上抓取https数据包-无需root

手机内装一个虚拟机,然后在虚拟机内运行我需要抓包的应用,该虚拟机内是不需要证书验证的。完美解决android7.0以上https无法抓包的问题。

qq_45764684的博客 1455

Modbus通信协议中ASCII模式与RTU模式详解

Modbus协议是一种串行通信协议,用于连接工业电子设备。它定义了设备之间如何传输信息,包括数据的格式、传输速度、错误检测等。Modbus协议广泛应用于各种工业自动化系统,如PLC、传感器、执行器等。Modbus协议的基本结构包括主站和从站。主站发起通信请求,从站响应请求并返回数据。通信过程中,数据以帧的形式传输,每帧数据包含地址、功能码、数据域等信息。

世间所有的相遇都是久别重逢 2186

数控弯管机xyz转换ybc的算法_数控弯管机技术的更新和应用.pdf

您所在位置:网站首页 > 海量文档&nbsp>&nbsp汽车/机械/制造&nbsp>&nbsp机械/模具设计数控弯管机技术的更新和应用.pdf3页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。2.该文档所...

weixin_31493101的博客 1521

source tree clone error:fatal remote error: Repository not found

source tree clone error:fatal remote error: Repository not found

Linda的前端开发路 3077

Modbus协议详解:Modbus RTU、Modbus ASCII、Modbus TCP

尽管在实时性和安全性上存在局限,但其通过扩展(如Modbus TCP)和与其他技术的结合,仍在智能制造和物联网中占据重要地位。起始地址:40001对应Modbus地址0x0000(需减1转换)。,即线圈40001=开,40003=开,40005=开,其他为关)。:每字节表示8个线圈状态(0=关,1=开),从低位到高位排列,即。:读取从地址1的保持寄存器40001-40002(2个寄存器)。(Slave)响应请求,每个从设备有唯一地址(1-247)。:读取从地址1的线圈40001至40008(共8个线圈)。

gs_bfsyrgz的博客 5843

SAP FICO 银企直联实战:从配置到异常处理的全流程解析

本文详细解析了SAP FICO银企直联的实战配置与异常处理全流程,涵盖银行主数据搭建、支付类配置、银行接口适配等关键步骤。通过实际案例分享,帮助用户掌握实时付款、余额监控和自动对账等核心功能,提升企业财务效率与安全性。特别针对常见问题如凭证重复付款、前置机UUID冲突等提供了实用解决方案。

weixin_29215815的博客 663

基于libmodbus库实现modbus TCP/RTU通信

基于libmodbus实现modbus TCP/RTU通信基类封装,以及功能介绍,库安装等全面知识,关于modbus使用看此文足矣!

tutu_hu的博客 2万+

dreamerv3复现教程

由于dreamerv3存在很多版本冲突问题,所以很难直接使用和复现。

无人机飞啊飞啊飞 2835

YOLOv13优化:PoolingFormerCGLU模块 MetaFormer 框架 + 池化混合器 手把手教你自注意力

PoolingFormer1 是一个基于 MetaFormer 框架 的轻量化卷积-Transformer 混合模块,通过 Pooling 取代自注意力,实现: 更低的计算成本 一定的全局信息融合 兼容 CNN 和 Transformer 的优点

FJN110的博客 426

ModBus-RTU详解

Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。虽然RTU比较简单,但是看协议资料、手册说得太专业了,起初很多内容都很难理解。     所谓的协议是什么?就是互相之间的约定嘛,如果不让别人知道那就是暗号。现在就来定义一个新的最简单协议。例如, 协议: “A” --“LED灭”   ...

大头之家 1万+

由ip地址和子网掩码求网络号、主机号、广播地址(超详细)

1、用二进制数表示IP地址   在进行计算之前,我们首先要学会十进制的IP地址怎么转换为二进制的IP地址。   给出一个例子: 十进制:172.16.25.3 二进制:10101100.00010000.00011001.00000011 1、如果两台主机的网络号相同,我们就说它们是同一网段 2、主机号的意义 - 1)主机号部分全变成1,即为该网段的广播地址 - 2)主机号部分全变成0,即为该网段的网路地址(网络号) 3、如果主机号部分为x位,则该网络能容纳最大主机数为: 2的x次方-2。减2

爱吃雪糕的小布丁的博客 9万+

Modbus RTU/TCPModbus报文解析和示例

0x、1x、 3x、4x各是一片数据区,它是5位十进制地址(16bit),是Modbus协议规定的地址范围,各类地址是互相对应的,但在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。其中 "09" 是地址码(从站号),其中"03"是读Holding Register的功能码,"00 04 00 03"是数据区,"00 04"是寄存器的起始地址,"00 03"说明要连续读三个寄存器的值。主设备(客户端)或从设备(服务器)中的任何一个出现异常响应,都会导致数据处理错误。

zyy_linux的博客 1万+

OceanBase数据库:与MySQL和Oracle的函数差异分析

OceanBase数据库兼容性解析:MySQL与Oracle模式深度比较 摘要:OceanBase通过独特的双模式架构,实现了对MySQL和Oracle的高度兼容。文章首先分析了OceanBase的兼容性架构,包括SQL解析层、优化器层和执行引擎层的差异化设计。随后对比了两种模式在数据类型、SQL语法、函数支持等方面的兼容性差异,其中MySQL模式兼容5.7版本大部分功能,Oracle模式则支持155个内置函数和PL/SQL特性。最后提出了模式选择的六大考量因素,包括现有系统基础、功能需求和迁移成本等,为数

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1228

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Modbus RTU和Modbus TCP的区别

Modbus RTU和Modbus TCP区别

yinglincha4297的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Modbus RTU 协议详解

~~~~~~~ 以:波特率9600、1bit起始位、8bit数据位、1bit停止位,1bit校验位、无流控为例,那么1s内就可以传输(1+8+1+1)/9600*3.5*1000≈4ms,所以,如果从机在接收过程中,超过了4ms没有收到数据,则认为本帧数据接收结束;~~~~~~~~ 要求使用偶校验。从机返回:01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a3 67。

1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MODBUS通讯的C语言实现与简单讲解

C语言 modbus Linux

小王的博客 2万+

MODBUS RTU/TCP协议及常用功能码详解

一、简介 ModBus是Modicon公司为其PLC通讯而开发的一种通讯协议。如今Modicon公司已经被施耐德收购成为了施耐德旗下品牌。从1979年问世至今,已经成为工业通讯领域的业界标准。 ModBus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。 MODBUS寄存器分类 寄存器种类 读写状态 数据类型 功能码 PLC地址 线圈寄存器 读/写 位(bit)

qq_43254236的博客 4万+

C Modbus RTU/ASCII/TCP 源码

C# Modbus RTU/ASCII/TCP 源码 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了一个完整的C# Modbus RTU/ASCII/TCP 源码,实现了Modbus协议中的01、02、03、04、05、06、10、0F功能码的功能。该源码可以直接添加到您的项目中使用,方便快捷。 功能特点 支持多种通信方式:包括RTU、ASCII和TCP三种...

gitblog_09803的博客 646

【知识分享】Modbus通信协议详解

Modbus是一种一主一从的一对一通信方式(主机发一帧,从机回一帧的形式),当然也一主多从,但实际也是一对一通信,同一时刻只能有一个从机进行响应。如果需要和多个从机同时通信,这里也支持使用广播,即主机发送指令,所有从机接收指令并执行,但不进行应答。可以参考国标标准(以下简称国标),GBT 19582-2。.........

知识噬元兽的博客 4万+
上一篇: 揭秘C++内存漏洞根源:2025年最值得关注的5大工具链保障方案
下一篇: 从零到部署:Python + PEFT 2.0大模型微调完整路径(含代码实例)
Algorift
博客等级 码龄1年 178粉丝 2179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值