描述

这是一个非常简单的设备支持示例。这个EPICS设备支持提供了实时时钟的"秒"部分(00-59)。EPICS记录数据库提供了两个记录,"秒"值的十分之一和"秒"值的10倍。

构建

makeBaseApp.pl是一个创建应用程序区域的perl脚本。它了创建以下部分:

  • Makefile
  • configure:这个目录包含EPICS构建系统所需的文件
  • Clock1App:一个用于一个主要子模块的目录和相关文件的集合。
  • iocBoot:一个子目录和相关联的文件。
  • iocBoot/iocClock1:用于单一ioc的子目录和文件。

1) 调用以下命令来准备目录结构和环境:

[root@centos7 EPICS]# mkdir Clock1                     # 新建一个目录,用于放置项目
[root@centos7 EPICS]# cd Clock1/
[root@centos7 Clock1]# makeBaseApp.pl  -t ioc Clock1
[root@centos7 Clock1]# makeBaseApp.pl  -i -t ioc Clock1
Using target architecture linux-x86_64 (only one available)
The following applications are available:Clock1
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[root@centos7 Clock1]# ls
Clock1App  configure  iocBoot  Makefile

2)在Clock1/Clock1App/src目录下编写设备源文件

  • devAiSecond.h
/** devAiSecond.h* */#include <time.h>
  • devAiSecond.c
/** devAiSecond.c** */
static char  what[] = "@(#) devAiSecond v0.1 support for Second";#undef DEBUG_ON#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include "alarm.h"
#include "cvtTable.h"
#include "dbDefs.h"
#include "dbAccess.h"
#include "recGbl.h"
#include "recSup.h"
#include "devSup.h"
#include "aiRecord.h"
#include "link.h"
#include "epicsExport.h"
#include "devAiSecond.h"/* create dset for devAiSecond */
static long init_record();
static long init_ai();
static long read_ai();struct {long number;DEVSUPFUN report;DEVSUPFUN init;DEVSUPFUN init_record;DEVSUPFUN get_ioint_info;DEVSUPFUN read_ai;DEVSUPFUN special_linconv;
} devAiSecond = {6,NULL,init_ai,init_record,NULL,read_ai,NULL
};
epicsExportAddress(dset, devAiSecond);/* Ai Record */
/* init_ai for debug */
static long init_ai(int after)
{
#ifdef DEBUG_ONprint("devAiSecond(init) called, pass=%d\n",after);
#endifreturn 0;
}static long init_record(struct aiRecord * pai)
{
#ifdef DEBUG_ONprintf("devAiSecond (init_record) called\n");
#endifpai->udf = FALSE;return 0;
}static long read_ai(struct aiRecord * pai)
{time_t t;struct tm * tm;#ifdef DEBUG_ONprintf("devAiRecord (read_ai) accessed\n");
#endiftime(&t);tm = localtime(&t);pai->udf = FALSE;pai->rval = tm->tm_sec;
#ifdef DEBUG_ONprintf("devAiSecond (read_ai) data %d\n", pai->rval);
#endifreturn 0;
}
  • Makefile
TOP=../..include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================
# Build an IOC support library
LIBRARY_IOC += aiSecond
DBD += aiSecond.dbd
aiSecond_SRCS += devAiSecond.c
aiSecond_LIBS += ${EPICS_BASE_IOC_LIBS}#=============================
# Build the IOC applicationPROD_IOC = Clock1
# Clock1.dbd will be created and installed
DBD += Clock1.dbd# Clock1.dbd will be made up from these files:
Clock1_DBD += base.dbd# Include dbd files from all support applications:
Clock1_DBD += aiSecond.dbd# Add all the support libraries needed by this IOC
Clock1_LIBS += aiSecond# Clock1_registerRecordDeviceDriver.cpp derives from Clock1.dbd
Clock1_SRCS += Clock1_registerRecordDeviceDriver.cpp# Build the main IOC entry point on workstation OSs.
Clock1_SRCS_DEFAULT += Clock1Main.cpp
Clock1_SRCS_vxWorks += -nil-# Add support from base/src/vxWorks if needed
#Clock1_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary# Finally link to the EPICS Base libraries
Clock1_LIBS += $(EPICS_BASE_IOC_LIBS)#===========================include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE
  • aiSecond.dbd
# include "base.dbd"
# local menu, record, device, driver, breakpoint definitions
device(ai,CONSTANT,devAiSecond,"Second")

3)在Clock1/Clock1App/Db目录下编辑记录文件和Makefile文件:

  • aiSecond.db:
record(ai, "TEST_AI:CLOCK1:SEC1")
{field(DESC, "Second devided by 10")field(DTYP, "Second")field(INP, "this is not use, but must not be NULL")field(SCAN, "1 second")field(EGUF, "1")field(EGUL, "0")field(EGU, "Second/10")field(LINR, "LINEAR")field(ASLO, "0.1")field(AOFF, "0")field(MDEL, "0.01")field(HOPR, "6")field(LOPR, "0")field(HIHI, "5.5")field(HIGH, "4.5")field(LOW, "1.5")field(LOLO, ".5")field(HHSV, "MAJOR")field(HSV, "MINOR")field(LSV, "MINOR")field(LLSV, "MAJOR")
}
record(ai, "TEST_AI:CLOCK1:SEC10")
{field(DESC, "Second multiplied by 10")field(DTYP, "Second")field(INP, "this is not used")field(SCAN, "5 second")field(EGUF, "1")field(EGUL, "0")field(EGU, "Second*10")field(LINR, "LINEAR")field(ASLO, "10")field(AOFF, "0")field(MDEL, "1")field(HOPR, "600")field(LOPR, "0")field(HIHI, "550")field(HIGH, "450")field(LOW, "150")field(LOLO, "50")field(HHSV, "MAJOR")field(HSV, "MINOR")field(LSV, "MINOR")field(LLSV, "MAJOR")
}
  • Makefile:
TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE#----------------------------------------------------
# Create and install (or just install) into <top>/db
# databases, templates, substitutions like this
DB += aiSecond.db#----------------------------------------------------
# If <anyname>.db template is not named <anyname>*.template add
# <anyname>_template = <templatename>include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE

4) 退到Clock1目录,执行make,进行编译:

[root@centos7 Clock1]# make
make -C ./configure install
make[1]: Entering directory `/usr/local/EPICS/Clock1/configure'
...
make[1]: Leaving directory `/usr/local/EPICS/Clock1/iocBoot'
[root@centos7 Clock1]#

5) 进入Clock1/iocBoot/iocClock1路径下,编辑st.cmd文件

[root@centos7 Clock1]# cd iocBoot/iocClock1/
[root@centos7 iocClock1]# ls
envPaths  Makefile  st.cmd
[root@centos7 iocClock1]# cat st.cmd
#!../../bin/linux-x86_64/Clock1#- You may have to change Clock1 to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/Clock1.dbd"
Clock1_registerRecordDeviceDriver pdbbase## Load record instances
dbLoadRecords("db/aiSecond.db","user=epics")  # 添加需要加载记录的路径cd "${TOP}/iocBoot/${IOC}"
iocInit## Start any sequence programs
#seq sncxxx,"user=epics"
[root@centos7 iocClock1]#

6) 在/etc/profile.d/epics.sh末尾添加以下两行

export EPICS_CA_ADDR_LIST=192.168.50.49  # 本机IP地址
export EPICS_CA_AUTO_ADDR_LIST=NO

7)使/etc/profile.d/epics.sh中定义的环境变量生效,并启动这个创建的软IOC程序:

[root@centos7 iocClock1]# source /etc/profile.d/epics.sh
[root@centos7 iocClock1]# ls
envPaths  Makefile  st.cmd
[root@centos7 iocClock1]# ../../bin/linux-x86_64/Clock1 st.cmd  # 启动IOC
#!../../bin/linux-x86_64/Clock1
< envPaths
epicsEnvSet("IOC","iocClock1")
epicsEnvSet("TOP","/usr/local/EPICS/Clock1")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/usr/local/EPICS/Clock1"
## Register all support components
dbLoadDatabase "dbd/Clock1.dbd"
Clock1_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadRecords("db/aiSecond.db","user=epics")
cd "/usr/local/EPICS/Clock1/iocBoot/iocClock1"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.3.1
## EPICS Base built Mar 16 2022
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=epics"
epics> dbl                      # 查看当前的EPICS数据库中正在运行的记录
TEST_AI:CLOCK1:SEC1
TEST_AI:CLOCK1:SEC10
epics>

8) 用camonitor监视其中一个记录TEST_AI:CLOCK1:SEC1:

[epics@centos7 ~]$ camonitor TEST_AI:CLOCK1:SEC1   # 每秒钟值VAL值增量为0.1,且在0-6之间循环
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:47.460203 4.7 HIGH MINOR
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:48.458183 4.8 HIGH MINOR
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:49.459828 4.9 HIGH MINOR
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:50.460593 5 HIGH MINOR
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:51.459630 5.1 HIGH MINOR
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:52.460288 5.2 HIGH MINOR
TEST_AI:CLOCK1:SEC1            2022-03-23 23:35:53.459531 5.3 HIGH MINOR
^C
[epics@centos7 ~]$

更多描述:

devAiSecond.c提供一个使用ai记录支持的设备支持。它读取系统时钟并且提取"秒"部分。由于它只用一个短事件获取此信息,这个设备支持相当简单。如果它用很长时间处理输入/输出,为了不阻止你的ioc程序的其它部分的实时运行,这个运行的之后部分不应该被延迟。这样一个设备支持被称为异步设备支持。运行的此部分会在另一个线程或进程中被通知,并且那被称为驱动支持。你可以编写你自己的异步设备支持和相应的驱动支持,或者你可以使用AsynDriver。

aiSecond.db数据库定义了两个过程变量。其中一个每秒种被运行(SCAN:1 second)并且通过devAiSecond设备支持读取实时时钟。它指定一个线性转换(LINR:LINEAR ASLO:0.1等)获取"秒"值的十分之一。它也指定若干警报条件(HIHI:5.5 HHSV: MAJOR等),如果这个值大于或等于5.5,将产生一个MAJOR警报。

aiSecond.dbd绑定这个记录支持"ai"和设备支持名称"Second"(在数据库aiSecond.db中使用),和dset结构体"devAiSecond"(在设备支持devAiSeond.c中使用)。

EPICS设备支持的简单示例相关推荐

  1. VS2010对C++11的语法支持简单示例

    简单的来说,就是大部分不支持,小部分支持,具体的参考官网链接: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visu ...

  2. Web API 简单示例

    一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting ...

  3. 配置Dot1q终结子接口实现同设备VLAN间通信示例

    示例图 一.实验目的 1.配置Dot1q终结子接口实现同设备VLAN间通信示例 二.注意事项 1.Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文,收到不带VLAN Tag ...

  4. 使用NATS及其nats.c客户端简单示例用法(nats.c的API接口)

    NATS 前言 什么是NATS NATS 客户端应用程序 NATS 服务基础架构 将NATS客户端应用程序连接到NATS服务器 简单的消息传递设计 NATS客户端 安装 开始 基本用法 JetStre ...

  5. Java TCP 抓包简单示例

    Java TCP 抓包简单示例 由于目前网上没有一篇能真正方便读者操作的此类文章,本文对此通过示例做个简单介绍. 缘起 有一天本来在看头条,然后看到一则游戏的广告,看画面可能是我喜欢的建造类型(纪元1 ...

  6. Xcode8支持iOS11或者是Xcode9支持iOS11.1的设备支持文件(免费)

    更新一下Xcode9支持iOS12 的设备支持文件 GitHub下载地址: https://github.com/iGhibli/iOS-DeviceSupport 先把设备支持文件的下载地址贴出来: ...

  7. appcompat v21: 让 Android 5.0 前的设备支持 Material Design

    1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...

  8. xcode江湖录-第04章 风水宝地--界面生成器之StoryBoard简单示例 与 约束

    第04章风水宝地--界面生成器之StoryBoard简单示例 ??如何设置转场动画?? ??如何在参与到转场动作中?? ??如何让页面跳转到自定义VC?? ??如何设置自定义跳转模式?? ??如何用S ...

  9. python简单单元测试示范卷_Python 单元测试的简单示例

    这篇文章主要为大家详细介绍了Python 单元测试的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 以前我是不 ...

最新文章

  1. 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
  2. gitlab开启https加密 and 全站https
  3. 转载:WPF binding
  4. foreach循环怎么获取全部返回值_PHP跳出循环的方法语句有哪些
  5. git升级后jenkins的报错
  6. AIM Tech Round 5 (rated, Div. 1 + Div. 2)
  7. 四款主流同步软件介绍
  8. Java使用ttf字体下载网站
  9. Pr2023(Premiere Pro)中文版软件下载「附带安装教程」
  10. 如何简单地设置一个LoRa网关?
  11. QT 5.9.5的快捷键操作
  12. 浏览器下载ftp文件
  13. 高校企业双向赋能,首届飞桨启航菁英计划圆满结束
  14. 检测网络不通时自动重启计算机,电脑连不上网怎么办?6个最简单最实用的解决办法,帮你轻松搞定!...
  15. 在练琴时关于音乐与计算机结合的碎思考
  16. Masm for MAC安装教程+实例分析
  17. 创邻科技Galaxybase荣获2021年度IT168技术卓越奖
  18. 与Anthony Baldino一起塑造声音
  19. JQuery中常用的 属性选择器
  20. 微信小程序-导航吸顶+view锚点

热门文章

  1. vim 配置文件 ,高亮+自动缩进+行号+折叠+优化
  2. 跟李沐学AI:实用机器学习 | 第九章
  3. PPT“备注”内容字体可以修改颜色也能直接看到修改效果
  4. 华为鸿蒙系统老手机能用吗_华为使用自家“鸿蒙”系统,旧手机的安卓系统可以更新成那个系统吗?...
  5. cnblogs is not free for us to motify
  6. python全案例学习_Python全案例学习与实践
  7. 【Labview】基于Labview的BMI计算器
  8. 【VCS】Git之无尽探索
  9. 工作小妙招之将Excel中不同sheet中的数据按照相同属性进行合并
  10. 一枚中级网络工程师的工作日常,能引起多少同行的共鸣啊。