LabVIEW使用硬件抽象层适应不同的接口

news2025/1/31 22:53:49

LabVIEW使用硬件抽象层适应不同的接口

在实验室工作时,拥有不同品牌/型号的各种设备,有时(或多或少)具有相同的目的。为了缩短开发时间,想创建一个硬件抽象层,允许使用所有相同类型的仪器,并具有高级驱动程序(抽象)。我认为最好的“架构”是OOP,但我面临一个问题。

作为一个例子,让以父类(抽象层)PowerSupply.lvclass为例。子类为PS_ModelA.lvclass,PS_ModelB.lvclass等。

父类定义方法 Initialize.vi、SetVoltage.vi 和 Close.vi

现在,问题是:如果PS_ModelA使用USB接口(VISA/COM端口),而PS_ModelB使用GPIB/IVI,则选择与仪器通信的端口的控件不属于同一类型。

因此,我不能使用“端口”控件(VISA 或 IVI)作为父方法“初始化”的输入,因为一个或另一个子项的类型不匹配。

目前的“技巧”是定义一个多态VI初始化,它调用静态VI“初始化PS_A”或“初始化PS_B”。但是,失去了 OOP的动态部分,我已经可以看到这种方法带来的可扩展性问题,所以感觉不对。

解答:

这里的简单解决方案是让 Initialize 成为动态调度(可能已经走到了这一步),然后在子类中使用私有数据。

为每个类中的必要详细信息(A 的 VISA 资源、B 的 GPIB 等)提供一个写入访问器,并在程序开始之前在类常量上调用它们。可以创建接受这些输入并生成类对象的子VI(作为类成员,或在子类外部,但可能在库中)。(这基本上类似于在初始化PS_A和初始化PS_B VI中描述的内容)。

如果有很多类似的情况,另一种解决方案是定义仅执行通信的类,例如“VISA Communicator”,“GPIB Communicator”,并让它们继承“GeneralCommunicator”类,包括“Read”,“Write”,“Init”等。然后,你给一个“通信器”作为初始化的输入(对于 PS),并且可以在那里保留某种通用性。但是,仍然需要设置 Communicator 子项,这将需要与当前关注的有关PS_A、PS_B初始化相同类型的代码。

代码这样做,它还有一个额外的好处:你可以通过给它一个“假通信器”来更轻松地测试电源代码,它存储例如传递给“写入”的字符串数组,或者允许您设置一个固定字符串在调用“读取”时提供, 检查电源在各种条件下的行为。如果要执行一些单元测试,则很有用。

其余选项包括使用变体或字符串(在这种情况下,我相信可以携带两个必要的名称来初始化您的电源),但这会失去一些类型安全性,并阻止例如单击下拉列表控件以检查可用的 VISA 端口。该变体可能允许使用 VISA 资源名称控件,然后使用 VISA 资源子类中的数据变体,但这是一个相当模糊的解决方案,需要您知道子级所需的数据类型,在这种情况下,您不会从连接器窗格中获取该信息。可能最好避免此选项,但您可以考虑它...

从左上角开始,逆时针移动,我有

初始化子序列类(VISA 串行)。与你想做的事情不完全相同,但非常相似。

设置主 Power.vi(我想为电源实现的几个命令之一)。这知道此特定 PS 的命令,但不处理特定的消息格式

发送消息并获取 Acknowledgement.vi:格式化消息(所有命令都调用此子VI),然后尝试发送消息并接收响应。仍然是PS类的一部分,但是如果您有许多更通用的电源(或动态调度等),则可以对其进行修改

向 Serial.vi 发送消息:PS 类的成员,使用 Write.vi 然后调用嵌套对象“串行”,然后 Read.vi。对端口等的这一级别一无所知(这些是在 Init VI 中设置的)。

Write.vi(在单独的库文件,通过PPL):实际执行VISA Write。在后台,您会看到此类的类层次结构:它有一个同级,其中包含用于读取和写入固定响应的内部字符串数组。使用自己的私有数据在初始化VI中打开串口。

需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。

 

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

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

相关文章

操作系统实验6:地址映射与共享

本次实践项目有两个基本内容: (1)用Bochs调试工具跟踪Linux-0.11的地址转换过程; (2)实现基于共享物理页框的进程间内存共享。 知识点补充 GDT和GDTR 和一个段有关的信息需要 8 个字节来描述&#xff0c…

【3D目标检测】Orthographic Feature Transform for Monocular 3D Object Detection

目录概述细节网络结构正交特征变换模块其余部分概述 本文是基于单目图像的3D目标检测方法。 【2018】【OFT-Net】 研究的问题: 在图像表示中,物体的比例会随着深度的变化而变化;物体的外观随着视点的不同而不同;物体的距离&…

看漫画也能学Python?小学生都能学会,《看漫画学python 2》PDF中文超清版,可分享

学习Python的小伙伴大部分应该都知道《看漫画学Python:有趣、有料、好玩、好用(全彩版)》这本书! 《看漫画学Python》进阶版,在第1版的基础上讲解Python进阶知识,帮助读者完善Python知识体系,提…

