【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理
于NI kb摘录
1.概述
对于NI RIO系列设备(CompactRIO、sbRIO、myRIO等)进行编程时,需要注意有三个不同的组件。
- 人机界面 (HMI) 。有时称为“主机”,为用户提供图形用户界面(GUI),用于监控系统状态和设置操作参数。使用 HMI 是可选的,因为 RIO 产品可以编程为无头运行,并且有些产品可以直接连接到嵌入式用户界面,但是当实施 HMI 时,它们可以采用 Windows 台式计算机、平板电脑或触摸面板的形式以计算机为例。
- 实时(RT)处理器:RT 处理器运行主要的实时程序,并且允许 RIO 可靠地执行具有特定时序要求的程序。
- 现场壳编程门阵列:FPGA是一种可重新编程的硅芯片,是嵌入式系统的核心。FPGA 将机箱 I/O 直接连接到 RT 处理器,无需通过总线,与其他控制器架构相比,系统响应的控制延迟非常低。由于 FPGA 通过 LabVIEW FPGA 模块在硬件而不是软件中运行其代码,因此其速度和可靠性通常用于使用高速缓冲 I/O、快速控制循环或自定义信号过滤的应用。
HMI、RT 和 FPGA 在 LabVIEW 项目中都有自己独特的编程位置,并且每个组件内部和组件之间的通信方法也不同。本白皮书阐述了这些方法及其差异。下图显示了这些组件如何交互(假定 PC 用作 HMI)。
2.调用IO
在深入研究不同的通信方法之前,了解数据如何从 RIO 目标上的物理输入和输出端口传输到嵌入式系统组件非常重要。使用CompactRIO时,可以通过三种方式访问I/O:
- 对于实时(NI-DAQmx)模式,数据通过处理器通过 NI-DAQmx VI 读取。
- 对于实时扫描(IO变量)模式,数据通过FPGA发送,但最终通过将IO节点拖放到实时VI来在处理器上访问。
- 对于LabVIEW FPGA模式,通过将IO节点拖放到FPGA VI中,可以直接从FPGA内部读取I/O。
编程模式由 LabVIEW 项目中模块旁边的文本指示。
下图显示了每种模式如何通过不重叠的唯一路径发送 I/O 数据。
请注意,并非所有 CompactRIO 都支持使用 NI-DAQmx 进行编程。请参阅文档了解哪些型号的 CompactRIO 支持使用 NI-DAQmx 进行编程。
3.标签、流、消息
对 RIO 目标进行编程时,了解三种通信范例非常重要:
标签类型有时称为当前值类型,用于传达最新值。标签的一个示例是操作员通过 HMI 给出的控制设定点。该标签不需要传达控制设定点的所有历史数据,而只需传达操作员输入的最新值。此外,由于不需要所有先前设定点的历史数据,因此不能保证标签传输。无保证传输的这一方面有时被称为“有损”通信。
相比之下,流类型使用缓冲来传输每个数据点,其中吞吐量比延迟更重要。流通信的一种用例是通过 FPGA 将所有温度数据传输到 RT 处理器以记录到文件中。在这种情况下,历史数据是必要的,因此每个数据点的传输都得到保证。有保证的传输的这个方面被称为“无损”通信。
当需要保证信息的传递并且具有低延迟时,使用最后一种通信类型,即消息。紧急停止命令是消息通信类型的一个示例。在下表中,通信选项将指定为标签、流或消息类型。在大多数情况下,由于该选项的保证传递方面,可以支持流类型的通信选项也将支持消息类型。下表总结了这些通信类型。
通讯类型 | 基本特征 | 可选功能 | 表现 |
标签 | 仅当前值,定期读取 | 动态查找、分组管理 | 低延迟、高通道数 |
流 | 缓冲、阻塞(超时) | 多层缓冲 | 高吞吐量 |
消息 | 缓冲、阻塞(超时) | 确认数据传输 | 低延迟 |
4.通信选型摘要
下表提供了 HMI、RT 处理器和 FPGA 之间不同通信选项的最高级别概述。适用时请参阅更详细的表格。单击各个链接可查找有关该通信选项的更多详细信息。
From\To | HMI | RT | FPGA |
HMI | Tag
Stream
Message
| 详情看RT/HMI通信 | T用于 FPGA 和 RT 处理器之间通信的相同通信方法也可用于 FPGA 和 HMI 之间的通信。然而,这种情况不太常见,因为一旦通过以太网与 HMI 进行通信,就无法保证确定性。 |
RT |
详情看RT/HMI通信 | 详情看RT进程间通信 | Tag
Stream
|
FPGA | 用于 FPGA 和 RT 处理器之间通信的相同通信方法也可用于 FPGA 和 HMI 之间的通信。然而,这种情况不太常见,因为一旦通过以太网与 HMI 进行通信,就无法保证确定性 | Tag
Stream
|
详情查看FPGA进程间通信 |
RT进程间通信
下表概述了 RT 程序上不同进程之间进行通信时可用的通信选项。该表分为在确定性循环(例如定时循环)与非确定性循环之间通信或在非确定性循环与另一个非确定性循环之间通信时可用的选项。最佳实践是,实时处理器上的每个内核仅运行一个确定性循环,以避免优先级冲突。
通讯类型 | 确定性循环到非确定性循环 | 非确定性循环到非确定性循环 |
标签 |
|
|
流、消息 |
|
|
RT/HMI 通讯
下表概述了实时程序与 Windows PC 上运行的 HMI 之间进行通信时可用的不同通信选项。该表还列出了通信选项是否支持一个或多个 RT 处理器或 HMI 之间的通信。值得注意的是,我们的 CompactRIO 目标运行 64 位 NI Linux Real-Time 操作系统,有一个嵌入式 UI 选项,允许显示 Real-Time VI 的前面板。在这种情况下,无需对 HMI 进行编程。
通讯类型 | 通讯选项 | RT 目标数量:HMI 数量 |
标签 | 网络发布的共享变量 | 1:1、1:N、N:1 |
TCP/IP | 1:1 | |
UDP协议 | 1:N 或 N:1 | |
网页服务 | 1:1、1:N | |
流、消息 | 网络流 | 1:1 |
TCP/IP(仅消息) | 1:1 |
FPGA 进程间通信
通讯类型 | 通讯选项 | 常用 |
标签 | 局部/全局变量 | 分享最新数据 |
记忆项目 | 分享最新数据 | |
注册项目 | 分享最新数据 | |
流、消息 | 握手 | 建立持续通信的参数 |
FIFO(触发器) | 传输缓冲数据 (FIFO < 100 字节) | |
FIFO(查找表) | 传输缓冲数据 (100 字节 ≤ FIFO ≤ 300 字节) | |
FIFO(块存储器) | 传输缓冲数据 (FIFO > 300 字节) *可用块存储器的上限由FPGA目标指定 |
下表概述了 FPGA 上不同进程之间进行通信时可用的通信选项。有多种方法可以在两个不同的 FPGA 之间进行通信,但这里不讨论这些选项。
5.RIO开发人员必备指南
此链接必看,文档范例皆有:RIO Developer Essentials Guide for Academia
6.FPGA、实时处理器和分布式系统之间的通信范例
Communicate Between FPGA, Real-Time Processor, and Distributed Systems - NI
其他
初学者可以先看一下NI对于每个工具包的说明文档,这个对于知识盲区打开有一定的帮助。
LabVIEW Real Time Module: 产品文档 - NI
LabVIEW FPGA Module:产品文档 - NI
LabVIEW Real-Time和LabVIEW FPGA项目范例
嵌入式系统通常需要具有可靠性和确定性的架构。因此,许多嵌入式应用需要专门处理系统状态监测、错误处理和看门狗定时器。针对CompactRIO和PXI RT DAQ的LabVIEW项目范例提供了推荐的软件架构,可用于各种嵌入式控制与监控系统,这是满足这些需求的最佳实践。这些项目范例还给出了数据通信、网络连接、控制例程、数据记录等的最佳实践。
为了在LabVIEW中查看这些模板,您必须安装LabVIEW Real-Time和/或LabVIEW FPGA模块。
CompactRIO项目范例
| CompactRIO的LabVIEW FPGA控制 此项目范例专为需要高性能控制和/或基于硬件的安全逻辑的应用程序而设计。控制通过FPGA架构实现,而并非在软件中运行控制算法,使控制循环速率能够达到10 kHz以上,且抖动极小。FPGA VI还包含安全逻辑,可在出现严重错误或者实时软件故障时立即将所有输出设置成安全状态,从而更大限度地确保系统的可靠性。 参阅相关文档 | 参阅NI社区的详细指南 |
| CompactRIO的LabVIEW Real-Time控制(RIO扫描接口) 此项目范例专为需要确定性控制性能的控制应用而设计,其单点I/O速率不超过100 Hz。此项目范例不使用FPGA硬件,而是使用确定性的实时处理器进行系统控制。此范例使用RIO扫描接口(RSI)在实时应用中获取I/O数据,如同变量一样。 |
| CompactRIO的LabVIEW FPGA波形采集与记录 此项目范例包含基于FPGA的可自定义高速模拟采集,并可在满足触发条件时,将采集到的数据记录至实时系统的磁盘。此项目范例可以自主运行,或者连接到所提供的可选用户界面。 |
| CompactRIO的LabVIEW Real-Time序列生成器 此项目范例可实现序列引擎,可针对控制应用在LabVIEW Real-Time中执行用户自定义的序列或方法。它包括一个基于Windows的用户界面,该界面能够生成用户定义的序列,将此类序列部署到CompactRIO,以及监测序列引擎状态。用户界面动态加载子面板,展示了高效、响应流畅的用户界面架构。 查看视频教程 |
Real-Time项目范例(使用DAQmx)
LabVIEW Real-Time (NI-DAQmx)项目范例专为实时控制和/或波形采集与记录应用而设计。
| LabVIEW Real-Time控制(NI-DAQmx) 实现基于软件的确定性设备控制。此项目范例采用NI-DAQmx,并专为使用NI Real-Time PXI控制器和NI DAQ且需要确定性DAQ控制I/O的控制应用而设计。 参阅相关文档 |
| LabVIEW Real-Time波形采集与记录(NI-DAQmx) 采集连续波形数据并将数据记录至磁盘。此项目范例采用NI-DAQmx,包含模拟数据采集,并在可满足触发条件时,将采集到的数据记录至实时系统的磁盘。此项目范例可以自主运行,或者连接到所提供的可选用户界面。此范例专为使用NI Real-Time PXI控制器和NI DAQ或者NI独立式CompactDAQ的应用而设计。 参阅相关文档 |
相关文章:

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理
于NI kb摘录 1.概述 对于NI RIO系列设备(CompactRIO、sbRIO、myRIO等)进行编程时,需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”,为用户提供图形用户界面(GUI),用于监控系统…...

