基本概念

CSM模块 (CSM Module)

CSM 是 Communicable State Machine 的缩写. 在 Wiki 中,CSM 通常也表示基于 CSM 编写的程序模块。

在 LabVIEW 中,从文件形式上看,CSM模块 是一个 vi 文件;从编程角度看,CSM 是一个典型的状态机

状态(State)

代码上对应了 CSM 条件结构中的一个分支,是 CSM 的基本逻辑单元。CSM 内部不同的状态之间基于一定的逻辑实现状态跳转,完成具体的功能。

在 LabVIEW 中,状态是 case 条件结构中的一个分支,相比其它状态机不同的是,CSM 总的 case 条件结构数据类型为字符串,且满足特定的语法规则。

  • 宏状态(Macro)

    一类特殊的状态, 可以解释为多个状态的组合,实现固定状态的组合逻辑。在 CSM 模板中,默认包含用于描述整个启动过程状态变化(“Macro: Initialize”),和退出时的整个状态变化(”Macro: Exit”) 两个宏状态

消息(Message)

消息CSM模块间的通讯方式,主要用于1:1的模块间交互,消息又发送端CSM发出后,收到消息的CSM 将进入同名的状态。例如模块 A 发送了 “API: DoSth” 到模块 B, 模块 B 将进入 “API: DoSth” 状态。

在 LabVIEW 中,消息是一段满足特定的语法规则的字符串,其中包含了消息符号状态响应参数,CSM 的 vi 选版中提供了消息生成 vi,帮助用户更便捷的生成消息字符串。

消息格式解析(Message Format)

[CSM消息字符串(CSM Message)] >> [参数(Arguments)] [消息类型符号(Message Symbol) ->|,->,-@] [目标模块(Target Module)] // [注释(Comments)]
  • CSM 消息字符串(CSM Message): CSM的消息,不可包含CSM关键字和换行符。
  • >>: CSM消息字符串(CSM Message)和参数(Arguments)的分隔符。
  • 参数(Arguments): CSM消息的参数,不可包含CSM关键字和换行符。
  • 消息类型符号(Message Symbol): 消息类型符号,用于标识消息类型,包括同步调用(-@)、异步调用(->)、异步不等待返回(->|)等。
  • 目标模块(Target Module): 消息发送的目标模块,如为空,则表示消息会被本模块处理。为空时,消息类型符号也不能存在。
  • 注释(Comments): 注释信息,不会被解析。

消息类型(Message Type)

消息类型是根据消息的处理方式不同对消息进行的分类。目前的消息类型主要分为: 同步消息异步消息。其中,异步消息基于应用场景的不同,又分为有返回的异步消息,无返回的异步消息

消息符号(Message Symbol)

消息符号是在字符串中表示消息类型的特殊字符。目前的消息符号有 ‘-@’,’->’,’->\|’ 三种,分别代表: 同步消息,有返回的异步消息,无返回的异步消息 三个消息类型

同步消息 (Sync Message)

同步消息消息的一种。CSM 发出同步消息后,将暂停状态变化,等待被调用方完成消息处理。同步消息通过 -@ 描述。

调用方会发生的错误:

  • 如果输入的目标模块为"",会产生NO Target Error
  • 如果输入的模块不存在,会产生Target Error
  • 如果输入的模块存在,但是在指定的时间内还未完成处理,会产生Timeout Error

调用方会停留等待返回:

  • 如果调用方是CSM模块,会停留在Parse State Queue++ VI中。
  • 如果是API调用,会停留在调用VI,例如CSM - Send Message and Wait for Reply VI。

返回:

  • 如果调用方是CSM模块
    • 正常情况下,会进Response状态处理返回。
    • 如果是调用方发生的错误,会导致CSM状态机进入Error Handler模块,处理错误。
    • 如果是被调用方发生的错误,此信息仍然是消息的结果,在Response状态处理,可以从Additional Information中获取。
  • 如果是API调用
    • Response输出为返回。
    • 调用方和被调用方发生的错误,会合并到错误簇输出。

异步消息 (Async Message)

异步消息是消息的一种。CSM 发出异步消息后,不等待被调用方完成消息处理,继续进行状态变化。 异步消息也分为两种:

  • 有返回的异步消息:通过 -> 描述。被调用方完成消息处理后,将通知调用方
  • 无返回的异步消息:通过 ->\| 描述,被调用方不会通知调用方

