ARTICLE · 1126787
【PDF下载】可通讯状态机框架CSM学习笔记(完结)
常见 LabVIEW 编程框架比较
四大框架简介
DQMH:在 LabVIEW QMH 的基础上拓展实现“模块”的概念,解决 QMH 模块循环间通讯不直接、不易支持可复制模块、不容易搭建系统框架等限制,是目前 LabVIEW 生态中非常流行的程序框架。DQMH 模块 = LabVIEW Library + 主 VI + API + 通讯自定义控件;Request 是基于 User Event 实现的外部接口,Broadcast 基于 User Event 实现,用于通知外部模块的状态变化; Actor Framework:LabVIEW 实现的 Actor Model 方案,多个 Actor 可以独立运行并相互通信,提供面向对象体系结构的一组类。该模型提供两个父类:Actor(拥有数据状态的模块)与 Message(消息在操作者间传递用来触发状态改变),实际开发时需要创建它们的子类; SMO(JKI-State-Machine-Objects):对 JKI-State-Machine 的扩展,可以创建多个异步运行的 JKI-State-Machine 对象,它们之间通过动态事件通讯。模块即类,通过类的方式操作模块;概念上支持可复制模块;支持子模块。
十二维度对比
维度 | DQMH | SMO | Actor Framework | CSM |
外部接口 | Script 辅助创建 API | 类公共接口作为 API | 类封装的 Message 消息通讯 | 字符串格式的消息通讯,非必须创建 API |
状态反馈 | User Event,外部需要存在事件结构添加订阅逻辑<o:page></o:page> | User Event,外部需要存在事件结构添加订阅逻辑 | 消息处理中封装反馈消息 | 消息通过 JKISM 机制传递,无需 User Event Structure;隐式传递,订阅无需修改侵入代码,可外部调用 |
可复制模块 | 复杂,两套模板 | 容易,类实现,框架不区分 | 容易,类实现,消息和模块独立,灵活性高 | 容易,VI 属性决定 |
代码依赖 | 调用方需要依赖模块的自定义事件和参数定义,需预先开发框架定义部分的接口代码 | 调用方高度依赖模块实现,必须先开发框架接口部分 | 调用方可能有继承依赖和消息依赖,需预先定义消息类和方法 | 调用方开发无需依赖框架代码;消息、参数均用字符串,不显式依赖,不易 broken;复杂参数需要依赖 |
参数传递 | 任意类型,使用 User Event 传递 | 任意类型,使用 User Event 传递 | 任意类型,需要封装 Message 类 | 字符串,复杂类型需转换 |
代码复杂度 | 框架逻辑简单,模块代码冗余度高,不依赖 script 增删比较复杂 | 框架特别复杂,模块逻辑基于 JKI 状态机,需理解 JKI SMO 的概念逻辑 | 框架特别复杂,实现高度依赖 OOP | 继承 JKISM 优点,代码逻辑集中,理解消息通讯状态跳转后与 JKISM 编程思路相同 |
生态 | 最佳 | 社区中仅有 JKI 提供模板和工具 | 一般,通常作为企业内部统一架构 | 待完善 |
OOP | 无 | 有 | 有 | 无 |
执行效率 | 依赖 Event Structure | 依赖 Event Structure / LabVIEW OOP | LabVIEW OOP | 依赖参数的解析 |
UI 编写 | 支持 | 支持 | 支持 | 支持 |
RTOS | 支持 | 不推荐 | 不推荐 | 支持 |
高级模式 | 无 | 可组合,模块能作为子模块 | 继承 Actor Core.vi 实现特殊模式 | 并行工作者模式、责任链模式 |
各框架优缺点
框架 | 优点 | 缺点 |
DQMH | 继承于应用最广泛的框架 QMH,且无 OOP,对大多数 LabVIEW 用户比较友好;社区活跃度高,资料/工具众多 | 代码接口冗余;两套模板实现 Singleton/Standalone 模块 |
SMO | 非常符合面向对象的概念;模块独立性好,操作调用直观;最适用的场景是模块复用,不与调用方一起开发<o:page></o:page> | 框架复杂度高,对用户要求高;目前社区用户少、更新频率不高;资料比较少 |
Actor Framework | 操作者、消息均解耦,解耦程度高,便于多人协作开发;熟悉 OOP 的开发人员使用方便 | 框架复杂度高,对用户要求高;项目需要架构师角色 |
CSM | 继承于 JKISM,代码集中度高;无 OOP,对大多数 LabVIEW 用户比较友好;通过文档定义接口分工,无需代码;容易实现操作序列化(Serialization);内置多种高级模式 | 所有消息必须使用 STRING 格式传递,有转换的开销;目前工具/资料还不完善 |
案例分享
案例一:数据连续采集并保存程序
模块独立:功能模块相互没有任何调用关系,通过业务逻辑(UI 模块)订阅状态; 模块可替换:相同接口的模块不需要调整业务代码; 模块接口可通过文档描述提前定义,不需要架构师提前编写接口; 波形数据通过 CSM MassData Arguments 传递,无需创建数据传输通路。
案例二:复杂系统的组件化及序列化测试
测试系统模块化:将系统划分为系统模块(组件1、组件2、组件3)与系统采集(数采1、数采2)等独立 CSM 模块,每个模块具备 start / action / stop 等操作及 error occurred / status changed / data sampled 等状态; 测试项组件化:各独立模块组合成相应的测试需求,基于 CSM 实现组件与测试项交互。例如:测试1 = 组件1 + 组件2 + 数采1;测试2 = 组件1 + 组件3 + 数采1;测试3 = 组件2 + 组件3 + 数采2;每个测试项具备 error handler / status ready / data sampled / test status 等状态; 测试文件序列化:通过“测试项列表库”加载所有测项,双击任意测项配置参数、添加测试步骤,实现测试序列化自动化;测试流程可任意编排,例如:步骤1(测试1)→ 步骤2(测试2)→ 步骤3(测试3)→ 步骤4(测试1)→ 步骤5(测试3)……

