首页> 中国专利> 暴露的信息模型与应用的集成中具有降低复杂度的系统和方法

暴露的信息模型与应用的集成中具有降低复杂度的系统和方法

摘要

提供用于信息模型与对应应用的自动模型集成的系统(100)、方法和计算机程序产品。信息模型服务器(130)向消费者(200)暴露信息模型。暴露的信息模型具有模型元素(131),其用于暴露类型或类别以及用于暴露类型或类别及其成员值的实例。应用组件(110)提供采用映射描述(113)所扩充的应用代码,所述映射描述(113)定义应用的内部信息模型如何被映射到暴露的信息模型。模型集成组件(120)注册将要暴露的内部信息模型元素;按照映射描述将所注册的内部信息模型元素(111)映射到暴露的信息模型元素(131);以及通过使用双向同步机制来更新(310,320)信息模型元素。

著录项

  • 公开/公告号CN112166429A

    专利类型发明专利

  • 公开/公告日2021-01-01

    原文格式PDF

  • 申请/专利权人 ABB瑞士股份有限公司;

    申请/专利号CN201980037707.0

  • 申请日2019-06-07

  • 分类号G06F30/20(20200101);

  • 代理机构72001 中国专利代理(香港)有限公司;

  • 代理人郑浩;姜冰

  • 地址 瑞士巴登

  • 入库时间 2023-06-19 09:23:00

说明书

技术领域

本发明一般涉及与信息模型的应用集成,以及更特别涉及将应用的内部信息模型(数据模型)与暴露的信息模型同步。

背景技术

当前,(装置上的)应用与网络上暴露的信息模型(例如OPC统一架构(UA)模型)的集成是手动任务。这种手动任务是容易出错的,因为现代应用的信息模型能够变得很复杂,以及应用数据模型的相应元素通常具有隐晦名称(cryptic name),从而使得人类用户难以实现用于集成的正确工作配置。此外,应用中的变化必须在设计时间手动转移到信息模型中的变化,从而引起应用执行的中断。

应用通常具有嵌入式数据模型,其例如通过编程语言来定义为对象或数据结构。这种嵌入式模型在本文中称作内部信息模型。难题是要将这类现有内部信息模型映射到对应暴露的信息模型。暴露的信息模型的示例是如由IEC 62541-3, Edition 2.0, 2015-03,(OPC Unified Architecture – Part 3: Address Space Model)和IEC 62541-5,Edition 2.0, 2015-03, (OPC Unified Architecture – Part 5: Information Model)所定义的基于OPC UA的信息模型,地址空间等同暴露的信息模型的实例。信息模型与应用的集成是复杂任务,它通常要求大量手动编程工作量和附加组件来管理应用与外部暴露的信息模型之间的交互。现有工具(SDK或编程资料库)提供用来定义信息模型的手段,但是它们缺乏如何将应用内定义的遗留数据模型迁移到能够在网络上暴露的信息模型(例如经过OPC UA服务所处理)中的概念。现有手动集成机制对人类是复杂和容易出错的,因为开发人员需要具有目标信息建模技术、所采用的SDK、从应用数据模型到目标信息模型的概念映射的详细知识,同时保存应用的语义。

发明内容

存在对于提供用于以降低复杂度来改进应用的内部信息模型与暴露的信息模型的集成的灵活性以提供更健壮模型集成方式的系统和方法的需要。

上述技术问题通过具有如独立权利要求所要求保护的特征的计算机系统、计算机实现方法和计算机程序产品来解决。要求保护的实施例允许信息建模与应用的无缝集成,从而消除对集成代码的手动创建的需要。要求保护的方式提供在运行时对应用元素的即时值(live value)的直接访问。它进一步允许在应用运行时期间内省(introspect)和修改信息模型结构。

