基于 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.mzph.cn/news/162504.shtml

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

相关文章

改进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…

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;指针解引用操作的时候的权限。…

玻璃加工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…

matlab使用scatter函数画图时报错“数组索引必须为正整数或逻辑值”解决办法

一、背景 在使用matlab的scatter函数画图时报错“数组索引必须为正整数或逻辑值”。 scatter函数说明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形标记的散点图。 二、解决办法 如果使用scatter函数时报上述错误&#xff0c;尝试将连续函数先转换为函…

ubuntu编译sqlite3并使用

SQLite3是一种轻量级的关系型数据库管理系统&#xff0c;它是在C语言基础上实现的。SQLite3具有许多优点&#xff0c;例如&#xff1a; 1.灵活&#xff1a;它可以在多种操作系统上运行&#xff0c;并且可以将多个数据库文件合并成一个文件。 2.易于使用&#xff1a;SQLite3使用…

基于爬行动物算法优化概率神经网络PNN的分类预测 - 附代码

基于爬行动物算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于爬行动物算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于爬行动物优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

八股文面试day6

什么是代理&#xff1f;为什么要用动态代理&#xff1f; 代理模式大概意思是&#xff1a;为其他对象提供一个代理项或者是占位符&#xff0c;以控制对这个对象的访问 代理模式核心思想&#xff1a;创建一个代理对象&#xff0c;在客户端和目标对象之间的一个中介&#xff0c;…

35的程序员被辞了可以自己接外包啊?为什么都那么悲观呢?

35的年纪&#xff0c;上有老下有小&#xff0c;即将步入中年危机&#xff0c;在这个节骨眼上被辞&#xff0c;能不悲观吗&#xff1f; 在这个年纪人们往往追求的是稳定的工作和生活&#xff0c;而进入一个自己不熟悉的行业并不是一个好的选择。 况且&#xff0c;你认为的外包…

诊断0x27服务解密文件DLL制作与使用

DLL文件在CANoe的使用方法 DLL文件在诊断里面可以用在0x27秘钥服务里面&#xff0c;对解密有帮助&#xff0c;在下图位置加载。 DLL文件制作 vector公司本来就给了我们一个demo&#xff0c;先拷贝一份下来&#xff0c;别把原来的文件给改坏了。我这个是CANoe12&#xff0c;de…