【AMC】异步消息通信框架讲解(一)

1.安装ACM异步消息通信库

        打开VI Package Manager,搜索AMC,安装库即可。

        安装完成以后,可以在函数面板中找到对应的库

         

        也可以打开对应的范例熟悉一下函数功能,范例除了一个需要设备以外,其他的都可以直接跑。

 2.AMC概述

        异步消息通信 (AMC) 库是一个通用 LabVIEW API,用于在 LabVIEW 应用程序中的进程内、进程之间以及不同 LabVIEW 目标(网络上的系统)之间发送消息。

        队列消息处理器 (QMH) 设计模式是一种通用 VI 架构,可用作各种 LabVIEW VI 的基础。它使用 AMC API 发送和接收消息。此设计模式可用于实现状态机、应用程序的用户界面、异步通信处理器以及大型应用程序中的其他任务和系统组件。

        此设计模式与其他 VI 架构实现类似,通常称为排队状态机。由于此设计模式除了用于传统状态机和面向状态的任务之外,还可用于许多其他用途,因此选择此设计模式的名称来代表设计模式的实现。

        异步消息通信 (AMC) 库的目的是为各种本地和分布式 LabVIEW 应用程序提供易于使用的可扩展消息传递架构。它允许您在应用程序的一个进程内、一个 LabVIEW 目标上的不同进程之间或通过以太网连接的不同 LabVIEW 目标上的进程之间发送消息。

        在本讨论中,LabVIEW 应用程序进程是您作为应用程序的一部分定义的单个正在进行的操作。它们通常使用 While 循环或定时循环来实现,但在某些情况下也可能由 For 循环或其他有限程序结构组成。进程可能包括应用程序的用户界面 VI、I/O 引擎、通信引擎、数据记录引擎或状态机驱动的控制进程。AMC 库用于在这些进程之间发送不同的消息。消息可能是另一个进程启动特定操作、执行特定操作的命令,可能是状态更新,可能是应用程序特定部分故障或错误的通知等。API 旨在用于以未定义间隔发生且通常不太频繁的异步消息。需要在特定进程(例如数据流)之间频繁且定期发送的消息或数据可以使用其他技术(例如用于本地进程的原始 LabVIEW 队列或用于分布式进程的基于 TCP 的通信)以更好的运行时性能实现。简单 TCP 消息传递 (STM) 参考库是专为吞吐量性能而设计的基于 TCP 的通信架构的良好示例。

3.消息(message)

        消息是包含在 LabVIEW 群集中的一条信息,由 AMC 库中的类型定义 (TypeDef) 定义。可以通过添加其他元素或更改现有元素来自定义 TypeDef,以满足应用程序的需求。AMC 库中包含的消息定义包含消息名称(字符串)、值(字符串)、属性(键控字符串数组)和一些其他参数,例如接收方主机、接收方进程等。这些其他参数由 AMC 基础架构使用,除非您清楚地了解它们在库的不同函数中的使用方式,否则不应更改或删除它们。

        

        有些开发人员可能更喜欢使用 变体 而不是字符串作为消息值,或者使用变体属性来存储其他属性,而不是键控数组。如果您确实修改了消息 TypeDef,您还需要调整库中的几个函数,例如与 XML 之间的转换,以匹配消息类型。

本地发送消息

        AMC 库最简单的用途是将消息从进程的一个部分发送到另一个部分。一种常见的此类应用是在排队消息处理程序 (QMH) 设计模式中使用 AMC VI,本文后面将对此进行介绍。在 QMH 设计模式中,事件处理程序(例如 UI 事件结构)从源(本例中为 UI)捕获事件,并将它们作为消息传递到进程的另一部分(消息处理器)进行处理。AMC 在单个进程中的其他应用是任何类型的生产者/消费者设计模式。

        在内部,AMC 库 VI 使用 LabVIEW 队列来缓冲发送方和接收方之间的消息。

         AMC VI 的一个稍微高级一点的用例是将消息从一个进程发送到另一个进程。在同一个 LabVIEW 目标上。消息仍然通过 LabVIEW 队列发送,因为可以在两个进程中引用同一个队列。在这种情况下,每个接收方进程将实例化一个命名的消息队列,任何其他进程都可以使用消息队列名称向接收方进程发送消息。每个发送方队列使用接收方进程提供的队列名称引用接收方进程和队列。

        对于两个或多个进程之间的双向消息通信,每个接收进程将创建自己的接收队列,任何其他进程都可以将其消息发送到每个接收者的公共队列。这意味着每个进程只需要一个消息队列,而不必在每对通信进程之间建立单独的连接。

