EPICS aSub记录使用实例

news2024/10/7 13:13:53

本实例描述了在数据库中如何使用aSub记录

本实验中使用了三个k型热电偶,一个3路k型热电偶变送器以及一个串口服务器:

 温度变送器参数:

 串口服务器:

1) 用makeBaseApp.pl构建IOC应用程序的目录结构:

[blctrl@localhost tempcollect]$ ls
bin  configure  db  dbd  iocBoot  lib  Makefile  tempcollectApp

2) 在configure/RELEASE文件中增加以下内容,指定要使用的模块:

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

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

3)在程序源文件目录src中增加一个名为convert_t.c的C源程序文件和一个对应的convert.dbd文件,内容分别如下:

convert_t.c内容如下:

// 此C源文件是用于将aSub记录中分别从INPA,INPB,INPC读取一个整数
// 经过运算后,分别从OUTA,OUTB和OUTC输出链接输出
#include <stdio.h>
#include <dbDefs.h>
#include <registryFunction.h>
#include <aSubRecord.h>
#include <epicsExport.h>


static long convert_t(aSubRecord *prec) {
        long i, *a;
        double * b;

        a = (long *)prec->a;
        b = (double *)prec->vala;

        for (i=0; i<prec->noa; i++) {
            b[i] = 0.1 * a[i];
        }
        //printf("%d-%f\n", a,b);

        a = (long *)prec->b;
        b = (double *)prec->valb;

        for (i=0; i<prec->nob; i++) {
            b[i] = 0.1 * a[i];
        }

        //printf("%d-%f\n", a,b);
        a = (long *)prec->c;
        b = (double *)prec->valc;

        for (i=0; i<prec->noc; i++) {
            b[i] = 0.1 * a[i];
        }
        //printf("%d-%f\n", a,b);

        return 0; /* process output links */
}

convert.dbd内容如下:

function(convert_t)

将以上内容以及所需要dbd文件和库文件指定到相同路径下Makefile文件中:

...
tempcollect_DBD += asyn.dbd
tempcollect_DBD += drvAsynIPPort.dbd
tempcollect_DBD += modbus.dbd
tempcollect_DBD +=  convert_t.dbd

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


tempcollect_SRCS +=  convert_t.c
...

4) 在Db路径下增加一个数据库longinInt32.template模板文件和convert.db文件:

longinInt32.template内容如下,其作用是从modbus协议设备读取寄存器输入:

# longin record template for register inputs
record(longin,"$(P)$(R)") {
    field(DTYP,"asynInt32")
    field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")
    field(SCAN, "$(SCAN)")
}

convert.db文件内容如下,其作用是进行数据转换:

# 此记录是进行数据转换,转换过程将调用编写的convert_t函数
record(aSub, "$(P)Convert") {
  field(DESC, "Convert Raw To Temp")
  field(SCAN, ".5 second")
  field(SNAM, "convert_t")
  field(FLNK, "$(P)ForwardValue.PROC")
  field(EFLG, "ON CHANGE")
  field(INPA, "$(P)$(T)1")
  field(INPB, "$(P)$(T)2")
  field(INPC, "$(P)$(T)3")
  field(FTA, "LONG")
  field(FTB, "LONG")
  field(FTC, "LONG")
  field(OUTA, "$(P)$(M)1")
  field(OUTB, "$(P)$(M)2")
  field(OUTC, "$(P)$(M)3")
}

# 用于设置Event记录提交的事件号
record(longin, $(P)Event)
{
  field(INP, "1")
  field(PINI,"1")
}

# 运行时将提交指定事件
record(event, "$(P)ForwardValue") {
  field(DESC, "Forward All Value")
  field(INP, "$(P)Event")
  field(SCAN, "Passive")
  field(PINI, "NO")
  field(VAL, "1")
}

# 如果遇到提交的事件为1,则运行
record(ai, "$(P)$(M)1") {
  field(SCAN, "Event")
  field(EVNT, "1")
}

# 如果遇到提交的事件为1,则运行
record(ai, "$(P)$(M)2") {
  field(SCAN, "Event")
  field(EVNT, "1")
}

# 如果遇到提交的事件为1,则运行
record(ai, "$(P)$(M)3") {
  field(SCAN, "Event")
  field(EVNT, "1")
}

将以上两个文件,添加到同级目录中的Makefile中:

...
DB += longinInt32.template
DB += convert.db
...

5) 回到这个IOC的顶层目录,执行Make,进行程序编译。

6)进入到启动文件所在目录,编辑一个模板替代文件temperature.substitutions以及st.cmd启动文件

temperature.substitutions内容如下:

