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即可联网。

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

b、安装EPICS

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

#下载epics
cd /.mkdir epicscd /epics/wget https://epics.anl.gov/download/base/base-3.16.2.tar.gz
#解压并重命名为 basetar vxfz base-3.16.2.tar.gzmv 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/basemake

出现下图则为编译成功

向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_profilecd /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 cleanmake

出现下图则是编译成功了

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

#!../../bin/linux-arm/aiDriver#- You may have to change aiDriver to something else
#- everywhere it appears in this file< envPathscd "${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

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

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

相关文章

实验四 增强型可靠文件传输系统

一、实验目的和任务 掌握基于队列的多文件传输机制理解断点续传的实现原理学习文件传输完整性保障方法 二、实验内容 基础功能验证 单文件传输功能测试服务器状态监控测试传输日志记录验证 新增功能实现 多文件队列传输功能断点续传支持 三、实验步骤 4.1 客户端功能扩…

网络Tips20-003

1.E1载波的控制开销占2/32*100%6.25%&#xff0c;E1载波的基本帧传送时间是125uS。 2.计算机在一个指令周期的过程中&#xff0c;为从内存读取指令操作码&#xff0c;首先要将.程序计数器(PC)的内容送到地址总线上 3.3DES算法:密码学中&#xff0c;3DES是三重数据加密算法通称…

【MySQL】索引(重要)

目录 一、索引本质&#xff1a; 索引的核心作用 索引的优缺点 二、预备知识&#xff1a; 硬件理解&#xff1a; 软件理解&#xff1a; MySQL与磁盘交互基本单位&#xff1a; 三、索引的理解&#xff1a; 理解page&#xff1a; 单个page&#xff1a; 多个page&#x…

【深入浅出MySQL】之数据类型介绍

【深入浅出MySQL】之数据类型介绍 MySQL中常见的数据类型一览为什么需要如此多的数据类型数值类型BIT&#xff08;M&#xff09;类型INT类型TINYINT类型BIGINT类型浮点数类型float类型DECIMAL(M,D)类型区别总结 字符串类型CHAR类型VARCHAR(M)类型 日期和时间类型enum和set类型 …

数字化时代下,软件测试中的渗透测试是如何保障安全的?

在如今数字化与信息化的时代&#xff0c;软件测试中存在渗透测试&#xff0c;其位置十分重要&#xff0c;它借助模拟恶意攻击的方式&#xff0c;去发现软件系统所存在的漏洞以及安全问题&#xff0c;这是保障软件安全的关键环节&#xff0c;接下来我会对它的各个方面进行详细介…

Pytorch - Developer Notes 1/2

文章目录 自动混合精度示例典型的混合精度训练处理未缩放梯度梯度裁剪 处理缩放梯度梯度累积梯度惩罚 处理多个模型、损失函数和优化器多 GPU 工作环境下的注意事项单进程中的DataParallel分布式数据并行&#xff1a;每个进程对应一个GPU每个进程使用多块GPU的DistributedDataP…

RuntimeError: CUDA error: __global__ function call is not configured

表明在 CUDA 设备上调用的核函数 没有正确配置线程块和网格维度。 一般体现在&#xff1a; 直接调用 kernel 函数&#xff0c;而不是通过 launch 函数 指定 kernel 函数调用 解决方法&#xff08;示例&#xff09;&#xff1a; // kernel function __global__ void Idtest_k…

cloudfare+gmail 配置 smtp 邮箱

这里介绍有一个域名后&#xff0c;不需要服务器&#xff0c;就可以实现 cloudfare gmail 的 邮箱收发。 为什么还需要 gmail 的 smtp 功能&#xff0c;因为 cloudfare 默认只是对 email 进行转发&#xff0c;就是只能收邮件而不能发送邮件&#xff0c;故使用 gmail 的功能来进…

如何在 CentOS 7 命令行连接 Wi-Fi?如何在 Linux 命令行连接 Wi-Fi?

如何在 CentOS 7 命令行连接 Wi-Fi&#xff1f;如何在 Linux 命令行连接 Wi-Fi&#xff1f; 摘要 本教程覆盖如何在多种 Linux 发行版下通过命令行连接 Wi-Fi&#xff0c;包括&#xff1a; CentOS 7、Ubuntu、Debian、Arch Linux、Fedora、Alpine Linux、Kali Linux、OpenSU…

