高级模式

系统级模块 (System-Level Module API)

CSM - Mark As System-Level Module.vi

在输入字符串前添加.,即可将此模块标记为系统级模块,例如输入为UIModule,输出为.UIModule

参考范例: 系统级模块示例 - 0. Base Concepts\7. System-Level Module.vi

名称拼接API

这个VI只操作了模块名称字符串,并没有实际功能,当熟悉CSM规则后,可以直接输入对应的名称字符串和规则符号,不是必须调用此API。

CSM系统级模块

系统级模块的其他CSM功能,均与普通模块相同,和普通模块唯一的区别,在于默认的CSM - List Modules VI不会列出系统级模块。因此它通常用于实现一些后台运行的功能模块,而在统一处理普通模块操作逻辑时,可以避免对这些后台运行逻辑的干扰。

CSM系统级模块通常以.开头,例如: .MainApp.BackgroundTask等,.是名称的一部分,消息发送、订阅等操作需要的名称也要包含.。例如:您可以将主程序循环命名为.MainApp,就可以通过CSM - List Modules VI来获取所有普通模块的列表,而不会列出.MainApp,如果主程序需要退出其他全部模块,就可以发送Macro: Exit给CSM - List Modules VI的结果,这样就可以退出所有普通模块,而不会影响系统级模块的运行。

协作者模式、责任链模式的CSM模块名称,也可以以.开头,作为系统级模块运行。

输入控件(Controls)

  • CSM Name: CSM模块名称。

输出控件(Indicators)

  • CSM Name (Marked As System-Level Module): 添加.标记的CSM模块名称。

子模块

Concatenate Submodule Name.vi

拼接生成子模块名。

输入控件(Controls)

  • CSM Name: CSM模块名称。
  • Name: 要拼接的名称。

输出控件(Indicators)

  • Submodule Name: 拼接生成的子模块名。

工作者模式 (Work Mode API)

CSM - Mark As Worker Module.vi

在CSM名称后添加#,以标记此模块为协作者模式模块。

参考范例: 工作者模式示例 - 4. Advance Examples\1. Action Workers Example

名称拼接API

这个VI只操作了模块名称字符串,并没有实际功能,当熟悉CSM规则后,可以直接输入对应的名称字符串和规则符号,不是必须调用此API。

CSM工作者模式(Worker Mode)

一个CSM模块,通过实例化多个实例,申请的名称后添加#,并共享相同的消息队列,实现工作者模式。

  • 从外部调用上看,这些实例一起组成了一个复合的模块,命名为Worker Agent。
  • 每一个实例,命名为Worker。

行为: 外部调用者可以认为Worker Agent就是一个CSM模块,可以进行消息通讯、状态注册等操作。从内部看,空闲的Worker会从Worker Agent消息队列中取出消息,处理消息。因此,工作者模式能够实现一个CSM模块的并发消息处理。

举例:

  //申请模块名称为module#,module是Worker Agent名称,实例化2个实例,这2个实例的名字可能为:
  // - module#59703F3AD837
  // - module#106A470BA5EC
  // 不能直接和Worker进行通讯,需要和Worker Agent通讯,例如:
  csm message >> arguments -@ module //同步消息,空闲的Worker将处理此消息。
  csm message >> arguments -> module //同步消息,空闲的Worker将处理此消息。

应用场景:

  • 10086接线员的场景
  • 下载器并发下载的场景
  • 编译器并发编译的场景
  • TCP Server处理多个Client连接

输入控件(Controls)

  • CSM Name: CSM模块名称。

输出控件(Indicators)

  • CSM Name (Marked As Worker): 添加#标记的CSM模块名称。

责任链模式 (Chain of Responsibility API) - 待完善

CSM - Mark As Chain Module.vi

拼接责任链模式模块的名称,使用$作为分隔符。注意Order不必连续,但是必须唯一,编号小的节点,将排列在责任链的前面。

