TANGO 的主要目标是将设备视为具有方法和数据的网络对象,使它们成为真正的 C++/Java 对象,可以像本地一样进行实例化和远程访问。
IDL FILE #
IDL 文件包含以下网络接口:
- Device:所有控制对象(包括数据库)的基本接口。每个设备都有状态。通过执行传递一个输入参数并返回一个输出参数(TANGO 预定义数据类型之一)的命令,在设备上执行操作。命令可以同步或异步执行。异步命令必须提供回调对象才能接收答案。设备支持可读取或写入的属性列表。设备可以返回有关其自身或其状态的一般信息。每个设备都有一个包含最后 n 个命令的黑匣子并实现安全性。
- Callback:客户端对象将被服务器调用以返回异步响应。该回调有一个处理程序方法,该方法在解包响应时调用。
- Monitor:用于监视设备或属性的系统网络对象。客户登记他们的兴趣。
- Consumer:用于从监视器接收事件的客户端对象。
TANGO还支持一些伪网络接口。伪网络接口仅在客户端实现,而不在服务器中实现。支持以下伪网络接口:
- GroupDevice:用于对设备进行分组并在一组设备上执行命令的客户端对象
- GroupAttributes:用于对不同设备的设备属性进行分组并读取和写入它们的客户端对象。
代码仓库:https://gitlab.com/tango-controls/tango-idl
版本演化 #
TANGO 系统通过一系列逐步扩展的接口定义(从 Device 接口到 Device_6 接口),展示了对设备控制和数据管理需求的不断演进和适应。
- Device
- 基本功能: 提供设备的基础交互能力,包括同步执行命令、读写属性、获取设备信息等。
- 属性和命令的管理: 支持对设备属性的配置及读写,对设备执行的命令进行查询和执行。
- Device_2
- 轮询和缓存支持: 引入数据源参数,支持从设备直接读取或从轮询缓存读取数据。
- 命令和属性配置的扩展: 提供更详细的命令和属性配置信息,包括显示级别等。
- Device_3
- 增强的属性读写: 支持更复杂的属性读写操作。
- 扩展的设备信息: 提供更丰富的设备信息,包括设备类型等。
- 属性配置增强: 支持更详细的属性配置。
- Device_4
- 客户端识别: 引入客户端识别,用于命令执行和属性读写中。
- 历史记录增强: 引入命令和属性的历史记录查询,支持更详细的历史数据分析。
- 属性读写和配置的进一步增强: 支持更复杂的操作。
- Device_5
- 管道管理: 引入管道(Pipe)的概念和管理方法,包括管道的读写和配置。
- 属性配置和读写的最新扩展: 进一步增强了属性管理的能力。
- 增强的历史记录和配置管理: 支持对属性和管道的更复杂配置,以及历史数据的查询。
- Device_6
- 接口版本标记: 标识设备支持的TANGO版本为V10,没有引入新的方法或属性,主要作为版本更新的标识。
Device 的基本功能 #
Device接口是TANGO控制系统中的核心部分,定义了与TANGO设备进行交互的基本功能。这些基本功能构成了TANGO设备交互的基础,使得客户端能够控制和监视设备的状态,以及对设备进行配置和管理。通过这些接口,TANGO系统提供了一个强大而灵活的框架,用于实现复杂的设备控制逻辑和数据处理任务。
命令执行 #
command_inout
: 这是执行设备命令的基础方法,它允许客户端向设备发送命令并接收回应。该方法接受一个命令名(字符串形式)和一个命令输入参数(任意类型),返回命令的输出结果(也是任意类型)。这使得客户端可以执行如开关设备或调整设备参数等操作。
属性读写 #
read_attributes
: 允许客户端读取一个或多个设备属性的当前值。这个方法接收一个属性名的数组,并返回一个包含每个属性当前值的列表。每个属性值都包括实际的数据值、数据质量(如有效、无效、警告等)、时间戳等信息。write_attributes
: 使客户端能够设置一个或多个设备属性的值。客户端提供一个属性值列表,每个列表项包括属性名和新的属性值。这个方法不返回任何结果,但如果操作失败会抛出异常。get_attribute_config
: 用于获取一个或多个属性的配置信息,例如属性的数据类型、读写权限、最大维度等。这些配置信息对于理解属性的行为和约束条件非常重要。set_attribute_config
: 允许客户端为一个或多个属性设置新的配置。这可以包括改变属性的标签、描述、单位等元数据。
设备信息和状态 #
ping
: 这个方法用于检测设备是否在线和可达。如果设备响应,说明它是活跃的;如果没有响应,客户端可能会收到一个异常。info
: 提供设备的一般信息,如设备的类别、服务器标识、位置等。这对于了解设备的背景和运行环境非常有用。- 状态和描述属性: Device接口还定义了几个只读属性,如
name
(设备名)、description
(设备描述)、state
(设备状态)和status
(状态的文本描述)。这些属性为客户端提供了设备的基本信息和当前状态。
命令和属性的查询 #
command_list_query
: 返回设备支持的所有命令的列表。这对于客户端了解设备能够执行哪些操作非常有用。command_query
: 提供指定命令的详细信息(一个DevCmdInfo
结构),如命令的输入输出类型等,帮助客户端正确地构造命令调用。
Device_2 升级内容 #
Device_2接口的引入,主要是为了提升数据访问的灵活性和效率,通过引入数据源管理的概念,使得客户端可以根据实际需要选择最合适的数据获取方式;对属性和命令配置的增强,提供了更多的信息和配置选项,使得设备管理和操作更加灵活和精细。
轮询机制和数据源管理 #
-
命令执行带数据源(command_inout_2):
- 功能描述: 在Device接口的command_inout方法基础上增加了一个新参数DevSource source,这允许客户端指定命令执行结果的数据来源是直接从设备读取还是从轮询缓存中获取。
- 新增参数: DevSource source: 指定数据源,可以是设备直接(DEV)、缓存(CACHE)或先尝试缓存后设备(CACHE_DEV)。
- 改进点: 提高了数据访问的灵活性和响应速度,特别是在数据频繁更新的场合。
-
读取属性带数据源(read_attributes_2):
- 功能描述: 类似于command_inout_2,这个方法允许客户端在读取属性值时指定数据来源。
- 新增参数
DevSource source
: 允许选择数据来源,使得客户端可以更灵活地根据实际情况和需求选择读取数据的方式。
属性和命令的配置增强 #
-
获取属性配置(get_attribute_config_2):
- 功能描述: 扩展了get_attribute_config方法,提供了对属性更详细的配置信息,包括新增的显示级别(Display Level)等配置项。
- 改进点: 增强了属性配置的能力,使客户端能够更细致地管理和配置设备属性,支持更复杂的应用场景。
-
查询命令列表(command_list_query_2):
- 功能描述: 扩展了command_list_query方法,提供了命令配置中新增的显示级别等信息。
- 改进点: 提供了更为详尽的命令信息,使客户端可以根据命令的不同级别进行相应的操作,增强了用户界面的友好性和操作的适应性。
-
查询命令详情(command_query_2):
- 功能描述: 在command_query基础上增加了命令的显示级别信息。
- 改进点: 通过引入显示级别,使得对命令的描述更加丰富和详细,有助于客户端或用户界面根据不同的应用场景选择合适的命令进行操作。
Device_3 升级内容 #
Device_3接口相比Device_2主要在属性管理和设备信息获取方面进行了显著的增强和扩展,引入了更细致的属性读写能力和更丰富的设备及属性配置信息。
增强的属性读写能力 #
-
读取属性(read_attributes_3):
- 功能描述: 这个方法扩展了Device_2中的read_attributes_2,引入了AttributeValueList_3,提供了对属性读取操作的增强,允许更灵活地处理属性值及其质量信息。
- 改进点: 引入了属性维度信息和错误列表,使得客户端在读取属性时可以获取更多关于属性状态的详细信息,包括可能发生的错误。
-
写入属性(write_attributes_3):
- 功能描述: 提供了一个增强的属性写入方法,支持更复杂的错误处理机制,包括MultiDevFailed异常。
- 改进点: 在写入属性时,如果遇到错误,客户端可以得到更详细的错误信息,包括哪些属性写入失败及其原因,这对于错误诊断和异常处理非常有用。
设备信息的扩展 #
- 获取设备信息(info_3):
- 功能描述: info_3方法扩展了Device接口的info方法,提供了设备的更多信息,如设备类型等。
- 改进点: 这一扩展使得客户端可以获取更全面的设备信息,有助于更好地理解和管理设备。
属性配置的增强 #
-
获取属性配置(get_attribute_config_3):
- 功能描述: 该方法在Device_2的基础上进行了扩展,允许获取包括显示级别在内的更丰富的属性配置信息。
- 改进点: 提供了对属性配置更细致的控制和管理,使得属性的展示和操作可以根据不同的使用场景进行调整。
-
设置属性配置(set_attribute_config_3):
- 功能描述: 相比于Device_2,这个方法支持更复杂的属性配置设置,包括新引入的配置项。
- 改进点: 使得客户端能够根据需求对设备属性进行更详细的配置,增强了设备管理的灵活性和精确度。
属性和命令历史记录的查询 #
Device_3接口并没有直接新增与属性和命令历史记录查询相关的方法,这些功能在后续的接口版本中得到了扩展。Device_3主要集中在提高属性读写的灵活性和扩展设备信息及属性配置的功能上。
Device_4 升级内容 #
Device_4接口的引入标志着TANGO系统在客户端管理、操作审计、历史数据查询及操作效率方面的重大进步。
客户端识别 #
- 客户端识别(ClntIdent):
- 功能描述: Device_4引入了一个新的参数类型ClntIdent,用于在执行命令或读写属性时标识请求的客户端。这允许TANGO服务更准确地跟踪和管理来自不同客户端的操作,提高了系统的安全性和可追踪性。IDL 为 C++ 和 Java 客户端定义了不同的结构(CppClntIdent_6、JavaClntIdent_6),并提供与旧客户端识别机制的向后兼容性。
- 改进点: 通过客户端识别,TANGO系统能够为每个客户端提供定制化的服务和响应,同时增强了对操作的审计和控制能力。
增强的历史记录查询 #
-
命令历史记录查询(command_inout_history_4):
- 功能描述: 此方法扩展了历史记录查询功能,允许客户端获取指定命令的执行历史,包括命令的输入、输出以及执行时间等详细信息。
- 改进点: 为系统维护人员和应用开发者提供了强大的工具,以分析和诊断系统中的操作和事件,帮助提高系统的稳定性和性能。
-
属性值历史记录查询(read_attribute_history_4):
- 功能描述: 类似于命令历史记录的查询,这个方法允许查询特定属性的值变化历史,包括属性值、质量标志、时间戳等。
- 改进点: 增强了对设备状态和行为分析的能力,特别是在需要监控和回溯设备性能或状态变化的场合。
灵活的属性和命令操作 #
- 带客户端识别的命令执行(command_inout_4):
- 功能描述: 这个方法扩展了command_inout_2,增加了客户端识别参数,使得命令执行可以关联到特定的客户端请求。
- 改进点: 提高了命令执行的安全性和可追踪性,有助于在多客户端环境中管理和控制对设备的访问。
- 带客户端识别的属性读写(read_attributes_4和write_attributes_4):
- 功能描述: 这些方法在属性读写操作中引入了客户端识别,使得每次属性操作都可以与发起操作的客户端相关联。
- 改进点: 这增强了属性操作的安全性和个性化处理能力,特别是在复杂的系统环境中,能够有效地管理和控制不同客户端对属性的操作。
- 写后读属性(write_read_attributes_4):
- 功能描述: 新增的方法允许客户端在单个操作中先写入一组属性值,然后立即读取另一组(或相同的)属性值,这种原子操作减少了网络通信次数,提高了操作效率。
- 改进点: 对于需要频繁更新并立即读取最新状态的应用场景,这个方法显著提高了效率和响应速度。
Device_5 升级内容 #
更高级的属性配置 #
- 获取和设置属性配置(get_attribute_config_5和set_attribute_config_5):
- 功能描述: 这两个方法扩展了Device_4中对属性配置的操作,引入了更详细的配置选项,如属性的记忆化(memorization)设置,允许系统记住属性的最后值并在设备重启时恢复这些值。
- 改进点 最小/最大报警值(min_alarm、max_alarm): 允许用户为属性设置最小和最大的报警阈值。当属性值超出这些阈值时,系统可以触发相应的报警,提示用户进行检查或采取行动
增强的属性和管道读写能力 #
- 读取属性(read_attributes_5):
- 功能描述: 进一步增强了读取属性的能力,允许在读取属性时提供更详细的信息,如数据类型、数据格式等。
- 改进点: 增强了对属性数据处理的灵活性,使客户端能够更准确地处理和解析返回的属性值。
- 写后读属性(write_read_attributes_5):
- 功能描述: 此方法允许在单个操作中先写入一组属性值,然后立即读取一组(可能是不同的)属性值,进一步提升了Device_4中引入的相关操作的灵活性和效率。
- 改进点: 通过减少网络通信次数,提高了操作效率,特别是对于需要频繁更新状态并快速获取最新状态的控制逻辑。
- 获取和设置管道配置(get_pipe_config_5和set_pipe_config_5):
- 功能描述: 新增了对管道(一种复杂数据结构的集合)的配置读取和设置方法,允许客户端管理和控制管道的行为。
- 改进点: 管道是TANGO系统中用于处理复杂数据传输的一种机制,这些方法提供了对管道高度灵活的配置和管理能力,适用于复杂的数据处理需求。
管道操作 #
- 读写管道(read_pipe_5、write_pipe_5和write_read_pipe_5):
- 功能描述: 这一系列方法提供了对管道数据的读取、写入以及写后读操作,允许客户端与设备之间进行复杂数据结构的高效通信。
- 改进点: 通过支持复杂数据结构的传输,这些方法使得TANGO系统能够更好地处理高级数据处理场景,如实时数据分析、复杂的设备控制逻辑等。
Device_6 升级内容 #
Device_6主要作为一个版本标记,表明设备或TANGO服务支持或兼容至TANGO版本10的特性和API。
属性值 #
基本属性值
- AttrQuality:描述属性值的质量,指示属性值是有效、无效、处于报警状态、正在变化还是处于警告状态。这使客户能够了解他们收到的数据的可靠性。
- AttrWriteType:指定属性的写入能力,例如只读、只写或读写,并包含未定义状态的未知类型。
- AttrDataFormat:定义属性的数据格式,区分标量值、光谱和图像,并使用未知格式的占位符。
- DevSource:表示设备信息的来源,区分直接设备访问、缓存或两者的组合。
- ErrSeverity:枚举错误的严重级别,包括警告、错误和恐慌级别,这有助于确定问题的优先级。
- DevState:列出设备可能的状态,涵盖开、关、移动、故障等常见状态,这对于管理和监控设备操作至关重要。
- DispLevel:区分显示级别或访问级别,例如操作员和专家,可能根据用户的角色控制某些设备功能的可见性或访问。
- 跟踪上下文传播:定义包括用于传播跟踪上下文的结构 (W3CTraceContextV0),采用“W3C 跟踪上下文”标准。 这对于分布式系统调用的可观察性和监控非常重要,确保不同组件和服务之间的可追溯性。
- 客户端标识 (ClntIdent):扩展客户端标识机制以包含跟踪上下文以实现可观察性。 这对于识别和跟踪来自不同客户端的请求至关重要,尤其是在分布式环境中。
- LockerLanguage Enum:该枚举用于选择 ClntIdent 联合的编组/解组机制,支持 pre-IDL6 和 IDL6 数据结构。 这使得该接口能够支持不同版本的客户端识别,确保不同版本的TANGO系统之间的兼容性。
- 模块化和可扩展性:该 IDL 文件中模块(例如 Tango 模块)的使用以及数据类型和结构的定义演示了设计模块化和可扩展系统的方法。 这种设计允许轻松添加新功能和组件,同时保持向后兼容性。
杂项结构
- TimeVal:表示时间值的结构,可能用于时间戳或调度目的。
- DevCmdInfo 和 DevCmdInfo_2:定义命令信息的结构,包括命令名称、输入和输出类型及其描述。 DevCmdInfo_2 使用附加显示级别字段扩展了 DevCmdInfo,指示预期的用户界面级别。
错误处理机制
- DevError:包含有关错误的详细信息,包括原因、严重性、描述和来源。 这种结构可以实现详细的错误报告。
- NamedDevError:使用名称和索引扩展 DevError,可能用于分组或识别错误较大操作或命令序列中的错误。
- DevFailed 和 MultiDevFailed:处理错误和失败的异常,DevFailed 提供错误列表,MultiDevFailed 提供报告多个命名错误的方法。
属性管理
- 属性配置结构:AttributeConfig、AttributeConfig_2、AttributeConfig_3和AttributeConfig_5详细配置设备属性,包括名称、写入类型、数据格式、数据类型、维度、描述、单位、格式、值约束以及进一步定制的扩展。 这些结构演变为包括更详细的配置,例如警报设置、事件属性,并且在最新版本(AttributeConfig_5)中,还包括属性的记忆设置和枚举标签。
- 属性值结构:这些结构(AttributeValue、AttributeValue_3、AttributeValue_4 和 AttributeValue_5)表示属性的值及其质量、时间戳、维度和错误列表(如果适用)。 它们不断发展以支持更复杂的数据结构和详细的错误报告。
- 属性数据类型和联合:AttributeDataType 枚举和 AttrValUnion 提供了一种灵活的机制来表示不同类型的属性值,包括布尔值、数字类型、字符串、设备状态和编码数据。 这允许属性保存与设备操作和监控相关的各种数据。
- 事件和警报配置:ChangeEventProp、PeriodicEventProp、ArchiveEventProp、EventProperties 和 AttributeAlarm 等结构允许配置属性更改如何根据特定阈值或周期触发事件和警报。 此功能对于自动监控和响应系统至关重要。
管道管理
- 管道配置:PipeConfig 结构定义管道的配置,管道是设备之间或客户端与设备之间的数据管道。 配置选项包括名称、描述、标签、访问级别、写入类型和其他设置的扩展。
- 管道数据结构:DevPipeDataElt、DevPipeBlob 和 DevPipeData 结构有助于管道内的复杂数据处理,允许嵌套数据结构 (DevPipeDataElt)、用于对数据元素进行分组的 blob (DevPipeBlob) 以及带有时间戳的整体管道数据结构 (DevPipeData)。
数据就绪事件和设备接口更改
- AttDataReady:此结构用于通知与属性关联的数据何时准备就绪,包括属性名称、其数据类型以及用于跟踪更新的计数器。
- DevIntrChange:表示设备接口更改事件,指示设备是否已启动并列出属于设备接口的命令和属性。 这对于设备功能可能随时间变化的动态系统至关重要。
设备信息
- DevInfo 和 DevInfo_3:这些结构提供有关设备的基本和扩展信息,例如其类、服务器 ID、服务器主机、服务器版本、文档 URL 和设备类型(在 DevInfo_3 中)。 此信息对于管理设备和与设备交互至关重要。
命令和属性历史记录
- 历史结构:包括 DevCmdHistory、DevAttrHistory 及其版本,这些结构允许跟踪命令执行和属性更改的历史记录,包括时间戳、成功/失败状态、值、维度和错误。 这些历史数据对于诊断、审核和了解设备随时间的变化至关重要。
ZeroMQ事件系统
- ZmqCallInfo:详细说明通过 ZeroMQ 事件系统进行的调用,包括版本、计数器、方法名称、对象 ID 以及调用是否导致异常。 该结构支持TANGO的事件驱动架构,促进高效的通信和事件处理。
设备接口
- 设备接口:定义 TANGO 设备的核心接口,包括设备名称、描述、状态、状态和管理员名称等属性。 它提供了执行命令、读取和写入属性配置和值、对设备进行 ping 操作以了解可用性、检索设备信息以及查询支持的命令的方法。 该接口是与 TANGO 设备交互的支柱,支持同步和异步操作。