file "../../db/longinInt32.template" { pattern
{P,                             R,              PORT,           OFFSET,         DATA_TYPE,      SCAN}
{ZSTEMPERATURE:                 TEMP1           AI_In_Word,     0,              INT16, "I/O Intr"}
{ZSTEMPERATURE:                 TEMP2           AI_In_Word,     1,              INT16, "I/O Intr"}
{ZSTEMPERATURE:                 TEMP3           AI_In_Word,     2,              INT16, "I/O Intr"}
}

st.cmd内容如下:

#!../../bin/linux-x86_64/tempcollect

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

< envPaths

cd "${TOP}"

## Register all support components
dbLoadDatabase "dbd/tempcollect.dbd"
tempcollect_registerRecordDeviceDriver pdbbase
## 这里的Modbus温度温度变送设备的IP地址192.168.3.111和端口号26
## 设置端口名为temperature
drvAsynIPPortConfigure("temperature", "192.168.3.111:26",0,0,1)

## 此设备使用标准的RTU
modbusInterposeConfig("temperature", 1 ,2000, 0)


# 读保持寄存器,从地址0开始读取3个字
drvModbusAsynConfigure("AI_In_Word",  "temperature",1, 3, 0, 3, 0, 500, "temperature")

## 装载数据库实例
dbLoadRecords("db/convert.db","P=ZSTEMPERATURE:,T=TEMP,M=RT")

cd "${TOP}/iocBoot/${IOC}"
## 装载数据库实例
dbLoadTemplate("temperature.substitutions")
iocInit

7) 在启动目录中启动这个IOC程序,并且查看加载的记录:

../../bin/linux-x86_64/tempcollect st.cmd

epics> dbl
ZSTEMPERATURE:ForwardValue
ZSTEMPERATURE:Event
ZSTEMPERATURE:TEMP1
ZSTEMPERATURE:TEMP2
ZSTEMPERATURE:TEMP3
ZSTEMPERATURE:Convert
ZSTEMPERATURE:RT1
ZSTEMPERATURE:RT2
ZSTEMPERATURE:RT3

8) 用CSS Pheobus做一个图形界面:

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

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

相关文章

OpenGL入门教程之 摄像机

引言 前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景。OpenGL本身没有摄像机的概念&#xff0c;但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机&#xff0c;这样感觉就像我们在移动&#xff0c;而不是场景在移动。  本节我们将会讨论如何…

从零开始学架构——高可用存储架构

双机架构 存储高可用方案的本质都是通过将数据复制到多个存储设备&#xff0c;通过数据冗余的方式来实现高可用&#xff0c;其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此&#xff0c;对任何一个高可用存储方案&#xff0c;我们需要从以下几个方面去进…

【MySQL】一个脚本启动MySQL 8.0并初始化数据库

引 很多情况下需要在客户端发布时发布 MySQL 数据库&#xff0c;这种发布方式虽然存在文件资源较大、易出错等缺点&#xff0c;但是却可以让桌面产品的发布更加完整。 本文将阐述如何使用一个脚本启动并初始化 MySQL 8.0 的方法&#xff0c;涵盖数据库下载、脚本源码、测试及…

PFSK162 3BSE015088R1通常都要做空载全电压合闸冲击试验

​ PFSK162 3BSE015088R1通常都要做空载全电压合闸冲击试验 变压器励磁涌流影响的保护整定 摘要&#xff1a;在大型变压器空栽冲击过程中&#xff0c;由于励磁涌流和负序电压的存在&#xff0c;如果定值整定不得当&#xff0c;会导致差动保护&#xff0c;复压过流保护等误动作&…

设计模式——组件协作模式之观察者模式

文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案&#xff0c;最朴素的方式②、第二种方案&#xff0c;重构使得遵循DIP原则&#xff1a;③、进一步的小优化&#xff1a;④、修改使得支持多个观察者&#xff1a; 4、结…

028:Mapbox GL 绘制线段,实时测量长度距离值

第028个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制线段,编辑线段,实时显示长度值。这里使用turf来计算长度值,采用默认的单位千米。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代…

Elasticsearch:Standard Text Analyzer - 标准文本分析器

Elasticsearch 提供了超过很多开箱即用的分析器&#xff0c;我们可以在文本分析阶段使用它们。 这些分析器很可能足以满足基本情况&#xff0c;但如果需要创建自定义分析器&#xff0c;可以通过使用构成该模块的所需组件实例化一个新的分析器模块来实现。 下表列出了 Elasticse…

SuSE linux server 11通过SAP来安装oracle11g

这里安装通过xmanager4进行安装&#xff0c;之前文章已经说了怎么通过xmanager4来连接linux系统&#xff0c;这里说一下安装oracle11g。 我这里是通过sap来安装oracle11g&#xff0c;所以需要 export LD_LIBRARY_PATH/oracle/P90/112_64/lib/:/sapmnt/P90/exe/ 同时在orap90用…

