基于 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.hqwc.cn/news/209525.html

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

相关文章

STM32 CAN通信自定义数据包多帧连发乱序问题

场景&#xff1a; can标准帧中每一帧只能传输8字节&#xff0c;而应用中传输一包的内容往往超过8字节&#xff0c;因此需要把一个包拆成多个帧发送&#xff0c;接收端才把收到的多帧重新组装成一个完整的包 问题描述 在一问一答的两块板间通信&#xff0c;多帧连发是能够按照…

易点易动设备管理系统提升设备能耗管理和设备状态监控效率

如今&#xff0c;能源效率和设备状态监控对于企业来说变得越发重要。传统的设备管理方式往往存在能耗浪费和难以实时监控设备状态的问题。为了解决这些问题&#xff0c;易点易动设备管理系统应运而生。本文将介绍易点易动设备管理系统的功能和优势&#xff0c;以及如何通过它提…

低压配电柜浪涌保护器综合选型方案

地凯科技低压配电柜是指在额定电压不超过1000V的交流电力系统中&#xff0c;用于接受和分配电能&#xff0c;控制、保护和监测电路的装置。低压配电柜广泛应用于工业、商业、住宅等领域&#xff0c;是电力系统的重要组成部分。 然而&#xff0c;低压配电柜也面临着来自外部和内…

UniApp打包教程:使用HBuilder X和AppUploader完成原生App云打包和上架指南

UniApp打包教程&#xff1a;使用HBuilder X和AppUploader完成原生App云打包和上架指南" 目录 uniapp进行打包 使用上架工具appuplode进行发包 1.登录appuploder软件 2.登陆开发者App Store后台 uniapp进行打包 在HBuilder X编辑器中打开需要打包的项目&#xff0c;然后…

SpringCache使用详解

SpringCache 1.新建测试项目SpringCache2.SpringCache整合redis2.1.Cacheable2.2.CacheEvict2.3.Cacheput2.4.Caching2.5.CacheConfig 3.SpringCache问题4.SpringCache实现多级缓存 1.新建测试项目SpringCache 引入依赖 <dependencies><dependency><groupId&g…

【文末送书】十大排序算法C++实现

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

2023 年亚马逊黑色星期五和网络星期一的企业电子商务指南

亚马逊黑色星期五和网络星期一 周末即将到来&#xff01;感恩节于 11 月 23 日举行&#xff0c;紧接着是 24 日黑色星期五和 27 日网络星期一。您的亚马逊业务准备好应对大量涌入了吗&#xff1f; 我们相信您已经准备好黑色星期五优惠并准备好库存&#xff0c;以确保您有足够的…

【Python基础】多进程编程(进程间通信 、进程池等附上实例代码)

&#x1f308;欢迎来到Python专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mys…

什么牌子首饰超声波清洗机好、家用首饰清洗机推荐

精致的男生女生在搭配衣服肯定是少不了首饰的点缀的&#xff0c;像项链、戒指、耳环等这种配饰是少不了的&#xff0c;我们日常生活中清洗首饰的方法有很多&#xff0c;有的是用盐水清洗&#xff0c;有的是用苏打水清洗&#xff0c;虽然清洗方法有非常多&#xff0c;但是都不及…

c#数据库:vs2022 加入mysql数据源

网上有VS2019连接MySQL数据库的&#xff0c;那么VS2022&#xff0c;VS2023如果和连接到mysql数据库呢&#xff0c;这里总结一下我的经历&#xff1a; 1、首先下载ODBC驱动安装包 当前下载地址&#xff1a;https://dev.mysql.com/downloads/connector/odbc/ 2、ODBC安装 下载完…

【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备

Virtuose 6D RV为一款具有大工作空间并在所有6自由度上提供力反馈的触觉设备&#xff0c;设计专用于虚拟现实环境&#xff0c;特别适合于大型虚拟物体的处理。 Virtuose 6D RV是当今市场上唯一将高工作效率与高工作量相结合在一起的产品。6D RV特别适合于缩放与操纵等应用&…

易点易动库存管理系统革新企业库存管理,降本增效

随着全球经济的快速发展和市场竞争的加剧&#xff0c;企业对库存管理的需求变得越来越迫切。传统的手工操作和繁琐的库存管理方式已经无法满足现代企业的需求。为了解决这一问题&#xff0c;易点易动库存管理系统应运而生。 易点易动库存管理系统概述 易点易动库存管理系统是一…