关于游戏性能优化的技巧
关于游戏性能优化的技巧 游戏性能优化对象池Jobs、Burst、多线程间隔处理定时更新全局广播缓存组件缓存常用数据2D残影优化2D骨骼转GPU动画定时器优化DrawCall合批处理优化碰撞层优化粒子特效 游戏性能优化 好久没有在CSDN上面写文章了,今天突然看到鬼谷工作室技术…...

antdesignpro实现滚动加载分页数据
原理解析:每滚动一次相当于翻页,请求后端时给的页码参数要想办法加1,后端才能根据页码给出相应数据 注意后端收到页码参数之后要准确计算出每页的首行数据,关键逻辑代码: # 根据前端传的页码,进行计算下一…...

步兵 cocos2dx 加密和混淆
文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理,可以确保应用代码的安全性,同时提高性…...

【算法设计与分析】——动态规划算法
🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:…...

WPF组合控件TreeView+DataGrid之DataGrid封装
(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…...

PIL/Pillow
Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能,包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年,因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…...
ARM 汇编入门
ARM 汇编入门 引言 ARM 汇编语言是 ARM 架构的汇编语言,用于直接控制 ARM 处理器。虽然现代软件开发更多地依赖于高级语言和编译器,但理解 ARM 汇编仍然对于深入了解系统、优化代码和进行低级调试非常重要。本文将为您提供一个简单的 ARM 汇编入门指南…...
SQL进阶:多表查询
在SQL基础部分,我们在讲解的过程中只用到了单表查询。但实际上,常见的业务场景单表查询不能满足,或者拆分查询性能过慢。这个时候我们就需要用到连接查询。即查询多表按一定规则合并后的数据。 注意,合并后的数据也是表ÿ…...

多层负载均衡实现
1、单节点负载均衡 1)站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理 2)nginx将http请求分发给后端多个web-server 优点: 1)DNS-server不需要动 2)负载均衡:通过ngi…...