参考范例: 责任链模式示例 - 4. Advance Examples\2. Chain of Responsibility Example

CSM责任链模式(Chain of Responsibility Mode)

多个CSM模块,申请的名称后添加$,组成处理事务的一个链条,通过责任链模式形成一个完整的模块。

  • 从外部调用上看,这些实例一起组成了一个复合的模块,命名为Chain。
  • 每一个实例,命名为Chain Node。

行为: 外部调用者可以认为Chain就是一个CSM模块,可以进行消息通讯、状态注册等操作。从内部看,nodes会根据排列顺序依次尝试处理消息,当node具有当前消息处理的能力时,消息被处理,不再向后传递。

举例:

//申请模块名称为module$, module是chain名称,实例化4个实例,这四个实例的名字可能为:
// - module$1
// - module$2
// - module$3
// - module$4
// 组成的Chain顺序为module$1(head) >> module$2 >> module$3 >> module$4(tail)
// 假设module$3 module$4能够处理"csm message"
csm message >> arguments -@ module
// 这个消息将被module$3处理, module$4不会响应

应用场景:

  • 权限审批过程,按照职位层级,具有某职能权限的人员,就可以直接审批,无需继续传递。
  • 功能拼接,不同模块实现不同的任务,通过拼接可以完成不同功能合集的组合。
  • 功能覆盖,通过覆盖实现OOP中的重载。
  • 工作者模式的场景,通常不适合具有界面操作。

名称拼接API

这个VI只操作了模块名称字符串,并没有实际功能,当熟悉CSM规则后,可以直接输入对应的名称字符串和规则符号,不是必须调用此API。

输入控件(Controls)

  • CSM Name: CSM模块名称。
  • Order: 责任链模式下的顺序,编号小的节点,将排列在责任链的前面。

输出控件(Indicators)

  • CSM Name (Marked As Chain): 添加$标记的CSM模块名称。

CSM - Resolve Node Module.vi

通过将高级模式的节点名称解析出对应的CSM模块名称。

例如:

  • 工作者模式节点的名称为module#59703F3AD837,得到的结果是module
  • 责任链模式节点的名称为module$1,得到的结果是module

输入控件(Controls)

  • CSM Module Name: CSM模块名称。
  • Node Name: 节点名称。

多循环模式支持(Multi-Loop Support)

CSM - Request CSM to Post Message.vi

申请CSM模块给出异步消息。此API主要用于CSM多循环模式下,其他模块中申请CSM发出消息。

在此场景下,通常也可以使用CSM - Post Message VI,但是它发送的时刻无法确定,而且也不能获得异步消息的返回值。此VI是一个补充。

参考范例多循环模块示例 - 4. Advance Examples\5. Multi-Loop Module Example\TCP Server Module(Multi-Loop Support).vi

CSM多循环模式(Multi-Loop Mode)

在有些场景下,适合使用多个循环构成同一个CSM模块,例如:

  • 一段已有的功能代码上改造为CSM模块,例如TCP连接循环、DAQmx数据采集循环,为了保证原本的逻辑清晰,可以在已有的代码包裹While循环,再附加CSM通讯循环,实现改造功能。
  • 在实时要求高的情况,需要使用定时循环实现,则需要CSM循环作为通讯接口,定时循环作为功能循环的实现方案。
  • 在界面操作非常复杂的情况下,建议将界面操作和CSM通讯循环分离,界面操作循环处理界面操作,产生模块间的消息,CSM循环作为实际功能循环。

多循环支持模式API用于此场景下在模块内部循环间传递内部消息,或提供非CSM循环的CSM接口功能。

输入控件(Controls)

  • Module Name: 发送状态的CSM。
  • State: 消息名称。
  • Arguments (“”): 将被广播的状态参数。
  • Without Reply? (F): 是否需要返回。当需要返回时,发出的是异步消息;不需要返回时,发出的是异步无返回消息。
  • Target Module (“” By Default): 目标模块。
  • Immediately? (F): 立即执行选项。立即发送会让此消息在CSM循环中立即被处理,而不是等待CSM循环中现存的消息执行完毕。

