Day06_C语言网络编程20250718mobus重点

01.思维导图

1 什么是 modbus

他是一个在工控领域非常好用的通信写 modbus协议本质上是一个 基于 tcp 协议二次封装的一个协议 什么叫做基于tcp二次封装的协议:我们自己写的pack_t(无论静态还是动态),都是属于二次封装的协议

modbus协议是一种 “主从问答式”的协议 主机:向从机发出查询指令或者修改指令 从机:接受到指令之后回答问题 或者 做出对应打完修改

2 modbus 协议包中内容

2.1 协议包组成

第0~1 字节 :存放当前协议包的序号,从0开始
modbus协议会对协议包的序号做自增操作
第2~3 字节 :存放modbus协议的标识符
该数据固定性写 0
第4~5 字节:存放接下来的所有数据的字节数
第6 字节:放从机的序列号
一台主机允许连接多台从机,该字节就是用来明确,我要向第几台从机发送数据
第7个字节:modbus 协议的操作方式
也就是说,现在主机要如何操作从机
到底是读还是写,到底是读什么东西,写什么东西
简称 "操作码"
剩下的所有字节都是数据位
根据操作码的不同,数据位的格式也是不同的

2.2    modbus协议具体操作内容
这里的操作码,其实就类似于我们自己写打完 enum Type type,用来告诉接收端,这个协议包发过去之后干嘛用的
modbus协议一共有4个操作内容

03.测试电脑是大端还是小端???

#include <25051head.h>
int main(int argc, const char *argv[])
{char a[2]={0x03,0x00};//0x0003//0000 0011 0000 0000if(htons(3)==3){printf("大端序列..\n");}else{printf("小端序列..\n");}printf("%d\n",*(short*)a);return 0;
}

04.软件

第一种:modbus

第一种:01.Modbus Poll

 

 第一种情况:写单个线圈(写一个bit位)【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】

 

#include <25051head.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{/*if(argc<2){printf("请输入端口号..\n");return 1;}*///atoi函数,将字符串类型转换成整形//short port=atoi(argv[1]);int client = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in addr = {0};addr.sin_family = AF_INET;// 如果用的是ipv4结构体,固定写AF_INET// 其功能为:标记位// 用来标记,当前传入的结构体是 ipv4 结构体,还是ipv6结构体,// 还是域套接字本地结构体addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");// 如果地址是 0.0.0.0,这里直接写个 = 0 也是没问题的if(connect(client,(struct sockaddr*)&addr,sizeof(addr))==-1){perror("bind_error");return 1;}modbus_t ms={0};ms.id=0x0000;ms.protocol=0x0000;ms.len=htons(0x0006);ms.no=0x01;ms.type=0x05;ms.buf[0]=0x00;ms.buf[1]=0x00;ms.buf[2]=0xff;ms.buf[3]=0x00;write(client,&ms,sizeof(ms));return 0;
}

 第二种情况:写多个线圈(写一个bit位)【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】

#include <25051head.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{/*if(argc<2){printf("请输入端口号..\n");return 1;}*///atoi函数,将字符串类型转换成整形//short port=atoi(argv[1]);int client = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in addr = {0};addr.sin_family = AF_INET;// 如果用的是ipv4结构体,固定写AF_INET// 其功能为:标记位// 用来标记,当前传入的结构体是 ipv4 结构体,还是ipv6结构体,// 还是域套接字本地结构体addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");// 如果地址是 0.0.0.0,这里直接写个 = 0 也是没问题的if(connect(client,(struct sockaddr*)&addr,sizeof(addr))==-1){perror("bind_error");return 1;}modbus_t ms={0};ms.id=0x0000;ms.protocol=0x0000;ms.len=htons(9);ms.no=0x01;ms.type=0x0f;ms.buf[0]=0x00;ms.buf[1]=0x00;//我们写10个线圈 10->0000 1010 0000 0000  小端字节序列ms.buf[2]=0x00;//0000 0000ms.buf[3]=0x0a;//0000 1010ms.buf[4]=0x02;ms.buf[5]=0x55;ms.buf[6]=0x01;write(client,&ms,sizeof(ms));return 0;
}

 第三种情况:写一个寄存器【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】

