创建CSM模块

目录

  1. Step1. 创建基于 CSM 的可重用模块
    1. 设计要点
    2. API 命名和使用
    3. 状态广播
    4. 测试和文档
    5. 模块命名规则
    6. 系统级模块
    7. CSM Attribute
  2. Step2. 在CSM框架中调用模块
    1. CSM消息语法
    2. 调用流程
  3. Step3. 在其他框架中调用CSM模块
    1. 核心API
      1. CSM - Post Message.vi
      2. CSM - Send Message and Wait for Reply.vi
      3. 订阅CSM模块状态
    2. 集成模式
    3. 集成注意事项
  4. Step4. CSM参数传递
    1. 为什么只用字符串?
    2. 参数类型对比
    3. 内置参数类型
      1. 1. 纯字符串
      2. 2. SAFESTR - 安全字符串
      3. 3. HEXSTR - 十六进制字符串
      4. 4. ERRSTR - 错误字符串
    4. 参数工具VI
    5. 使用场景
    6. 最佳实践
    7. CSM关键字
  5. 总结

Step1. 创建基于 CSM 的可重用模块

一个可重用模块只需要做好两件事:提供外部接口(API)和发布状态变化(Status/Interrupt)。把这两点说清楚了,别人就能用你的模块,不用管内部怎么实现的。

在CSM里,所有 case 都能当消息调,但建议用 API 分组做外部接口。状态变化就通过 Status 或 Interrupt Status 广播出去。

可参考范例:创建可重用模块 img

设计要点

写个好用的模块,记住这几点:

  • 单一职责:一个模块只干一件事。比如数据采集模块就只管采集,文件模块就只管读写文件
  • 接口清晰:API 名字要让人一看就懂,像 API: StartAcquisitionAPI: Stop。参数和返回值格式要统一
  • 模块独立:别在代码里写死其他模块的名字。用广播机制解耦,配置用 Attribute 或初始化参数
  • 错误处理:实现 “Error Handler” 状态处理错误,出错时发 “Error Occurred” 广播通知外部

API 命名和使用

命名规范

  • 加 “API:” 前缀标识外部接口
  • 动词开头描述操作:API: ReadAPI: Connect
  • 语义清晰,别用缩写:推荐 API: StartAcquisition,不推荐 API: StrtAcq

常见分类

  • 生命周期:Initialize, Start, Stop, Cleanup
  • 配置:SetParameter, GetParameter, LoadConfig
  • 功能:Execute, Query, Update

文档示例

// API: StartAcquisition
// 功能:启动数据采集
// 参数:SampleRate(Hz, 1-10000), Channels(逗号分隔,如"AI0,AI1")
// 返回:Success 或 Error
// 示例:API: StartAcquisition >> 1000,AI0,AI1 -@ DAQModule
// 注意:参数值包含特殊字符时需用SAFESTR编码

状态广播

命名:用描述性名称,如 DataReadyConnectionEstablishedErrorOccurred

优先级

  • 普通广播 (Status):常规通知 - DataReady >> Data -> <status>
  • 中断广播 (Interrupt):紧急通知 - EmergencyStop >> Reason -> <interrupt>

测试和文档

测试:用 CSM 调试控制台逐个测试 API,验证返回值。用全局日志监控消息流,检查广播触发和参数传递。

文档:说明模块功能、API 列表(参数/返回值/示例)、广播列表、Attribute 列表,给个基本使用示例就行。

版本管理:用语义化版本号(v1.2.3)- 主版本改接口,次版本加功能,修订号修 bug。保持向后兼容。

模块命名规则

CSM模块名称不能包含这些特殊字符: ~!@%^&*()\[\]{}+=|\\/?'"<>,.\t\r\n,这些是CSM框架的保留字符。

详细规则见CSM基本概念

系统级模块

系统级模块名字前面加个”.”,比如 .SchedulerModule。它们不会出现在活动模块列表中,只能通过显式消息调用,一般用来做全局后台功能。