Mac使用命令行工具解压和压缩rar文件

目前在Mac电脑里支持解压缩的格式主要有&#xff1a;zip、gz等&#xff0c;但是还不支持rar格式的文件&#xff0c;接下来带着大家学习一下如何解压缩rar格式文件。 1.下载rar工具 打开&#xff1a;https://www.rarlab.com/download.htm 根据自己电脑的芯片要求选择自己的安装…

马云的创业故事及他人生中的摆渡人-卖掉中国黄页去北漂(四)

马云上京&#xff0c;是在外经贸部一位名叫王建国的朋友牵线之下&#xff0c;受邀担任外经贸部下属的中国国际电子商务中心&#xff08;下面简称EDI&#xff09;总经理&#xff0c;负责搭建外经贸部官网和网上中国商品交易市场。 马云团队在潘家园租了房子&#xff0c;白天上班…

如何编写高质量代码、提高编程效率?

一、 前言 高质量代码是指在满足功能需求的基础上&#xff0c;具备高性能、安全、可扩展、易维护、可测试等特点的代码。它不仅可以提高开发效率和代码质量&#xff0c;更能有效减少代码维护成本&#xff0c;促进团队协作和项目成功。因此&#xff0c;编写高质量代码对程序员来…

妙记多「我的主页」升级,日历聚合任务待办,为你打造个人时间管理系统⏰

我们应该如何处理“日程”和“待办”的关系&#xff1f; 日程和待办的区别与联系 从字面意义上来理解&#xff0c;日程是这一天的安排&#xff0c;待办是需要去完成的事情&#xff0c;日程与待办本质上是一种相互包含的关系。将所有事情都视作待办显然是不科学的&#xff0c;那…

二叉树的非递归遍历

目录 前言&#xff1a; 一&#xff1a;前序遍历 二&#xff1a;中序遍历 三&#xff1a;后序遍历 四&#xff1a;层序遍历 前言&#xff1a; 二叉树的非递归遍历需要借助栈和队列以及二叉树的一些基础接口&#xff0c;这些在之前的文章中有讲过&#xff0c;这里就不赘述&…

SSD目标检测

数据集以及锚框的处理 数据集&#xff1a; 图像&#xff1a;&#xff08;batch_size , channel , height , width&#xff09; bounding box: &#xff08;batch_size , m , 5&#xff09; m: 图像中可能出现的最多边界框的数目 5&#xff1a; 第一个数据为边界框对应的种…

tongweb

13051667606 东方通产品介绍 产品兼容 硬件要求 安装 安装目录结构 启动tongweb 停止tongweb bin下常用命令 企业版管理控制台 文档&#xff1a;产品简介及安装指南 绿色版直接解压安装 tar -zxvf …tar.gz Tongweb的配置文件 在conf的tongweb.xml 修改端口等信息 通过页面…

第四章 Unity工程和相机介绍

在上面的章节中&#xff0c;我们创建了一个“New Unity Project”工程&#xff0c;并保存到了“E:\workspace”工作空间下。那么&#xff0c;我就先看看这个工程的文件结构&#xff08;E:\workspace\ New Unity Project&#xff09;。 接下来&#xff0c;我们简单介绍一下这些目…

【老王读SpringMVC-3】根据 url 是如何找到 controller method 的?

前面分析了 request 与 handler method 映射关系的注册&#xff0c;现在再来分析一下 SpringMVC 是如何根据 request 来获取对应的 handler method 的? 可能有人会说&#xff0c;既然已经将 request 与 handler method 映射关系注册保存在了 AbstractHandlerMethodMapping.Ma…

Python 二进制 八进制 十进制 十六进制之间的转换

众所周知&#xff1a;计算机底层是以二进制数来进行存储计算&#xff0c;而计算机进制&#xff1a;数制是用一组固定的符号和统一的规则来表示数值的方法。 开始下面讲述之前首先要声明&#xff1a; 二进制&#xff0c;八进制&#xff0c;十六进制 都可以转换为十进制&#xf…

【DRF配置管理】如何在视图类使用get_objects()

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django使用DRF框架 【DRF配置管理】如何在视图类配置参数(一) 【DRF配置管理】如何在视图类配置参数(二) 【DRF配置管理…

第二届广州·琶洲算法大赛启动,百度飞桨助力广州打造中国算法新高地

‍‍ 生成式人工智能热潮席卷全球&#xff0c;算法创新成为 AI 突破发展的关键&#xff0c;推动实体经济高质量增长。4月25日&#xff0c;第二届广州琶洲算法大赛正式启动&#xff0c;广州市政府主办、百度飞桨等联合承办&#xff0c;广召天下算法英雄&#xff0c;加快“琶洲算…