调用方会发生的错误:

  • 如果输入的目标模块为"",会产生NO Target Error
  • 如果输入的模块不存在,会产生Target Error

调用方不会停留等待返回:

  • 如果调用方是CSM模块,会在Parse State Queue++ VI发送消息后,进入Async Message Posted状态。
  • 如果是API调用,会继续执行后续代码,API只能发送异步无返回异步消息。

返回:

  • 如果调用方是CSM模块
    • 正常情况下,会进入Async Response状态处理返回。被调用方发生的错误,此信息仍然是消息的结果,在Async Response状态处理,可以从Additional Information中获取此错误信息。
    • 如果是调用方发生的错误,会导致CSM状态机进入Error Handler模块,处理错误。
  • API只能发送异步无返回异步消息,无返回。

CSM操作消息(CSM Operation Message)

CSM定义了系统所需的操作,例如发送广播,广播的订阅、取消订阅。可以基于此定义,扩展系统的功能。

//[CSM操作字符串(CSM Operation)] >> [参数(Arguments)] -> <[操作类型(Operation)]> // [注释(Comments)]

例如:

// 发送信号广播"TCP Connected",参数为"192.168.1.100"
TCP Connected >> 192.168.1.100 -> <broadcast>
// 将TCPModule的TCP Connected广播注册到UI模块的UpdateLED API
TCP Connected@TCPModule >> UpdateLED@UI -><register>

响应(Response)

响应是被调用模块对于消息的返回。

在 LabVIEW 中,响应 就是一个由用户定义的字符串。例如当模块 A 发送了 “API: DoSth” 到模块 B, 模块 B 将进入 “API: DoSth” 状态后,模块 A 希望得到一个来自模块 B 返回字符串 “Reveived” 以确认模块 B 已经收到,此时返回的字符串信息就是响应。 请注意 CSM vi 模板中的状态响应默认均为空字符串。

  • 同步消息会通过 “Response”状态处理响应。
  • 有返回的异步消息会通过 “Async Response”状态处理响应。

广播(Broadcasting)

广播是 CSM 通知外部自身状态变化的特殊消息,用于支撑1:N的模块间交互方式。广播的收发模式采用了订阅机制,即,外部模块需要先注册广播,注册成功后才会接收到被订阅模块的广播消息。

广播的订阅制工作模式上和当前基Pub\Sub模式的各种 MQ 机制类似。目前 CSM 广播消息仅支持 LabVIEW 的同一应用的内部模块交互,尚不支持跨应用和跨机器的模块间交互。

广播类型(Broadcast Type)

CSM中的广播分为三种: 信号广播(Status)、中断广播(Interrupt)和状态广播(State), 模块会将信号广播推送给所有订阅了该信号广播的模块。 其中信号广播(Status)和中断广播(Interrupt)是需要显式调用的广播,状态广播(State)是隐式的广播,在订阅关系存在的情况下,当CSM运行完成某个状态,就会自动触发状态广播(State)。

  • 信号广播(Status): 普通优先级的广播,类似异步消息,会通过低优先级队列传递。当模块中存在其他未处理的异步消息或者信号广播时,会依次被处理。
  • 中断广播(Interrupt): 高优先级的广播,类似同步消息,会通过高优先级队列传递。当模块中存在其他低优先级的异步消息或者信号广播时,会被优先处理,但是如果存在其他未处理的同步消息或中断广播时,会被依次处理。
  • 状态广播(State): 状态广播是隐式的广播,在订阅关系存在的情况下,当CSM运行完成某个状态,就会自动触发状态广播(State)。状态广播的参数,为CSM状态的Response。

注意:

  • 信号广播或中断广播需要显示发送,名称不要和CSM状态名相同,否则可能出现多次触发的情况
  • 状态广播由于效率的考虑,只有订阅后才会发送,这就意味着必须注册才能在模块的广播事件中收到状态广播。

广播格式解析(Broadcast Format)