基于PHP的在线编程课程学习系统

有需要请加文章底部Q哦 可远程调试 基于PHP在线编程课程学习系统 一 介绍 在线编程课程学习系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery.js。系统角色分为学生&#xff0c;教师和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqljquery.jsphps…

PyTorch_张量形状操作

搭建模型时&#xff0c;数据都是基于张量形式的表示&#xff0c;网络层与层之间很多都是以不同的shape的方式进行表现和运算。 对张量形状的操作&#xff0c;以便能够更好处理网络各层之间的数据连接。 reshape 函数的用法 reshape 函数可以再保证张量数据不变的前提下改变数…

大模型实践:图文解锁Ollama在个人笔记本上部署llm

使用在线模型服务时&#xff0c;我们常常需要支付API调用费用&#xff0c;这对于个人开发者或小型组织来说可能是一笔不小的开支。那么&#xff0c;有没有方法可以在本地免费使用这些强大的模型呢&#xff1f;答案是肯定的——Ollama就是这样一个工具。 当然如果是比较大的组织…

Python基本语法(lambda表达式)

lambda表达式 lambda的一般形式是在关键字lambda后面跟一个或多个参数&#xff0c;之后再紧跟一个 冒号&#xff0c;接下来是一个表达式。lambda是一个表达式&#xff0c;而不是一个语句&#xff0c;它能够出现 在Python语法不允许def出现的地方。作为表达式&#xff0c;lambd…

【MySQL数据库】用户管理

目录 1&#xff0c;用户信息 2&#xff0c;创建/删除/修改用户 3&#xff0c;数据库的权限 MySQL数据库安装完之后&#xff0c;我们最开始时使用的都是 root 用户&#xff0c;其它用户通常无法进行操作。因此&#xff0c;MySQL数据库需要对用户进行管理。 1&#xff0c;用户…

Python的ArcPy基于Excel表格对大量遥感影像批量重分类

本文介绍基于Python中的ArcPy模块&#xff0c;以Excel表格内的信息&#xff0c;对遥感影像加以重分类的方法。 首先&#xff0c;明确一下本文的需求。现有按照文章ArcPy批量将栅格文件的属性表导出为Excel表格的方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/artic…

LabVIEW 中VI Server导出 VI 配置

该 LabVIEW VI 展示了在 VI Server 中配置和执行 Exported VIs 的过程&#xff0c;实现对服务器端导出 VI 的远程调用与操作。 ​ 具体过程及模块说明 前期配置&#xff1a;需确保在 LabVIEW 的 “Tools> Options > VI Server > Protocols” 路径下&#xff0c;启用 …

论文阅读:2024 ACM SIGSAC Membership inference attacks against in-context learning

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Membership inference attacks against in-context learning https://arxiv.org/pdf/2409.01380 https://www.doubao.com/chat/4030440311895554 速览 这篇论文主要研究了…

从 Python 基础到 Django 实战 —— 数据类型驱动的 Web 开发之旅

主题简介&#xff1a; 本主题以 Python 基础数据类型为核心&#xff0c;结合 Django 框架的开发流程&#xff0c;系统讲解如何通过掌握数字、字符串、列表、元组、字典等基础类型&#xff0c;快速构建功能完善的 Web 应用。通过理论与实践结合&#xff0c;帮助学员从零基础 Py…

软考 系统架构设计师系列知识点之杂项集萃(53)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;52&#xff09; 第85题 在静态测试中&#xff0c;主要是对程序代码进行静态分析。“数据初始化、赋值或引用过程中的异常”属于静态分析中的&#xff08;&#xff09;。 A. 控制流分析 B. 数据…

Raycaster光线投射

Raycaster光线投射 3D虚拟工厂在线体验 描述 光线投射Raycaster&#xff0c;用于进行raycasting&#xff08;光线投射&#xff09;。 光线投射用于进行鼠标拾取&#xff08;在三维空间中计算出鼠标移过了什么物体&#xff09;。 构造器 Raycaster( origin : Vector3, dire…