Redis取最近10条记录
有时候我们有这样的需求,就是取最近10条数据展示,这些数据不需要存数据库,只用于暂时最近的10条,就没必要在用到Mysql类似的数据库,只需要用redis即可,这样既方便也快! 具体取最近10条的方法&a…...

Mybatis之增删改查
目录 一、引言 二、Mybatis——增 举例:添加用户 三、Mybatis——删 举例:删除用户 四、Mybatis——改 举例:修改用户 五、Mybatis——查 六、注意 END: 一、引言 书接上回,我们在了解完mybatis之后,肯…...

Go 代码检查工具 golangci-lint
一、介绍 golangci-lint 是一个代码检查工具的集合,聚集了多种 Go 代码检查工具,如 golint、go vet 等。 优点: 运行速度快可以集成到 vscode、goland 等开发工具中包含了非常多种代码检查器可以集成到 CI 中这是包含的代码检查器列表&…...

SwiftUI 趣谈之:绝不可能(Never)的 View!
概览 SwiftUI 的出现极大的解放了秃头码农们的生产力。SwiftUI 中众多原生和自定义视图对于我们创建精彩撩人的 App 功不可没! 不过,倘若小伙伴们略微留意过 SwiftUI 框架头文件里的源代码,就会发现里面嵌有一些奇怪 Never 类型,…...
etcd是什么
目录 1.关于etcd2.应用场景 本文主要介绍etcd 概念和基本应用场景。 1.关于etcd etcd是一个开源的、分布式的键值存储系统,用于共享配置和服务发现。它是由CoreOS团队开发的,主要用于实现分布式系统的配置管理和服务发现。 etcd的主要特性包括&#x…...