更多信息见CSM高级模式与特性

CSM Attribute

Attribute 是用来存模块配置的,有两个用处:

  • 让外部不用发消息就能读写模块的属性值
  • Worker 模式、Chain 模式里不同节点之间共享数据

详细用法见CSM基本概念

Step2. 在CSM框架中调用模块

当调用者也是CSM模块时,模块之间靠消息字符串通讯。可以用 Build Message with Arguments++.vi 生成消息,或者直接写消息字符串。

CSM消息语法

#CSM 状态语法
    // 本地消息
    DoSth: DoA >> 参数

    // 同步调用
    API: xxxx >> 参数 -@ TargetModule

    // 异步调用
    API: xxxx >> 参数 -> TargetModule

    // 无应答异步调用
    API: xxxx >> 参数 ->| TargetModule

    // 广播普通状态
    Status >> StatusArguments -><status>

    // 广播中断状态
    Interrupt >> StatusArguments -><interrupt>

    // 注册状态订阅
    Status@Source Module >> Handler Module@Handler Module -><register>

    // 取消状态订阅
    Status@Source Module >> Handler Module -><unregister>

#CSM 注释
    // 用 "//" 添加注释,右边的内容会被忽略
    UI: Initialize // 初始化 UI

调用流程

同步调用

  1. 构建消息:API: Operation >> Args -@ TargetModule
  2. 发送并等待
  3. 收到响应进入 “Response” 状态处理

异步调用

  1. 构建消息:API: Operation >> Args -> TargetModule
  2. 发送后立即进入 “Async Message Posted”
  3. 继续干别的事
  4. 收到响应时进入 “Async Response” 状态处理

可参考范例:CSM调用者场景 img

Step3. 在其他框架中调用CSM模块

如果你用的是 DQMH、Actor Framework 或传统状态机,可以用这些 API 和 CSM 模块通讯:

核心API

CSM - Post Message.vi

发送异步消息,不等结果。用于通知型操作,单向数据传递。

// 从DQMH发消息给CSM
CSM - Post Message.vi
  - State: "API: ProcessData"
  - Arguments: "DataString"
  - Target Module: "DataProcessor"

CSM - Send Message and Wait for Reply.vi

发送同步消息,等待返回。用于需要立即获取结果的场景。

// 查询CSM模块状态
CSM - Send Message and Wait for Reply.vi
  - State: "API: GetStatus"
  - Target Module: "StatusModule"
  - Timeout: 5000ms
  - Response: 返回的状态信息

注意:设置合理的超时时间,处理超时错误,别在事件结构里阻塞。

订阅CSM模块状态

通过用户事件订阅状态变化:

// 注册订阅
CSM - Register Broadcast.vi
  - CSM Name: "SubscriberModule"
  - Source CSM Name: "DataModule"
  - Trigger: "DataReady"
  - API: "ProcessData"

// 在事件结构中处理
Event Structure
  - Case: "ProcessData" Event
  - 处理收到的数据

集成模式

命令-通知模式:外部框架发命令,订阅CSM的完成通知 同步查询模式:外部框架同步调用CSM获取数据 事件驱动模式:外部框架订阅CSM的状态变化事件

集成注意事项

  • 事件结构中用 Post 别用 Send & Wait,避免阻塞
  • 可以创建适配器模块转换消息格式
  • 同步调用要设超时保护
  • 通过订阅机制保持状态同步

可参考范例:其他框架调用者场景 img

Step4. CSM参数传递

CSM 只支持字符串类型参数,但可以通过不同的编码方式传递各种数据。

为什么只用字符串?

  • 灵活:字符串可以表示任意数据类型
  • 可扩展:易于添加新编码方案
  • 好调试:日志里能直接看
  • 跨模块兼容:不同模块间不用管数据类型

参数类型对比