通过网络发送消息

        当通过网络将消息从一个 LabVIEW 目标传递到另一个时,必须使用网络传输协议传递消息。AMC 库使用的协议是 UDP,因为它不需要在每对通信目标之间建立连接。这使得 AMC 库能够在分布式 LabVIEW 应用程序中轻松地在网络上的任意数量的目标之间传递消息。 

        为了在接收方处理使用 UDP 发送的消息,每个将接受传入消息的目标都必须运行 AMC Dispatcher 进程。此进程维护一个开放的 UDP 端口并侦听来自网络上任何其他目标的传入消息。当在调度程序中收到消息时,它会转发到本地接收方进程的消息队列。接收方进程的名称包含在消息本身的参数中。

        使用这种设计,一个目标上的进程可以向应用程序中另一个目标上的任何命名进程发送消息。发送者只需要知道目标名称(IP 地址)和远程目标上的接收者进程的名称。

        AMC Dispatcher 提供了许多后面描述的附加服务功能,这些功能可以在应用程序中用于验证各个远程目标和进程的存在,以及枚举远程目标上可用的所有进程。

4.API介绍

        AMC API分为三种类型:

  • 发送和接收消息并管理本地消息队列
  • 管理本地和远程 AMC 调度程序
  • 注册和注销本地消息队列

        创建消息队列:用于创建一个新的消息队列,或者获取已经存在的消息队列。每个将要接收消息的进程都使用“创建消息队列”VI 来创建一个具有唯一名称的新消息队列。该名称由进程本身提供。创建新消息队列时,您还可以将一些初始消息放入队列中,这些消息将由进程读取。这通常用于 QMH 设计模式中,以在本地进程中执行一些初始化操作。

        销毁消息队列: 当进程关闭时,任何由该进程创建的消息队列必须使用此函数终止,并返回对立中剩余的消息。

         发送本地消息:将消息发送到本地目标上的进程。如果进程输入为空,则消息将发送到消息队列输入参数引用的消息队列,否则消息将发送到进程名称指定的本地消息队列。优先级消息输入允许您将消息放在消息队列的前面而不是后面。放在队列前面的消息将是接收进程中第一个出队的消息。

        发送网络消息:将消息发送到远程目标上的进程。此 VI 使用 UDP 将消息直接发送到接收方主机输入中指定的远程目标,AMC 调度程序会将消息转发到接收方进程输入中指定的本地消息队列。

         检查消息队列状态:检查其本地队列的状态以及队列中的消息数量。

         读取下一条消息 : 用于从消息队列中检索要在本地进程中处理的下一条消息。消息队列通过队列引用传入,因为它将在同一进程中创建。终止列表输入用作 QMH 设计模式或其他类似消息处理器的一部分。任何与终止列表中的任何名称匹配的出队消息都将导致 VI 的退出进程输出设置为 True。这可用于自动终止处理器循环。默认终止消息为“退出”。

 

       刷新消息队列: 如果需要,进程可以清空本地消息队列并删除所有等待消息,而无需使用刷新消息队列 VI 进行处理。

 

       将队列添加到注册表:注册消息队列,把指定名称的消息队列添加到注册表中。

         从注册表中获取队列:从注册表里获得指定名称的消息队列。

        获取注册表中所有的消息队列。

 

         队列注册表:管理消息队列注册表的属性。是LabVIEW功能全局变量和相关接口,用于跟踪一个目标中使用的消息队列列表。

        要使用 AMC 通过以太网接收消息,必须在接收 LabVIEW 目标系统上运行 AMC Dispatcher。AMC Dispatcher 是一个独立的 VI 和进程,它打开并监控 UDP 端口以接收传入消息,并根据每条消息中的接收方进程参数将它们转发到本地目标上的不同消息队列。

        在大多数 LabVIEW 目标(Windows XP、Windows XP 嵌入式、Windows Vista 和 LabVIEW Real-Time)上,您可以使用 Dispatch Start VI 和 Dispatch Stop VI 动态启动和停止 AMC Dispatcher。在 LabVIEW Windows CE 目标上,您必须将 AMC Dispatcher 放置在主 VI 中,与应用程序的其余部分并行,从而静态调用它。静态调用时,AMC Dispatcher 是一个常规子 VI,除非通过向 AMC Dispatcher 本身发送退出消息来终止它,否则它不会返回。

        MC Dispatcher 函数面板提供了额外的服务函数,可用于进一步自动化您的应用程序或验证远程目标。这些 VI 向在远程目标上运行的 AMC Dispatcher 发送不同的请求。所有这些函数都要求 AMC Dispatcher 也在发出这些请求的本地目标上运行,因为远程 Dispatcher 将发回本地 AMC Dispatcher 收到的响应。

        启动调度器:异步启动调度器程序,用于接收网络中其他目标主机发送的消息。

        获取本地调度器端口

        停止调度器

        测试调度器通信:用于向本地子网上的特定/所有网络目标发送 ping,这将促使本地子网上的所有 AMC 调度程序做出响应。此函数用于建立本地子网上可接收 AMC 消息的目标列表

 

        确认调度器队列消息:向特定目标发送查询,并验证特定命名的消息队列和相关进程是否存在。此 VI 用于确定特定进程是否正在运行并且能够接收消息。

        获取所有调度器的队列消息:请求指定远程目标上可用的所有消息队列列表。 

        UDP调度器

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值