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

news2025/1/22 12:46:15

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

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日,祝大家新年快乐,有工作的,工作顺利,想换工作的,来年都能找一个好工作。 

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

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

相关文章

【网络面试(6)】IP协议对网络包的转发

在前面的博客中&#xff0c;我们提到过&#xff0c;网络传输的报文是有真实的数据包和一些头部组成&#xff0c;目前我们了解的头部就有TCP头、IP头、MAC头&#xff0c;而且这三个头部信息都是在应用程序委托给协议栈之后&#xff0c;被写入的相关信息&#xff0c;这些头部都是…

香橙派5plus从ssd启动Ubuntu

官方接口图 我实际会用到的就几个接口&#xff0c;背面的话就一个M.2固态的位置&#xff1a; 其中WIFI模块的接口应该也可以插2230的固态&#xff0c;不过是pcie2.0的速度&#xff0c;背面的接口则是pcie3.0*4的速度&#xff0c;差距还是挺大的。 开始安装系统 准备工作 一张…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷③

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 模块…

【Redis-10】Redis集群的实现原理和实践

Redis集群是Redis提供的分布式数据库方案&#xff0c;通过分片来进行数据共享&#xff0c;实现复制和故障转移的功能。 1. Redis集群节点 一个Redis集群由多个节点组成&#xff0c;多个节点可以通过命令实现连接&#xff0c;由独立状态转为集群状态&#xff0c;命令是cluster …

论文解读:Coordinate Attention for Efficient Mobile Network Design(CVPR2021)

论文前言 原理其实很简单&#xff0c;但是论文作者说得很抽象&#xff0c;时间紧的建议直接看3.1中原理简述CBMA、原理简述CBMA以及3.2中原理简述coordinate attention block即可。 Abstract 最近关于mobile network设计的研究已经证明了通道注意(例如&#xff0c;the Squee…

7.java——异常

异常——error&#xff08;资源耗尽&#xff0c;JVM内部系统错误&#xff0c;代码一般处理不了&#xff09;和excption&#xff08;数组越界&#xff0c;空指针访问&#xff0c;代码可以处理&#xff09; java.lang.Throwable;异常体系的根父类 -------java.lang.Error:错误。…

20231231_小米音箱接入GPT

参考资料&#xff1a; GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker *.设置运行脚本权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned *.配置小米音箱 ()pip install miservice_fork -i https://pypi.tuna.tsinghua.edu.cn/sim…

如何设置Android Studio绘制布局时的视图--新手建议收藏!

目录 前言 一、总体步骤 二、详细步骤 三、总结 四、更多资源 前言 在Android Studio中&#xff0c;你可以使用布局编辑器来绘制应用程序的用户界面。布局编辑器提供了一个可视化界面&#xff0c;可让你以所见即所得的方式布局和设计应用程序的视图。 一、总体步骤 打开…

Pytest 项目结合Jenkins

一、window安装centos7虚拟机 参考网上其他教程 二、Linux安装Jenkins 进入jenkins.io网址&#xff0c;点击download&#xff0c;选择CentOS版本 1、Linux中安装java环境和git Jenkins的运行需要java环境&#xff1b;安装git是为代码上传给仓库做准备&#xff1b; yum - y…

idea构建maven项目报错的解决

使用idea创建了一个新的spring项目&#xff0c;maven配置完毕后&#xff0c;报错&#xff0c;引用的依赖不存在。 控制台报错信息如下&#xff1a; 通过查询资料&#xff0c;发现是阿里云的maven仓库中没有这个版本的jar包&#xff0c;导入无法引用到对应的依赖。 解决方法就是…

vmware部署docker+springboot+MySQL(超详细)

一、前期准备 (一)安装jdk #docker search openjdk #docker pull openjdk:8 (二)确认网络 如果局域网其他终端(如手机访问),虚拟机网络连接需要选择《桥接》模式,而且,需要使用有线连接,不能使用Wi-Fi,切忌切忌! 并且要选择实际的那个有线连接。比如我这里是“R…

WorkPlus私有化即时通讯的标杆,助力企业实现信息管控与保障

在信息时代&#xff0c;保护企业的信息安全至关重要。而私有化即时通讯成为了企业提升信息安全的重要手段。作为私有化即时通讯的领先选择&#xff0c;WorkPlus以其卓越的性能和领先的技术&#xff0c;为企业提供了安全可靠的通信解决方案。 私有化即时通讯是企业保护信息安全的…

华为云Stack 8.X流量模型分析(五)

六、EIP流量模型分析 ​ 弹性公网IP&#xff08;Elastic IP&#xff0c;简称EIP&#xff09;提供独立的公网IP资源&#xff0c;包括公网IP地址与公网出口带宽服务。如果资源只配置了私网IP&#xff0c;则无法直接访问Internet&#xff0c;为资源配置弹性公网IP后&#xff0c;可…

普中STM32-PZ6806L开发板(HAL库函数实现-按键扫描)

简介 实现按键扫描, 实现四个按键按下控制灯的亮灭 电路原理图 按键电路原理图 按键与主芯片引脚原理图 其他知识 原理图分析 Key_UP按下会有高电平输入, 所以电路设置应该是默认低电平, 初始化为下拉输入 Key_Left/Right/Down按下会有低电平&#xff0c; 初始化为下拉输…

HTML教程(2)——基础标签

一、HTML的元数据 <meta>标签定义关于 HTML 文档的元数据。元数据是关于数据的数据&#xff08;信息&#xff09;,其始终位于<html>元素内&#xff0c;通常用于指定字符集、页面描述、关键词、文档作者和视口设置&#xff1b; 元数据不会显示在页面上&#xff0c…

redis—List列表

目录 前言 1.常见命令 2.使用场景 前言 列表类型是用来存储多个有序的字符串&#xff0c;如图2-19所示&#xff0c;a、b、C、d、e五个元素从左到右组成 了一个有序的列表&#xff0c;列表中的每个字符串称为元素(element) &#xff0c;一个列表最多可以存储2^32 - 1 个元素…

MySQL Too many connections报错

MySQL 时不时出现Too many connections报错&#xff0c;重启MySQL就好了 但是过段时间又出现 一、解决方案&#xff1a; 1.修改mysql最大连接数 set global max_connections500; 以上是修改立即生效的&#xff0c;重启MySQL就会还原回去 在MySQL配置文件修改 max_connection…

GAMES101:作业4记录

文章目录 总览算法编写代码&#xff1a;recursive_bezier()的实现Bezier()函数的实现提高部分&#xff1a;反走样 总览 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该算法时,…

拒绝采样(算法)总结

先说说什么是拒绝采样算法&#xff1a;就类似于数学上的求阴影面积的方法&#xff0c;直接求求不出来&#xff0c;就用大面积 - 小面积 阴影面积的办法。 所谓拒绝 和 采样 &#xff1a;就像是撒豆子计个数&#xff0c;计算概率问题一样&#xff0c;大桶里面套小桶&#xff0c…

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio&#xff0c;Visual Studio 2010旗舰版下载链接&#xff1a;点此…