参数类型 类型 适用场景 性能 说明
纯字符串 内置 简单文本 ⭐⭐⭐⭐⭐ 直接传,无需编解码
SAFESTR 内置 有特殊字符的字符串 ⭐⭐⭐⭐ 特殊字符转%[HEXCODE]
HEXSTR 内置 复杂数据类型 ⭐⭐⭐ 任意数据转十六进制
ERRSTR 内置 错误传递 ⭐⭐⭐⭐ 专门传LabVIEW错误簇
MassData 插件 大数组、波形 ⭐⭐⭐⭐⭐ 循环缓冲区,高效传大数据
API Arguments 插件 多参数API ⭐⭐⭐⭐ 支持纯字符串作API参数
INI Static Variable 插件 配置变量 ⭐⭐⭐⭐ 提供${variable}支持

内置参数类型

1. 纯字符串

最简单,直接传。适合文件路径、配置值、状态描述。

API: LoadFile >> C:\Data\test.txt -@ FileModule
API: SetSampleRate >> 1000 -@ DAQModule

注意:不能包含 CSM 关键字(->-@等)和换行符。

2. SAFESTR - 安全字符串

把CSM关键字转成安全格式,比如 -> 转成 %3E%3E

API

输入: "Value -> Target"
编码后: "<SAFESTR>Value %2D%3E Target"

用户输入的字符串建议都用 SAFESTR 编码。

3. HEXSTR - 十六进制字符串

把任意 LabVIEW 数据转成十六进制字符串,支持数组、簇、波形等。

API

输入: [1.0, 2.5, 3.7] (DBL Array)
编码后: "<HEXSTR>000000000000F03F..."
解码: Variant -> Variant to Data

小于 1KB 的数据用 HEXSTR 合适,大数据用 MassData。

4. ERRSTR - 错误字符串

专门传 LabVIEW 错误簇。

API

输入: Error 1 - "File not found"
编码后: "<ERRSTR>[Error: 1] File not found"

用于错误传播和远程错误报告。

参数工具VI

table

使用场景

传配置参数

// 简单值直接传
API: SetValue >> 100 -@ Module

// 多参数用分隔符
API: Configure >> 1000,100,True -@ Module

传数据数组

// 小数组用HEXSTR
API: ProcessData >> <HEXSTR>... -@ Module

// 大数组用MassData
API: ProcessData >> <MassData>StartAddr,Length -@ Module

传错误信息

// 用ERRSTR
API: ReportError >> <ERRSTR>... -@ LogModule

// 或通过广播
Error Occurred >> <ERRSTR>... -> <status>

传文件路径

// 简单路径直接传
API: LoadFile >> C:\Data\file.txt -@ Module

// 有特殊字符用SAFESTR
API: LoadFile >> <SAFESTR>... -@ Module

最佳实践

选择编码方式

  • 简单数据 → 纯字符串
  • 有特殊字符 → SAFESTR
  • 复杂数据 → HEXSTR 或 MassData
  • 错误信息 → ERRSTR

性能优化

  • 小数据(<1KB)用 HEXSTR
  • 大数据(>1KB)用 MassData
  • 频繁传递考虑用 Attribute 共享数据

调试技巧

  • 用全局日志查看参数内容
  • HEXSTR 可以还原查看原始数据
  • 添加参数验证代码

CSM关键字

这些字符不能在参数中直接用,必须用 SAFESTR 编码:

->    异步调用
->|   异步无返回
-@    同步调用
-&    (保留)
<-    响应
\r\n  回车换行
//    注释
>>    参数分隔
;,    (保留)

总结

通过这章你学会了:

  1. 创建可重用模块:遵循设计要点,提供清晰的 API 和广播接口
  2. CSM框架内调用:用消息字符串或 Build Message API
  3. 其他框架调用:用 Post Message 和 Send & Wait API
  4. 参数传递:选合适的编码方式传各种数据

这些是开发 CSM 应用的基础。掌握后,你就能写出模块化、可重用、易维护的 LabVIEW 系统了。

更多高级内容见: