EPICS boRecord驱动程序编写和使用示例

news2024/12/26 3:30:50

以下示例程序将展示如何使用gpio的动态链接库编写一个boRecord的驱动程序,并且展示如何使用这个程序,控制一个LED灯的亮灭。

1) 新建这个示例程序的顶层目录,并且用makeBaseApp.pl在新建目录中构建这个IOC程序程序框架:

root@orangepizero2:/usr/local/EPICS/program#  mkdir boDriver
root@orangepizero2:/usr/local/EPICS/program# cd boDriver/
root@orangepizero2:/usr/local/EPICS/program/boDriver# makeBaseApp.pl -t ioc boDriver
root@orangepizero2:/usr/local/EPICS/program/boDriver# makeBaseApp.pl -i -t ioc boDriver
Using target architecture linux-aarch64 (only one available)
The following applications are available:
    boDriver
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
root@orangepizero2:/usr/local/EPICS/program/boDriver# ls
boDriverApp  configure  iocBoot  Makefile

2) 进入boDriver/boDriverApp/src路径,编写驱动程序和对应的支持文件:

源程序devbo_driver.c:

root@orangepizero2:/usr/local/EPICS/program/boDriver/boDriverApp/src# cat devbo_driver.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <wiringPi.h> // GPIO的头文件

#include "alarm.h"
#include "dbDefs.h"
#include "dbAccess.h"
#include "recGbl.h"
#include "recSup.h"
#include "devSup.h"
#include "boRecord.h"
#include "epicsExport.h"


/* 使用的GPIO管脚 */
#define LED     6

static long init_record(dbCommon *pcommon);
static long write_bo(boRecord *prec);

bodset devBoGPIO = {
    {5, NULL, NULL, init_record, NULL},
    write_bo
};

static long init_record(dbCommon *pcommon)
{
    long status;
    // 初始化GPIO
    wiringPiSetup();
    // 设置LED管脚为输出模式
    pinMode(LED, OUTPUT)    ;


    /*Don't convert*/
    status = 2;
    return status;

} /* end init_record() */

static long write_bo(boRecord *prec)
{
    long status;

    // 将输出值写到LED对应的管脚
    digitalWrite(LED,prec->val);


    return(status);
}

epicsExportAddress(dset,devBoGPIO);

支持文件devbo_driver.dbd:

root@orangepizero2:/usr/local/EPICS/program/boDriver/boDriverApp/src# cat devbo_driver.dbd
device(bo,INST_IO,devBoGPIO, "bo gpio")

编写Makefile文件,添加以下两处内容:

# 添加
boDriver_SRCS += devbo_driver.c
boDriver_DBD += devbo_driver.dbd

# 添加这个IOC所需的支持库
boDriver_LIBS += wiringPi
wiringPi_DIR = /usr/lib

3) 编写数据库实例文件,进入boDriver/boDriverApp/Db目录

编一个名为bo_gpio的数据库实例文件:

record(bo, "$(USER):BO")
{
        field(ONAM, "LIGHT ON")
        field(ZNAM, "LIGHT OFF")
        field(DTYP, "bo gpio")
}

并且把以上文件名添加到同一路径下的Makefile中:

DB += bo_gpio.db

4) 回到顶层目录boDriver执行make命令进行编译:

root@orangepizero2:/usr/local/EPICS/program/boDriver# make
make -C ./configure install
make[1]: Entering directory '/usr/local/EPICS/program/boDriver/configure'
...
make[2]: Nothing to be done for 'install'.
make[2]: Leaving directory '/usr/local/EPICS/program/boDriver/iocBoot/iocboDriver'
make[1]: Leaving directory '/usr/local/EPICS/program/boDriver/iocBoot'

5) 进入启动目录boDriver/iocBoot/iocboDriver中,修改启动文件st.cmd:

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

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

< envPaths

cd "${TOP}"

## Register all support components
dbLoadDatabase "dbd/boDriver.dbd"
boDriver_registerRecordDeviceDriver pdbbase

## Load record instances
dbLoadRecords("db/bo_gpio.db","USER=GPIO")

cd "${TOP}/iocBoot/${IOC}"
iocInit

 6) 用以下命令启动这个IOC程序:

root@orangepizero2:/usr/local/EPICS/program/boDriver/iocBoot/iocboDriver# ../../bin/linux-aarch64/boDriver st.cmd
#!../../bin/linux-aarch64/boDriver
< envPaths
epicsEnvSet("IOC","iocboDriver")
epicsEnvSet("TOP","/usr/local/EPICS/program/boDriver")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/usr/local/EPICS/program/boDriver"
## Register all support components
dbLoadDatabase "dbd/boDriver.dbd"
boDriver_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadRecords("db/bo_gpio.db","USER=GPIO")
cd "/usr/local/EPICS/program/boDriver/iocBoot/iocboDriver"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.7
## Rev. 2023-05-26T09:07+0000
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=orangepi"
epics> dbl
GPIO:BO

用dbl命令,查看当前IOC中只加载了一个记录GPIO:BO。

7) 用同一局域网中安装了通道访问工具的另一台计算机对这个IOC进行访问:

用cainfo查看GPIO:BO的信息:

[root@main-machine blctrl]# cainfo GPIO:BO
GPIO:BO
    State:            connected
    Host:             orangepizero2:5064
    Access:           read, write
    Native data type: DBF_ENUM
    Request type:     DBR_ENUM
    Element count:    1

在指定的GPIO管脚上点亮LED:

[root@main-machine blctrl]# caput GPIO:BO 1
Old : GPIO:BO                        LIGHT OFF
New : GPIO:BO                        LIGHT ON

熄灭指定的GPIO管脚上LED:

[root@main-machine blctrl]# caput GPIO:BO 0
Old : GPIO:BO                        LIGHT ON
New : GPIO:BO                        LIGHT OFF

结论:通过在驱动程序源程序中添加GPIO的头文件并且使用GPIO的库函数,并且在Makefile中指定要链接的GPIO库文件名称和对应的路径。在EPICS IOC中能够使用GPIO管脚进行数字量的输入和输出。

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

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

相关文章

前端项目安全扫描出来的漏洞——解决过程

为什么要升级&#xff0c;如图云桌面&#xff08;相当于堡垒机-远程桌面&#xff09;的项目审查是大概基于node16版本进行扫描的&#xff0c;本来我方是通过降版本从14到12绕过大范围更新&#xff0c;但现在躲得过初一躲不过十五&#xff0c;如何更新 package-lock.json 中的一…

HummerRisk获中国开源创新大赛优秀奖

日前&#xff0c;2022中国开源创新大赛落下帷幕&#xff0c;最终HummerRisk 荣获优秀奖。 5月31日&#xff0c;2022中国互联网发展创新与投资大赛暨2022年中国开源创新大赛在京落下帷幕。大赛由中央网信办信息化发展局指导&#xff0c;中国互联网发展基金会、中国网络空间研究院…

聚观早报 |特斯拉11天涨2000亿美元;三星正开发自有大型语言模型

今日要闻&#xff1a;特斯拉11天涨2000亿美元&#xff1b;三星正开发自有大型语言模型&#xff1b;苹果史上最贵新品遇冷&#xff1b;抖音外卖终止1000亿元GMV目标&#xff1b;12306试行在线选铺服务 特斯拉11天涨2000亿美元 特斯拉在 11 天的时间里市值增加了超过 2000 亿美元…

windows 服务程序和桌面程序集成(三)UDP监控工具

系列文章目录链接&#xff1a; windows 服务程序和桌面程序集成&#xff08;一&#xff09;概念介绍windows 服务程序和桌面程序集成&#xff08;二&#xff09;服务程序windows 服务程序和桌面程序集成&#xff08;三&#xff09;UDP监控工具windows 服务程序和桌面程序集成&…

基本线性分组码与性能参数及差错控制

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 基本线性分组码与性…

DAY 73 rsync远程同步

rsync介绍 rsync简介 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09;是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限&#xff0c;且采用优化的同步算法&#xff0c;传输前…

回调函数排序异常原因

回调函数排序异常原因 问题所在解决方案 参考我的这篇博文c回调函数排序:回调函数 我之前的代码是这样写的:&#xff08;存在问题&#xff09; 问题所在 将数组传递到其他函数中&#xff0c;再使用sizeof(数组名)&#xff0c;得到的不是数组的完成长度了(往往会短一些) 解决…

美团、抖音“卷”向本地生活B端

配图来自Canva可画 当美团与大众点评的合并案落下帷幕&#xff0c;美团在本地生活领域的江湖地位就算是基本奠定了。只不过&#xff0c;随着互联网技术的不断发展和创新&#xff0c;本地生活服务又被提供了更多的可能性和新机遇。因此&#xff0c;尽管美团严防死守&#xff0c…

花青素-肠道微生物群-健康轴

谷禾健康 花青素-肠道微生物群-健康轴 经常听到一些专家在介绍食品或保健品时说富含花青素&#xff0c;那么究竟什么是花青素&#xff1f;对我们的健康又有何益处&#xff1f; 花青素是在植物组织中发现的天然水溶性色素&#xff0c;水果、蔬菜、花卉中的呈色物质大部分与之有关…

vue项目中使用html2canvas解决截图不全的问题

话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <div><el-button click"downloadPicture">下载</el-button><div ref"imageDom"><el-table:data"tableData"style"width: 100%":row…

喜讯 | 华秋电子荣获证券时报年度高成长企业

6月9日&#xff0c;由证券时报社主办的第十一届中国创业投资论坛盛大开启&#xff0c;在论坛上&#xff0c;2023证券时报创投金鹰奖暨创业企业新苗奖评选隆重揭晓。 经过两个多月紧张的申报、投票、评选&#xff0c;近300家机构和企业的激烈比拼&#xff0c;最终一批独具韧劲、…

【React】React中编写CSS,Redux,RTX

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React中编写CSS内联样式普通csscss modulescss in js动态添加class ReduxJS纯函数如何创建redux…

中国联通泛终端技术生态创新成果发布,移远通信荣获业务与应用板块突出贡献奖

6月7日&#xff0c;以“轻联万物 共赴星海”为主题的2023中国联通泛终端技术生态创新成果发布会在北京举行。 会上&#xff0c;中国联通泛终端技术生态创新联合实验室对一年来作出突出贡献的单位进行了嘉奖。移远通信凭借其在物联网产品及应用解决方案等领域的深厚积累和突出贡…

KubeSphere 社区双周报 | OpenFunction 发布 v1.1.0 | 2023.5.26-6.8

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.05.26-2023.…

将本地项目推到gitee上

查看原来仓库地址 git remote -v删除原来仓库地址 git remote rm origin # git remote rm origin https://gitee.com/zhangxiaoQ/large-file-upload.git添加需要推送的仓库 git remote add origin https://gitee.com/stevencmu/large-file-upload.git

Unity Scene界面出好多黄线解决办法

点下 Button下的Visualize就消失

创建可引导的 macOS 安装器(可启动U盘)

Apple官网下载的macOS镜像&#xff0c;只是一个安装包&#xff0c;不带引导不能直接安装到空白mac机器的。 1、首先&#xff0c;你必须要有台能正常运行macOS的mac pc。 2、下载macOS Sierra 10.12 El Capitan 10.11 Yosemite 10.10 Mountain Lion 10.8 Lion 10.7 点按以…

智能工厂MES系统“超级大脑”,助力数字化工厂生产流程

随着现代工业的不断发展&#xff0c;数字化工厂已经成为了生产制造的新趋势。而在实现数字化转型过程中&#xff0c; MES系统则显得尤为重要。 那么&#xff0c;MES系统究竟能为数字化工厂带来什么神奇的魔力呢&#xff1f;下面就来一探究竟。 物料管理 MES系统可以提供物料的…

MySQL(七):一文带你学透 mysql运算符 (超详解)

运算符 前言一、算术运算符1、加法与减法运算符2、乘法与除法运算符3、求模&#xff08;求余&#xff09;运算符 二、比较运算符1、等号运算符2、安全等于运算符3、不等于运算符4、空运算符5、非空运算符6、最小值运算符7、最大值运算符8、BETWEEN AND运算符9、IN运算符10、NOT…

Prefix-Tuning论文解读

论文名称&#xff1a;Prefix-Tuning: Optimizing Continuous Prompts for Generation 论文地址&#xff1a;https://arxiv.org/pdf/2101.00190.pdf 论文代码&#xff1a;https://github.com/XiangLi1999/PrefixTuning 想搞prompt&#xff0c;看了好多篇&#xff0c;挑着记录…