#include <25051head.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{/*if(argc<2){printf("请输入端口号..\n");return 1;}*///atoi函数,将字符串类型转换成整形//short port=atoi(argv[1]);int client = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in addr = {0};addr.sin_family = AF_INET;// 如果用的是ipv4结构体,固定写AF_INET// 其功能为:标记位// 用来标记,当前传入的结构体是 ipv4 结构体,还是ipv6结构体,// 还是域套接字本地结构体addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");// 如果地址是 0.0.0.0,这里直接写个 = 0 也是没问题的if(connect(client,(struct sockaddr*)&addr,sizeof(addr))==-1){perror("bind_error");return 1;}modbus_t ms={0};ms.id=0x0000;ms.protocol=0x0000;ms.len=htons(6);ms.no=0x01;ms.type=0x06;ms.buf[0]=0x00;ms.buf[1]=0x00;//我们写10个线圈 10->0000 1010 0000 0000  小端字节序列ms.buf[2]=0x00;//0000 0000ms.buf[3]=0xff;//0000 1010write(client,&ms,sizeof(ms));return 0;
}

 第四种情况:写多个寄存器【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】

#include <25051head.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{/*if(argc<2){printf("请输入端口号..\n");return 1;}*///atoi函数,将字符串类型转换成整形//short port=atoi(argv[1]);int client = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in addr = {0};addr.sin_family = AF_INET;// 如果用的是ipv4结构体,固定写AF_INET// 其功能为:标记位// 用来标记,当前传入的结构体是 ipv4 结构体,还是ipv6结构体,// 还是域套接字本地结构体addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");// 如果地址是 0.0.0.0,这里直接写个 = 0 也是没问题的if(connect(client,(struct sockaddr*)&addr,sizeof(addr))==-1){perror("bind_error");return 1;}modbus_t ms={0};ms.id=0x0000;ms.protocol=0x0000;ms.len=htons(17);ms.no=0x01;ms.type=0x10;ms.buf[0]=0x00;ms.buf[1]=0x00;//我们写5个寄存器 10->0000 1010 0000 0000  小端字节序列ms.buf[2]=0x00;//0000 0000ms.buf[3]=0x05;//0000 1010//5个寄存器需要10个字节ms.buf[4]=0x0a;ms.buf[5]=0x00;ms.buf[6]=0x0a;ms.buf[7]=0x00;ms.buf[8]=0x14;ms.buf[9]=0x00;ms.buf[10]=0x1e;ms.buf[11]=0x00;ms.buf[12]=0x28;ms.buf[13]=0x00;ms.buf[14]=0x32;write(client,&ms,sizeof(ms));return 0;
}

 第五种情况:读寄存器【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】特别特别注意:读普通线圈和读离散线圈01和02回复的是不允许访问

 

#include <25051head.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{int client = socket(AF_INET, SOCK_STREAM, 0);if (client == -1) {perror("socket creation failed");return 1;}struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");if (connect(client, (struct sockaddr*)&addr, sizeof(addr)) == -1) {perror("connect failed");close(client);return 1;}// 构造读普通线圈请求报文modbus_t read_coils_msg = {0};read_coils_msg.id = 0x0000;read_coils_msg.protocol = 0x0000;read_coils_msg.len = htons(6); // 功能码 + 起始地址 + 线圈数量共 6 字节read_coils_msg.no = 0x01;      // 从站地址read_coils_msg.type = 0x03;    // 读普通线圈功能码read_coils_msg.buf[0] = 0x00;  // 起始地址高字节read_coils_msg.buf[1] = 0x00;  // 起始地址低字节,从地址 0 开始读read_coils_msg.buf[2] = 0x00;  // 要读取的线圈数量高字节read_coils_msg.buf[3] = 0x08;  // 要读取的线圈数量低字节,读取 8 个线圈// 发送读普通线圈请求ssize_t sent_bytes = write(client, &read_coils_msg, sizeof(read_coils_msg));if (sent_bytes == -1) {perror("write read coils request failed");close(client);return 1;}printf("Read coils request sent successfully.\n");// 接收响应uint8_t response[256];ssize_t recv_bytes = read(client, response, sizeof(response));if (recv_bytes == -1) {perror("read response failed");close(client);return 1;} else if (recv_bytes == 0) {printf("No response received.\n");} else {printf("Received %zd bytes response:\n", recv_bytes);for (int i = 0; i < recv_bytes; i++) {printf("%02x ", response[i]);}printf("\n");}close(client);return 0;
}

 第六种情况:写单个寄存器【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】

