FPGA----基于ZYNQ 7020实现EPICS通信系统

1、本实验过程来自博b站大神《神电测控》,原文地址:

EPICS实战(上位机篇):基于LV ZYNQ实现的EPICS通信系统(大物理) - 哔哩哔哩https://www.bilibili.com/opus/933476043369480224EPICS实战(下位机篇):基于LV ZYNQ实现的EPICS通信系统(重点) - 哔哩哔哩https://www.bilibili.com/opus/933487674120994835/?from=readlist2、CA下载地址,选择32位的,安装过程见b站大神的上位机篇。

Downloads - Helmholtz-Zentrum Berlin (HZB)Downloads of CA Labhttps://www.helmholtz-berlin.de/zentrum/organisation/it/calab/downloads_en.html3、SD卡分区。这个是Alinx产品自带的,自带debian8操作系统,有需要的联系我即可。

4、测试安装

a、使用笔记本给7020联网(全网唯一)

(1)在笔记本上将无线和网口建立网桥;

(2)将网线把笔记本和另一台电脑连起来;

(3)拔掉网线,将网线插入7020,7020即可联网。

(4)如果还是无法联网,那么就输入:

# 查询网络接口
ls /sys/class/net

# 保证172.24.14.68与上位机是同一网段,上位机ping即可
ifconfig eth0 172.24.14.68 netmask 255.255.255.0 up

 注意:直接给7020插入网线,7020可能会因为ip配置错误,导致无法联网。

b、安装EPICS

下载epics 3.16.2,也可以去官网直接下载,然后通过winscp传上去

#下载epics
cd /.

mkdir epics

cd /epics/

wget https://epics.anl.gov/download/base/base-3.16.2.tar.gz
#解压并重命名为 base

tar vxfz base-3.16.2.tar.gz

mv base-3.16.2 base
#配置系统环境变量,vi模式下新建一个.bash_profil
cd ~

vi .bash_profile

输入内容:export EPICS_HOST_ARCH=$(/epics/base/startup/EpicsHostArch)

按下esc键盘,然后:wq!退出

#激活设置,执行source指令激活刚刚写入的环境变量配置

source .bash_profile
#查看设置,出现linux-arm则配置成功

echo $EPICS_HOST_ARCH

#返回:linux-arm
#进入base目录下进行编译(大约20min)

cd /epics/base

make

出现下图则为编译成功

向bash_profile添加linux-arm的路径

cd ~

vi .bash_profile

输入内容:export PATH=$PATH:/epics/base/bin/linux-arm

按下esc键盘,然后:wq!退出

#然后激活一下:

source .bash_profile
cd /epics/base/bin/linux-arm 

softIoc

#返回:epics>

出现下图说明安装成功

c、利用caget或者caput或者camonitor测试EPICS base环境是否正常

5、建立一个epics例子程序

# 导入环境
cd ~
source .bash_profile

# 建立测试工程,在/epics/APP 目录下
cd ~
cd /epics
mkdir APP
cd APP
# 创建工程
mkdir myApp1
cd myApp1
makeBaseApp.pl -t example myApp
makeBaseApp.pl -i -t example myApp

# 编译工程
make

 不出意外的话,成功如下图所示

然后启动epics例子程序

# 进入iocmyApp文件夹
cd iocBoot/iocmyApp
ls
# 启动st.cmd
../../bin/linux-arm/my st.cmd

不出意外。成功的话是这样的

 输入  dbl 可以看到所有的管道

经过上述的操作,相信大家已经对epics有了一个大致的了解,下面我们将编写aiRecord的驱动程序,包括dbd文件和C语言源代码,然后编译并启动IOC,最后通过通道访问查看运行结果,实现每秒生成0-999随机数的功能,此教程来自博客:

EPICS aiRecord记录的驱动程序开发实例_epics ioc 驱动开发-CSDN博客文章浏览阅读1k次。本文详细介绍了如何在EPICS(ExperimentalPhysicsandIndustrialControlSystem)环境中创建一个IOC(Input/OutputController),编写aiRecord的驱动程序,包括dbd文件和C语言源代码,然后编译并启动IOC,最后通过通道访问查看运行结果,实现每秒生成0-999随机数的功能。 https://blog.csdn.net/yuyuyuliang00/article/details/1182283446、aiRecord的程序编写(需要3.15版本以上的epics)

cd ~

source .bash_profile

cd /epics/APP

创建aiDriver文件夹

mkdir aiDriver
cd aiDriver

创建名为aiDriver的例子程序

makeBaseApp.pl -t ioc aiDriver
makeBaseApp.pl -i -t ioc aiDriver

# 名字写 aiDriver

查看生成例子程序内容

root@zynq:/epics/APP/aiDriver# ls -R
.:
aiDriverApp  configure  iocBoot  Makefile
 
./aiDriverApp:
Db  Makefile  src
 
./aiDriverApp/Db:
Makefile
 
./aiDriverApp/src:
aiDriverMain.cpp  Makefile
 
