基础用法
Step1. 创建基于 CSM 的可重用模块
创建一个可重用模块通常不需要与其他模块进行消息交互;它只需要提供外部接口和发布模块的状态变化。因此,只要明确描述了这两个方面,就可以在不了解内部实现细节的情况下,调用可重用模块。
在CSM模块中,所有 case 分支都可以被视为调用的消息,但建议使用 API 分组作为外部接口。当发送状态更新时,通过发送 Status 或 Interrupt Status 来通知外部模块内部的状态变化。
可参考范例 /Example/1. Create a reusable module
.png)
模块名称命名规则
一个有效的CSM模块名称是一个字符串,不应包含以下任何特殊字符: ~!@%^&*()\[\]{}+=|\\/?'"<>,.\t\r\n。这些字符是CSM框架内保留用于其他目的的关键字。
系统级模块
系统级(SystemLevel)模块系统级模块的名称前会添加一个”.”作为前缀,标记为系统级模块。功能上与普通模块无异,可以进行消息通讯和状态订阅。他们之间的区别在于系统级的模块,不会自动被列出在活动模块列表中。这样在普通的逻辑调度中,系统级模块不会被直接调用,只能通过显式的消息发送,才能被触发。
因此系统级模块通常用于实现一些全局的后台功能,例如 TCP程序中的调度模块等。
CSM Attribute
CSM Attribute是CSM框架内用于存储模块配置的一种机制。它被用于:
- 提供一种无需消息访问的配置方法,外部通过模块名称、属性名称、数据类型即可直接读写模块的属性值。
- 提供一种Worker模式、Chain模式模块内部节点数据共享的机制。不同的节点共享同一个Attribute空间,节点可以通过读写Attribute来实现数据共享。
Step2. 在CSM框架中调用模块
在这种情况下,模块之间的通信完全依赖于消息字符串队列操作,你可以使用 Build Message with Arguments++.vi 函数生成一个 Message 字符串,或者,如果你熟悉规则,你可以直接使用编写用于描述通讯的字符串。
#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
// Another comment line
可参考范例 /Example/2. Caller is CSM Scenario.
.png)
Step3. 在其他框架中调用模块
在这种情况下,模块之间的通信完全依赖于Post/Send Message API和模块状态更改用户事件。
可参考范例 /Example/3. Caller is Other Framework Scenario.
.png)
Step4. CSM参数
CSM 只支持 STRING TYPE 作为参数,但是需要传输的数据种类繁多。因此,对参数的支持至关重要。下表列出了当前支持不同数据类型的一些方法,其中一些是 CSM 内置的,而其他一些则需要安装额外的支持插件。
| 参数类型 | 类型 | 描述 |
|---|---|---|
| SAFESTR | 内置 | 安全字符串,特殊字符(如 ->、->|、-@ 等)将被替换为 %[HEXCODE] |
| HEXSTR | 内置 | 将任意数据类型转换为十六进制字符串作为参数,支持无损传递复杂数据 |
| ERRSTR | 内置 | 用于传递 LabVIEW 错误簇,格式为 <ERRSTR>[Error: error-code] error-description
|
| MassData | 插件 | 数据将被保存在循环缓冲区中,传递带有起始地址和数据长度 |
| API Arguments | 插件 | 支持将纯字符串作为 CSM API 参数 |
| INI Static Variable | 插件 | 为 CSM 提供 ${variable} 支持 |
CSM参数类型(Argument Type)
在CSM中,所有参数/返回均以字符串形式呈现,但其背后可承载任意数据类型。因此,发送端需先进行编码,接收端再进行解码。 例如CSM内置HEXSTR编码方案,也可按需扩展自定义编解码器。
为便于识别编码方式,推荐将编码后的参数写成<Argument Type> STRING FORMAT ARGUMENT格式。
使用CSM - Argument Type VI即可提取类型标记,据此选择对应的解码函数。
CSM消息关键字
包括:->、->|、-@、-&、<-、\r、\n、//、>>、>>> 、;、,。
内置参数处理VI
- CSM - Argument Type.vi:从编码后的参数字符串中提取参数的编码类型标记。
- CSM - Keywords.vi:用于罗列CSM消息中的关键字及其%Hex格式。
- CSM - Make String Arguments Safe.vi:将参数字符串中的CSM关键字转换为%Hex格式,确保不影响CSM消息字符串解析。
- CSM - Revert Arguments-Safe String.vi:将安全的字符串参数中的%Hex格式的CSM关键字转换回普通格式。
- CSM - Convert Data to HexStr.vi:将LabVIEW任意数据类型转换为HEXSTR格式参数字符串。
- CSM - Convert HexStr to Data.vi:将十六进制字符串参数转换回变体数据。
- CSM - Convert Error to Argument.vi:将LabVIEW错误簇转换为CSM错误参数格式。
- CSM - Convert Argument to Error.vi:将CSM错误参数格式转换为LabVIEW错误簇。
.png)