基于 Modbus 的工業數據采集、控制(part 3)

Modbus 設備(利用 slave 模擬)

在這里插入圖片描述

在這里插入圖片描述

Modbus 采集程序

client.c

#include "client.h"modbus_t *ctx;
key_t key_shm, key_msg;
int shmid, msgid;
struct shm *shm0;
struct msgbuf msg0;void *collector(void *arg) {struct shm *p = (struct shm *)arg;while (1){sleep(1);if (modbus_read_registers(ctx, 0, 4, p->buf) < 0) {perror("Failed to modbus_read_registers");return NULL;}printf("LIGHT SENSOR: %d\n", p->buf[0]);printf("ACCELERATION SENSOR-X: %d\n", p->buf[1]);printf("ACCELERATION SENSOR-Y: %d\n", p->buf[2]);printf("ACCELERATION SENSOR-Z: %d\n\n", p->buf[3]);}pthread_exit(0);
}void *control(void *arg) {while (1){msgrcv(msgid, &msg0, sizeof(msg0)-sizeof(long), 250, 0);printf("LED: %c\n", msg0.ctl[0]);printf("BUZZER: %c\n\n", msg0.ctl[1]);modbus_write_bit(ctx, msg0.ctl[0]-48, msg0.ctl[1]-48);}pthread_exit(0);
}int main(int argc, char const *argv[])
{   if (argc != 3) {printf("Please input %s <ip> <port>. \n", argv[0]);return -1;}init_modbus(&ctx, argv[1], atoi(argv[2]));shm0 = init_shared_memory(&key_shm, &shmid);printf("The key(shm): %#x\n", key_shm);printf("The shmid: %d\n", shmid);init_msg_queue(&key_msg, &msgid);msg0.mtype = 250;printf("The key(msg): %#x\n", key_msg);printf("The msgid: %d\n", msgid);pthread_t tid1, tid2;if (pthread_create(&tid1, NULL, collector, shm0)) {perror("Failed to create a thread named collector");return -1;}if (pthread_create(&tid2, NULL, control, msg0.ctl)) {perror("Failed to create a thread named input");return -1;}pthread_join(tid1, NULL);pthread_join(tid2, NULL);// shmdt(p);// shmctl(shmid, IPC_RMID, NULL);// msgctl(msgid, IPC_RMID, NULL);modbus_close(ctx);modbus_free(ctx);return 0;
}

client.h

#ifndef __CLIENT_H_
#define __CLIENT_H_#include <stdio.h>
#include <modbus.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/msg.h>#define SHM_SIZE 64struct shm {uint16_t buf[4];// int flag;
};struct msgbuf {long mtype;    		/* message type, must be > 0 */uint8_t ctl[2]; 	/* message data */
};int init_modbus(modbus_t **, const char *, int);
struct shm *init_shared_memory(key_t *, int *);
int init_msg_queue(key_t *, int *);#endif

func.c