案例三:基于 CSM 的通用自动化测试框架
HAL(Hardware Abstract Layer,硬件抽象层):通过对同种类仪器的接口进行标准化抽象和实现,从而使用相同的接口操作不同厂家的同种仪器; MAL(Measurement Abstract Layer,测量抽象层):建立在 HAL 基础上,对测量方法进行抽象。
基于 TestStand 实现自动化测试:硬件设备(Devices / Third Party Devices)通过标准化接口(AI、AO、DMM、Serial……)接入接口通信层,再经测量方法层完成指令发送+应答采集、多波形采集与特性分析等测试业务; 自动化测试脚本化:可快速实现纯文本的自动化测试调用。脚本示例(片段):“Write-DBL(1Ch1S) >> Data : 3.000000 -@ VoltageAO”“DUT-OhmLaw >> dev-Volt : VoltageAI ; dev-Amps : CurrentAI ; Signal : c0 -@ MeasResistor”“Write >> PWM:Frequency:20%0A -@ Serial”“ScalarMeasure >> Dev : Scope ; Channel : 0 ; Measurement : 2 -@ ScopeScalar”等,用于多设备协同测试(电压、电阻、PWM、示波器等)。
案例四:gRPC 调用封装——汽车 HIL 故障注入系统
CSM 独立模块在其他编程框架中易于调用,调用方法清晰,外部改动少; CSM 的工作者模式(Worker Mode)可以以不添加额外代码的方式,提高 gRPC-Executor 模块的并行吞吐量。
案例要点速览
案例 | 场景 | CSM 体现的核心价值 |
数据连续采集并保存 | 连续采集、存储与分析程序模板(已上架 VIPM) | 模块独立、模块可替换、接口文档化、MassData 传输大数据 |
复杂系统组件化及序列化测试 | 复杂测试系统分解为模块/组件,测试项组合与测试序列化 | 灵活性、复用性、解耦合;测试文件可编排 |
通用自动化测试框架 | 多型号测试任务的标准化自动化测试软件 | 易用性、复用性、扩展性;HAL/MAL 抽象层;脚本化调用 |
gRPC 调用封装(汽车 HIL) | 为 LabVIEW 应用添加 gRPC 跨平台远程调用接口 | 易用性、扩展性;Worker Mode 提升并行吞吐量 |
总结与资源
核心要点回顾
CSM 是 JKISM 的扩展框架:保留字符串消息队列状态机的简单直观,用关键词扩展出同步消息(-@)、异步消息(->)、状态订阅/取消订阅(->/ ->)等模块间通信能力; 高复用框架 = 模块化:通过调度 API、操作 API、状态接口三类接口隔离模块,配合消息、错误处理、停止三类内部机制,实现模块独立、可替换、可文档化分工; 参数体系完备:Safe String、Hex String、Error String、MassData、API String、INI-Static-Variable 覆盖从简单字符串到大波形数据的传输场景,且支持脚本化(纯文本调用); 高级模式实用:Worker Mode(#)提升并行吞吐量、Chain Mode($)实现优先级责任链、Side-loop 处理阻塞性旁路工作; 选型参考:与 DQMH、SMO、Actor Framework 相比,CSM 无 OOP、代码集中度高、适合序列化操作与 RTOS,但工具/资料生态尚待完善,字符串消息存在转换开销; 案例验证:连续采集保存、复杂系统组件化序列化测试、通用自动化测试框架(HAL/MAL)、gRPC 远程调用(汽车 HIL)四个案例,覆盖了 CSM 从简单到复杂的应用场景。
相关资源汇总
资源 | 地址 | 用途 |
JKI State Machine | github.com/JKISoftware/JKI-State-Machine | CSM 的底层基础框架(预读资料) |
Introduction to DQMH | www.ni.com 官网检索(NICONNECT 2023 资料) | 了解 DQMH 框架(预读资料) |
Communicable State Machine | github.com/NEVSTOP-LAB/Communicable-State-Machine | CSM 框架主仓库,含 Wiki 与 Development Plan |
CSM Continuous Measurement and Logging | github.com/NEVSTOP-LAB/CSM-Continuous-Meausrement-and-Logging | 案例一源码;VIPM Community 可安装模板 |
gRPC-LabVIEW | github.com/ni/grpc-labview | gRPC 自动代码生成(案例四) |
完结撒花🌹🌹🌹🌹🌹🌹
往期精彩:
【资料分享】LabVIEW与三菱FX3U/5U PLC通信实战指南
【源码+文档】LabVIEW Actor Framwork:做一个聊天工具教会你(三)
【源码】Multi Column Listbox 仅支持【第一列】显示图标 / 符号?当然其他单元格也是可以显示图标
FlatUI3.0 Study Test System【Engine-Client 框架视频演示】
在LabVIEW中调用ReoGrid实现Excel表格的嵌入而无需依赖Office软件
LabVIEW编程中的风格与框架核心价值(AMC万能框架分享)
"懂硬件的软件工程师,是智能制造时代最难被替代的人。"
如果你也是 LabVIEW 从业者或者爱好者,欢迎在评论区留下你评论。
同时也欢迎加入技术讨论群,加微可邀。

-END-