基于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/supportASYN=$(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")
}

将以下两个文件添加到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< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/onevoltage.dbd"
onevoltage_registerRecordDeviceDriver pdbbasedrvAsynSerialPortConfigure("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.hqwc.cn/news/311104.html

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

相关文章

AJAX: 整理2:学习原生的AJAX,这边借助express框架

1. npm install express 终端直接安装 2. 测试案例&#xff1a;Hello World&#xff01; 新建一个express.js的文件&#xff0c;写入下方的内容 // 1. 引入express const express require(express)// 2. 创建服务器 const app express()// 3.创建路由规则 // request 是对请…

蓝桥杯真题位运算

位运算:对二进制进行操作的运算方式 与运算:有0得0 或运算:有1得1 异或运算:相同为0、不同为1取反 左移、右移 与运算&:有0则为0&#xff0c;全1为1 或运算|:有1则为1&#xff0c;全0为0 异或运算^:相同为0、不同为1 交换律: x^yy ^x 结合律: x ^(y ^z)(x ^y)^z …

《微信小程序开发从入门到实战》学习六十七

6.6 网络API 部分小程序服务端不是用云开发技术实现&#xff0c;而是由开发人员使用后端开发语言实现。 在小程序用网络API与&#xff08;开发人员使后端开发语言建设的&#xff09;服务端进行交互&#xff0c;可与服务端交换数据、上传或下载文件。 6.6.1 服务器域名配置 …

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat&#xff0c;所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用&#xff0c;其中关于文档如何进行分块的详细&#xff0c;可以参考笔者的另几篇文章&#xff1a; 大模型RAG 场景、数据、应用难点与解决&#xff08;四&#xff09;R…

Termius for Mac/Win:一站式终端模拟器、SSH 和 SFTP 客户端软件的卓越选择

随着远程工作和云技术的普及&#xff0c;对于高效安全的远程访问和管理服务器变得至关重要。Termius&#xff0c;一款强大且易用的终端模拟器、SSH 和 SFTP 客户端软件&#xff0c;正是满足这一需求的理想选择。 Termius 提供了一站式的解决方案&#xff0c;允许用户通过单一平…

华清远见作业第十六天

思维导图&#xff1a; 双向循环链表头插入&#xff1a; 代码&#xff1a; Doublelist insert_head(Doublelist head,datatype element) {//创建新节点sDoublelist screate_node();if(NULLs){return head;}s->dataelement;//数据存储//判断链表是否为空if(NULLhead){heads;…

使用Vue.js实现手机系统检测和页面响应

题目&#xff1a;使用Vue.js实现手机系统检测和页面响应 摘要&#xff1a;本文将介绍如何使用Vue.js来检测用户的手机操作系统&#xff0c;并根据操作系统类型进行相应的页面响应。我们将通过编写一个Vue组件&#xff0c;利用用户代理字符串来检测设备类型&#xff0c;并根据检…

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…

QString设置小数点精度位数

QString设置小数点精度位数 Chapter1 QString设置小数点精度位数Chapter2 Qt中QString.toDouble有效位数6位问题以及数据小数点有效位数的处理问题一&#xff1a;QString.toDouble有效位只有6位问题二:小数点有效位数的问题 Chapter3 qt QString转Double只显示6位数字的问题(精…

S32K312使用ITCM向FLASH代码区写入数据

使用C40_IP的系列方法向FLASH代码区写入数据时&#xff0c;程序会卡死在读取写操作的状态C40_Ip_MainInterfaceWriteStatus()这个方法中。本文主要介绍S32K312通过ITCM的方式&#xff0c;通过C40_IP的方法向FLASH代码区成功写入数据的方法和步骤。 首先&#xff0c;验证一下C4…

IIS服务器发布PHP网站

IIS服务器&#xff0c;相信开发者都不会陌生&#xff0c;它的英文全称是Internet Information Services&#xff0c;是由微软公司提供的基于运行Microsoft Windows的互联网基本服务&#xff0c;常用于Windows系统的Web项目部署&#xff0c;本篇以PHP项目为例&#xff0c;讲解如…

<JavaEE> TCP 的通信机制(三) -- 滑动窗口

目录 TCP的通信机制的核心特性 四、滑动窗口 1&#xff09;什么是滑动窗口&#xff1f; 2&#xff09;滑动窗口的作用是什么&#xff1f; 3&#xff09;批量传输出现丢包如何处理&#xff1f; 1> 接收端ACK丢包 2> 发送端数据包丢包 4&#xff09;适用性 TCP的通…