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.pswp.cn/web/89520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89520.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋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…