#include <25051head.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{int client = socket(AF_INET, SOCK_STREAM, 0);if (client == -1) {perror("socket creation failed");return 1;}struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");if (connect(client, (struct sockaddr*)&addr, sizeof(addr)) == -1) {perror("connect failed");close(client);return 1;}// 构造写单个寄存器请求报文modbus_t write_single_reg_msg = {0};write_single_reg_msg.id = 0x0000;write_single_reg_msg.protocol = 0x0000;write_single_reg_msg.len = htons(6); // 功能码 + 寄存器地址 + 寄存器值共 6 字节write_single_reg_msg.no = 0x01;      // 从站地址write_single_reg_msg.type = 0x06;    // 写单个寄存器功能码write_single_reg_msg.buf[0] = 0x00;  // 寄存器地址高字节write_single_reg_msg.buf[1] = 0x00;  // 寄存器地址低字节,选择地址 0write_single_reg_msg.buf[2] = 0x00;  // 要写入的值高字节write_single_reg_msg.buf[3] = 0x12;  // 要写入的值低字节,写入 0x0012// 发送写单个寄存器请求ssize_t sent_bytes = write(client, &write_single_reg_msg, sizeof(write_single_reg_msg));if (sent_bytes == -1) {perror("write single register request failed");close(client);return 1;}printf("Write single register request sent successfully.\n");// 接收响应uint8_t response[256];ssize_t recv_bytes = read(client, response, sizeof(response));if (recv_bytes == -1) {perror("read response failed");close(client);return 1;} else if (recv_bytes == 0) {printf("No response received.\n");} else {printf("Received %zd bytes response:\n", recv_bytes);for (int i = 0; i < recv_bytes; i++) {printf("%02x ", response[i]);}printf("\n");}close(client);return 0;
}

 第七种情况:写多个寄存器【特别注意,代码中绑定的ip地址是cmd-->ipconfig-->WLAN(IPV4地址)】

#include <25051head.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;typedef struct  modbus{uint16_t id;uint16_t protocol;uint16_t len;uint8_t no;uint8_t type;uint8_t buf[256];
}modbus_t;int main(int argc, const char *argv[])
{int client = socket(AF_INET, SOCK_STREAM, 0);if (client == -1) {perror("socket creation failed");return 1;}struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(502);addr.sin_addr.s_addr = inet_addr("192.168.127.225");if (connect(client, (struct sockaddr*)&addr, sizeof(addr)) == -1) {perror("connect failed");close(client);return 1;}// 要写入的寄存器数量uint16_t reg_count = 3;// 构造写多个寄存器请求报文modbus_t write_multiple_reg_msg = {0};write_multiple_reg_msg.id = 0x0000;write_multiple_reg_msg.protocol = 0x0000;write_multiple_reg_msg.len = htons(7 + reg_count * 2); // 功能码 + 起始地址 + 寄存器数量 + 字节数 + 数据write_multiple_reg_msg.no = 0x01;      // 从站地址write_multiple_reg_msg.type = 0x10;    // 写多个寄存器功能码write_multiple_reg_msg.buf[0] = 0x00;  // 起始寄存器地址高字节write_multiple_reg_msg.buf[1] = 0x00;  // 起始寄存器地址低字节,从地址 0 开始write_multiple_reg_msg.buf[2] = 0x00;  // 寄存器数量高字节write_multiple_reg_msg.buf[3] = reg_count & 0xFF;  // 寄存器数量低字节write_multiple_reg_msg.buf[4] = reg_count * 2;     // 字节数// 要写入的数据uint16_t values[] = {0x0012, 0x0034, 0x0056};for (int i = 0; i < reg_count; i++) {write_multiple_reg_msg.buf[5 + i * 2] = (values[i] >> 8) & 0xFF;      // 高字节write_multiple_reg_msg.buf[5 + i * 2 + 1] = values[i] & 0xFF;         // 低字节}// 发送写多个寄存器请求ssize_t sent_bytes = write(client, &write_multiple_reg_msg, sizeof(write_multiple_reg_msg));if (sent_bytes == -1) {perror("write multiple registers request failed");close(client);return 1;}printf("Write multiple registers request sent successfully.\n");// 接收响应uint8_t response[256];ssize_t recv_bytes = read(client, response, sizeof(response));if (recv_bytes == -1) {perror("read response failed");close(client);return 1;} else if (recv_bytes == 0) {printf("No response received.\n");} else {printf("Received %zd bytes response:\n", recv_bytes);for (int i = 0; i < recv_bytes; i++) {printf("%02x ", response[i]);}printf("\n");}close(client);return 0;
}

第一种:02.Modbus Slave

第二种:Wireshark【特别注意,绑定的服务器的ip地址是虚拟机中查询出来的ifconfig】