点云Delaunay三角剖分(三维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 四面体网格是一种三维非结构化网格,它划分了一个三维域。这种类型的分区有许多有利的性质。例如,它很适合具有任意复杂几何结构的领域,它可以很容易地在局部细化和粗化(没有悬挂节点),并且它可以完全自动地创建…

GitHub上超强Python零基础入门学习资源,让你的学习事半功倍

根据2020年StackOverflow开发者调查报告,Python是世界上最受欢迎的语言之一,排名仅次于Rust和TypeScript。更令人惊讶的是,Python是开发人员最想尝试的语言。 如果你是一位使用Python的开发人员,而且希望提高自己的技术水平&…

【Numpy基础知识】使用genfromtxt导入数据

使用Numpy进行I/O操作 来源:Numpy官网:https://numpy.org/doc/stable/user/basics.html 文章目录使用Numpy进行I/O操作导包【1】定义输入【2】将行拆分为列【3】跳过行和选择列【4】选择数据类型【5】设置名称【6】调整转换【7】快捷键功能NumPy 提供了几…

JAVA面试(不同类型的公司特点)

工作那么多年面试过很多公司,同时也面试过很多求职者。作为一个JAVA程序员,10年风雨路,10年技术路,一路走来,实属不易,JAVA语言从诞生,到发展起来,到风靡全球,到如今的混…

java回顾:私服搭建

目录 一、搭建私服 1.1、搭建私服原因 1.2、nexus软件的安装 1.3、私服的使用 1.4、仓库介绍 1.5、从私服下载资源 1.6、下载失败 1.7、将资源上传到私服 1.7.1 问题 一、搭建私服 1.1、搭建私服原因 公司开发了jar包,可供其他项目组使用、无网络使用…

次世代培训——我们从游戏美术发展历程讲起

自90后们记忆最初的小霸王游戏算起,中国游戏大致经历了从像素时代-预渲染时代-初世代-中世代-次世代这样几个阶段的变革。有趣的是,当主机、PC游戏早已跨过了像素时代,手游的兴起和发展却依然要遵从这一发展规律从头开始,当人们已…

FineReport智能报表工具- CSS修改控件样式

1. 概述 1.1 使用场景 在实际项目中,为了让 FineReport 报表中的控件和页面风格一致, 可以通过 CSS 修改控件的显示样式。 如下图所示,希望参数面板上文本框控件的边框变为红色,字体颜色变为蓝色。 除更换控件字体、修改边框颜色…

从风控中那些被标准化定义的问题谈起

说到风控业务中被标准化的定义问题,作为风控人最应该来谈谈这个内容,尤其是在数字化的风控内容上。数字化风控的标准化程度较高,在互金经过了一番喷薄的发展后,对于SOP守则,业务问题的定义及留给后续从业者可借鉴的资料…

足球人生:青春不过几届世界杯

🎉花有重开日,人无再少年。将近一个月的卡塔尔世界杯正式落帷幕,见证了最伟大的世界杯决赛,新老两代球王的巅峰对决,节奏拉满。诸神黄昏,球王加冕,最完美的结局。究竟怎样的颠沛流离才配得上这一…

web--拉灯泡切换黑天与白夜的精美动画

功能: 进入界面会出现一个灯泡(下面有可以自由飘动也可以自由拉动的绳子),鼠标左键按住不松开可以拉动绳子,松开变化亮起,同时有拉响的清脆声响,把它放在web作业的设计里面绝对是非常非常不错的…

SQL注入总结复习

SQL注入总结复习 一、前提 1、web三层架构 学习SQL注入,前提必须要了解web程序的三层架构。 数据访问层(DAL):主要负责对数据库进行增删改查,将存储在数据库中的数据提交给业务层,同时将业务层处理的数据…

第七章 集合相关知识

什么是集合 为了存储不同类型的多个对象, Java提供了一系列特殊的类, 这些类可以存储任意类型的对象,并且存储的长度可变,被统称为集合。集合可以简单理解为一个长度可变可以存储不同数据类型的动态数组。集合都位于java.uti包中,使用集合时必须导入java.util包。 …

前端二面必会手写面试题汇总

实现Vue reactive响应式 // Dep module class Dep {static stack []static target nulldeps nullconstructor() {this.deps new Set()}depend() {if (Dep.target) {this.deps.add(Dep.target)}}notify() {this.deps.forEach(w > w.update())}static pushTarget(t) {if …

LeetCode刷题复盘笔记—一文搞懂动态规划之300. 最长递增子序列问题(动态规划系列第二十七篇)

今日主要总结一下动态规划的一道题目,300. 最长递增子序列 题目:300. 最长递增子序列 Leetcode题目地址 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除…

想要月入过万?不防尝试一下Python这个职业!

自从20世纪90年代初发布以来,Python一直相当火爆,在这二十多年里,它的流行程度远远超过了C、C#、Java甚至Javascript。 Python为什么受欢迎? Python迅猛发展背后的一个主要驱动力是它学习起来相当容易,使用起来功能强…

程序员需要了解的硬核知识CPU

大家都是程序员,大家都是和计算机打交道的程序员,大家都是和计算机中软件硬件打交道的程序员,大家都是和CPU打交道的程序员,所以,不管你是玩儿硬件的还是做软件的,你的世界都少不了计算机最核心的 - CPU C…

【C语言进阶】通讯录不好用?进来,零基础带你写出自己的通讯录

目录 🤩前言🤩: 😎正文:编写通讯录😎: 1.文件建立: ①.头文件Contact.h: ②.函数定义文件Contact.c: ③.工程测试文件test.c: 2.通讯录整体执行…