为了解决这个技术问题,采用映射描述来扩充应用代码(例如应用的内部信息模型(数据模型),以实现暴露的信息模型中的注解类型/类别的自动暴露。扩充码能够经由包括映射描述的注解在代码中直接实现,以便再使用应用代码以用于构成暴露的信息模型。备选地,映射描述可与代码分开存储(例如在XML文件中)。分开存储的映射描述能够与相应代码部分直接相关。注解能够如同代码内的注释那样用来提供对将代码与暴露的信息模型相集成所要求的附加信息。这些注解能够在运行时期间来评估,并且与通过代码隐式提供的信息相组合。例如,类别签名(名称、继承、接口)、字段签名(名称、类型、值)和方法签名(名称、输入和输出参数)能够用来构成暴露的信息模型,并且将暴露的信息模型与代码或内部信息模型相集成。信息建模与应用代码的集成能够基于从利用注解的建立的技术(例如比如Java持久化API(JPA)、用于XML绑定的Java架构(JAXB)或用于RESTful/XML WEB服务的Java API(JAX-RS))已知的机制和概念。用于注解的基本概念能够概括为:

暴露的信息模型是独立的,因为它提供对于由客户/消费者处理暴露的信息所需的全部元数据。例如,客户/消费者能够是与信息模型服务器进行交互的另一个系统,或者它能够是经过适当软件应用与信息模型进行交互的人类用户。这包括类型声明信息。这还包括与所转移串行化数据的解码和编码有关的信息。暴露的信息模型基本上沿用从节点和边缘所组成的图表模式。节点和边缘始终基于预定义类型来创建(类型安全模型)。边缘通过对关联节点的引用来表示。

经过暴露的信息模型,客户/消费者能够浏览应用的实际配置,并且然后利用暴露的模型中表示的类型/类别在应用运行时创建暴露的信息模型中的实例。换言之,客户/消费者能够经由暴露的信息模型与模型元素进行交互。这些交互元素具有两个主要目的:首先允许客户/消费者改变应用的应用数据模型,以及其次使客户/消费者知悉应用中发生的变化。模型和对象结构的自动映射能够用来在运行时期间相应地例示应用中的内部对象。这个自动映射允许双向同步信息模型的元素。在一个实施例中,两侧的句柄(handler)能够用来使用附加业务逻辑来操控请求和更新。

在一个实施例中,提供用于信息模型与对应应用的自动模型集成的计算机系统。如本文所使用的,模型集成涉及模型结构集成和/或模型内容集成,并且在应用运行时发生。模型结构集成和模型内容集成通过提供部件来实现,所述部件允许在应用模型结构的暴露的信息模型与内部信息模型之间进行同步或者同步在信息模型的任一个模型中发生的内容值变化。也就是说,在暴露的信息模型中发生的变化将触发对应内部信息模型中的更新,并且反之亦然。

计算机系统包括信息模型服务器,其用来向消费者暴露信息模型。信息模型服务器是实现对暴露的信息模型的访问的组件。由信息模型服务器所实现的访问功能可包括用来浏览地址空间、读取和写入属性值、创建或删除模型-元素之间的引用、获得事件通知以及创建和删除暴露的模型-元素的服务。

在软件工程和数据建模的领域内,信息模型通常是实体类型的抽象正式表示,其可包括它们的性质、关系以及能够对它们执行的操作。模型中的实体类型可以是现实世界对象的种类(例如网络中的装置或发生事件),或者它们本身可以是例如计费系统中使用的实体的抽象。通常,它们用来对于能够通过实体类型、性质、关系和操作的闭集来描述的约束域进行建模。信息模型提供对问题域的描述的形式体系,而没有约束那个描述如何被映射到软件中的实际实现。可存在信息模型的许多映射。这类映射通常被称作数据模型,而不管它们是对象模型(例如使用UML)、实体关系模型还是XML方案。应用数据模型在本文中又称作内部信息模型。

多种信息建模语言存在,包括但不限于:实体-关系(ER)图形记号,集成定义语言1扩展(IDEF1X),EXPRESS语言和统一建模语言(UML),对象-角色建模语言(ORM)和完全面向通信的信息建模(FCO-IM)。一些建模语言参照术语“类型”,而其他语言使用术语“类别”。由于这些原因,本文中同义地使用信息模型元素的类型/类别。暴露的信息模型具有用于向消费者暴露类型以及用于暴露类型及其成员值的实例的暴露的模型元素。暴露的模型元素可具有作为暴露的信息模型的组成部分的用于暴露类型的类型空间,并且可具有用于暴露类型及其成员值的实例的实例空间。

计算机系统的应用组件提供采用映射描述所扩充的应用代码。如本文所使用的那样提供应用代码表示提供用于从应用组件外部来访问应用代码的部件。映射描述定义应用的内部信息模型如何被映射到暴露的信息模型。例如,特定映射描述能够配置成选择将要在暴露的信息模型的类型空间中暴露的内部信息的一个或多个类型定义(类别)。

计算机系统的模型集成组件注册(register)将要暴露的内部信息模型元素。模型集成组件能够访问由应用组件所提供的应用代码。扩充码中的映射描述用来选择相应内部信息模型元素,它们被注册在系统的注册表中。集成组件的映射模块按照映射描述将所注册的内部信息模型元素映射到对应暴露的信息模型元素。映射模块配置成通过解析相应内部信息模型类型(类别)的字段和方法连同对应映射描述来映射所注册的内部信息模型元素,并且将基于实例的暴露的信息模型元素映射到内部信息模型实例。

模型集成组件的同步器模块能够当相应模型元素发生变化时在两个方向上同步暴露的信息模型和内部信息模型的内容值。它能够通过创建或删除相应模型元素来在两个方向上进一步同步信息模型的模型结构。换言之,同步器执行双向对象模型同步,其包括用来创建和删除对象、读取和写入性质、转发事件以及调用方法的服务。这个机制在运行时将即时暴露的信息模型与应用相耦合。

为了同步与信息模型元素关联的变化,系统检测内部或暴露的信息模型元素的变化。例如,事件监听器能够用来观测模型元素,并且通知同步器关于对模型元素发生的任何变化。同步器然后确定用于向其他信息模型(内部/暴露的)传播信息模型(暴露的/内部)中的一个的所检测到的变化的同步方向。例如,同步器可比较与信息模型元素关联的时间戳,以确定最近变化是否对内部信息模型元素或者对暴露的信息模型元素发生。具有最近变化的信息模型则用作同步方向的原点(origin)。换言之,如果对于暴露的模型信息元素检测到最近变化,则同步方向指向内部信息模型中的对应元素。如果对于内部模型信息元素检测到最近变化,则同步方向指向暴露的信息模型中的对应元素。所允许同步方向也能够通过映射描述来限制或定义。备选地,触发同步的方式能够用来确定同步方向。例如,同步器模块能够提供用来触发更新的方法。这种方法还能够被参数化,以限制/定义同步方向。

同步器具有与特定内部信息模型元素与特定暴露的模型元素之间的相干性有关的信息。换言之,同步器能够确定与经改变的模型元素相关的对应模型元素。例如,ID映射能够用于这个目的。如果暴露的模型元素被改变,则确定对应内部模型元素,并且反之亦然。

使用与映射描述相组合的内部信息模型元素的签名(例如类别签名(名称、继承、接口)、字段签名(名称、类型、值)或方法签名)的配对(match-making)用来将暴露的模型元素的结构与内部信息模型的结构进行同步,这在其中内容值对应于具有子对象的复杂对象(complex object)的情况下可能是必需的。

如果暴露的信息模型元素及相关内部信息模型元素的签名匹配,则同步器按照所确定的同步方向来同步暴露的信息模型元素和相关内部信息模型。换言之,同步器检测同步方向,并且基于内部信息模型元素与暴露的模型元素之间的已知相干性来执行内容值或模型结构元素的同步。

例如,在检测到第一暴露的对象的变化的情况下,同步器检查第一暴露的对象是否具有暴露的信息模型中定义的与第二暴露的对象的关联。如果存在这种关联,则同步器(synchronizes)进一步检查对应于第一暴露的对象的内部对象是否与对应于第二暴露的模型元素的第二内部模型元素的字段的签名相匹配。如果存在签名匹配,则第二内部模型元素的字段值设置成第二暴露的模型元素的字段值。在检测到第一内部对象的变化的情况下,同步器处理(例如解析)第一内部对象的字段,以确定第一内部对象的子对象。同步器然后检查对应于第一内部对象的第一暴露的对象是否具有暴露的信息模型中定义的与对应于子对象的第二暴露的对象的关联。如果关联与第一内部对象的特定字段处的签名或映射描述匹配,则在内部信息模型中相应地创建对应关联。

在一个实施例中,提供一种在应用运行时同步应用的内部信息模型与暴露的信息模型之间的内容值的计算机实现方法。内部信息模型元素经由包括映射描述(所述映射描述定义应用数据模型如何被映射到暴露的信息模型)的应用代码来映射到暴露的信息模型元素。该方法包括:检测暴露的信息模型元素或内部信息元素的变化;确定同步方向;执行配对以通过使用与映射描述相组合的相关信息模型元素的签名来确定与经改变的模型元素对应的模型元素;以及如果签名匹配,则按照所确定的同步方向来同步对应内部信息模型元素和暴露的信息模型元素的内容值。

在内容值是原始值的情况下,同步器能够直接更新所确定的对应模型元素的内容值。原始值(或原始数据类型)是不能进一步划分的值(即,它没有其他结构或方法)。在内容值表示阵列(或集合体、向量)的情况下,同步器比较用于每个阵列元素的匹配引用并且与其同步。在内容值是与包括子对象的复杂对象相关的非原始值的情况下,同步器递归地应用执行配对并且将内容值与复杂对象的全部子对象进行同步的步骤。

在另一个实施例中,提供一种用于在应用运行时同步信息模型结构的计算机实现方法。内部信息模型元素再次经由采用映射描

换言之,如果内部对象在应用运行时作为应用的经改变的实例来创建或去除,则相应变化被传播到信息模型服务器,并且在同步之后在暴露的信息模型中被反映。同样,如果暴露的对象在应用运行时作为暴露的信息模型的经改变的实例来创建或去除,则相应变化被传播到应用组件,并且在同步之后在内部信息模型中被反映。

能够由计算机系统在将相应计算机程序加载到计算机系统的存储器中并且由计算机系统的一个或多个处理器执行所述程序时执行计算机实现方法。

通过在所附权利要求书中特别所描绘的元件和组合,将会认识和获得本发明的另外的方面。要理解,以上一般描述和以下详细描述两者只是示范和说明性的,而不是对如所述的本发明的限制。

附图说明

图1是按照实施例的用于信息模型与对应应用的自动模型集成的计算机系统的框图;

图2A是按照实施例的用于同步应用的内部信息模型与暴露的信息模型之间的内容值的计算机实现方法的简化流程图;

图2B是按照实施例的用于同步应用的内部信息模型与暴露的信息模型的信息模型结构的计算机实现方法的简化流程图;

图2C、图2D图示具有对象之间的关联的两个同步情形;

图3A图示能够用来定义信息模型的应用代码注解的示例;

图3B图示使用沿用OPC UA元模型的注解类别的应用代码示例;

图4A至图4E图示按照五个实施例的用于在应用运行时集成内部和暴露的信息模型的集成机制;

图5是示出可与本文所述技术一起使用的通用计算机装置和通用移动计算机装置的示例的简图。

具体实施方式

图1是按照实施例的用于信息模型与对应应用的自动模型集成的计算机系统100的示例实施例的框图。由此,模型集成涉及模型结构集成或模型内容集成,并且在应用运行时发生。换言之,在一个方面中,模型集成能够操控应用的内部信息模型(有时又称作应用数据模型)与暴露的信息模型之间的值的同步。在另一方面中,模型集成能够操控两个信息模型之间的模型结构变化的同步。

图2A是用于同步应用的内部信息模型与暴露的信息模型之间的内容值的计算机实现方法1000的简化流程图。

图2B是用于同步应用的内部信息模型和暴露的信息模型的信息模型结构的计算机实现方法2000的简化流程图。计算机系统100配置成当同步信息模型时执行两种方法1000、2000。要注意,内容值和模型结构同步能够在系统100中单独发生。

计算机系统100的描述在图2A、图2B的流程图的上下文中公开本发明的实施例。因此,以下描述使用参照图1、图2A和图2B的参考数字。计算机系统100包括三个主要组件:信息模型服务器130、应用组件110和模型集成组件120。

信息模型服务器130具有用来向消费者200暴露信息模型的功能。消费者是从计算机系统100外部来访问暴露的信息模型的外部实体。这种外部实体可以是另一个计算机系统或者使用客户端计算机的人类用户。人类用户可对模型手动应用改变操作。另一个系统可运行某个软件(例如工程工具),所述软件作为其自己的逻辑的组成部分(例如访问远程API)来访问信息模型。暴露的信息模型描述信息模型服务器的地址空间的标准化节点。这些节点是用于诊断或者用作到服务器特定节点的入口点的标准化类型以及标准化实例。例如,暴露的信息模型能够定义空OPC统一架构(OPC UA)服务器的地址空间,以实现互通性。为了使通过地址空间所暴露的数据是由相异系统(diverse system)相互可理解的,暴露的信息模型将相应信息表示标准化为计算机中心的数据。这个内容能够用作用来通过浏览来发现与任何客户相关的全部信息的起始点。

暴露的信息模型包括用于暴露类型或类别以及用于暴露类型或类别(暴露的对象)及其成员值的实例的暴露的模型元素131。在图1的实现中,暴露的模型元素131具有用于作为暴露的信息模型的组成部分的用于暴露类型或类别的类型或类别空间132,并且具有用于暴露类型或类别及其成员值的实例的实例空间134。消费者200能够通过访问模型和暴露的对象以执行动作(例如读取、写入、浏览或订阅)与暴露的信息模型进行交互。例如,系统的用户能够向信息模型服务器200发送请求,以便在应用运行时创建或删除暴露的对象,以调整模型结构。

类型空间132可进一步包括句柄133。句柄配置成通知模型集成组件350关于消费者200的创建请求,针对基于暴露的类型132的新暴露的对象134的创建。这个句柄触发新对应内部对象114的例示。与句柄133相似,句柄还能够是内部模型元素的组成部分,以通知作为内部模型元素的组成部分所实现的逻辑关于内容值或模型结构的任何变化。在内部模型元素的情况下,通常使用如面向对象的编程语言中已知的正常接口来定义

计算机系统100进一步包括应用组件110,其用来提供采用映射描述113(所述映射描述113定义应用的内部信息模型如何被映射到暴露的信息模型)所扩充的应用代码。在图3a、图3B的描述中详细说明映射描述的示例。应用代码定义包括内部模型元素111的内部信息模型(应用数据模型)。内部模型元素111使用类型/类别112,其中映射描述113作为类型/类别112的一部分。类型/类别定义的实例作为应用的内部对象114来创建。

系统100进一步具有模型集成组件120,该模型集成组件120提供用来集成内部信息模型和暴露的信息模型的功能,因为信息模型之间的适当映射允许消费者经过暴露的信息模型与应用进行交互。

为了实现这个目标,模型集成组件具有注册表(registry)模块121,其用来注册330内部信息模型元素111,以便在信息模型服务器130处的暴露的信息模型中暴露。能够通过模型集成组件120解析查找相应映射描述的可访问代码在代码中和/或自动地触发注册。当解析应用代码时,注册表121知悉经受暴露的信息模型中的暴露的内部应用类型/类别112(例如经过实现映射描述的相应注解)。由此,特定映射描述用于选择一个或多个内部模型元素111,以便在暴露的信息模型的类型或类别空间132中暴露。

模块集成组件120的映射模块122然后能够将所注册的类型/类别112映射到暴露的信息模型元素131,使得映射类型/类别在暴露的信息模型的类型空间132中暴露340。换言之,暴露的模型元素131具有作为暴露的信息模型的组成部分的用于暴露类型或类别的类型或类别空间132。此外,它们具有用于暴露类型或类别及其成员值的实例的实例空间134。按照应用代码中的映射描述来执行这个映射。对于暴露的信息模型元素到对应内部信息模型元素111的映射,映射模块能够解析相应内部信息模型类型/类别112的字段和方法连同对应映射描述113,并且将基于实例的暴露的信息模型元素(暴露的对象134)映射到对应内部信息模型实例(内部对象114)。句柄133是一种机制,其中模型集成120能够在类型空间132(所述类型空间1

模型集成组件的同步器模块123被实现以同步310、320与任一侧的信息模型元素关联的内容值和/或模型结构变化(即,在内部模型元素111或者暴露的模型元素131内发生的变化)。

为此目的,同步器123首先在应用运行时检测1100、2100、2300内部或暴露的信息模型元素的变化。这种变化可涉及特定信息模型元素的内容值变化,或者它可涉及相应信息模型中的结构变化(例如新模型实例/对象的创建或者现有模型实例/对象的去除)。如果变化在暴露的信息模型内发生,则变化通常通过与暴露的信息模型进行交互的客户/消费者200的相应动作(例如创建、更新、删除)来触发。如果变化在应用组件110发生,则变化可通过相应内部对象114的字段值的变化(例如传感器值的内容值变化)来触发。应用的编程语言的句柄能够用来对内部信息模型上的变化起反应(例如“钩住”getter和setter),以及触发从内部到暴露的信息模型的同步。备选地,应用能够手动触发调用如图4E中所示的“更新”方法的同步。

同步器123然后确定1200同步方向。换言之,同步器检测变化在哪一个信息中发生,并且断定变化需要被传播到其他信息模型。存在可用来得出同步方向的不同选项。例如,系统能够简单地比较与信息模型元素关联的时间戳,以确定最近变化是否对内部信息模型元素或者对暴露的信息模型元素发生。具有最近变化的信息模型则用作同步方向的原点。备选地,在实现暴露的信息模型的信息模型服务器130检测变化的情况下,信息服务器能够相应地通知同步器将暴露的信息模型设置为同步方向的原点。在实现内部信息模型的应用组件110检测变化的情况下,应用组件能够相应地通知同步器将内部信息模型设置为同步方向的原点。例如,应用能够触发同步——例如通过使用开始同步并且定义方向的方法(在同步器123处)。

同步器123进一步执行配对1300,以通过使用与映射描述相组合的对应信息模型元素的签名来确定与经改变的模型元素对应的模型元素。例如通过使用内省基于代码中的相应信息来确定签名。例如,类别签名(名称、继承、接口)、字段签名(名称、类型、值)和方法签名(名称、输入和输出参数)可用来比较信息模型元素,并且确定它们是否对应。映射描述可提供能够对配对是有用的附加信息。例如,如暴露的信息模型中定义的类型(对象类型或引用类型)的标识符可在映射描述内用来确定对应对象。

一旦同步方向为已知并且对应信息模型元素被识别,同步器就能够按照所确定的同步方向来同步内容值1400或者模型结构2200、2400中的变化。

在变化在内容值(该内容值为非原始值,因为内容值是包括子对象的复杂对象)中发生的情况下,配对和同步步骤递归地应用于复杂对象的全部子对象。换言之,如果对复杂对象检测到内容变化,则不存在实例空间134中的相应对象与内部对象114之间的简单对应性。复杂对象的结构而是需要递归地被解析,以及对于每个所识别的子对象,对应对象经过配对来识别。对于每个所解析的子对象,如果子对象具有原始值,则能够同步对应子对象的内容值。如果特定子对象是复杂对象本身,则递归也应用于特定子对象。

在同步包括复杂对象的内容值的一些情况下,经改变的复杂对象的结构需要被传播到将要更新的信息模型。图2C和图2D图示包括子对象的复杂对象的两种配对/同步情形。点划线双箭头指示如从初始模型映射已知的内部与暴露的对象之间的对应性。

图2C图示其中模型结构变化在信息模型服务器130处的暴露的信息模型中发生的示例。系统检测实例空间134中的第一暴露的对象E1的变化。系统通过检查第一暴露的对象E1是否具有暴露的信息模型中定义的与至少第二暴露的对象E2的至少一个(暴露的)关联EA1来检查暴露的对象E1是否为复杂对象。如果存在这种关联EA1,则同步器检查对应于第一暴露的对象E1的特定内部对象I1是否与第二内部模型元素I2的字段的签名相匹配,其中这个第二内部模型元素I2对应于第二暴露的模型元素E2。如果存在签名匹配,则第二内部模型元素I2的字段值设置成内部对象I1。也就是说,对于构建内部信息模型的结构,相应内部对象需要经由(内部)关联IA1来关联。这通过将复杂内部对象放入另一个内部对象的字段来实现。

如果例如消费者想要创建新状态并且将它加入如图3B中所示的Finite-State-Machine,则用户例示对类别“StateMachineVariableType”所创建的暴露的类型的新暴露的模型元素,并且将它与对暴露的模型元素(所述暴露的模型元素表示FiniteStateMachine的实例)的引用相链接。在这种情况下,表示状态的新暴露的模型元素为E2,以及表示FiniteStateMachine的暴露的模型元素为E1。作为暴露的信息模型的这个变化的反应,同步器执行从暴露的信息模型到内部信息模型的同步,并且识别内部对象I1,所述内部对象I1对应于E1并且是类别“StateMachineVariableType”的实例。对图3B中所示的这个类别,同步器执行内部对象I1与外部对象E2的字段的签名之间的配对连同外部对象E1与E2之间的引用。在字段“currentState”和“states”的注解“@Reference”(参见图3B)指示子对象可能基于暴露的模型元素来同步。由于两种注解均没有进行引用类型的进一步指定,所以缺省引用类型用于配对。备选地,能够实现“任何”引用类型在这种情况下能够匹配。如果用来将E1与E2链接的引用与这个缺省引用类型相匹配,则对象类型的配对完成。在E2的例示期间,基于在对于类型E2之前被注册的类型/类别112来创建内部对象I2。如果I2的类别可指配给通过配对过程评估的I1的实际字段,则I2被添加到匹配字段。在所述的示例中,两种字段“currentState”和“states”匹配,但是仅允许字段“states”通过暴露的信息模型来更新——如由映射描述通过将性质导入设置为假所定义。

图2D图示其中复杂对象的模型结构变化在应用组件110处的内部信息模型中发生的示例。同步器检测第三内部对象I3的变化,并且处理第三内部对象I3的字段,以确定第三内部对象的子对象I4。换言之,同步器确定(内部)关联IA2。同步器然后检查对应于第三内部对象I3的第三暴露的对象E3是否具有暴露的信息模型中定义的与对应于子对象I4的第四暴露的对象E4的关联EA2。如果没有找出的关联与I4所在的字段的签名和映射描述匹配,则创建E3与E4之间的目标关联EA2。在变化与I4的删除相关(即,在I3处的空字段)的情况下,相应地去除匹配关联。

接着上述示例:如果应用将StateMachineVariableType I4的实例添加到Finite-State-Machine I3的字段“states”,则同步器评估这个Finite-State-Machine E3的暴露的实例的全部现有关联(引用)。因为E4是新创建的对象,所以一直到这个时间点将没有匹配引用存在。因此,创建E3与E4之间的新引用EA2。在图3B的示例中,类型没有在实际字段“states”处的注解@Reference中进一步定义,并且因此引用将具有缺省引用类型。

当同步信息模型之间的模型结构变化时,能够区分不同类型的变化。最常见模型结构变化涉及在信息模型之一中创建新对象(实例)或者从信息模型之一中去除现有对象(实例)。下面描述四种更新情形的细节:用来创建内部对象的意图、用来创建暴露的对象的意图、用来去除暴露的对象的意图以及用来去除内部对象的意图。由此参考数字再次涉及图1。

在第一更新情形中,所检测到的模型结构变化预计从所创建的新暴露的对象134来创建内部对象114。例如,消费者200向信息模型服务器发送创建命令,以基于暴露的信息模型的类型空间132中定义的某个类型来创建新对象。同步器确定对应内部类型/类别112,并且创建对应类型/类别112的新内部对象114。通过应用相应映射描述采用来自相应创建的新暴露的对象134的信息来初始化新内部对象114的字段。

接着上述状态机示例:如果消费者在暴露的信息模型中创建Finite-State-Machine的实例,则创建对于Finite-State-Machine的暴露的类型所注册(参见图4A中的注册方法)的类别的实例。Finite-State-Machine的暴露的对象实例按照Finite-State-Machine的暴露的类型能够具有子对象——例如它能够采用StateMachineVariableType的实例的某个集合来初始化。在由消费者在暴露的信息模型中创建的附加状态的情况下,同步器递归地沿用Finite-State-Machine的暴露模型元素的结构,以便创建每种状态的对应内部对象,初始化值,并且将它们添加到对于Finite-State-Machine所创建的内部对象的字段“states”。

在第二更新情形中,所检测到的模型结构变化预计从某个内部类型/类别112的所创建的新内部对象114来创建暴露的对象134。同步器确定暴露的类型空间132中的对应类型,并且将对应类型的新暴露的对象134添加到实例空间134。如果所创建的新内部对象114是具有一个或多个子对象的复杂对象,则递归地处理所创建的新内部对象114的内容,以创建用于复杂对象的一个或多个子对象的暴露的模型元素。

接着上述状态机示例:如果应用在内部信息模型中创建Finite-State-Machine的实例,则创建对于Finite-State-Machine的类别所创建的暴露的类型的实例。能够采用字段中包含的子对象来初始化Finite-State-Machine的内部对象实例,例如能够采用StateMachineVariableTypes的实例的某个集合对它初始化。在由应用在内部信息模型中创建的附加状态的情况下,同步器递归地沿用Finite-State-Machine的内部模型元素的结构,以便创建对于每种状态的对应暴露的对象,初始化值,并且在字段“states”来创建Finite-State-Machine与其状态之间的相应引用。

在第三更新情形中,所检测到的模型结构变化预计从实例空间134中去除暴露的对象。同步器确定对应内部对象114,并且去除对应内部对象。如果将要去除复杂对象,则通过递归地处理复杂对象也去除全部关联和子对象。

接着上述状态机示例:如果消费者从Finite-State-Machine中去除一种状态,则这种状态的对应内部对象被确定并且在Finite-State-Machine的对应内部对象的字段被去除。

在第四更新情形中,所检测到的模型结构变化预计从内部信息模型中去除内部对象114。同步器确定实例空间中的对应暴露的对象,并且将它从实例空间134中去除。如果被去除的内部对象114是具有子对象的复杂对象,则递归地处理被去除的内部对象114的内容,以识别并且去除对于复杂暴露的对象的内容所创建的暴露的(子)对象。

接着上述状态机示例:如果应用从Finite-State-Machine中去除一种状态,则确定这种状态的对应暴露的对象。去除暴露的对象,并且从表示Finite-State-Machine的暴露的对象实例中去除与Finite-State-Machine的对应内部对象的字段处的签名匹配的全部引用。

图3A示出具有能够用来定义信息模型的注解机制(第1列)和注解示例(第2列)的示例的表310。在本示例中,注解类别遵守OPC UA元模型。第3列包括采用背后的基本原理(rationale)对相应注解的说明。

现有类别的再使用可要求应该用于暴露的信息模型的类别的过滤。注解@Node可用来定义相关类别,并且区分沿用RDF/OPC UA概念的节点与引用。注解@ID描述标识符,该标识符允许识别对象,以便将它们与信息模型中的节点关联。注解@Reference指示将要作为(子)节点所暴露的对象的字段。如果节点被认为是(UA)变量,则它能够在相应字段处使用注解@Value将字段作为这个(变量)节点的“值”来暴露。注解@Method允许向嵌入式逻辑暴露方法。附加注解(例如比如@BrowseName、@DisplayName、@Description、@DataType)能够在字段上使用,以使用它们的值来填充相应(一个或多个)暴露的节点的元数据。示例列表不是意在完整的。本领域的技术人员可定义其他有用注解,以定义映射描述。

图3B包括示例节点320,其示出使用沿用OPC UA元模型的注解类别来实现PackML状态机的FiniteStateMachineType的注解类别。PackML(包装机器语言)是作为工业自动化的方面的用于包装机器的控制的工业技术标准。以下实现示例在先前已经称作状态机示例。由此,示例代码(表320的左列)利用图3A中说明的注解。在表320的右列所给出的描述中说明各种代码部分的功能。如果没有给出注解(例如BrowseName、DisplayName或DataType),则它们能够从相应字段名称、字段类型或类别名称自动得出。每个注解能够保持附加性质,以参数化映射(如果它不同于自动映射的话):例如,在字段的@Reference能够缺省地被映射到hasComponent引用——但是在要求另一种参考类型时能够例如使用下列记号对它改写:@Reference(refType=UAReferenceTypes.organizes)

有限状态机的示例实现继承状态机的实现——即,还考虑那个超类别中暴露的字段或方法。

能够从类别或对象来得到用来描述相关节点的元数据。在示例中,能够基于字段“名称”处的值来生成浏览和显示名称。如果没有给出注解,则自动性设法基于类别(或者包含这个对象的父的字段名)来得出有意义名称。

节点标识符(ID)也能够基于字段值来生成。但是,如果没有给出注解@ID(如在示例中),则能够自动生成ID。

在示例中,基于字段“名称”的值来确定浏览和显示名称。“currentState”包含另外的(非原始)对象。@Reference注解确保另外的对象也将被处理,以及所产生的节点将从表示另外的对象的节点来引用。

集合体“states”的内容能够按照相同方式来处理。为了将所述内容与其他字段(例如“currentState”)的值加以区分,可插入中间节点“states”。能够识别已经处理的对象(例如,如果当前状态也是集合体“states”的组成部分的话)。在这类情况下,相关节点仅被创建一次并且多次被引用。

实现EventHandler接口——即,每当某事在节点或对象上发生时调用“操控”方法。EventHandler还可支持订阅其他对象或节点。这个机制能够在状态机内用来观测应当触发状态变化的性质或方法。也就是说,事件对象响应于性质的值变化而被创建并且作为通知被传递给handle( )方法。所包含的业务逻辑然后能够处理转变并且相应地更新“currentState”。

下面说明一些概念及其可能的相应实现/基本原理:

能够在注册表注册现有对象。它们的字段和方法能够接着在相应类别处的给定注解来暴露。注解描述如何在信息模型(地址空间)中表示注解元素。

类型空间工厂(factory)/注册器:能够在注册表注册类(使用注解)。这些类型则在信息模型的类型空间中暴露。通过这个工厂(类型安全),能够使用相应类型定义的副本作为基础来创建实例。

双向同步:对于每个节点,创建包装器(wrapper),该包装器保持对于将对象与相关节点和引用进行同步所需的全部信息。当对象发生变化时,它能够调用注册表处的更新方法。注册表能够确定用于同步相关节点和引用的相关包装器。当添加、去除或修改节点或引用时,信息模型服务器能够也调用对应更新方法,该更新方法又更新(一个或多个)对象。包装器能够被理解为组件,该组件知道同步的两侧,并且实现暴露的信息模型与内部信息模型之间的数据交换。包装器有时称作充当信息模型之间的耦合对象的关联类别。

读取、写入、订阅:在节点或对象处的值变化也能够经由双向同步来操控。如果被建模技术所支持,则能够由消费者来建立“订阅”——以通知消费者关于暴露的信息模型上的变化(例如值/结构变化)。在节点处的变化也在消费者的所建立预订上暴露。

如果同步器更新暴露的信息模型的值或结构,则现有订阅能够相应地被处理/调用,以通知消费者(与相反方向的更新句柄的调用相当)。

事件句柄 :包装器能够监测相关节点,以便经过对相关对象的变化。对象能够实现事件句柄。例如,如果在相关节点和引用处的变化应当在业务逻辑内立即被操控。

在OPC UA核心模型中,在OPC UA规范1.02版(release)(Part 10: Programs, May2012)中已经定义状态机的基本类型。但是,该规范仅针对状态机的表示,而没有基于性质变化来操控转变的手段。相比之下,示例代码320被建立,以操控状态机的转变注解类别。在示例代码320中提供状态和状态转变。状态机知道它的状态阵列,并且这类状态知道它们的转变。例如,转变次数可通过下列代码部分来存放在状态机中:

@Reference public ArrayList transitions

示例类别按照它们对OPC UA中的相关类型被注册的方式来注解。

每当这些类别之一经过OPC UA代码的创建来例示或者这种对象上的字段因UA信息模型的变化而改变(机制3)时,调用这些对象的EventHandler。即,当对表示状态的节点的UA引用被添加到状态机时,更新集合体状态,并且调用句柄。在这类情况下,句柄开始过程(例如段错误!未找到引用源(Fehler! Verweisquelle konnte nicht gefundenwerden)。中的示例中的checkState( )),该过程操控经改变的对象结构。在这个过程中,状态机订阅currentState上的变化,状态订阅相关转变上的变化,以及转变订阅所引用(监测)参数和方法。最后,参数值的变化一直被传播到状态机,所述状态机能够评估转变并且最终进入下一个状态。在作为字段currentState的值进入下一个状态之后,状态机必须使用这个字段上的更新方法来更新OPC UA中的表示(机制5)。

图4A至图4E图示用于在应用运行时集成内部和暴露的信息模型的五个集成机制。由此,图1中的模型集成组件120的各种模块统称为工厂124。

图4A图示在应用组件110的内部信息模型中注册新应用类别时的第一集成情形。使用方法register( ),能够在工厂124处注册类别。解析类别,并且生成对应包装器125。在相应暴露的模型元素的类型空间132中暴露对应节点。如果创建类型132-1,则潜在继承类型能够通过反射来分析,以便查找类型空间132内的锚点(anchor),其中这个新类型132-1能够作为子类型来注册。而且,对象116能够在暴露的信息模型中作为类型来注册(例如通过使用deriveType( )方法)。当预参数化对象将要用作用于实例的模板时,这能够是有利的(例如,Example_DeviceType能够例示相应DeviceType.class,并且例如预先定义供应商特定参数)。

图4B图示应用对象与暴露的模型元素的实例空间134的第二集成情形。工厂124按照相关类别115的注解(并且使用内省)中的映射描述来解析对象116,以便为表示对象116所需的每个节点和引用来创建包装器125-1。注册所生成的包装器125-1,并且包装器的相关节点和引用(实例134-1、...)被添加到实例空间134。当创建包装器时,将它初始化。也就是说,确定节点的元数据(例如节点id、浏览名称和显示名称)。在节点id和浏览名称的情况下,这可在开始仅进行一次,因为节点的这类方面在创建之后不能改变。在例如显示名称的情况下,同步也能够更新实际显示名称——例如如果注解字段的值发生变化。

在第一和第二集成情形中,工厂124解析相应类别或对象的全部字段和方法,以暴露对象的内容。有利地,这递归地被执行,使得全部所包含的子对象能够按照相同方式来操控。因此,类别的注册或者对象的例示创建暴露的信息模型内的全部包装器和元素,它们被要求以便综合表示暴露的信息模型内的对象。

图4C图示其中暴露的信息模型的消费者创建暴露的模型元素的类型的实例的第三集成情形。当消费者希望创建类型132-2的实例134-2时,在这个类型132-2所注册的回调执行工厂124内的例示过程(方法instantiate())。工厂确定对那个类型所注册的相关包装器(方法lookup())。然后,工厂创建相关类别115-2的实例(方法newInstance()),并且处理工厂内的相应对象116-2(与第二集成情形相似的方法create ())。最后,新创建的节点被添加到实例空间(方法add()),并且它被用作消费者的初始调用的结果。图中的虚线箭头代表“知道”关系:

- 类型的包装器知道类别和类型节点。

- 实例的包装器知道实例节点中的对象。

图4D图示其中暴露的信息模型与相关应用对象的正面相似地起作用的第四集成情形。当消费者访问暴露的信息模型中的实例134-3时,从工厂的注册表来获取相关包装器(方法access()和方法lookup())。这个包装器包含到应用组件110中的相关对象116-3的链接。(一个或多个)暴露的模型元素的访问类型被传递给相关对象116-3(读取、写入等)。例如,在值读取或值写入的情况下,访问包含实际值的注解字段。如果对象116-3实现EventHandler接口,则在对象访问之前和/或之后(取决于访问机制)调用这个句柄(方法handle())。结果经由所访问实例134-3来返回给消费者。

图4E图示用于将暴露的模型元素与内部模型元素同步的第五集成情形。每当改变对象116-4时,能够使用在工厂124的update()方法将暴露的信息模型与经改变的对

能够双向执行这个同步。也就是说,当暴露的信息模型包括与相应内部信息模型匹配的元素时,相应地更新内部信息模型的结构。例如,如果描述参数的节点作为描述参数集合的另外的节点的元素来添加,则更新具有保持参数集合的参数的集合体的向量的字段。

图5是示出可与这里所述技术一起使用的通用计算机装置900和通用移动计算机装置950的示例的简图。在一些实施例中,计算装置900可涉及系统100(参见图1)。计算装置950预计表示各种形式的移动装置,例如个人数字助理、蜂窝电话、智能电话和其他类似计算装置。在本暴露的上下文中,计算装置950可允许人类用户与装置900进行交互。在其他实施例中,整个系统100可在移动装置950上实现。这里所示的组件、其连接和关系以及其功能意在只是示范性的,而不是意在限制本文档中所述和/或要求保护的本发明的实现。

计算装置900包括处理器902、存储器904、存储装置906、连接到存储器904和高速扩展端口910的高速接口908以及连接到低速总线914和存储装置906的低速接口912。组件902、904、906、908、910和912的每个使用各种总线来互连,并且可安装在公共主板上或者按照其他适当方式来安装。处理器902能够处理供计算装置900内执行的指令,包括存储器904中或者存储装置906上存储的指令,其用来在外部输入/输出装置(例如耦合到高速接口908的显示器916)上显示GUI的图形信息。在其他实现中,可适当地使用多个处理器和/或多个总线连同多个存储器和多种类型的存储器。而且,可连接多个计算装置900,其中每个装置提供必要操作的部分(例如,作为服务器组、一组刀片服务器或者多处理器系统)。

存储器904在计算装置900内存储信息。在一个实现中,存储器904是一个或多个易失性存储器单元。在另一个实现中,存储器904是一个或多个非易失性存储器单元。存储器904也可以是另一种形式的计算机可读介质,例如磁或光盘。

存储装置906能够为计算装置900提供大容量存储装置。在一个实现中,存储装置906可以是或者包含计算机可读介质,例如软盘装置、硬盘装置、光盘装置或磁带装置、闪速存储器或其他类似固态存储器装置或者装置阵列(包括存储区域网络或其他配置中的装置)。计算机程序产品能够有形地体现在信息载体中。计算机程序产品还可包含指令,其在运行时执行如上所述的一个或多个方法。信息载体是计算机或机器可读介质,例如存储器904、存储装置906或者处理器902上的存储器。

高速控制器908管理计算装置900的带宽密集操作,而低速控制器912管理较低带宽密集操作。功能的这种分配只是示范性的。在一个实现中,高速控制器908耦合到存储器904、显示器916(例如经过图形处理器或加速器),以及耦合到可接纳各种扩展卡(未示出)的高速扩展端口910。在本实现中,低速控制器912耦合到存储装置906和低速扩展端口914。可包括各种通信端口(例如USB、蓝牙、以太网、无线以太网)的低速扩展端口可例如经过网络适配器来耦合到一个或多个输入/输出装置,例如键盘、指示装置、扫描仪或者组网装置(例如交换机或路由器)。

计算装置900可采取多种不同形式来实现,如图中所示。例如,它可实现为标准服务器920或者在一组这类服务器中多次实现。它还可实现为机架服务器系统924的组成部分。另外,它可在个人计算机(例如膝上型计算机922)中实现。备选地,来自计算装置900的组件可与移动装置(未示出)中的其他组件(例如装置950)相组合。这类装置的每个可包含计算装置900、950的一个或多个,并且整个系统可由相互通信的多个计算装置900、950来组成。

计算装置950包括处理器952、存储器964、输入/输出装置(例如显示器954)、通信接口966和收发器968以及其他组件。装置950还可提供有存储装置(例如微型驱动器或其他装置),以提供附加存储。使用各种总线来互连组件950、952、964、954、966和968的每个,并且组件的若干组件可安装在公共主板上或者按照其他适当方式来安装。

处理器952能够在计算装置950内执行指令,包括存储器964中存储的指令。处理器可实现为包括独立以及多个模拟和数字处理器的芯片的芯片组。处理器可提供例如装置950的其他组件的协调,例如用户接口、由装置950所运行的应用以及由装置950进行的无线通信的控制。

处理器952可经过控制接口958以及耦合到显示器954的显示接口956与用户进行通信。显示器954可以是例如TFT LCD(薄膜晶体管液晶显示器)或OLED(有机发光二极管)显示器或者其他适当的显示技术。显示接口956可包括适当电路系统,其用于驱动显示器954以向用户呈现图形和其他信息。控制接口958可从用户接收命令,并且对它们进行转换供提交给处理器952。另外,可提供与处理器952进行通信的外部接口962,以便实现装置950与其他装置的近区域通信。外部接口962可在一些实现中提供例如有线通信或者在其他实现中提供无线通信,并且也可使用多个接口。

存储器964在计算装置950内存储信息。存储器964能够实现为一个或多个计算机可读介质、一个或多个易失性存储器单元或者一个或多个非易失性存储器单元中的一个或多个。扩展存储器984也可被提供并且经过扩展接口982(所述扩展接口982可包括例如SIMM(单列直插存储器模块)卡接口)来连接到装置950。这种扩展存储器984可为装置950提供额外存储空间,或者还可存储装置950的应用或其他信息。特别地,扩展存储器984可包括用来执行或补充上述过程的指令,并且还可包括安全信息。因此,例如,扩展存储器984可充当装置950的安全模块,并且可编程有指令,所述指令准许装置950的安全使用。另外,安全应用可经由SIMM卡连同附加信息(例如按照不可攻击方式将识别信息放置在SIMM卡上)来提供。

存储器可包括例如闪速存储器和/或NVRAM存储器,如以下所述。在一个实现中,计算机程序产品有形地体现在信息载体中。计算机程序产品包含指令,所述指令在被执行时执行例如上述方法等的一个或多个方法。信息载体是计算机或机器可读介质,例如存储器964、扩展存储器984或者处理器952上的存储器,它们可例如通过收发器968或外部接口962来接收。。

装置950可经过通信接口966进行无线通信,所述通信接口966在必要时可包括数字信号处理电路系统。通信接口966可提供各种模式或协议下的通信,例如GSM语音呼叫、SMS、EMS或MMS消息传递、CDMA、TDMA、PDC、WCDMA、CDMA2000或GPRS等等。这种通信可例如经过射频收发器968进行。另外,短程通信可例如使用蓝牙、WiFi或其他这种收发器(未示出)进行。另外,GPS(全球定位系统)接收器模块980可向装置950提供附加导航和位置相关无线数据,所述数据可通过装置950上运行的应用适当地使用。

装置950还可使用音频编解码器960进行听觉通信,所述音频编解码器可从用户接收口头信息(spoken information),并且将它转换成可使用数字信息。音频编解码器960同样可例如经过例如装置950的手柄(handset)中的扬声器为用户生成可听声。这种声音可包括来自语音电话呼叫的声音,可包括记录声音(例如语音消息、音乐文件等),并且还可包括通过装置950上进行操作的应用所生成的声音。

计算装置950可采取多种不同形式来实现,如图中所示。例如,它可实现为蜂窝电话980。它还可实现为智能电话982、个人数字助理或其他类似移动装置的组成部分。

这里所述的系统和技术的各个实现能够在数字电子电路系统、集成电路系统、专门设计的ASIC(专用集成电路)、计算机硬件、固件、软件和/或其组合中实现。这些各种实现能够包括通过在可编程系统中可执行和/或可解释的一个或多个计算机程序来实现,可编程系统包括经耦合以从存储系统接收数据和指令,并且传送数据和指令到存储系统的至少一个可编程处理器、至少一个输入装置和至少一个输出装置。

这些计算机程序(又称作程序、软件、软件应用或代码)包括用于可编程处理器的机器指令,并且能够通过高级过程和/或面向对象的编程语言和/或通过汇编/机器语言来实现。如本文所使用的,术语“机器可读介质”、“计算机可读介质”表示用来向可编程处理器提供机器指令和/或数据的任何计算机程序产品、设备和/或装置(例如磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”表示用来向可编程处理器提供机器指令和/或数据的任何信号。

为了提供与用户的交互,这里所述的系统和技术能够在具有显示装置以及键盘和指向装置(鼠标或轨迹球)的计算机上实现,显示装置(例如CRT(阴极射线管)或LCD(液晶显示器)监视器)用于向用户显示信息,用户能够通过指向装置向计算机提供输入。其他种类的装置也能够用来提供与用户的交互;例如,提供给用户的反馈能够是任何形式的感测反馈(例如视觉反馈、听觉反馈或者触觉反馈);以及能够接收采取任何形式的来自用户的输入,包括声音、语音或触觉输入。

这里所述的系统和技术能够在计算装置中实现,该计算装置包括后端组件(例如作为数据服务器),或者包括中间件组件(例如应用服务器),或者包括前端组件(例如客户端计算机,该客户端计算机具有图形用户界面或者WEB浏览器,用户能够通过它与这里所述的系统和技术的实现进行交互),或者这类后端、中间件或前端组件的任何组合。系统的组件能够通过数字数据通信的任何形式或介质(例如通信网络)来互连。通信网络的示例包括局域网(“LAN”)、广域网(“WAN”)和因特网。

计算装置能够包括客户端和服务器。客户端和服务器通常相互远离,并且通常经过通信网络进行交互。客户端和服务器的关系依靠相应计算机上运行并且相互具有客户端-服务器关系的计算机程序而出现。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号