server.c代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;int main(int argc, const char *argv[])
{if(argc < 2){printf("请输入端口号\n");return 1;}short port = atoi(argv[1]);// atoi 函数,将字符串类型转换成整形// "123" -> 123// "123abc" -> 123// "12abc3" -> 12 // "abc123" -> 0int server = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in addr = {0};addr.sin_family = AF_INET;	addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("0.0.0.0");if(bind(server,(struct sockaddr*)&addr,sizeof(addr)) == -1){perror("bind");return 1;}listen(server,10);struct sockaddr_in client_addr;int client_len = sizeof(client_addr);int client = accept(server,(struct sockaddr*)&client_addr,&client_len);// 这个 client 就是成功接受连接的客户端的套接字printf("有客户端连接\n");while(1){char buf[128] = "";int res = read(client,buf,128);// 一旦client客户端关闭,则read(client) 函数就会从阻塞变成非阻塞//int res = recv(client,buf,128,MSG_DONTWAIT);if(res == 0){// 无论如何,read、recv函数只要客户端断开连接,都会返回0printf("客户端断开连接\n");return 0;}printf("客户端发来消息:%s\n",buf);sleep(1);}return 0;
}

第三种:网络调试工具-飞机

特别注意:

小飞机给modbus传数据有问题:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/web/89520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比亚迪古德伍德亮相:从技术突破到文化对话

近日&#xff0c;比亚迪携腾势Z9GT、方程豹豹5、腾势D9亮相英国古德伍德速度节——全球最具声望的汽车文化盛典。方程豹豹5搭载全球首个 DMO电驱越野平台&#xff0c;在爬山赛道上展现出媲美性能跑车的动力响应与精准控制&#xff0c;彻底打破“越野必靠大排量燃油机”的西方传…

UniApp TabBar 用户头像方案:绕过原生限制的实践

需求场景&#xff1a; 在 UniApp 项目中&#xff0c;需要将 TabBar 首页项 (index) 的图标替换为当前用户的网络图片&#xff0c;并实现&#xff1a; 放大且圆形显示。点击该图标时&#xff0c;页面滚动回顶部。切换到其他分类时&#xff0c;首页 Tab 项恢复为普通首页图标。 尝…

如何阅读Spring源码

如何阅读Spring源码 简介 最近有许多人问我如何阅读Spring源码&#xff0c;那我便在这给出阅读源码的方法&#xff0c;能够保证本地能够让源码能够运行起来。 Spring 源码环境本地编译 Gradle下载地址 通过网盘分享的文件&#xff1a;gradle-6.4.1-all.zip 链接: https://pan.b…

Excel导出实战:从入门到精通 - 构建专业级数据报表的完整指南

文章目录Excel导出实战&#xff1a;从入门到精通 - 构建专业级数据报表的完整指南引言&#xff1a;ExcelJSFileSaver如何映射到Excel操作一、ExcelJS核心架构解析 - 从文件结构理解1. 工作簿(Workbook)模型 - 相当于整个Excel文件2. 工作表(Worksheet)配置 - 相当于单个工作表设…

PyTorch图像预处理全解析(transforms)

1. 引言在深度学习计算机视觉任务中&#xff0c;数据预处理和数据增强是模型训练的关键步骤&#xff0c;直接影响模型的泛化能力和最终性能表现。PyTorch 提供的 torchvision.transforms 模块&#xff0c;封装了丰富的图像变换方法&#xff0c;能够高效地完成图像标准化、裁剪、…

slam中的eskf观测矩阵推导

在之前的《slam中的eskf推导》一文中&#xff0c;没有写观测矩阵 H 矩阵的过程&#xff0c;现在补上这部分。前置列举几个等下推导需要用到的一些点&#xff1a;平面特征点构造观测矩阵例如在 fastlio 中&#xff0c;是利用平面特征点到拟合平面的距离来构造观测方程&#xff0…

Python_2

逻辑判断 首先得首先&#xff0c;我们想判断一个逻辑的正确与否&#xff0c;一定是需要一个能够表现出逻辑的词 如果我只说一个1 2&#xff0c;那么大家都不知道我在说什么但是如果我说1<2,那么大家就能判断这个语句的正确与否了 下面是几个常用的逻辑词 < 小于>大于&…

Liunx-Lvs配置项目练习

1.实验环境配置Lvs调度器有两块网卡 一块仅主机和一块nat网卡&#xff0c;客户端nat模式&#xff0c;两台服务器为仅主机模式2.集群和分布式简介集群与分布式系统简介集群 (Cluster)集群是指将多台计算机(通常为同构的)通过高速网络连接起来&#xff0c;作为一个整体对外提供服…

T5(Text-to-Text Transfer Transformer) 模型

下面是对 T5&#xff08;Text-to-Text Transfer Transformer&#xff09; 模型的详细介绍&#xff0c;包括其原理、架构、训练方式、优势与局限&#xff0c;以及与其他模型&#xff08;如 BERT、GPT&#xff09;的对比。一、T5 是什么&#xff1f;T5&#xff08;Text-to-Text T…

