基于EPICS modbus模块的单通道电压监测项目

先介绍在本项目中使用到的硬件:

1)开发板:为香橙派Zero2,安装系统如下:

Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy

2) USB转485模块:微雪工业级USB转RS485串口转换器

 3)485单通道电压测量模块:此模块默认通信参数

  • 波特率:9600
  • 数据位:8
  • 停止为:1
  • 校验:无

此模块的modbus rtu通信寄存器如下:

 以下是IOC软件部分:

以下是IOC控制程序的开发过程:

这个IOC程序需要以下模块支持:base, asyn和modbus。

1)用makeBaseApp构造IOC程序框架。

2)在configure/RELEASE下添加所需模块的路径:

SUPPORT=/usr/local/EPICS/synApps/support

ASYN=$(SUPPORT)/asyn
MODBUS=$(SUPPORT)/modbus

# EPICS_BASE should appear last so earlier modules can override stuff:
EPICS_BASE = /usr/local/EPICS/base

 3)在onevoltageApp/src目录下Makefile文件中添加,编译所需的模块以及库文件:

....
onevoltage_DBD += asyn.dbd
onevoltage_DBD += drvAsynSerialPort.dbd
onevoltage_DBD += modbusSupport.dbd


# Add all the support libraries needed by this IOC
onevoltage_LIBS += asyn
onevoltage_LIBS += modbus

...

4) 在onevoltageApp/Db文件中添加以下两个文件:

a) longinInt32.template用于从硬件读取原始电压表示的数值:

record(longin,"$(P)$(R)") {
    field(DTYP,"asynInt32")
    field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")
    field(SCAN, "$(SCAN)")
    field(FLNK, "$(P)Digitals")
    field(EGU, "V")
}

b) calc_voltage.db:用于转换硬件原始电压表示格式为正常表示的电压格式:

record(calc, "$(P)Digitals") {
  field(SCAN, "Passive")
  field(FLNK, "$(P)Divsion")
  field(CALC, "FLOOR(A/B)")
  field(INPA, "$(P)RawV1")
  field(INPB, "10000")
}


record(calc, "$(P)Divsion") {
  field(SCAN, "Passive")
  field(FLNK, "$(P)Voltage")
  field(CALC, "10^A")
  field(INPA, "$(P)Digitals")
}

record(calc, "$(P)Voltage") {
  field(SCAN, "Passive")
  field(EGU, "V")
  field(CALC, "(A-C*10000)/B")
  field(INPA, "$(P)RawV1")
  field(INPB, "$(P)Divsion")
  field(INPC, "$(P)Digitals")
}

IOC数据库中记录之间关系图,设计如下:

将以下两个文件添加到Makefile中:

...
DB += longinInt32.template
DB += calc_voltage.db
...

5) 返回这个IOC的顶层目录并且执行Make,编译这个项目。

6)进入启动目录,创建一个模板实例化文件,然后编辑st.cmd文件:

a) onevoltage.substitutions

file "../../db/longinInt32.template" { pattern
{P,           R,                PORT,     OFFSET,   DATA_TYPE,      SCAN}
{ONEVOLTAGE:,    RawV1,        A0_In_Word,     0,     UINT16,       "I/O Intr"}
}

b) st.cmd 

#!../../bin/linux-aarch64/onevoltage

#- You may have to change onevoltage to something else
#- everywhere it appears in this file

< envPaths

cd "${TOP}"

## Register all support components
dbLoadDatabase "dbd/onevoltage.dbd"
onevoltage_registerRecordDeviceDriver pdbbase

drvAsynSerialPortConfigure("onevoltage", "/dev/ttyUSB0", 0, 0, 0)
asynSetOption("onevoltage",0,"baud","9600")
asynSetOption("onevoltage",0,"parity","none")
asynSetOption("onevoltage",0,"bits","8")
asynSetOption("onevoltage",0,"stop","1")

modbusInterposeConfig("onevoltage",1 ,2000,0)

drvModbusAsynConfigure("A0_In_Word", "onevoltage", 1, 4,  0, 1, 0,  200, "onevoltage")

## Load record instances
dbLoadRecords("db/calc_voltage.db","P=ONEVOLTAGE:")

cd "${TOP}/iocBoot/${IOC}"
dbLoadTemplate("onevoltage.substitutions")