CSM - Request CSM to Broadcast Status Change.vi

申请CSM发送广播。此API主要用于CSM多循环模式下,其他模块中申请CSM发出广播,通知其他模块状态改变。

参考范例多循环模块示例 - 4. Advance Examples\5. Multi-Loop Module Example\TCP Server Module(Multi-Loop Support).vi

CSM多循环模式(Multi-Loop Mode)

在有些场景下,适合使用多个循环构成同一个CSM模块,例如:

  • 一段已有的功能代码上改造为CSM模块,例如TCP连接循环、DAQmx数据采集循环,为了保证原本的逻辑清晰,可以在已有的代码包裹While循环,再附加CSM通讯循环,实现改造功能。
  • 在实时要求高的情况,需要使用定时循环实现,则需要CSM循环作为通讯接口,定时循环作为功能循环的实现方案。
  • 在界面操作非常复杂的情况下,建议将界面操作和CSM通讯循环分离,界面操作循环处理界面操作,产生模块间的消息,CSM循环作为实际功能循环。

多循环支持模式API用于此场景下在模块内部循环间传递内部消息,或提供非CSM循环的CSM接口功能。

输入控件(Controls)

  • Module Name: 发送状态的CSM。
  • Status: 将被广播的状态。
  • Arguments (“”): 将被广播的状态参数。
  • Broadcast? (T): 控制是否广播的开关输入。
  • Priority (“Status”): 广播的优先级, 默认为”信号广播(Status)”,或”中断广播(Interrupt)”。
  • Immediately? (F): 立即执行选项。立即发送会让此消息在CSM循环中立即被处理,而不是等待CSM循环中现存的消息执行完毕。

CSM - Forward UI Operations to CSM.vi

此VI主要应用于多循环模式下,将并行于CSM循环的UI循环中用户操作产生的时间,转发到CSM循环中处理。CSM DQMH-Style Template VI模板就是这个逻辑。

参考范例连续循环示例 - Addons - Loop Support\CSMLS - Continuous Loop in CSM Example.vi

CSM多循环模式(Multi-Loop Mode)

在有些场景下,适合使用多个循环构成同一个CSM模块,例如:

  • 一段已有的功能代码上改造为CSM模块,例如TCP连接循环、DAQmx数据采集循环,为了保证原本的逻辑清晰,可以在已有的代码包裹While循环,再附加CSM通讯循环,实现改造功能。
  • 在实时要求高的情况,需要使用定时循环实现,则需要CSM循环作为通讯接口,定时循环作为功能循环的实现方案。
  • 在界面操作非常复杂的情况下,建议将界面操作和CSM通讯循环分离,界面操作循环处理界面操作,产生模块间的消息,CSM循环作为实际功能循环。

多循环支持模式API用于此场景下在模块内部循环间传递内部消息,或提供非CSM循环的CSM接口功能。

输入控件(Controls)

  • State(s) In (“”): 待处理的状态。
  • Name (“” to Use UUID): 模块的名称。
  • High Priority? (T): 立即执行选项。立即发送会让此消息在CSM循环中立即被处理,而不是等待CSM循环中现存的消息执行完毕。

输出控件(Indicators)

  • States Out: 输入始终为空,是为了在模板中保证连线一致性设置的输出端。

CSM - Module Turns Invalid.vi

检查CSM是否已经退出。通常用于和CSM并行的功能循环的跟随CSM循环退出。

CSM高级模式的模块(协作者模式、责任链模式)只有在最后一个节点退出后,才会触发模块退出事件。

输入控件(Controls)

  • CSM Name: CSM模块名称。

输出控件(Indicators)

  • Turn Invalid (Exit)?: CSM模块是否已经退出。