./configure:
CONFIG  CONFIG_SITE  Makefile  RELEASE  RULES  RULES_DIRS  RULES.ioc  RULES_TOP
 
./iocBoot:
iocaiDriver  Makefile
 
./iocBoot/iocaiDriver:
Makefile  st.cmd

编写驱动程序devAiDriver.c,在aiDriverApp/src目录下 。注意,如果按照博主的代码,在本环境下无法编译。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
 
#include "alarm.h"
#include "dbDefs.h"
#include "dbAccess.h"
#include "epicsMath.h"
#include "recGbl.h"
#include "devSup.h"
#include "aiRecord.h"
#include "epicsExport.h"
#include "dbLink.h"

 
/* Create the dset for devAiRandom */
static long init_record(void *precord);
static long get_ioint_info(int cmd, dbCommon *prec, IOSCANPVT *ppvt);
static long read_ai(aiRecord *prec);
 
struct {
    long        number;
    DEVSUPFUN   report;
    DEVSUPFUN   init;
    DEVSUPFUN   init_record;
    DEVSUPFUN   get_ioint_info;
    DEVSUPFUN   read_ai;
} devAiDriver= {
    6,
    NULL,
    NULL,
    init_record,
    get_ioint_info,
    read_ai
};

// 导出这个驱动程序,名称为devAiDriver
epicsExportAddress(dset, devAiDriver);
 
static long init_record(void *precord)
{
    aiRecord *prec = precord;
 
    srand((unsigned)time(NULL));
    prec->udf = FALSE;

        printf("init_record_ai called for %p\n", precord);

    return 0;
}
 
static long readLocked(struct link *pinp, void *userPvt)
{
    aiRecord *prec = (aiRecord *)userPvt;

       if (!prec) {
        return S_db_badField; // 或其他适当的错误码
    }
 
    // 产生一个0-999之间的随机数
    prec->rval = rand() % 1000;
 
    if (dbLinkIsConstant(&prec->tsel) &&
        prec->tse == epicsTimeEventDeviceTime)
        dbGetTimeStamp(pinp, &prec->time);
 
    return 0;
}

static long get_ioint_info(int cmd, dbCommon *prec, IOSCANPVT *ppvt) {

        printf("get_ioint_info called cmd=%d, prec=%p\n", cmd, prec);

    return 0;
}
 
static long read_ai(aiRecord *prec)
{
    long status = dbLinkDoLocked(&prec->inp, readLocked, prec);
 
    if (status == S_db_noLSET)
        status = readLocked(&prec->inp, prec);
       
    printf("read_ai called, prec=%p\n", prec);

    return status;
}

同级目录下创建devAiDriver.dbd文件:(如果你看过第5步骤生成的myApp例子文件可以知道,每个c文件都会有一个dbd文件与之对应,并且都在src文件夹下)

# 与devAiDriver.c中的DSET的devAiDriver对应
# 起一个叫 Random Ai 的名字
device(ai,INST_IO,devAiDriver, "Random Ai")

 修改同一级目录下的Makefile文件,添加以下两行:(注意,一定要在对应位置添加)

aiDriver_DBD += devAiDriver.dbd
aiDriver_SRCS += devAiDriver.c

进入目录aiDriver/aiDriverApp/Db中创建aiTest.db文件

record(ai, "$(TEST):AiRandom")# 起一个叫 $(TEST):AiRandom 的PV
{
        field(DESC, "Test Ai Driver")
        field(SCAN, "1 second")    # 1 秒扫描一次
        field(DTYP, "Random Ai") # 指定设备驱动,与前文起的名字一致
        field(ASLO, "1.0")
        field(LINR, "NO CONVERSION")
}

相同路径下的Makefile中添加以下一行:

DB += aiTest.db

 切换目录并且编译

cd ~

cd /epics/APP/aiDriver

# 将所有文件时间设置为当前时间
find . -type f -exec touch {} +

make clean

make

出现下图则是编译成功了

进入启动目录aiDriver/iocBoot/iocaiDriver,修改启动脚本st.cmd

#!../../bin/linux-arm/aiDriver
 
#- You may have to change aiDriver to something else
#- everywhere it appears in this file
 
< envPaths
 
cd "${TOP}"
 
## Register all support components
dbLoadDatabase "dbd/aiDriver.dbd"
aiDriver_registerRecordDeviceDriver pdbbase
 
## 装载记录实例
dbLoadRecords("db/aiTest.db","TEST=Random")
 
cd "${TOP}/iocBoot/${IOC}"
iocInit

启动程序

cd /epics/APP/aiDriver/iocBoot/iocaiDriver
# debug模式下进行
gdb --args ../../bin/linux-arm/aiDriver st.cmd
# 输入run即可执行,如果代码有错,会自动停止

正常情况下,再启动一个putty,即可看到这些输出 

#命令,Random:AiRandom这个名字是在db中生成的
camonitor Random:AiRandom

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发光的沙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值