iocInit

7) 在IOC启动目录中,执行以下命令../../bin/linux-aarch64/onevoltage st.cmd,并且用dbl查看加载的记录:

epics> dbl
ONEVOLTAGE:Digitals
ONEVOLTAGE:Divsion
ONEVOLTAGE:Voltage
ONEVOLTAGE:RawV1

8) 先用命令行测试:

root@orangepizero2:~#  caget ONEVOLTAGE:RawV1 # 测量电压的原始表示
ONEVOLTAGE:RawV1               32002
root@orangepizero2:~#  caget ONEVOLTAGE:Voltage # 转换后的电压值
ONEVOLTAGE:Voltage             2.005

9) 用CSS制作图形界面:

写在2023年12月31日,祝大家新年快乐,有工作的,工作顺利,想换工作的,来年都能找一个好工作。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

水面漂浮物监测识别摄像机

水面漂浮物监测识别摄像机是一种用于监测水体表面上漂浮物的高科技设备。它主要通过安装在水域周边的摄像头实时捕捉水面情况&#xff0c;利用图像识别技术自动识别和监测水面漂浮物。这种设备在环境保护、水域清洁和水质监测等方面具有广泛的应用价值。 水面漂浮物包括各类垃圾…

启动gazebo harmonic

ros2 launch ros_gz_sim gz_sim.launch.py gz_version:8 或者在launch文件内&#xff1a; 如果不输入gz_version:8,默认就是6&#xff0c;启动的就是默认版本ign版本 左边那个是8&#xff0c;右边那个是6

大模型笔记 【1】 大模型初探

以下是Andrej Karpathy一小时讲解chatgpt的笔记。 Andrej Karpathy做自动驾驶的人应该比较熟悉&#xff0c;他是李飞飞的学生。在openAI做了一年半的科学家之后&#xff0c;去了特斯拉。在Tesla AI day讲解tesla自动驾驶方案的就是他。 这里我的主要收获是两个 大模型是一个有…

西电期末1018.logistic方程

一.题目 二.分析与思路 根据题目递归即可&#xff0c;用while函数判断是否到达1000项&#xff0c;内部用abs函数&#xff08;绝对值函数&#xff09;判断是否收敛&#xff0c;最后按照结果输出即可。 三.代码实现 #include<bits/stdc.h>//万能头 int main() {double …

ROS学习记录:在ROS中用C++实现激光雷达避障

前言 本文建立在成功获取激光雷达数据的基础上&#xff0c;详细参考 在ROS中用C实现获取激光雷达的数据 一、实现思路 二、在VScode中打开之前编写好的lidar_node.cpp 三、在lidar_node.cpp中写入如下代码 #include <ros/ros.h> #include <std_msgs/String.h> …

【数据库原理】(5)关系数据库的关系数据结构

关系及相关概念 在关系模型中,无论是实体还是实体之间的联系均由关系(二维表)来表示。 1.域&#xff08;Domain&#xff09; 定义&#xff1a;域是一组具有相同数据类型的值的集合。例子&#xff1a;实数集合、整数集合、英文字母集合等。 2.笛卡儿积&#xff08;Cartesian…

职场革命:六款AI助手改写工作效率的故事

引言 在数字化时代&#xff0c;AI助手正快速成为职场的革命者。这些智能助手不仅仅是效率的提升者&#xff0c;它们更是创新的驱动力&#xff0c;重新定义了我们的工作方式。从自动化PPT创建到智能邮件优化&#xff0c;它们的影响深远且多元。本文将深入探讨六款不同领域的AI助…

三、C语言中的分支与循环—if语句 (1)

在这一章节中我们的学习内容如下&#xff0c;咱们一步步来。 分支结构 1. if语句 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a;&& , || , &#xff01; 5. switch语句 循环结构 6. while循环 7. for循环 8. do-while循环 9. break和conti…

基于VS2019的C++动态链接库DLL生成与调用

一、理论知识及实践经验 实验注意事项及部分程序编写规范&#xff08;部分源自ChatGPT-3.5&#xff09;&#xff1a; Ⅰ __declspec(dllexport)和__declspec(dllimport)是用于在C中定义动态链接库&#xff08;DLL&#xff09;的关键字。在编写动态链接库时&#xff0c;__declsp…