应用全局的UI状态存储AppStorage
目录 1、概述 2、StorageProp 2.1、观察变化和行为表现 3、StorageLink 3.1、观察变化和行为表现 4、从应用逻辑使用AppStorage和LocalStorage 5、从UI内部使用AppStorage和LocalStorage 6、不建议借助StorageLink的双向同步机制实现事件通知 6.1、推荐的事件通知方式…...

MySQL数据库 触发器
目录 触发器概述 语法 案例 触发器概述 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的soL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录&am…...
C语言学习之给定任意的字符串,清除字符串中的空格
实例要求:给定任意的字符串,清除字符串中的空格,并将其输出;实例分析:1、指针函数实现,需要注意指针函数的返回值是一个指针类型;2、字符类型的数组实现,循环遍历并赋给新的数组&…...
由实验数据进行函数拟合的python实现
0.引言 已知公式求参的过程,对工程而言,一般是一个线性拟合或者非线性拟合的过程。我们现在来以代码片段为例,来描述如何求参。一般这个过程会涉及超定方程的计算。这个过程,原本需要使用matlab,现在python照样可以做…...
<JavaEE> 基于 UDP 的 Socket 通信模型
目录 一、认识相关API 1)DatagramSocket 2)DatagramPacket 3)InetSocketAddress 二、UDP数据报套接字通信模型概述 三、回显客户端-服务器通信 1)服务器代码 2)客户端代码 一、认识相关API 1)Data…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...