PostgreSQL技术大讲堂 - 第97讲:PG数据库编码和区域(locale)答疑解惑

PostgreSQL从入门到精通系列课程&#xff0c;近100节PG技术讲解&#xff0c;让你从小白一步步成长为独当一面的PG专业人员&#xff0c;点击这里查看章节内容。 PostgreSQL从入门到精通课程&#xff0c;持续更新&#xff0c;欢迎加入。第97讲&#xff1a;PostgreSQL 数据库编码…

【IEEE独立出版 】第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)

第六届机器学习与计算机应用国际学术会议&#xff08;ICMLCA 2025&#xff09; 大会简介 第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)定于2025年10月17-19日在中国深圳隆重举行。本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向&#xff0c;着力…

对于编码电机-520直流减速电机

编码电机的介绍 编码器是一种将角位移或者直线位移转换成一连串电数字脉冲的一种传感器。我们可以通过编码器测量电机转动的位移或者速度信息。 编码器按照工作原理&#xff0c;可以分为增量式编码器和绝对式编码器&#xff0c;绝对式编码器的每一个位置对应一个确定的数字码&a…

Rust入门之并发编程基础(三)

Rust入门之并发编程基础&#xff08;三&#xff09; 题记&#xff1a;6月底7月初&#xff0c;结束北京的工作生活回到二线省会城市发展了&#xff0c;鸽了较久了&#xff0c;要继续坚持学习Rust&#xff0c;坚持写博客。 背景 我们平时使用计算机完成某项工作的时候&#xf…

一文读懂循环神经网络—深度循环神经网络(DRNN)

目录 一、从 RNN 到 DRNN&#xff1a;为什么需要 “深度”&#xff1f; 二、DRNN 的核心结构 1. 时间维度&#xff1a;循环传递 2. 空间维度&#xff1a;多层隐藏层 3. 双向 DRNN&#xff08;Bidirectional DRNN&#xff09; 三、DRNN 的关键挑战与优化 1. 梯度消失 / 爆…

磁悬浮轴承系统中由不平衡力引发的恶性循环机制深度解析

磁悬浮轴承系统中由不平衡力引发的 “振动-激励-更大振动”恶性循环 是一个典型的 正反馈失控过程,其核心在于 传感器信号的污染 与 控制器对真实位移的误判。以下是其逐步演进的原理详解: 恶性循环的触发与演进 1:不平衡力的产生(根源) 转子存在质量偏心,质心(CM)偏离…

优迅股份IPO隐忧:毛利水平“两连降”,研发费用率不及行业均值

撰稿|行星来源|贝多财经近日&#xff0c;厦门优迅芯片股份有限公司&#xff08;下称“优迅股份”&#xff09;的科创板IPO审核状态变更为“已问询”&#xff0c;中信证券为其保荐机构。天眼查App信息显示&#xff0c;优迅股份成立于2003年2月&#xff0c;是中国首批专业从事光通…

Linux探秘坊-------15.线程概念与控制

1.线程概念 1.什么是线程2.线程 vs 进程不同的操作系统有不同的实现方式&#xff1a; linux &#xff1a;直接使用pcb的功能来模拟线程&#xff0c;不创建新的数据结构windows&#xff1a; 使用新的数据结构TCB&#xff0c;来进行实现&#xff0c;一个PCB里有很多个TCB 3.资源划…

Github库镜像到本地私有Gitlab服务器

上一节我们看了如何架设自己的Gitlab服务器&#xff0c;今天我们看怎么把Github库转移到自己的Gitlab上。 首先登录github&#xff0c;进入自己的库复制地址。 克隆镜像库 在本地新建一个文件夹 在文件夹执行CMD指令 git clone --mirror gitgithub.com:thinbug/A.git–mirror参…

【C++】——类和对象(中)——默认成员函数

一、类的默认成员函数默认成员函数就是用户没有显示实现&#xff0c;不过编译器会自动生成的成员函数&#xff0c;称为默认成员函数。一个类默认成员函数一共有6个&#xff0c;在我们不写的情况下&#xff0c;编译器就会自动生成这6个成员函数&#xff0c;不过我们重点要学习的…

MATLAB知识点总结

1.将A图与B图相同范围内归一化显示在同一个figure上&#xff1a; figure, plot(A(150:450,500)/max(A(150:450,500))) hold on plot(D(150:450,500)/max(D(150:450,500)),‘R’) 将两幅图像的一定范围显示在同一图像上。 figure,plot(A(350,100:450)) hold on plot(G(350,100:4…