.babky勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 网络安全威胁不断进化&#xff0c;其中.babky勒索病毒引起了广泛关注。这篇文章91数据恢复将深入介绍.babky的狡猾特征&#xff0c;以及在遭受其袭击时如何高效地恢复被加密的数据&#xff0c;并提供实用的预防方法。当面对被勒索病毒攻击导致的数据文件加密…

mac环境下安装部署mysql5.7

下载安装包 进入官网下载MySQL5.7的安装包 https://www.mysql.com/downloads/ 安装包下载完成后双击pkg文件进行安装&#xff0c;无脑点下一步即可&#xff0c;注意安装完成后记得保存最后弹出框的密码 进入系统偏好设置&#xff0c;找到mysql&#xff0c;开启mysql服务…

详谈电商网站建设的四大流程!

在21世纪的互联网时代&#xff0c;电商网站的建设是每个企业发展不可缺少的一次机遇。企业商城网站建设成功也许会获得更大的了利润&#xff1b;如果网站建设不成功&#xff0c;那么也会带来一定的损失。所以建设电商网站不是那么一件简单的事情。那么电商网站制作流程是怎样的…

DoIP学习笔记系列:(八)车厂一般关于DoIP的相关测试分析

文章目录 1. 前言2. 基本项测试2.1 协议版本默认值2.2 车辆标识请求报文格式2.3 带EID的车辆标识请求报文格式2.4 带VIN的车辆标识请求报文格式2.5 否定响应码0x002.6 否定响应码0x012.7 否定响应码0x022.8 否定响应码0x042.9 路由激活应答码0x002.10 路由激活应答码0x012.11 路…

突发!博世「裁员」

对于未来几年的汽车行业需求变化&#xff0c;一级零部件供应商正在加快「降本增效」举措&#xff0c;犹如下游客户更加倾向于降本&#xff0c;而不是无休止的提升整车性能&#xff0c;比如&#xff0c;续航里程、智能化。 本周&#xff0c;全球汽车零部件龙头供应商博世宣布&am…

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 最近更新的速度和频率大不如以前&#xff0c;主要原因还是自己有些懈怠了。学习是一个持续努力的过程&#xff0c;一旦中断&#xff0c;再想保持以往的状态可能要…

钡铼分布式IO在玻璃制造中的实时数据采集与监控应用介绍

导读 玻璃行业多年来一直广泛使用 PLC 来帮助管理生产过程所需的精确材料比例&#xff0c;完全依赖其PLC进行数据采集与控制&#xff0c;并且大量依靠人工来操作&#xff0c;所以这些高成本推动了对成本较低的替代方案的需求。 场景描述 某玻璃厂生产的玻璃生产包括配料段、熔…

性能测试之(六):JMeter 元件

元件&#xff08;多个类似功能组件的容器&#xff09; 组件&#xff1a;封装的方法&#xff0c;比如取样器中的发送请求的方法 一、常见的元件 1、取样器&#xff1a;发送请求2、逻辑处理&#xff1a;控制语句执行顺序3、前置处理器&#xff1a;在请求&#xff08;取样器&…

可狱可囚的爬虫系列课程 08:新闻数据爬取实战

前言 本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。 相信大家平时或多或少都有看新闻的习惯&#xff0c;那么我们今天所要爬取的网站便是新闻类型的&#xff1a;中国新闻网&#xff0c;我们先来使用爬虫爬取一些具有明显规则或规律的信息&am…

陪诊系统|北京陪诊小程序提升陪诊服务效果

随着科技的不断发展&#xff0c;人们对于医疗服务的需求也越来越高。在过去&#xff0c;陪诊师和陪诊公司通常需要通过电话或传真等传统方式与医院进行沟通和安排。然而&#xff0c;现在有了陪诊小程序&#xff0c;这些问题得到了解决。本文将介绍陪诊小程序的开发流程和功能&a…

CSDN质量分批量查询

单个文章质量分查询地址&#xff08;点击右边地址&#xff09;&#xff1a; CSDN质量分查询 创作者身份认证审核标准 优质创作者申请条件&#xff1a; 粉丝数在5000以上近30日&#xff08;申请日算起&#xff09;原创文章数不少于4篇原创博文总数不少于100篇垂直领域原创数量…