#include "client.h"int init_modbus(modbus_t **ctx, const char *ip, int port) {*ctx = modbus_new_tcp(ip, port);if (*ctx == NULL) {perror("Failed to modbus_new_tcp");return -1;}if (modbus_set_slave(*ctx, 1) < 0) {perror("Failed to modbus_set_slave");return -2;}if (modbus_connect(*ctx) < 0) {perror("Failed to modbus_connect");return -3;}return 0;
}struct shm *init_shared_memory(key_t *key, int *shmid) {*key = ftok("./client.c", 'v');        // ftok(任意文件名/路徑名, 任意字符);if (key < 0) {perror("Failed to ftok");return NULL;}*shmid = shmget(*key, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);if (*shmid < 0) {if (errno == EEXIST)*shmid = shmget(*key, SHM_SIZE, 0666);else {perror("Failed to shmget");return NULL;}}struct shm *p = shmat(*shmid, NULL, 0);     // 0 表示可讀可寫, 若只讀則 SHM_RDONLYif (p == (void *)-1) {				   		// if (*p == -1) 也可以perror("Failed to shmat");return NULL;}return p;
}int init_msg_queue(key_t *key, int *msgid) {*key = ftok("./client.h", 'v');if (*key < 0){perror("Failed to ftok");return -4;}*msgid = msgget(*key, IPC_CREAT | IPC_EXCL | 0666);if (

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162504.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

瀏覽器事件循環原理 —— JS為何會阻礙渲染?

系列文章目錄 第一章 瀏覽器事件循環原理 —— 瀏覽器進程模型第二章 瀏覽器事件循環原理 —— 渲染主線程如何工作&#xff1f;第三章 瀏覽器事件循環原理 —— 何為異步&#xff1f; 文章目錄 系列文章目錄 文章目錄 前言 代碼解析 總結 前言 該文章作用于 “web前端大…

橋接模式 (Bridge Pattern)

定義&#xff1a; 橋接模式&#xff08;Bridge Pattern&#xff09;是一種結構型設計模式&#xff0c;用于將抽象部分與其實現部分分離&#xff0c;使它們可以獨立地變化。這種模式通過創建一個橋接接口&#xff0c;將抽象類和其實現類解耦&#xff0c;使得修改或擴展獨立的抽…

改進YOLOv5 | C3模塊改動篇 | 輕量化設計 |骨干引入動態卷積|CondConv

???YOLOv5實戰寶典--星級指南:從入門到精通,您不可錯過的技巧 ??-- 聚焦于YOLO的 最新版本, 對頸部網絡改進、添加局部注意力、增加檢測頭部,實測漲點 ?? 深入淺出YOLOv5:我的專業筆記與技術總結 ??-- YOLOv5輕松上手, 適用技術小白,文章代碼齊全,僅需 …

信號功率放大器的工作原理和特點是什么

信號功率放大器是一種電子設備&#xff0c;用于將輸入信號的功率進行放大&#xff0c;以達到所需的輸出功率水平。它在各個領域中都有廣泛的應用&#xff0c;包括音頻放大器、射頻放大器、激光功率放大器等。下面將詳細介紹信號功率放大器的工作原理和特點。 工作原理&#xff…

Git使用基礎總結(從小白到新手版)

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

只知道ECMAScript 2015(ES6),一篇匯總ECMAScript 2015~ECMAScript 2023新特性

前言 我們常說的ES6也就是ECMAScript 2015是在2015年6月發布的。這個版本引入了許多重要的語言特性和改進&#xff0c;對 JavaScript 進行了深刻的擴展和升級&#xff0c;ES6 是 JavaScript 語言的一個里程碑。所以有時也被稱為ES6。這是由于規范的發布年份與實際版本號之間的…

OpenAI“宮斗”新進展!Sam Altman將重返OpenAI擔任首席執行官 董事會成員改動

在經過激烈的五天討論和辯論之后&#xff0c;高調人工智能初創公司OpenAI宣布&#xff0c;其聯合創始人之一Sam Altman將回歸擔任首席執行官。這一決定是對上周Altman突然被解雇的回應&#xff0c;該決定引起了極大的關注和討論。 OpenAI表示&#xff0c;他們已經達成了與Altm…

德迅云安全-德迅衛士:保障您的主機安全

主機安全是指保證主機在數據存儲和處理的保密性、完整性、可用性&#xff0c;包括硬件、固件、系統軟件的自身安全&#xff0c;以及一系列附加的安全技術和安全管理措施。 為什么要主機安全&#xff1f; 服務器一旦被黑客入侵&#xff0c;個人和企業面臨以下安全風險&#xff…

張弛聲音變現課,如何為偶像劇配音?

在為偶像劇進行配音工作時&#xff0c;配音員應當捕捉劇中角色的年輕活力、浪漫的愛情故事以及輕快的生活節奏。偶像劇主要講述的是青春的愛戀、友誼和夢想追求&#xff0c;因此配音需要傳遞出劇中的真誠和活潑。為偶像劇配音可以考慮以下幾點建議&#xff1a; 鮮明活潑的聲音 …

如何判斷交流回饋老化測試負載是否合格?

交流回饋老化測試負載是用于模擬實際工作環境中設備運行狀態的測試工具&#xff0c;主要用于檢測設備的耐久性和穩定性。 負載性能&#xff1a;需要檢查負載的性能是否符合設計要求&#xff0c;這包括負載的功率、電流、電壓等參數是否在規定的范圍內&#xff0c;以及負載的工作…

【AI】行業消息精選和分析(11月23日)

今日動態 1、Sam Altman 重掌 CEO&#xff0c;OpenAI 權力斗爭正式「落幕」 2、重磅好消息&#xff1a;語音 ChatGPT 現已向全用戶開放 3、NVIDIA 與基因泰克合作&#xff0c;利用生成式 AI 加速藥物發現 4、 英偉達Q3營收同比增長206%至181億美元 黃仁勛&#xff1a;生成式AI時…

Zoho Bigin和標準版CRM有什么區別?

Zoho Bigin是Zoho公司推出的一款針對小微企業設計的CRM系統&#xff0c;它與Zoho CRM一脈相承&#xff0c;但更加輕量級&#xff0c;快速幫助小微企業實現數字化銷售。下面來說說&#xff0c;Zoho Bigin是什么&#xff1f;它適合哪些企業&#xff1f; 什么是Zoho Bigin&#x…

【c語言】重溫一下動態內存,int數組過大會造成棧錯誤

項目場景&#xff1a; 項目場景&#xff1a;互助群同學在刷題的過程中&#xff0c;遇到的一個題目&#xff0c;需要申請一個很大數組&#xff0c;于是這個同學就寫了int[1000000],其實這樣寫也沒有錯&#xff0c;可是運行后卻顯示棧錯誤。于是就找到我來請教&#xff0c;我想就…

從零開始的c語言日記day36——指針進階

一、什么是指針: 指針的概念:1.指針就是個變量&#xff0c;用來存放地址&#xff0c;地址唯一標識一塊內存空間。 ⒉指針的大小是固定的4/8個字節(32位平臺/64位平臺)。 指針是有類型&#xff0c;指針的類型決定了指針的-整數的步長&#xff0c;指針解引用操作的時候的權限。…

嵌入式面經-python相關問題

1、c\cpp\python 區別&#xff0c;各自優缺點&#xff1f; 2、python是怎么處理 深拷貝和淺拷貝的&#xff1f; 3、python的多線程 多進程 4、用過python哪些庫

玻璃加工ERP包含些模塊?玻璃加工ERP好用嗎

玻璃制品的類型多、規格不一、營銷策略靈活、銷售渠道廣泛、生產關聯業務環節。在當今這個市場競爭日益激烈的時代&#xff0c;如何有效整合各個業務環節&#xff0c;提升多部門協作效率&#xff0c;隨時進行數據分析等&#xff0c;是每個玻璃加工企業面臨的管理難題。 在數字…

【C語法學習】27 - 字符串轉換為數字

文章目錄 1 atoi()函數1.1 函數原型1.2 參數1.3 返回值1.4 轉換機制1.5 示例1.5.1 示例1 1 atoi()函數 1.1 函數原型 atoi()&#xff1a;將str指向的字符串轉換為整數&#xff0c;函數原型如下&#xff1a; int atoi(const char *str);1.2 參數 atoi()函數只有一個參數str&…

docker部署paddleocr

內容僅供參考學習 歡迎朋友們V一起交流&#xff1a; zcxl7_7 環境 1. CentOS7 ?2. docker ?3. PaddleOCR2.5.2 1.準備 1. 首先準備好需要打包的項目 2. 在該項目中創建Dockerfile文件 touch Dockerfile2. 編寫Dockerfile # 從Python 3.8的官方鏡像中創建(pyt…

建立簡單的客戶端-服務端通信系統

本文介紹如何使用C編寫一個基本的客戶端-服務端通信系統。通過這個例子&#xff0c;你將學到如何建立TCP連接、發送和接收消息&#xff0c;以及如何處理多個客戶端連接。 客戶端代碼&#xff1a; #include <stdio.h> // 標準輸入輸出庫&#xff0c;提供基本的輸入…

matlab使用scatter函數畫圖時報錯“數組索引必須為正整數或邏輯值”解決辦法

一、背景 在使用matlab的scatter函數畫圖時報錯“數組索引必須為正整數或邏輯值”。 scatter函數說明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置創建一個包含圓形標記的散點圖。 二、解決辦法 如果使用scatter函數時報上述錯誤&#xff0c;嘗試將連續函數先轉換為函…