[CSM广播(CSM Broadcast)] >> [参数(Arguments)] -> <broadcast> // [注释(Comments)]
[CSM信号广播(CSM Broadcast)] >> [参数(Arguments)] -> <status> // [注释(Comments)]
[CSM中断广播(CSM Broadcast)] >> [参数(Arguments)] -> <interrupt> // [注释(Comments)]
  • CSM广播(CSM Broadcast): CSM的广播,不可包含CSM关键字和换行符。
  • >>: CSM广播(CSM Broadcast)和参数(Arguments)的分隔符。
  • 参数(Arguments): CSM 广播的参数,不可包含CSM关键字和换行符。
  • 广播类型(Broadcast Type): <broadcast>,<status>为信号广播(Status),<interrupt>为中断广播(Interrupt)。
  • 注释(Comments): 注释信息,不会被解析。

广播优先级(Broadcast Priority)

从名称上就可以看出,广播是有优先级的。状态广播(State)是一种特殊的广播,默认它的优先级与信号广播(Status)相同。 其中中断广播(Interrupt)为高优先级广播,与同步消息均使用高优先级队列进行传递; 信号广播(Status)为低优先级广播,与异步消息均使用低优先级队列进行传递。

// 默认的广播为信号广播,例如:
ModuleInternalChange >> Arguments -> <broadcast> // 低优先级
ModuleInternalChange >> Arguments -> <broadcast> // 低优先级

默认的优先级由发送方定义,通过广播格式中的广播类型(Broadcast Type)进行定义。

// 发送方可以定义广播的优先级
ModuleInternalChange >> Arguments -> <status> // 低优先级
ModuleInternalChange >> Arguments -> <interrupt> // 高优先级

默认的订阅不会改变优先级,但可以通过特殊的订阅格式,改变订阅后的广播优先级。

// 默认的订阅不改变优先级
ModuleInternalChange@SourceModule >> API@TargetModule -><register>
// 将订阅的广播改为普通优先级,无论之前是何优先级
ModuleInternalChange@SourceModule >> API@TargetModule -><register as status>
// 将订阅的广播改为高优先级,无论之前是何优先级
ModuleInternalChange@SourceModule >> API@TargetModule -><register as interrupt>

订阅(Subscription)

订阅是将广播与绑定的接口(API)关联起来,当广播被触发时,会调用绑定的接口(API)。当然,也可以取消订阅。 在CSM中,有以下两种广播:

  • 广播(Broadcast): 广播由模块显示的调用广播消息发送,参数需要显示给入。
  • 状态(State): CSM模块的任意一个状态,也可以被订阅。被触发的API收到的参数,为CSM状态的Response。
// 注册
[CSM广播(CSM Broadcast)]@[源模块(SourceModule)] >> [绑定的接口(API)]@[目标模块(TargetModule)] -><register> // [注释(Comments)]
// 取消注册
[CSM广播(CSM Broadcast)]@[源模块(SourceModule)] >> [绑定的接口(API)]@[目标模块(TargetModule)] -><unregister> // [注释(Comments)]
  • CSM广播: 由源模块定义,参考“CSM 广播格式解析”。
  • 源模块: 广播的模块,如果订阅任意模块的广播,源模块可以用*表示。
  • 绑定的接口: 由目标模块定义,为目标模块对外的接口。
  • 目标模块: 绑定的接口所在的模块。当在CSM模块中表示订阅到本模块,可忽略。同时省略前面的@分隔符。
  • <register>/<unregister>: 注册/取消订阅的操作类型定义。
  • 注释(Comments): 注释信息,不会被解析。

订阅位置(Subscription Location)

CSM订阅所添加的订阅规则,分为内部添加和外部添加两种。

  • 外部添加:外部添加的规则为全局规则,不会随着CSM模块的退出而自动删除,需要手动取消订阅。
    • 使用-<register>语句添加的规则,如果指明了API所在的模块名称,则为外部添加。
    • 使用 API CSM - Register Broadcast VI 添加的规则,均为外部添加。
  • 内部添加:CSM模块内部添加的规则,会随着CSM模块的退出而自动删除,无需手动取消订阅。
    • 只有使用语句-<register>添加的规则,且API未指明模块名称时,才为内部添加。

      例如:
      status@sourceModule >> API@TargetModule -><register> // 外部添加
      status@sourceModule >> API -><register> // 内部添加
      

参数(Arguments)

消息响应广播都能携带数据,这些数据被叫做参数

同步调用 (Sync-Call)

一个 CSM模块通过同步消息对另一个模块的调用,叫做同步调用。同步调用的过程

异步调用 (Async-Call)

一个 CSM模块通过异步消息对另一个模块的调用,叫做异步调用。异步调用的过程

results matching ""

    No results matching ""