Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 合同模板 > bacnet协议中文24,bacnet协议

bacnet协议中文24,bacnet协议

收藏

本作品内容为bacnet协议中文24,格式为 docx ,大小 1035322 KB ,页数为 397页

bacnet协议中文24


("1.目的本标准的目的是要定义一些数据通信的服务和协议,这些服务和协议用于采暖、通风、空调和制冷控制设备(简称HVAC&R)的监控计算机设备之中,也可用于其它楼宇自动控制系统的计算机设备之中。此外本标准还要定义一个抽象的和面向对象的方法,用来表示这些设备之间信息通信方式,从而促使在楼宇系统中使用数字控制技术。2.范围2.1本协议提供了一个完整的报文集合,用来在设备之间传送二进制编码、模拟量、文本数据和数字数据,这些数据是(当然不局限于这些):(a)硬件的二进制输入量和输出量的值,(b)硬件的模拟输入量和输出量的值,(c)软件的二进制和模拟量的值;(d)文本字符串的值;(e)时间进度表信息,(f)报警和事件信息,(g)文件,(h)控制逻辑。2.2本协议将每个楼宇自动控制系统计算机建模成为一些数据结构的集合,并且称这些数据结构为对象。对象的各个属性代表了这个设备硬件、软件以及操作的各个方面。这些对象提供了一种不需了解设备的内部设计或配置细节,而能够识别和访问信息的方法。3.术语定义3.1所采用的国际标准中的术语本标准中所使用的以下术语由其它国际标准或开放系统互联的草案标准所定义。在此重新列出这些定义以及相应参考的标准。在第25节参考文献中,包括了本节和本标准中其它地方所涉及的所有美国标准和国际标准的名称。斜体书写的词或短语在本节中都有专门的定义条目。3.1.1抽象句法结构(abstractsyntax):用来表示应用层数据或应用层协议控制信息的符号规则的规定,这些符号规则独立于用来表示它们的编码技术。(ISO8822)3.1.2应用(application):用户的处理请求信息的集合。(ISO8649)3.1.3应用实体(application-entity):与OSI相关的一个应用进程的表示形式。(ISO7498)3.1.4应用进程(application-process):在一个实开放系统中的一个活动元素,其功能是为一个特定应用而1执行信息处理的任务。(ISO7498)3.1.5应用层协议控制信息(application-protocol-control-information):在应用实体之间交换的信息,这些信息通过使用表示层服务来协调它们之间相连接的操作。(ISO9545)3.1.6应用层协议数据单元(application-protocol-data-unit):应用协议中规定的数据单元,其中包含有应用层协议控制信息和应用层用户数据(application-user-data)。(ISO9545)3.1.7应用层服务元素(application-service-element):是一个应用实体的一部分,其功能是在适当的时候,通过使用下层服务来提供一个OSI环境的能力。(ISO7498)3.1.8具体句法结构(concretesyntax):用于数据的正式规范中的规则的表示形式,具体表示某数据的规范表示形式。(ISO7498)3.1.9对等实体(peer-entities):在相同的协议层次中的实体。(ISO7498)3.1.10实开放系统(realopensystem):是一个实系统,在与其它的实系统通信时遵守OSI标准的要求。(ISO7498)3.1.11实系统(realsystem):是一个集合体,其组成部分包括有计算机、相关的软件、外部设备、终端、操作者、操作处理过程、信息传递方法等等,这些部分组成一个自主的整体,完成信息处理和/或信息传递的功能。(ISO7498)3.1.12第N层服务访问点((N)-service-access-point):协议中第N层实体向第N+1层实体所提供的服务的访问点。(ISO7498)3.1.13第N层服务数据单元((N)-service-data-unit):协议中第N层的接口数据,其一致性不受第N层通信的影响。(ISO7498)3.1.14服务用户(service-user):是在某个开放系统中的实体,该实体通过服务访问点使用一个服务。(ISOTR8509)3.1.15服务提供者(service-provider):向对等服务用户提供服务的所有实体的抽象总和。(ISOTR8509)3.1.16传输句法结构(transfer-syntax):在开放系统之间用于数据传递目的的具体句法结构。(ISO7498)3.1.17服务原语;原语(service-primitive;primitive):用来描述服务用户和服务提供者之间交互作用的、抽象的、与具体实现无关的表示方式。(ISOTR8509)3.1.18请求(原语)(request(primitive)):一种交互作用的表示方式,用来描述服务用户希望得到完成某些操作的服务而调用一些过程。(IISOTR8509)3.1.19指示(原语)(indication(primitive)):一种交互作用的表示方式,在该作用中,服务提供者或者指示本身已经主动调用了某些过程,或者指示在对等服务访问点的服务用户已经调用了一个过程。(ISOTR8509)3.1.20响应(原语)(response(primitive)):一种交互作用的表示方式,在该作用中,服务用户表明已经完成了先前一个交互作用所调用的一些过程,其中所指的先前的一个交互作用是由一个指示原语所表示的。2(ISOTR8509)3.1.21证实(原语)(confirm(primitive)):一种交互作用的表示方式,在该作用中,一个服务提供者在一个特定的服务访问点指示某些过程已经完成,这些过程是在相同的服务访问点由前一个请求原语所调用的。(ISOTR8509)3.1.22用户元素(userelement):是一个应用进程的某部分的表示,这个应用进程的部分因为需要实现该应用进程的通信目的而要使用应用服务元素。(ISO7498)3.2本标准中定义的术语3.2.1访问控制(accesscontrol):一种控制访问网络资源的方法。3.2.2报警(alarm):1.一种听觉的或者视觉的或者两者都有的通报,提醒操作者出现了可能需要采取纠错操作的非正常现象。2.由特定设备或控制器检测出的非正常状态,这种设备或控制器是为监测这种状态而专门设计的。3.2.3算法改变报告(algorithmicchangereporting):利用在一个事件登记对象中指定的算法,得出的关于一个报警或者一个事件的检测和报告。参见3.2.27的内部报告。3.2.4BACnet设备(BACnetdevice):是指任何一种支持用BACnet协议进行数字通信的真实的或者虚拟的设备。3.2.5BACnet用户(BACnet-user):是一个应用进程中由BACnet用户元素所表示的那个部分。3.2.6网桥(bridge):在物理层和数据链路层上连接两个或多个网段的设备。该设备还可以根据MAC层地址完成报文的过滤。3.2.7广播(broadcast):表示一个报文,这个报文作为一个单一单元而发送到多个设备上。3.2.8状态改变(changeofstate):表示一个事件,这个事件在测量出或者计算出布尔值或离散量值发生改变时发生。3.2.9数值改变(changeofvalue):表示一个事件,这个事件在测量出或者计算出模拟值与预定义的值发生改变时发生。3.2.10客户(client):表示一个系统或者设备,它为某些特定目的,通过一个服务请求实例调用其它设备的服务,客户向服务器请求服务。3.2.11上下文范围(context):能够完全描述某一个特定时间的、特定通信环境的数据或信息的集合。3.2.12控制器(controller):用于调节或管理一个系统或部件的设备。3.2.13数据保密性(dataconfidentiality):描述信息不被未经授权的个体、实体或过程所利用或识别的属性。3.2.14数据完整性(dataintegrity):描述数据不被未经授权的方法所改变或破坏的属性。3.2.15数据来源鉴别(dataoriginauthentication):对接收到的数据的来源是否为其声明的来源的证实行为。3.2.16直接连接网络(directlyconnectednetwork):通过一个路由器即可访问的、报文无须中间路由器中继的网络。一个PTP连接,当PTP连接有效时,并且没有使用中间路由器时,就是一个直接连接网络。33.2.17下载(download):一种特定的文件传输行为,专门用于将可执行程序或数据库传送到远程可执行设备上。3.2.18实体(entity):具有独立的、可区分特征的存在事物,并且可以用一组属性来描述它的具有可标识的性质。3.2.19检错(errordetection):用来识别在通信中是否存在错误的一个过程。3.2.20纠错(errorrecovery):由被检测到的错误所激活的过程,该过程将确保信息交换得以继续。3.2.21网关(gateway):用来连接两个或多个不同网络的设备,信息可以通过这个设备在这些网络之间交换。3.2.22全局(global):关于一个通信互联网络上的所有设备或节点。3.2.23全局广播(globalbroadcast):表示一个报文,这个报文被发送到一个BACnet互联网上的所有网络中的设备或节点。3.2.24半路由器(halfrouter):是一个设备或者节点,用在一个PTP连接的一端。两个半路由器形成一个路由器,并建立起一个有效的PTP连接。3.2.25初始化(initialization):表示建立一个已知状态的过程,通常这个过程是从加电开始的。初始化可能需要重新建立一个节点的逻辑或物理地址。3.2.26互联网络(internetwork):由路由器互联起来的两个或多个网络的集合。在一个BACnet的互联网络中,任意两个节点之间存在着唯一一条报文传输路径。3.2.27内部报告(intrinsicreporting):表示对一个报警或者事件的探测和报告,其探测基于在对象类型规范中定义的算法,不需要调用对事件登记对象的外部引用。参见3.2.3的算法改变报告。3.2.28密钥(key):控制加密和解密操作的一个符号序列。3.2.29本地(local):同一网络上作为参考设备的相关设备。3.2.30本地广播(localbroadcast):表示一个报文,这个报文被发送到同一网络上所有设备或节点。3.2.31传输介质(medium):是物理传输实体。典型介质有双绞线、光缆,和同轴电缆。3.2.32介质访问控制(mediumaccesscontrol):表示一个处理过程,这个过用于维持对通讯传输介质的访问顺序3.2.33网络(network):由网桥互联起来具有相同网络地址的一个或多个网段的集合。3.2.34网络资源(networkresource):通过通信传输介质可以访问的任何物理的或逻辑的实体。3.2.35节点(node):与通信传输介质相连的可寻址的设备。3.2.36对象类型(objecttype):由属性集合所定义的数据结构。3.2.37操作者身份鉴别(operatorauthentication):确认登录到一个设备上的操作员是否为其声明的身份的行为。3.2.38对等实体身份鉴别(peerentityauthentication):确认在一个联合体中某个同等实体是否为其声明的身份的行为。3.2.39物理网段(physicalsegment):BACnet节点直接相连的单一连续传输介质。3.2.40可打印字符(printablecharacter):表示可打印的符号的字符。包括大小写字母、标点符号和算术4符号。当然不只局限于此,其精确的集合随所使用的字符集而改变。在ANSIX.34标准中可打印字符由十六进制表示,其范围从X‘20’到X‘7E’。3.2.41属性(property):一个对象类型的详细特征。3.2.42私有的(proprietary):在BACnet的范围内,本标准确定的对象类型、属性、私有传输服务或枚举的任何扩充或附加部分。3.2.43接收方BACnet用户(receivingBACnet-user):接收指示或证实的BACnet用户。3.2.44远程(remote):与当前讨论的设备在不同网络的设备或节点。3.2.45远程广播(remotebroadcast):表示一个报文,这个报文被发送到与报文源不同网络上的所有设备或节点。3.2.46中继器(repeater):在物理层上连接两个或多个物理网段的设备。3.2.47请求方BACnet用户(requestingBACnet-user):在有证实的服务中作为客户的BACnet用户。3.2.48响应方BACnet用户(respondingBACnet-user):在有证实的服务中作为服务器的BACnet用户。3.2.49路由器(router):在网络层连接两个或多个网络的设备。3.2.50安全(security):用来确保信息交换不泄露给未被授权的个体的所有过程。安全措施包括防止机密信息的泄露,甚至包括设置谁有权访问通讯网络。虽然某些安全措施可以通过限制通讯介质的物理访问来实现,安全的定义是不同于访问控制的。3.2.51网段(segment):由中继器互联起来的一个或多个物理网段。3.2.52发送方BACnet用户(sendingBACnet-user):发送请求或响应的BACnet用户。3.2.53服务器(server):为某个目的响应一个服务请求实例的设备或系统。它为客户提供服务。3.2.54同步(synchronization):表示一种功能,这种功能在信息传输或交换时,允许处理过程定义和识别某个特定位置,以此来将一次通信对话复位到预设状态。3.2.55单元时间(unit_time):传送一个带有一个比特的发送位和一个比特停止位的八位字节所需的时间,即十个比特时间。3.2.56上载(upload):从一个远程设备上传送一个可执行程序或数据库的过程。通过这种方式,允许随后的下载操作。3.3本标准中使用的缩写和简称A应用层(前缀)AE应用实体ANSI美国国家标准学院APCI应用层协议控制信息API应用编程接口ARCNETARCNET计算机网络ASE应用层服务单元5ASN.1抽象句法结构符号1(ISO8824)B’’表示在单引号之间使用二进制符号BAC楼宇自动控制C有条件的C(=)条件(参数与服务原语中左边的参数在语义上相等)CNF证实原语COV值的改变CRC循环冗余码校验D’’表示在单引号之间使用十进制符号DA本地目标MAC层地址DADR最终目标MAC层地址DER需要应答的数据DES数据加密标准(FIPS46-1)DIDARCNET目标MAC地址DLEN最终目标MAC层地址的一个字节长度DNET两个字节表示的最终目标的网络号码DSAPLLC目标服务访问点(对于BACnet为X'82')EXEC执行一个服务请求的能力ICI接口控制信息ILARCNET信息长度域IND指示原语IEEE电气和电子工程师协会INIT发起一个服务请求的能力ISO国际标准化组织L数据链路层(前缀)LAN局域网LLC逻辑链路控制(ISO8802-2)LPCI链路层协议控制信息LPDU链路层协议数据单元LSAP链路层服务访问点(对于BACnet为X'82')LSDU链路层服务数据单元M命令的M(=)命令的(参数与服务原语中左边的参数在语义上相等)MA介质访问(前缀)6MAC介质访问控制MPCIMAC层协议控制信息MPDUMAC层协议数据单元MSDUMAC层服务数据单元MS/TP主从/令牌传递N网络层(前缀)NP网络优先权NPCI网络层协议控制信息NPDU网络层协议数据单元NRZ反向不归零制NSAP网络层服务访问点NSDU网络层服务数据单元O表明对某个属性的支持是可选的OSI开放系统互联P物理层(前缀)PACARCNET数据分组的头字节PCI协议控制信息PDU协议数据单元PICS协议实现一致性声明PK私有密钥PPCI物理层协议控制信息PPDU物理层协议数据单元PSDU物理层服务数据单元PTP点到点R表明对某个属性是支持的,并且用BACnet设备可读该属性REQ请求原语RSP响应原语S选择S(=)选择(参数与服务原语中左边的参数在语义上相等)SA本地网络资源的MAC层地址SAP服务访问点SCARCNET系统代码(对于BACnet为X'CD')SDU服务数据单元SIDARCNET源的MAC层地址7SK会话密钥SLEN源节点的MAC层地址的一个字节长度SNET两个字节表示的源节点网络号码SPC标准工程委员会SSAPLLC源节点服务访问点(对于BACnet为X'82')TSM事务处理状态机U用户选项U(=)用户选项(参数与服务原语中左边的参数在语义上相等)UART通用的异步收发器VT虚拟终端W表明对某个属性是支持的,并且用BACnet设备可读和可写该属性X’’表示在单引号之间使用十六进制符号XID交换标识(ISO8802-2)4.BACnet协议的体系结构国际标准化组织在制定计算机网络通讯协议标准时定义了一个模型,称为开放系统互联参考模型(OSI)(ISO7498)。模型的目的是解决计算机与计算机之间普遍的通信问题。在这个模型中,将计算机通信这样一个复杂的问题分解成7个小的、容易解决的子问题,每个子问题只与某些通信功能相关,并且把这些子问题称8应用层表示层会话层传输层网络层数据链路层物理层用户1应用层表示层会话层传输层网络层数据链路层物理层用户2管理与用户应用程序的实际接口编码、加/解密、信息转换会话管理、传输同步可靠的端到端报文传输、报文分段建立点到点通路、路由选择数据分组、通信介质访问的管理在物理介质上传输比特流两个节点间的物理介质图4-1.开放系统互联基本参考模型BACnet网络层ISO8802-3(IEEE802.3)ARCNETMS/TP(主从/令牌传递)PTP(点到点协议)EIA-485(RS485)EIA-232(RS232)ISO8802-2(IEEE802.2)类型1LonTalkBACnet应用层BACnet的协议层次应用层网络层数据链路层物理层对应的OSI层次图4-2.BACnet简化的体系结构层次图为协议体协结构的一层,整个模型是一个七层的体系结构。在图4-1中给出这七层的体系结构图。对于某个层次来说,它使用下面各层所提供的服务,同时也向它上面的各层提供服务。每一层可以想象成一个黑盒,黑盒的上面和下面都具有经过认真定义的接口。一个应用程序通过与OSI应用层的相连,实现与另一个远程应用程序的通信。对于这种发生在两个应用程序之间的通信,看起来两个程序似乎是通过各自的应用层接口直接相连。各层之间仅仅需要了解其它层的很少的情况。通过类似的方式,协议的每一层利用下面各层的服务来提供通信服务,与另一个系统的同等层建立起一个虚的对等层通信。而真正的通信只发生在物理层。OSI模型以高度概括的观点来分析计算机与计算机的通信,用来解决在全世界范围内的、巨大而复杂的计算机网络的通信问题。在这种情况下,互相通信的单个计算机之间可能相距很远,因此报文要通过一系列中间点才能到达。而这些中间点相应地可能需要实现路由选择功能、某种解析功能,以及复杂的同步和差错恢复功能。实现OSI模型协议所需的费用较高,在绝大部分楼宇自动控制系统中,并不需要实现OSI模型的所有内容。不过只从OSI的功能性方面来考虑,经过简化,OSI模型仍然是楼宇自动控制协议的一个很好的参考。如果只选择OSI模型中需要的层次,形成一个简化的模型,作为楼宇自动控制系统的协议体系结构,就可以减少报文的长度,降低通信处理的开销,并且也满足楼宇自动控制系统的需要。这个简化的体系结构降低了楼宇自动控制工业的生产成本,同时处理器的大批量生产、局域网技术的发展,也为过程控制和办公自动化工业的发展起到了推动作用。另一方面,可以充分利用现有的、易用的、应用广泛的局域网技术,如以太网、ARCNET和LonTalk。这样不但可以降低成本,而且也有利于提高性能,为系统集成开辟新的途径。4.1BACnet简化的体系结构BACnet建立在包含四个层次的简化分层体系结构上,这四层相当于OSI模型中的物理层、数据链路层、网络层和应用层,如图4-2所示。BACnet标准定义了自己的应用层和简单的网络层,对于其数据链路层和物理层,提供了以下五种选择方案。9第一种选择是ISO8802-2类型1定义的逻辑链路控制(LLC)协议,加上ISO8802-3介质访问控制(MAC)协议和物理层协议。ISO8802-2类型1提供了无连接(Connectionless)不确认(Unacknowledged)的服务,ISO8802-3则是著名的以太网协议的国际标准。第二种选择是ISO8802-2类型1定义的逻辑链路控制协议,加上ARCNET(ATA/ANSI878.1)。第三种选择是主从/令牌传递(MS/TP)协议加上EIA-485协议。MS/TP协议是专门针对楼宇自动控制设备设计的,同ISO8802-2类型1一样,它通过控制EIA-485的物理层,向网络层提供接口。第四种选择是点对点(PTP)协议加上EIA-232协议,为拨号串行异步通信提供了通信机制。第五种选择是LonTalk协议。这些选择都支持主/从MAC、确定性令牌传递MAC、高速争用MAC以及拨号访问。拓扑结构上,支持星型和总线型拓扑。物理介质上,支持双绞线、同轴电缆、光缆。这五种选项将在第7节到第11节中深入论述。简化的四层BACnet体系结构,是在仔细考虑了BACnet网络的独特特征和要求,以及尽可能少的协议开销原则后得出的。在下面的分析里,将讨论BACnet体系结构只包括物理层、数据链路层、网络层和应用层的原因。BACnet完成其固有的操作到底需要哪些层次呢?仔细分析BACnet网络的特征后,可以得到以下两点:首先,BACnet是一种局域网。即使在某些应用中,楼宇里设备间的远距离通信必不可少时,BACnet仍然是一种局域网。因为这种远距离的通信功能,由电信网来实现。通信中要完成的路由、中继、可靠的传输等问题都由电信网来处理,电信网可看成是BACnet外部的部分。其次,BACnet设备是静态的(static),即在空间上,它们不会经常被移来移去。在要完成的功能上,从某种意义上说也是不变的,即不会今天生产的设备的功能是这样,明天就完全不同了。在充分了解BACnet网络的特征后,就可讨论OSI模型的各层在BACnet网络中的适用性了。物理层提供了连接设备和传输数据载波信号的方式,显然在BACnet协议中,物理层是必不可少的。数据链路层负责将数据组织成帧(frame)或分组(packet)、管理通讯介质的访问、寻址,以及完成一些差错校正和流量控制的任务,这些都是BACnet协议所需要的,因此数据链路层也是必不可少的。网络层的功能包括:将全局地址解析为局部地址、在一个或多个网络中进行报文的路由、协调不同类型网络的差异(如不同网络所允许的最大报文长度)、序列控制、流量控制、差错控制、以及多路复用。由于BACnet网络的拓扑特点,在各个设备之间只存在一条逻辑通路(参见图4-3),这样便不需要最优路由的算法。其次,BACnet网络是由中继器或者网桥互联起来的一个或者多个网段所组成的网络,它具有单一的局部地址空间。在这样一种单一网络中,许多OSI网络层的功能也变得多余,或者与数据链路层相重复。但是在BACnet网10络系统中,网络层又是必不可少的。例如,在一个BACnet的互联网【注】(internet)中,当两个或者多个网络使用了不同的MAC层时,便需要区别局部地址和全局地址,这样才能将报文路由到正确的网络上去。在BACnet协议中,通过定义了一个包含必要的寻径和控制信息的网络层头部,来完成这种简化了的网络层功能。_______________________________________________________________________________[注]:internet和internetwork这两个词都代表一般的网络互联所形成的网络,在本书中翻译为“互联网”。Internet这个词代表特定的已经存在于世界范围的计算机互联网,在本书中翻译为“因特网”。――译者注传输层主要是负责提供可靠的端到端的报文传输、报文分段、序列控制、流量控制,以及差错校正。传输层的许多功能与数据链路层相似,只是在作用范围上有所不同。传输层提供的是端到端的服务,而数据链路层则提供的是单一网络上点到点的服务。由于BACnet支持多种网络的配置,因此协议必须提供传输层端到端的服务。而可靠的端到端传输和差错校正功能,在BACnet协议中由BACnet的应用层利用报文超时重传方式来完成。其次,考虑到缓冲区和处理器资源的管理,报文分段和端到端的流量控制也是必要的。这是因为即使一个简单的BACnet请求,都可能会导致大量的信息回传。同样,这些功能也是由BACnet的应用层完成的。最后,为了实现报文的正确重组,序列控制也是必需的。这也是由BACnet的应用层中的分段过程实现的。总的来说,由于BACnet是建立在无连接的通信模型基础上的,因此所需的服务大大减少,并且可以被高层来实现,这样便省去了一个单独传输层所会增加的通信开销。在BACnet协议中,不设单独的传输层,所需的功能由应用层实现。会话层的功能是在通信双方之间建立和管理长时间对话,其中的一个重要功能是建立同步标志点,用来在发生差错时回复到前一个标志点,以避免对话重新开始。但是在一个BACnet网络中,绝大部分的通信都是很简短的,比如读写一个值或者一些值,通知(notify)某个设备有某个警报或事件(event)发生,或者更改某个设定值。当然长时间的信息交换偶然也会发生的,比如上载或下载某个设备参数。由于绝大部分事务处理都是简短的,会话层的服务极少用到,再考虑到设置单独的会话层所带来的开销,所以BACnet标准中不包括单独的会话层。表示层为通信双方提供了屏蔽下层传送语法的服务。这种传送语法是用来将应用层中抽象的用户数据视图,变成适合下层传输的字节序列。但当只存在一种传送语法时,表示层的功能便减少到对应用程序的数据进行编码。由于在BACnet应用层中定义了一个固定的编码方案,因此一个独立的表示层也变得不再需要。协议的应用层为应用程序提供了完成各自功能所需的通信服务。在此基础上,应用程序可以监控HVAC&R和其它楼宇自动控制系统。显然应用层是本协议所必需的。从以上讨论中,可以得到以下几点:(a)实现一个完全的OSI七层体系结构需要大量的资源和开销,因此它对于目前的楼宇自动控制系统是不适用的。(b)按照OSI模型的方式构造协议体系结构,并且采用现有的计算机网络技术,可以使得新协议具有实现成本低和便于与其它计算机网络系统集成的特点。(c)根据楼宇自动控制系统的环境及要求,可以通过去除OSI某些层的功能简化OSI模型,来制定新协议的体系结构。111/2RT网段1网段2RT1/2RT物理网段物理网段物理网段物理网段物理网段物理网段物理网段物理网段物理网段物理网段物理网段网络1网段3网段4网络2网络3PTP点到点连接网段5BACnet互联网B=网桥RT=路由器R=中继器1/2RT=半路由器图4-3.BACnet互联网结构图RRRRBRTBRR(d)由物理层、数据链路层、网络层和应用层组成的一个简化体系结构,是当今楼宇自动控制系统的最佳解决方案。4.2BACnet网络的拓扑结构为了适应各种应用,BACnet并没有规定严格的网络拓扑结构。BACnet设备可以直接连接到四种局域网(LANs)中的一种网络上,也可以通过专线或拨号异步串行线连接起来。这几种局域网由可以通过BACnet路由器进一步互联(参见第6节的详细描述)。按照局域网拓扑的观点,每个BACnet设备与物理介质相连,物理介质称之为物理网段。一个或多个物理网段通过中继器在物理层连接,便形成了一个BACnet网段。而一个BACnet网络则是由一个或多个BACnet网段通过网桥互连而成。每个BACnet网络都形成一个单一的介质访问控制MAC地址域,这些在物理层和数据链路层上连接各个网段的设备,可以利用MAC地址实现报文的过滤。将使用不同LAN技术的多个网络,用BACnet路由器互连起来,便形成了一个BACnet互联网(internetwork)。如前所述,在一个BACnet互联网中,任意两个节点之间恰好存在着一条报文通路。这些概念如图4-3所示。12应用层应用进程应用程序BACnet用户元素BACnetASEAPI应用实体NSAP图5-1.BACnet应用进程模型4.3安全BACnet系统安全方面的主要隐患,是有人有意或无意地改变了设备的配置参数或控制参数。问题产生的原因经常是由于安全措施没有把某个计算机操作包括在内,从而使得在那台计算机上可以进行非法操作。采取安全措施的一个重要地方是人-机接口处。由于人-机接口不属于通信协议,因此厂家可根据需要自由地在该接口处设置密码保护、跟踪记录或者其它控制措施。另外,在本标准中对任何属性的写访问操作,并没有明确要求是“可写的(writable)”。这一点可以通过限制只能在虚终端节点(virtualterminalnode)处才允许修改、或干脆完全禁止来加以改进。这样厂家便可以利用他们认为尽可能合适的、完备的机制,来保护密钥属性(keyproperty)。最后,BACnet定义了用来提供对等实体、数据来源以及操作员身份鉴别的服务(参见第24节)。5.应用层5.1应用层模型本节给出BACnet应用层的模型,建立这个模型的目的是为了清楚地描述应用层与应用程序之间的交互(interaction)、应用层与协议栈中下面各层次的关系、以及应用层与远程设备中应用层的对等交互。但需要说明的是,该模型并不是应用层的实现规范。一个应用进程(ApplicationProcess)是指在一个系统中,针对某个应用而进行信息处理的功能模块。如图5-1所示,在应用进程中有一部分位于应用层之外,它们与通信功能无关,这些部分都不属于BACnet标准的规范范围。我们将应用进程中位于应用层内的部分称为应用实体(ApplicationEntity)。换句话说,一个应用实体是应用进程中与BACnet通信功能相关的部分。一个应用程序(applicationprogram)通过应用编程接口API(ApplicationProgramInterface)与应用实体进行交互。编程接口不在BACnet中定义,但是在具体的实现中它总是一个函数、过程或子程序的调用。在图5-1中,阴影部分是应用进程位于BACnet应用层中的部分。一个应用实体由两部分组成,分别是BACnet用户元素(UserElement)和BACnet应用层服务元素ASE(ApplicationServiceElement)。BACnet应用层服务元素描述了应用服务或功能的集合,在第13节到第17节以及第24节中将进行详细规范。BACnet用户元素执行多种功能,并且支持本地的API,它描述每个应用服务中“服务过程(serviceprocedure)”的实现。BACnet用户元素负责三个方面的事务,第一,保存事务处理的上下文信息,包括产生请求标识符(ID),记录哪个标识符是与哪个设备发出的应用服务响应(或对哪个设备的应用服务请求)相对应的;第二,保存超时重传机制所需的超时计时器;第三,将一个设备的行为映射13NPCI网络层服务数据单元(NSDU)LPCI数据链路层服务数据单元(LSDU)MPCIMAC层服务数据单元(MSDU)PPCI物理层服务数据单元(PSDU)APCI与服务相关的数据块APDUMPDULPDUNPDU应用层BACNET请求与服务有关的参数与网络层、数据链路层、MAC层相关的参数N-UNITDATA.请求DL-UNITDATA.请求MA-UNITDATA.请求P-UNITDATA.请求PPDU与数据链路层、MAC层相关的参数与MAC层相关的参数BACnet服务请求应用程序应用层网络层数据链路LLCMAC物理层图5-2.BACnet协议栈及数据流PCI:协议控制信息(ProtocolControlInformation)PDU:协议数据单元(ProtocolDataUnit)成为BACnet对象。根据OSI技术报告中关于ISO服务的约定用法(ISOTR8509),BACnet中两个对等应用进程间的信息交换,被表示成抽象服务原语的交换。这些服务原语用来传递一些特定的服务参数,这些参数将在第13节到第17节以及第24节中具体定义。本协议定义四种服务原语:请求(request)、指示(indication)、响应(response)和证实(confirm)。包含在这些原语中的信息,由本标准中定义的各种协议数据单元(PDU:ProtocolDataUnit)传递。为了清楚地表示所使用的BACnetPDU,下面给出一些符号标记:CONF_SERV.requestCONF_SERV.indicationCONF_SERV.responseCONF_SERV.confirmUNCONF_SERV.requestUNCONF_SERV.indicationSEGMENT_ACK.requestSEGMENT_ACK.indicationERROR.requestERROR.indicationREJECT.requestREJECT.indicationABORT.requestABORT.indication有证实(confirmed)服务的符号标记是CONF_SERV,指明使用BACnet的有证实服务PDU。无证实(unconfirmed)服务的符号标记是UNCONF_SERV,指明使用BACnet的无证实服务PDU。分段确认(segmentacknowledge)服务的符号标记是SEGMENT_ACK,指明使用BACnet的分段确认PDU。差错(error)服务的符号标记是ERROR,指明使用BACnet的差错PDU。拒绝(reject)服务的符号标记是REJECT,指明使用BACnet的拒绝PDU。中止(abort)服务的符号标记是ABORT,指明使用BACnet的中止PDU。当应用程序需要同远程的应用进程通讯时,它所要进行的操作是通过API访问本地的BACnet用户元素。应用程序调用API接口,并且将诸如服务请求接收设备的标识符(或地址)和协议控制信息等作为参数传递给API,而将通信内容作为数据传递给API。API将参数直接下传到网络层或数据链路层,而将数据组成一个应用层服务原语,通过BACnet用户元素传递给BACnet应用层服务元素。从概念上来讲,由应用层服务原语产生的应用层协议数据单元APDU(applicationprotocoldataunit),构成了网络层服务原语的数据部分,并通过网络层服务访问点NSAP(NetworkServiceAccessPoint)下传到网络层。按照这样的方式,这个请求进一步下传到本地设备协议栈的以下各层。整个过程如图5-2所示。于是,报文就这样被传送到远程的设备,并在远程设备协议栈中逐级上传,最后指示原语看起来似乎是直接从远程的BACnet应用层服务元素上传到远程的BACnet用户元素。同样,任何从远程设备发回的响应,也是以这样的方式回传给请求设备的。14应用实体通过API与应用程序除了交换服务原语和服务参数之外,还交换接口控制信息ICI(interfacecontrolinformation)参数。ICI的具体内容取决于服务原语的类型。应用实体将接收到的ICI参数下传至下面各层,从而使得各层可以构建自己的PDU。而由应用实体回传给应用程序的ICI参数,则包含了下面各层从各自PDU中得到的信息。通过API与各种服务原语交换信息的ICI参数包括:“目的地址DA(destination_address)”:将要接收服务原语设备的地址。其格式(如设备名称、网络地址等)只与本地有关。这个地址也可以是多目地址、本地广播地址或全局广播地址类型。“源地址SA(source_address)”:发送服务原语的设备的地址。其格式只与本地有关。“网络优先级NP(network_priority)”:在6.2.2节中所描述的一个四级网络优先级参数。“期待回复数据DER(data_expecting_reply)”:一个逻辑值参数,用来指明某个服务是否需要一个回复的服务原语。表5-1说明了各种ICI参数对各种服务原语的适用性。表5-1.ICI参数在各种服务原语中的适用性服务原语DASANPDERCONF_SERV.requestYesNoYesYes15请求PDU响应PDU发送接收响应方服务器端发送接收请求方客户端图5-3.客户与服务器的关系CONF_SERV.indicationYesYesYesYesCONF_SERV.responseYesNoYesYesCONF_SERV.confirmYesYesYesNoUNCONF_SERV.requestYesNoYesNoUNCONF_SERV.indicationYesYesYesNoREJECT.requestYesNoYesNoREJECT.indicationYesYesYesNoSEGMENT_ACK.requestYesNoYesNoSEGMENT_ACK.indicationYesYesYesNoABORT.requestYesNoYesNoABORT.indicationYesYesYesNoBACnet设备(BACnetDevice)是指任何一种支持用BACnet协议进行数字通信的真实的或者虚拟的设备。由12.9节中的定义可知,每一个BACnet设备必须且只能包含一个设备(Device)对象。每一个BACnet设备,都由一个NSAP唯一定位。在NASP中,包含了一个网络编号和一个MAC地址。在多数情况下,一个BACnet设备就是一个物理设备。然而在某些情况下,一个单一的物理设备也可以形成多个“虚拟的”BACnet设备。(参见附件H)。5.1.1有证实的应用层服务BACnet基于客户/服务器通信模型定义了有证实的应用层服务。客户方通过具体的服务请求实例向服务器方请求服务,服务器方通过响应请求来为客户方提供服务,这种关系如图5-3所示。在交互过程中,担当客户角色的BACnet用户,称为请求方BACnet用户;担当服务器角色的BACnet用户,称为响应方BACnet用户。有证实应用层服务的具体过程如下:由请求方BACnet用户发出一个有证实服务请求原语(CONF_SERV.request),形成请求PDU,发送给响应方BACnet用户。当这个请求PDU到达响应方BACnet用户时,响应方BACnet用户则收到一个有证实服务指示原语(CONF_SERV.indication)。同样,由响应方BACnet用户发出的一个有证实服务响应原语(CONF_SERV.response),形成响应PDU回传给请求方BACnet用户。当响16应PDU到达请求方BACnet用户时,请求方BACnet用户则收到一个有证实服务证实原语(CONF_SERV.confirm)。无论是请求方BACnet用户还是响应方BACnet用户,在该过程中都进行了PDU的发送和接收。因此,所谓“发送方BACnet用户”指的是发起一个PDU发送的BACnet用户;而“接收方BACnet用户”指的是接收到PDU到达指示的BACnet用户。5.1.2无证实的应用层服务在无证实应用层服务中,不存在上述客户/服务器模型、“请求方BACnet用户”和“响应方BACnet用户”等概念,只有“发送方BACnet用户”和“接收方BACnet用户”,BACnet标准用它们来定义无证实的应用层服务的服务过程。5.2BACnet报文的分段为了实现长报文(长度大于通信网络、收/发设备所支持的长度)的传输,BACnet采取了应用层报文分段的机制来对报文进行分段。在BACnet中只有有证实请求(Confirmed-Request)和复杂确认(Complex-ACK)报文可能需要分段,因此分段还是BACnet的一个可选特性。5.2.1报文分段规则本节规范对报文进行分段的规则。5.2.1.1APDU数据流的分段规则每个BACnet报文是一个由标记符和数值所组成的序列,这个序列是按照第21节中的ASN.1定义和第20节中的编码规则编码而成的。对于这样的数据流进行分段,依照下列的规则进行:(a)一个完整的报文尽可能作为一个APDU发送。(b)当一个完整的报文不可能作为一个APDU发送时,则应分段成最少个数的多个APDU发送。(c)对报文进行分段时,必须以字节(8个比特)作为最小的分割单位。5.2.1.2APDU最大长度的确定在BACnet中,APDU的最大长度不是固定的,其具体值是下列各长度值中的最小值:(a)设备所能发送的APDU的最大长度。这个长度一般与本地设备的缓冲区大小等因素有关。(b)BACnet互联网所能传输到远程设备的APDU的最大长度。这个长度一般由本地、远程、以及中间传输网络的数据链路所允许的网络层协议数据单元(NPDU)的最大长度所决定,在第6节中将对此详细说明。(c)远程设备所能接收的APDU的最大长度,其值不能小于50个字节。如果报文的发送设备是请求方BACnet用户,也就是说要发送的APDU是BACnet有证实请求PDU(BACnet-Confirmed-Request-PDU)或者是BACnet无证实请求PDU(BACnet-Unconfirmed-Request-PDU),这时远程设备所能接受APDU的最大长度,由远程设备对象的最大APDU长度支持(Max_APDU_Length_Accepted)属性所确定。可以通过第15节中描述的读属性(ReadProperty)服务来读取该属性值;也可以按16.9节中所述的方法,向远程设备发送一个Who-Is服务请求,使其回复一个I-Am服务响应,通过读取其中的‘最大APDU长度支持17(MaxAPDULengthAccepted)’参数来获得该属性值。如果报文的发送设备不是请求方BACnet用户,也就是说要发送的APDU是BACnet复杂确认PDU(BACnet-Complex-ACK-PDU),这时远程设备所能接受的APDU的最大长度,由本报文所响应的那个BACnet有证实请求PDU中的‘最大APDU长度支持’参数所确定。上述的各种约束值最终决定了最大可传输长度的大小。需要注意的是,除非各个约束值都取最小值,否则最大可传输长度(maximum-transmittable-length)不会是一个常数。5.2.2分段协议控制信息(PCI)为了支持报文分段,BACnet规定BACnet有证实请求PDU和BACnet复杂确认PDU的头部,包含两个布尔型参数,分别是‘报文分段(SegmentedMessage)’和‘后继(MoreFollows)’。如果报文经编码处理后生成的APDU的长度,小于或等于5.2.1节所确定的最大可传输长度的值,则‘报文分段’和‘后继’两个参数都应设置为FALSE。反之,如果报文经编码处理后生成的APDU的长度,大于5.2.1节所确定的最大可传输长度的值,则所有的分段中‘报文分段’参数都应设置为TRUE;并且除了最后一个分段,其它所有分段中的‘后继’参数也应设置为TRUE。此外,由有证实请求报文或复杂确认报文的每个分段所生成APDU的头部,还有两个条件参数。第一个条件参数是‘序号(SequenceNumber)’,这个八位二进制无符号整数被报文分段的发送方用来指定当前分段在整个报文分段序列中的位置。另一个条件参数是‘预设窗口尺寸(ProposedWindowSize)’,它同样是一个八位二进制无符号整数。报文分段的发送方用该参数来指明,在收到一个分段确认(SegmentAck)报文之前,它预备发送的最大报文分段数。这两个参数在分段报文发送中的具体用法将在5.3节和5.4节中进一步说明。起始分段中的‘序号’参数应设置为0。报文分段接收方在收到一个或一组报文后,会向发送方发送一个包含有‘序号’参数的分段确认PDU。序号的大小,等于最近一次成功接收到的分段的‘序号’参数值。这样,这个分段确认PDU不但用来请求发送方继续发送后一个或一组分段,还用来对先前一个分段或者是先前所有未被确认的分段(当WindowSize值大于1时)的确认。当然,在分段传输交互过程中的任何一方如果想中止交互过程,只要发送一个中止PDU(Abort-PDU)即可。5.3BACnetAPDU的传输在5.4节中,将对BACnet的APDU收发协议进行正式的表述,称之为事务处理状态机(TransactionStateMachine)。本节对整个收发协议作个整体概述。5.3.1有证实请求报文的传输客户端设备在下列两种情况下将启动一个计时器,用来计量对所关注的报文确认的时间。这两种情况是:(1)传输了一个完整未分段有证实请求报文后;(2)在等待接收分段有证实请求报文最后一个分段所对应的分段确认报文的确认信息时。一旦收到了一个关于那个还没有确认的有证实请求报文所发的差错APDU、拒绝APDU、中止APDU、简单确认(SimpleACK)APDU或复杂确认(ComplexACK)APDU,则停止计时,同时通知客户应用程序。如果计时器的时间值超出了客户设备对象的APDU超时(APDU_TimeOut)属性值,则整个有证实请求报文重新发送,计时器重新计时。所有有证实请求报文的超时重发过程都按照上述过程进行,直至重发次数超出了客户端设备对象的APDU重发次数(Number_Of_APDU_Retries)属性所规定的次数。若超出规定值仍未收到响应,18该报文将被丢弃,同时通知客户应用程序。5.3.2分段的有证实请求报文的传输客户端设备在发送分段的有证实请求PDU的第一个分段之前,首先选择一个预设窗口尺寸值,以表示它在收到一个分段确认报文之前,一次准备发送的报文分段最大个数。预设窗口尺寸值的选取由开发者自己决定,这只与客户端设备有关,但是其取值范围限制在从1到127。这个值由有证实请求PDU分段的‘预设窗口尺寸’参数表示,并且同一报文的每个分段该参数值都应该相同。在发送了有证实请求报文的第一个分段后,客户端设备将启动一个计时器,用来计量对该分段确认的时间。一旦收到了一个关于这个还没有确认的有证实请求报文分段所发的差错APDU、拒绝APDU、中止APDU、或分段确认APDU,则停止计时。如果计时器的时间值超出了客户设备对象的APDU分段超时(APDU_Segment_Timeout)属性值,则重发这个分段,并将计时器置零,重新计时。所有分段的超时重发过程都按照上述过程进行,直至重发次数超出了客户端设备对象中APDU重发次数属性所规定的次数。若超出规定值仍未收到响应,整个报文将被丢弃,同时通知客户应用程序。当服务器端设备收到分段的有证实请求PDU报文的第一个分段后,将会选择一个实际窗口尺寸(ActualWindowSize)值,以表示它在发送一个分段确认报文之前,一次准备接收的报文分段最大个数。实际窗口尺寸值的选取由开发者自己决定,这只与服务器设备有关,但是它还不能大于有证实请求PDU中的‘预设窗口尺寸’参数值,而且其取值范围限制在从1到127。对同一有证实请求报文所回应的所有分段确认报文,其实际窗口尺寸值都应该相同。需要特别说明的是,不管实际窗口尺寸值是多少,服务器设备在收到有证实请求报文的第一个分段后,应立即响应一个分段确认报文。在收到第一个分段确认APDU后,客户端设备得到该报文中携带的‘实际窗口尺寸(actual-window-size)’参数值,并将该值设置成客户设备自己的实际窗口尺寸。这样,客户端设备和服务器端设备的实际窗口尺寸值一致。客户端便可以在收到一个分段确认APDU之前,一次发送实际窗口尺寸值所规定的多个分段。客户端设备从收到一个分段确认APDU到发送一个分段,中间的时间间隔不能超过参数Tseg的值。同样,在连续发送的每个分段之间,时间间隔也不能超过Tseg值。客户端发送完整个报文或发送了窗口值个数的多个分段后,将启动一个计时器,用来计量对这些报文分段确认的时间。一旦收到了一个关于某些或者全部还没有确认的有证实请求报文分段所发的拒绝APDU、中止APDU或分段确认APDU,则停止计时。如果计时器的时间值超出了客户设备对象的APDU分段超时属性值,则重发这些分段,并且将计时器置零,重新计时。所有报文分段的超时重发过程都按照上述过程进行,直至重发次数超出了客户端设备对象中APDU重发次数属性所规定的次数。如果超出规定值仍未收到响应,该报文将被丢弃,同时通知客户应用程序。当客户端设备正在发送一个有证实请求报文分段序列的过程中,即使需要确认的分段数量小于实际窗口尺寸值,都可能会收到拒绝APDU、中止APDU或分段确认APDU。在这些情况发生时,如果收到拒绝APDU或中止APDU,则停止有证实请求报文的传输,如果收到分段确认APDU,则将此作为序号等于或小于该APDU中‘序号’参数值的所有分段的确认,而那些没有被确认的分段将按上述过程进行重发。需要注意的是还存在这样的情况,当客户端设备收到拒绝APDU、中止APDU或分段确认APDU时,可能已经发送或者已经向发送队列中传送了一个或多个(数量少于实际窗口尺寸值)额外的有证实请求PDU分段。5.3.3分段的复杂确认报文的传输服务端设备在发送分段复杂确认PDU的第一个分段之前,首先选择一个预设窗口尺寸值,以表示它在收到19一个分段确认报文之前,一次准备发送的报文分段最大个数。预设窗口尺寸值的选取由开发者自己决定,这只与服务器端设备有关,但是其取值范围限制在从1到127。复杂确认PDU的每一个分段中都有一个‘预设窗口尺寸(proposed-window-size)’参数,携带服务器端设备的预设窗口尺寸值,并且同一报文的每个分段的这个参数值都应该相同。在传输完第一个分段后,服务端设备将启动一个计时器,用来计量对该报文分段确认的时间。一旦收到了一个关于这个还没有确认的复杂确认报文分段所发送的中止APDU或分段确认APDU,则停止计时。如果计时器的时间值超出了服务器设备对象的APDU分段超时属性值,则重发这个分段,并将计时器置零,重新计时。所有分段的超时重发过程都按照上述过程进行,直至重发次数超出了服务器端设备对象中APDU重发次数属性所规定的次数。若超出规定值仍未收到响应,整个报文将被丢弃。当客户端设备收到分段的复杂确认APDU报文的第一个分段后,将会选择一个实际窗口尺寸值,以表示它在发送一个分段确认报文以前,一次准备接收的报文分段最大个数。实际窗口尺寸值的选取由开发者自己确定,这只与客户设备有关,但是它不能大于复杂确认PDU中的‘预设窗口尺寸’参数值,而且其取值范围限制在从1到127。对同一复杂确认的所有分段确认,其实际窗口尺寸参数值都应该相同。需要特别说明的是,不管实际窗口尺寸是多少,客户端设备在收到复杂确认报文的第一个分段后,就应立即发送一个分段确认报文。在收到一个分段确认APDU后,服务端设备得到该报文中携带的‘实际窗口尺寸’参数值,并将该值设置成服务器设备自己的实际窗口尺寸。这样,服务器端设备便可以在收到一个分段确认APDU之前,一次发送‘实际窗口尺寸’参数值所规定的多个分段。服务端设备从收到一个分段确认APDU到发送一个分段,中间的时间间隔不能超过参数Tseg的值。同样,在连续发送的每个分段之间,时间间隔也不能超过Tseg值。服务器端设备发送完整个报文或发送了窗口值个数的多个分段后,将启动一个计时器,用来计量对这些报文分段确认的时间。一旦收到了一个关于某些或者全部还没有确认的复杂确认报文分段所发的中止APDU或分段确认APDU,则停止计时。如果计时器的时间值超出了服务器设备对象的APDU分段超时属性值,则重发这些分段,并且将计时器置零,重新计时。所有报文分段的超时重发过程都按照上述过程进行,直至重发次数超出了服务器端设备对象中APDU重发次数属性所规定的次数。如果超出规定值仍未收到响应,该报文将被丢弃。服务器端在发送复杂确认报文分段的过程中,即使需要确认的分段数量小于实际窗口尺寸值,都可能会收到中止APDU或分段确认APDU。在这些情况发生时,如果收到拒绝APDU或中止APDU,则停止复杂确认报文的传输,如果收到分段确认APDU,则将此作为序号等于或小于该APDU中‘序号’参数值的所有分段的确认,而那些没有被确认的分段将按上述过程进行重发。需要注意的是还存在这样的情况,当服务器端设备收到一个中止APDU或分段确认APDU时,可能已经发送或者已经向发送队列中传送了一个或多个(数量少于实际窗口尺寸值)额外的有证实请求PDU分段。5.3.4分段确认APDU的传输分段确认APDU是分段接收方设备用来确认发送方的信息。在以下四种情况下,设备应传送一个分段确认报文。(a)设备收到分段的报文的第一个分段。在这种情况下,用于确认的分段确认报文中参数‘否定确认(negative-ACK)’应设置为FALSE,以表明这是个肯定的确认;参数‘序号’应设置为0,以表明第一个分段已经被确认,分段的发送方可以继续发送后续的分段。(b)设备收到未确认的、有序的、数量为实际窗口尺寸的多个报文分段构成的序列。在这种情况下,用于20确认的分段确认报文中参数‘否定确认’应设为FALSE,以表明这是个肯定的确认;,参数‘序号’应设置为此次所收的最后一个分段的‘序号’值,以表明包括该‘序号’在内的分段都被确认了,分段的发送方可以继续发送后续的分段。(c)设备收到一个乱序分段报文(可能表明丢失了某个分段)。在这种情况下,分段接收方将丢弃这个乱序分段。此处“乱序(outoforder)”这个词的意思是指所收的分段的‘序号’不等于所预期的‘序号’。用于确认的分段确认报文中参数‘否定确认’应设为TRUE,以表明这是个否定的确认;参数‘序号’应设置为最后一次正确收到的分段的‘序号’值,以表明到此‘序号’值为止的所有分段都被确认了,分段的发送方可以继续发送后续的分段。(d)设备收到报文的最后一个分段。在这种情况下,用于确认的分段确认报文中参数‘否定确认’应设为FALSE,以表明这是个肯定的确认;参数‘序号’应设置为最后报文分段的‘序号’值,以表明所有分段都被确认了。5.3.5重复的APDU和报文分段5.3.5.1客户端事务处理状态机的中止当使用BACnet标准定义的差错重传机制时,在报文传输的交互处理中,必然存在收到重复报文或分段的可能。在客户端,当发送了有证实请求APDU报文(或报文的第一个分段)之后,将创建事务处理状态机,进行事务处理。当出现以下四种情况之一时,客户端的事务处理中止,同时结束该事务处理状态机。(a)当收到服务器端设备发来的、包含有这个事务处理的调用标识符(invokeID)的五种报文时。这五种报文分别是:简单确认APDU、不分段的复杂确认APDU、差错APDU、拒绝APDU和中止APDU。(b)收到服务器发来的分段的复杂确认APDU的最后一个分段,并发送了相应的分段确认APDU后。(c)当超时重传次数用尽后。(d)在向服务器发送了包含有该事务处理的调用标识符的中止APDU后(例如:客户端中止这个事务处理)。5.3.5.2服务端事务处理状态机的中止在服务端,当收到了证实请求APDU报文(或报文的第一个分段)之后,将创建事务处理状态机,进行事务处理。当出现以下四种情况之一时,服务器端的事务处理中止,同时结束该事务处理状态机。(a)当向客户端设备发送完成包含有这个事务处理的调用标识符的五种报文时。这五种报文分别是:简单确认APDU、不分段的复杂确认APDU、差错APDU、拒绝APDU和中止APDU。(b)当收到客户端设备发来的关于分段的复杂确认APDU最后一个分段的分段确认APDU之后。(c)当接收到客户端发来的包含有该事务处理调用标识符的中止APDU后。(d)在传输一个分段的复杂确认APDU的过程中,超时重传次数达到规定值仍未成功时。5.3.5.3重复报文的处理重复报文或重复报文分段的处理过程如下:(a)当服务器接收到一个重复的有证实请求报文时,如果服务器具有识别重复的有证实请求报文的能力,则该重复的报文将被服务器丢弃。否则,服务器仍然响应这个重复的有证实请求报文,在这种情况下,客户将根据这个服务器响应报文中的调用标识符不与任何一个当前的事务处理状态机绑定这个情况,21而丢弃这个响应报文。(b)当服务器接收到一个重复的有证实请求报文分段,即已经收到并针对该分段发送了分段确认报文时,服务器将丢弃这个重复的分段,并回传一个合适的分段确认APDU。任何分段都可由对等方地址(peeraddress)、调用标识符和分段的序号唯一确定。(c)当客户接收到一个重复的复杂确认报文分段,即已经收到并针对该分段发送了分段确认报文时,客户将丢弃这个重复的分段,并回传一个合适的分段确认APDU。任何分段都可由对等方地址、调用标识符和分段的序号唯一确定。(d)当一个设备接收到一个重复的分段确认APDU时,该设备将丢弃这个重复的分段确认APDU。其它的一些措施(包括可能的报文分段重发),应符合5.4节中的规定。5.3.6失效资源(StaleResource)的处理上述BACnet的差错重传过程,其具体实现需要客户和服务器两端提供一定的资源。这些资源通常是事务处理的各个细节,包括事务处理状态机、计时器、以及APDU或APDU分段缓冲区等。当差错重传过程失败时,这些相关的资源也变得失效,应被释放掉。资源释放的具体细节取决于系统的具体设计。作为设计建议,本协议给出了资源失效而应释放的依据:(a)在客户端,当收到对一个有证实请求APDU的完整响应后。(b)在客户端,当一个有证实请求APDU报文被重发了APDU重发次数属性所规定的次数,但仍未成功时。(c)在客户端,当一个有证实请求APDU分段被重发了APDU重发次数属性所规定的次数,但仍未成功时。(d)在服务器端,当发送了对某个有证实请求APDU的响应并收到相应的分段确认后。5.4应用层协议状态机BACnet的APDU可以分为两种:一种是由请求方BACnet用户(客户)发送的,另一种是由响应方BACnet用户(服务器)发送的。所有的BACnet设备都应能工作在响应方BACnet用户状态,从而能够接收请求方BACnet用户发来的APDU。另一方面,许多设备还可以工作在请求方BACnet用户状态,接收响应方BACnet用户发来的APDU。请求方BACnet用户(客户)发送的APDU:BACnet无证实请求PDU(BACnet-Unconfirmed-Request-PDU)BACnet有证实请求PDU(BACnet-Confirmed-Request-PDU)BACnet分段确认PDU(BACnet-SegmentACK-PDU)(参数‘服务器(server)’=FALSE)BACnet中止PDU(BACnet-Abort-PDU)(参数‘服务器’=FALSE)响应方BACnet用户(服务器)发送的APDU:BACnet简单确认PDU(BACnet-SimpleACK-PDU)BACnet复杂确认PDU(BACnet-ComplexACK-PDU)BACnet差错PDU(BACnet-Error-PDU)BACnet拒绝PDU(BACnet-Reject-PDU)22BACnet分段确认PDU(BACnet-SegmentACK-PDU)(参数‘服务器’=TRUE)BACnet中止PDU(BACnet-Abort-PDU)(参数‘服务器’=TRUE)请求方和响应方BACnet用户为每一个事务处理都要创建并且维护一个事务处理状态机(简称TSM)。该TSM在事务开始时创建,在事务结束时中止。其过程如下:由空闲(IDLE)状态转变进入到TSM状态,建立TSM;由TSM状态转变到空闲状态,中止TSM。一个事务处理由客户BACnet地址(BACnetAddress)、服务器BACnet地址和调用标识符(如果存在的话)唯一确定。当一个PDU从网络层传递给应用层时,应用层软件检查PDU的类型、源BACnet地址、目的BACnet地址、调用标识符(如果存在的话),确定PDU的类型(是请求方还是响应方BACnet用户)以及应送给哪个TSM处理。如果不存在对应的TSM,必须新建一个TSM。当一个请求从应用程序传递给应用层时,应用层软件检查请求的类型、源BACnet地址、目的BACnet地址、调用标识符(如果存在的话),确定请求的类型(是请求方还是响应方BACnet用户)以及应送给哪个TSM处理。如果不存在对应的TSM,必须新建一个TSM。为了简化状态机的描述,这里仅给出应用实体所进行分段的情况,应用程序所进行的分段也是存在的。在这种情况下,当前的TSM无论是接收一个分段还是一组分段或是发送分段确认,分段都将通过更新后的TSM传递给应用程序,而分段确认则只沿着从应用程序通过分段确认请求(SEGMENT_ACK.request)原语这个方向传递。当更新的状态机接收到分段确认PDU,就向应用程序传递一个分段确认指示(SEGMENT_ACK.indication)原语。5.4.1变量与参数在每个事务处理状态机的实例中,都使用了一些变量,定义如下:重发计数(RetryCount):用于计数APDU重发的次数分段重发计数(SegmentRetryCount):用于计数分段重发的次数分段发送完毕(SentAllSegments):用于控制APDU的重发及接收服务器的响应最近序号(LastSeqenceNumber):用于保存顺序接收的最近一个分段的序号初始序号(InitialSequenceNumber):用于保存填充一个窗口的分段序列的第一个分段的序号实际窗口尺寸(ActualWindowSize):用于保存当前窗口尺寸值预设窗口尺寸(ProposedWindowSize):用于保存分段发送方的预设的窗口尺寸值分段计时器(SegmentTimer):用于记录PDU分段的超时请求计时器(RequestTimer):用于记录有证实请求的超时以下是所用的参数的说明:Tseg:这个参数是一个节点在发送完一个分段序列的最后一个分段后,等待分段确认PDU的时间长度。这个时间长度值等于节点的设备对象中APDU分段超时属性值。Twait_for_seg:这个参数是一个节点在发送完分段确认PDU后,等待后续报文分段的时间长度。这个时间长度值是节点的设备对象中APDU分段超时属性值的4倍。Tout:这个参数表示节点的设备对象中APDU超时属性值。Nretry:这个参数表示节点的设备对象中APDU重发次数属性值。5.4.2InWindow函数23函数“InWindow”用于完成对两个序号(由无符号8位整数构成)的模256运算。所有的计算和比较都是在8位无符号整数基础上模256运算。函数InWindow(seqA,seqB)(a)如果参数seqA减去参数seqB的差再模256,其结果少于实际窗口尺寸,则返回TRUE(b)否则返回FALSE。例程(参考资料):假定实际窗口尺寸为4,则InWindow(0,0)返回TRUEInWindow(1,0)返回TRUEInWindow(3,0)返回TRUEInWindow(4,0)返回FALSEInWindow(4,5)返回FALSE(因为(4-5)mod256=255)InWindow(0,255)返回TRUE(因为(0-255)mod256=1)5.4.3FillWindow函数函数“FillWindow”用于发送一组PDU分段,该PDU分段序列的数目或者正好填充窗口,或者是一个报文的最后部分分段。在收到一个分段确认APDU到发送下一个分段序列,时间间隔不能大于Tseg值。分段序列中两个相邻分段发送的时间间隔,也不能大于Tseg值。函数FillWindow(sequenceNumber)(a)将局部变量ix值设置为0。(b)如果下一个要发送的分段(分段的序号是序号加上ix)是报文的最后一个分段,则跳至步骤(g)。(c)产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request,用来发送后续的BACnetAPDU分段。此分段中参数‘报文分段’=TRUE,‘后继’=TURE,‘预设窗口尺寸’=预设窗口尺寸值,‘序号’=(序号+ix)模256。(d)将ix自加1。(e)如果ix小于实际窗口尺寸值,跳至步骤(b)。(f)跳至步骤(i)。(g)产生参数‘期待回复数据’=TRUE的N-UNITDATA.request,用来发送最后一个BACnetAPDU分段。此分段中参数‘报文分段’=TRUE,‘后继’=FALSE,‘预设窗口尺寸’=预设窗口尺寸值,‘序号’=(序号+ix)模256。(h)将变量分段发送完毕(SentAllSegments)设置为TRUE,用来表示此次已经将所有分段发送完毕。(i)返回到调用者。5.4.4请求方BACnet用户(客户)状态机5.4.4.1空闲状态24在空闲状态,设备等待着本地应用程序请求服务。发送无证实请求(SendUnconfirmed)如果设备接收到本地应用程序发出的UNCONF_SERV.request,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet无证实请求PDU,然后进入空闲状态。发送有证实不分段请求(SendConfirmedUnsegmented)如果设备接收到本地应用程序发出的CONF_SERV.request、并且APDU的长度不大于5.2.1节所确定的“最大可传输长度”,则设备对该事务过程指定一个调用标识符,设置变量分段发送完毕=TRUE,重发计数=0,启动请求计时器,产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文,用来传送一个参数‘报文分段’=FALSE的BACnet有证实请求PDU,然后进入等待证实状态(AWAIT_CONFIRMATION),等待确认。发送有证实分段请求(SendConfirmedSegmented)如果设备接收到本地应用程序发出的CONF_SERV.request、并且APDU的长度大于5.2.1节所确定的“最大可传输长度”,则设备对该事务过程指定一个调用标识符,设置变量分段发送完毕=FALSE,重发计数=0,分段重发计数=0,初始序号=0,预设窗口尺寸=所希望的大小,实际窗口尺寸=1,启动请求计时器,产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文。该请求报文用来传送参数‘报文分段’=TRUE、‘后继’=TURE、‘序号’=0、‘预设窗口尺寸’=预设窗口尺寸的一个BACnet有证实请求PDU,这个PDU包含了这个报文的第一个分段。然后进入分段请求(SEGMENTED_REQUEST)状态,等待确认。(注:预设窗口尺寸值的选取由开发者自己决定,这只与本地设备有关,但是其取值范围限制在从1到127。)接收到意外分段信息(UnexpectedSegmentInfoReceived)如果设备从网络层接收到一个意外的PDU,例如一个参数‘报文分段’=TRUE的BACnet复杂确认PDU,或者是一个参数‘服务器’=TRUE的BACnet分段确认PDU时,这表明存在一个活动的服务器TSM,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送参数‘服务器’=FALSE的BACnet中止PDU,然后进入空闲状态。接收到意外PDU(UnexpectedPDU_Received)如果设备从网络层接收到一个意外的PDU,例如一个参数‘报文分段’=FALSE的BACnet简单确认PDU、BACnet复杂确认PDU,或者一个参数‘服务器’=TRUE的BACnet差错PDU、BACnet拒绝PDU、BACnet中止PDU时,这表明不存在一个活动的服务器TSM,则进入空闲状态。(这里,客户端并不了解所讨论的事务处理,因而没有必要产生拒绝指示原语25(REJECT.indication)、中止指示原语(ABORT.indication)等服务原语)5.4.4.2分段请求状态在分段请求状态,设备等待接收针对BACnet有证实请求PDU所发出的一个或几个分段的BACnet分段确认PDU的确认报文。接收到重复确认PDU(DuplicateACK_Received)如果设备从网络层接收到一个BACnet分段确认PDU报文,其中参数‘服务器’=TRUE,而函数InWindow(BACnet分段确认PDU的‘序号’参数值,初始序号)返回值为FALSE,则重启分段计时器,进入分段请求状态,继续等待确认。接收到新确认PDU(NewACK_Received)如果设备从网络层接收到一个BACnet分段确认PDU报文,其中参数‘服务器’=TRUE,而函数InWindow(BACnet分段确认PDU的‘序号’参数值,初始序号)返回值为TRUE,同时设备至少还有一个报文分段等待发送,则设置变量初始序号=(BACnet分段确认PDU的‘序号’+1)模256,实际窗口尺寸=BACnet分段确认PDU的‘实际窗口尺寸’参数值,分段重发计数=0,调用函数FillWindow(初始序号)来发送一个或多个BACnet有证实请求PDU,这些PDU正好包含了后续的实际窗口尺寸个报文分段,然后进入分段请求状态,等待新的确认。接收到最后一个确认PDU(FinalACK_Received)如果设备从网络层接收到一个BACnet分段确认PDU报文,其中参数‘服务器’=TRUE,而函数InWindow(BACnet分段确认PDU的‘序号’,初始序号)的返回值为TRUE,同时已没有分段需要发送,则停止分段计时器,启动请求计时器,进入等待证实状态,等待服务响应。分段超时(Timeout)如果分段计时器的值超过了Tseg、但分段重发计数的值又小于Nretry,则分段重发计数自加1,重启分段计时器,调用函数FillWindow(初始序号)以重新发送一个或多个BACnet有证实请求PDU,这些PDU正好包含了后续的实际窗口尺寸个报文分段,然后进入分段请求状态,重新等待确认。最终超时(FinalTimeout)如果分段计时器的值超过了Tseg、同时分段重发计数的值也超过Nretry,则停止分段计时器,向本地应用程序发送CONF_SERV.confirm(-)服务原语,然后进入空闲状态。接收到中止PDU(AbortPDU_Received)26如果设备从网络层接收到一个BACnet中止PDU报文,其中参数‘服务器’=TRUE,则停止分段计时器,向本地应用程序发送ABORT.indication原语,然后进入空闲状态。接收到简单确认PDU(SimpleACK_Received)如果设备从网络层接收到一个BACnet简单确认PDU报文、并且变量分段发送完毕=TRUE,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(+)原语,然后进入空闲状态。接收到不分段复杂确认PDU(UnsegmentedComplexACK_Received)如果设备从网络层接收到一个BACnet复杂确认PDU报文,其中参数‘报文分段’=FALSE,并且变量分段发送完毕=TRUE,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(+)原语,然后进入空闲状态。接收到分段复杂确认PDU(SegmentedComplexACK_Received)如果设备从网络层接收到一个BACnet复杂确认PDU报文,其中参数‘报文分段’=TRUE、‘序号’=0,同时该设备支持报文分段,并且变量分段发送完毕=TRUE,则停止请求计时器,然后根据接收到的PDU中的‘预设窗口尺寸’参数值以及设备自身情况,计算变量实际窗口尺寸的实际取值,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送参数‘否定确认(negative-ACK)’=FALSE、‘服务器’=FALSE、‘实际窗口尺寸’=实际窗口尺寸值的一个BACnet分段确认PDU,然后启动分段计时器,设置变量最近序号=0,初始序号=0,最后进入分段证实(SEGMENTED_CONF)状态,接收后续分段。(注:实际窗口尺寸的值由开发者自行确定,只与本地设备有关,但是这个值的取值限制在1到127范围内,并且实际取值不能大于接收到的BACnet复杂确认PDU报文中的‘预设窗口尺寸’参数值。)接收到差错PDU(ErrorPDU_Received)如果设备从网络层接收到一个BACnet差错PDU报文、并且变量分段发送完毕=TRUE,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(-)服务原语,然后进入空闲状态。接收到拒绝PDU(RejectPDU_Received)如果设备从网络层接收到一个BACnet拒绝PDU报文、并且变量分段发送完毕=TRUE,则停止请求计时器,向本地应用程序发送REJECT.indication原语,然后进入空闲状态。接收到意外PDU如果设备从网络层接收到一个BACnet简单确认PDU、BACnet复杂确认PDU、BACnet差错PDU或者BACnet中止PDU报文、而变量分段发送完毕=FALSE;或者从网络层接收到的BACnet复杂确认PDU报文且其参数‘报文分段’=TRUE、而本设备又不支持报文分段;或者是从网络层接收到的BACnet复杂确认PDU报文27其参数‘报文分段’”=TRUE、参数‘序号’≠0,在以上这些情况下,停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request,传送参数‘服务器’=FALSE的一个BACnet中止PDU,同时向本地应用程序发送CONF_SERV.confirm(-)原语,最后进入空闲状态。发送中止PDU(SendAbort)如果设备从本地应用程序接收到ABORT.request服务原语,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request,传送一个参数‘服务器’=FALSE的BACnet中止PDU,然后进入空闲状态。5.4.4.3等待证实状态在等待证实状态,设备等待接收针对BACnet有证实请求PDU所发出的响应。接收到简单确认PDU如果设备从网络层接收到一个BACnet简单确认PDU,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(+)服务原语,然后进入空闲状态。接收到不分段复杂确认PDU如果设备从网络层接收到一个BACnet复杂确认PDU报文,其中参数‘报文分段’=FALSE,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(+)服务原语,然后进入空闲状态。接收到分段复杂确认PDU如果设备从网络层接收到一个BACnet复杂确认PDU报文,其中参数‘报文分段’=TRUE、‘序号’=0,同时该设备支持报文分段,则停止请求计时器,根据接收到的PDU中的‘预设窗口尺寸’参数值以及设备自身情况,计算变量实际窗口尺寸的取值,并产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request,用来传送参数‘否定确认’=FALSE、‘服务器’=FALSE、‘实际窗口尺寸’=变量实际窗口尺寸值的一个BACnet分段确认PDU,然后启动分段计时器,设置变量最近序号=0,变量初始序号=0,最后进入分段证实状态,接收后续分段。(注:实际窗口尺寸的值由开发者自行确定,只与本地设备有关,但是这个值的取值限制在1到127范围内,并且实际取值不能大于接收到的BACnet复杂确认PDU报文中的‘预设窗口尺寸’参数值。)接收到差错PDU如果设备从网络层接收到一个BACnet差错PDU报文,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(-)原语,然后进入空闲状态。28接收到拒绝PDU如果设备从网络层接收到一个BACnet拒绝PDU报文,则停止请求计时器,向本地应用程序发送REJECT.indication原语,然后进入空闲状态。接收到放弃PDU如果设备从网络层接收到一个BACnet放弃PDU报文,其中参数‘服务器’=TRUE,则停止分段计时器,向本地应用程序发送ABORT.indication原语,然后进入空闲状态。接收到分段确认PDU如果设备从网络层接收到一个BACnet分段确认PDU=报文,其中参数‘服务器’=TRUE,则将此视为重复PDU而丢弃掉,然后返回当前状态。接收到意外PDU如果设备从网络层接收到一个意外的PDU,例如一个参数‘报文分段’=TRUE,参数‘序号’≠0的BACnet复杂确认PDU,或者一个参数‘报文分段’=TRUE,而此设备又不支持报文分段的情况,则停止请求计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用以传送参数‘服务器’=FALSE的一个BACnet放弃PDU报文,同时向本地应用程序发送CONF_SERV.confirm(-)服务原语,最后进入空闲状态。请求超时不分段(TimeoutUnsegmented)如果设备的请求计时器的值超过了Tout,但重发计数的值又小于APDU重发次数参数值,并且有证实请求APDU的长度不大于5.2.1节所确定的最大可传输长度值,则停止请求计时器,将重发计数自加1,产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文,用以传送参数‘报文分段’=FALSE的一个BACnet有证实请求PDU,最后进入等待证实状态,重新等待确认。请求超时分段(TimeoutSegmented)如果设备的请求计时器的值超过了Tout,但重发计数的值又小于APDU重发次数参数值,而有证实请求APDU的长度大于5.2.1节所确定的最大可传输长度,则停止请求计时器,将重发计数自加1,设置变量分段重发计数=0,启动分段计时器,设置变量初始序号=0,变量实际窗口尺寸=1,产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文,用来传送参数‘报文分段’=TRUE、‘后继’=TURE、‘序号’=0的一个BACnet有证实请求PDU,该PDU包含了这个报文的第一个分段,最后设备进入分段请求状态,等待确认。29最终超时如果设备的请求计时器的值超过了Tout,同时重发计数的值也超过了APDU重发次数参数值,则停止请求计时器,向本地应用程序发送CONF_SERV.confirm(-)原语,然后进入空闲状态。发送放弃PDU如果设备从本地应用程序接收到ABORT.request原语,则停止请求计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=FALSE的BACnet放弃PDU,然后进入空闲状态。5.4.4.4分段证实状态在分段证实状态,设备等待接收一个或者几个针对BACnet分段确认PDU的响应分段。接收到新分段但无空间保存(NewSegmentReceived_NoSpace)如果设备从网络层接收到一个BACnet复杂确认PDU,其中‘报文分段’=TRUE、‘序号’=(最近序号+1)模256,但设备自身已没有空间来存储新的分段,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=FALSE的BACnet中止PDU,然后向本地应用程序发送CONF_SERV.confirm(-)原语,最后进入空闲状态。接收到新的分段如果设备从网络层接收到一个BACnet复杂确认PDU报文,其中‘报文分段’=TRUE、‘后继’=TRUE、‘序号’=(最近序号+1)模256、且‘序号’≠(初始序号+实际窗口尺寸)模256,则保存此BACnet复杂确认PDU分段,将变量最近序号自加1、模256,重启分段计时器,然后进入分段证实状态,等待后续的分段。接收到一组分段中的最后分段(LastSegmentOfGroupReceived)如果设备从网络层接收到一个BACnet复杂确认PDU报文,其中‘报文分段’=TRUE、‘后继’=TRUE、‘序号’=(最近序号+1)模256、且‘序号’=(初始序号+实际窗口尺寸)模256,则保存此BACnet复杂确认PDU分段,将变量最近序号自加1、模256,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送参数‘否定确认’=FALSE、‘服务器’=FALSE、‘实际窗口尺寸’=实际窗口尺寸值的BACnet分段确认PDU,重启分段计时器,最后进入分段证实状态,等待接收后续分段。接收到复杂确认的最后分段(LastSegmentOfComplexACK_Received)如果设备从网络层接收到一个BACnet复杂确认PDU,其中‘报文分段’=TRUE、‘序号’=(最近序号+1)模256、‘后继’=FALSE(即最后一个分段),30则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送参数‘否定确认’=FALSE、‘服务器’”=FALSE、‘实际窗口尺寸’=实际窗口尺寸值的一个BACnet分段确认PDU,然后向本地应用程序发送一个CONF_SERV.confirm(+)原语,该原语中包含了接收到的所有分段,最后进入空闲状态。接收到乱序分段(SegmentReceivedOutOfOrder)如果设备从网络层接收到一个BACnet复杂确认PDU,其中‘报文分段’=TRUE、‘序号’”≠(最近序号+1)模256,则丢弃此PDU分段,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘否定确认’”=TRUE、‘服务器’=FALSE、‘序号’=最近序号、‘实际窗口尺寸’=实际窗口尺寸的BACnet分段确认PDU,然后重启分段计时器,进入分段证实状态,等待接收后续分组。接收到中止PDU如果设备从网络层接收到一个BACnet中止PDU报文,其中参数‘服务器’=TRUE,则停止分段计时器,向本地应用程序发送ABORT.indication原语,然后进入空闲状态。接收到意外PDU如果设备从网络层接收到一个意外的PDU,例如参数‘报文分段’=FALSE的BACnet简单确认PDU、BACnet复杂确认PDU,或者是参数‘服务器’=TRUE的BACnet差错PDU、BACnet拒绝PDU、BACnet分段确认PDU,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=FALSE的BACnet中止PDU,同时向本地应用程序发送CONF_SERV.confirm(-)原语,最后进入空闲状态。分段超时如果设备的分段计时器的值超过了Tseg的4倍,则停止分段计时器,向本地应用程序发送CONF_SERV.confirm(-)原语,然后进入空闲状态。发送中止PDU如果设备从本地应用程序接收到ABORT.request,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=FALSE的BACnet中止PDU,然后进入空闲状态。5.4.5响应方BACnet用户(服务器)状态机5.4.5.1空闲状态31在空闲状态,设备等待从网络层传递来一个PDU。接收到无证实请求PDU如果设备从网络层接收到一个BACnet无证实请求PDU,则向本地应用程序发送一个UNCONF_SERV.indication原语,然后进入空闲状态。接收到不分段有证实请求PDU如果设备从网络层接收到一个BACnet有证实请求PDU,其中参数‘报文分段’=FALSE,则向本地应用程序发送一个CONF_SERV.indication原语,然后进入等待响应状态。接收到分段证实请求PDU且不支持如果设备从网络层接收到一个BACnet有证实请求PDU,其中参数‘报文分段’=TRUE,但是该设备不支持分段报文的接收,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet中止PDU,其中参数‘服务器’=TRUE、‘放弃原因(abort-reason)’=不支持分段(SEGMENTATION_NOT_SUPPORTED),然后进入空闲状态。接收到分段证实请求PDU如果设备从网络层接收到一个BACnet有证实请求PDU,其中参数‘报文分段’=TRUE、‘序号’=0,且该设备支持分段报文的接收,则根据BACnet有证实请求PDU中的‘预设窗口尺寸’参数值以及设备自身情况,计算变量实际窗口尺寸的取值,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet分段确认PDU,其中参数‘否定确认’=FALSE、‘服务器’=TRUE、‘实际窗口尺寸’=实际窗口尺寸值,然后启动分段计时器,设置最近序号=0、初始序号=0,最后进入分段请求状态,准备接收后续分段。(注:实际窗口尺寸的值由开发者自行确定,只与本地设备有关,但是这个值的取值限制在1到127范围内,并且实际取值不能大于接收到的BACnet有证实请求PDU报文中的‘预设窗口尺寸’参数值。)接收到中止PDU如果设备从网络层接收到一个BACnet中止PDU报文,其中参数‘服务器’=FALSE,则进入空闲状态。接收到意外PDU如果设备从网络层接收到一个意外的PDU,例如一个参数‘报文分段’=TRUE、‘序号’=0的BACnet有证实请求PDU,或者一个参数‘服务器’=FALSE的BACnet分段确认PDU,则产生参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU报文,然后进入空闲状态。325.4.5.2分段请求状态在分段请求状态,设备等待接收BACnet有证实请求PDU的分段。接收到新的分段如果设备从网络层接收到一个BACnet有证实请求PDU,其中‘报文分段’=TRUE、‘后继’=TRUE、‘序号’=(最近序号+1)模256、‘序号’≠(初始序号+实际窗口尺寸)模256,则保存此BACnet有证实请求PDU分段,将变量最近序号自加1,模256,重启分段计时器,然后进入分段请求状态,等待接收后续的分段。接收到一组分段中的最后分段如果设备从网络层接收到一个BACnet有证实请求PDU报文,其中‘报文分段’=TRUE、‘后继’=TRUE、‘序号’=(最近序号+1)模256、‘序号’=(初始序号+实际窗口尺寸)模256,则保存此BACnet有证实请求PDU分段,将变量最近序号自加1,模256,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet分段确认PDU,其中参数‘否定确认’=FALSE、‘服务器’=TRUE、‘序号’=最近序号值、‘实际窗口尺寸’=实际窗口尺寸值,然后重启分段计时器,设置变量初始序号=变量最近序号,最后进入分段请求状态,等待接收后续的分段。接收到报文最后分组如果设备从网络层接收到一个BACnet有证实请求PDU报文,其中参数‘报文分段’=TRUE、‘序号’=(最近序号+1)模256、‘后继’=FALSE(即最后一个分段),则保存此BACnet有证实请求PDU分段,将变量最近序号自加1,模256,停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet分段确认PDU,其中参数‘否定确认’=FALSE、‘服务器’=TRUE、‘序号’=变量最近序号值、‘实际窗口尺寸’=变量实际窗口尺寸值,然后设置变量初始序号=变量最近序号值,向本地应用程序发送一个CONF_SERV.indication(+)原语,在该原语中,包含了接收到的所有分段,最后进入等待响应状态。接收到乱序分段如果设备从网络层接收到一个BACnet有证实请求PDU,其中‘报文分段’=TRUE、‘序号’≠(最近序号+1)模256,则丢弃此PDU,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet分段确认PDU,其中‘否定确认’=TRUE、‘服务器’=TRUE、‘序号’=变量最近序号的值、‘实际窗口尺寸=变量实际窗口尺寸的值,然后重启分段计时器,设置变量初始序号=变量最近序号,最后进入分段请求状态,等待接收后续分组。接收到中止PDU如果设备从网络层接收到一个BACnet中止PDU报文,其中参数‘服务器’=FALSE,33则停止分段计时器,然后进入空闲状态。接收到意外PDU如果设备从网络层接收到一个意外的PDU,例如一个参数‘报文分段’=FALSE的BACnet有证实请求PDU、或者一个参数‘服务器’”=FALSE的BACnet分段确认PDU,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,最后进入空闲状态。分段超时如果设备的分段计时器的值超过了Tseg的4倍,则停止分段计时器,进入空闲状态。发送中止PDU如果设备从本地应用程序接收到ABORT.request原语,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,然后进入空闲状态。5.4.5.3等待响应状态在等待响应状态,设备等待本地应用程序针对BACnet有证实请求PDU所做出的响应。参见9.8节关于在MS/TP网络中的特殊考虑。发送简单确认PDU如果设备从本地应用程序接收到一个CONF_SERV.response(+)原语,且这个原语要通过一个BACnet简单确认PDU进行传递,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个包含了这个CONF_SERV.confirm(+)信息的BACnet简单确认PDU,然后进入空闲状态。发送不分段复杂确认PDU如果设备从本地应用程序接收到一个CONF_SERV.response(+)原语,且这个原语要通过一个BACnet复杂确认PDU进行传递,而且这个APDU的长度不大于5.2.1节所确定的最大可传输长度值,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘报文分段’=FALSE的BACnet复杂确认PDU,然后进入空闲状态。无法发送分段复杂确认PDU(CannotSendSegmentedComplexACK)如果设备从本地应用程序接收到一个CONF_SERV.response(+)原语,且这个原语要通过一个BACnet复杂确认PDU进行传递,而且这个APDU的长度大于5.2.1节所确定的最大可传输长度值,如果同时还存在以34下任何一种情况:(a)此设备不支持分段报文的发送,或者(b)客户端设备不能接收分段的响应(当客户端设备发来的BACnet有证实请求PDU中参数‘可接收分段响应(segmented-response-accepted)’=FALSE时),则产生参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet中止PDU,其中参数‘服务器’=TRUE、‘放弃原因’=不支持分段,最后进入空闲状态。发送分段复杂确认PDU如果设备从本地应用程序接收到一个CONF_SERV.response(+)原语,且这个原语要通过一个BACnet复杂确认PDU进行传递,而且这个APDU的长度大于5.2.1节所确定的最大可传输长度值,同时该设备支持分段报文的发送,而且客户端设备也能够接收分段的响应(当客户端设备发来的BACnet有证实请求PDU中参数‘可接收分段响应’=TRUE时),则设置参数分段重发计数=0、初始序号=0、预设窗口尺寸=所希望的值、实际窗口尺寸=1,启动分段计时器,产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文,用来传送一个包含了这个报文第一个分段的BACnet复杂确认PDU,其中参数‘报文分段’=TRUE、‘后继’=TURE、‘序号’=0、‘预设窗口尺寸’=变量预设窗口尺寸值,最后进入分段请求状态,等待接收确认。发送差错PDU如果设备从本地应用程序接收到一个CONF_SERV.response(-)原语,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet差错PDU,然后进入空闲状态。发送中止PDU如果设备从本地应用程序接收到ABORT.request原语,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,然后进入空闲状态。发送拒绝PDU如果设备从本地应用程序接收到REJECT.request原语,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet拒绝PDU,然后进入空闲状态。接收到中止PDU如果设备从网络层接收到一个BACnet中止PDU,其中参数‘服务器’=FALSE,则向本地应用程序发送ABORT.indication原语,然后进入空闲状态。35接收到重复的请求PDU如果设备从网络层接收到一个BACnet有证实请求PDU,其中参数‘报文分段’=FALSE,则将这个PDU视为重复请求而丢弃掉,然后重新返回当前状态。接收到重复分段PDU如果设备从网络层接收到一个BACnet有证实请求PDU,其中参数‘报文分段’=TRUE,则将这个PDU视为重复分段而丢弃掉,并且产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个BACnet分段确认PDU,其中参数‘否定确认’=FALSE、‘服务器’=TRUE、‘序号’=变量最近序号值、‘实际窗口尺寸’=变量实际窗口尺寸的值,然后重新返回当前状态。接收到意外PDU如果设备从网络层接收到一个意外的PDU,例如一个参数‘服务器’=FALSE的BACnet分段确认PDU,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,然后向本地应用程序发送ABORT.indication原语,最后进入空闲状态。分段超时如果设备的请求计时器的值超过了Tout,则产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,然后向本地应用程序发送ABORT.indication原语,最后进入空闲状态。5.4.5.4分段响应状态在分段响应状态,设备等待接收一个BACnet分段确认PDU,此PDU用于对BACnet复杂确认PDU中的一个或几个分段进行确认。接收到重复确认PDU如果设备从网络层接收到一个BACnet分段确认PDU报文,其中参数‘服务器’=FALSE,而函数InWindow(BACnet分段确认PDU中的‘序号’参数值,初始序号)的返回值为FALSE,则重启分段计时器,进入分段响应状态,继续等待接收确认,直至超时。接收到新确认PDU如果设备从网络层接收到一个BACnet分段确认PDU报文,其中参数‘服务器’=FALSE,而函数InWindow(BACnet分段确认PDU中的‘序号’参数值,初始序号)的返回值为TRUE,同时设备至少还有一个报文分段等待发送,则设置变量初始序号=(BACnet分段确认PDU的‘序号’+1)模256、变量实际窗口尺寸=BACnet分段确认36PDU的‘实际窗口尺寸’参数值,然后重启分段计时器,设置分段重发计数=0,调用函数FillWindow(初始序号),产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文,用来传送一个或多个BACnet证实请求PDU,在这些PDU中,恰好包含了后续的实际窗口尺寸个报文分段,最后进入分段响应状态,等待新的确认。接收到最后一个确认PDU(FinalACK_Received)如果设备从网络层接收到一个BACnet分段确认PDU报文,其中参数‘服务器’=FALSE,同时函数InWindow(BACnet分段确认PDU中的‘序号’参数值,初始序号)的返回值为TRUE,并且已没有分段需要发送,则停止分段计时器,进入空闲状态。分段超时如果设备的分段计时器的值超过了Tseg,但分段重发计数又小于Nretry,则将分段重发计数自加1,重启分段计时器,调用函数FillWindow(初始序号),产生一个参数‘期待回复数据’=TRUE的N-UNITDATA.request报文,用来传送一个或多个BACnet有证实请求PDU,在这些PDU中,恰好包含了后续的实际窗口尺寸个报文分段,最后进入分段响应状态,重新等待确认。最终超时如果设备的分段计时器的值超过了Tseg,分段重发计数的值超过APDU重发次数,则停止分段计时器,然后进入空闲状态。接收到中止PDU如果设备从网络层接收到一个BACnet中止PDU报文,其中参数‘服务器’=FALSE,则停止分段计时器,向本地应用程序发送ABORT.indication原语,然后进入空闲状态。接收到意外PDU如果设备从网络层接收到一个意外的PDU,例如一个BACnet证实请求PDU,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,然后进入空闲状态。发送放弃PDU如果设备从本地应用程序接收到ABORT.request原语,则停止分段计时器,产生一个参数‘期待回复数据’=FALSE的N-UNITDATA.request报文,用来传送一个参数‘服务器’=TRUE的BACnet中止PDU,然后进入空闲状态。5.5应用层协议时序图37各种服务原语具体传递的过程,可以通过时序图(参见图5-4至5-13)来说明。每个时序图可以分为三个或者四个区域。标注为“提供方”的区域代表了服务提供者,标注为“用户”的区域代表了服务使用者。如果还存在第四个区域,则代表的是应用程序。其中位于“提供者”与“用户”之间的竖线,对于应用层而言,指的是BACnet用户元素与BACnet应用层服务元素之间的接口。对于下面各层而言,这些竖线表示的则是处于服务提供者与服务使用者之间的服务访问点(service-access-point)。在图中,由上到下是时间流逝的方向。处于服务使用者区域中的箭头,指明了在事务处理过程中由服务原语所表示的信息的流动方向(即从服务使用者流入或流出)。图5-4到图5-13示出了BACnet中定义的各种应用层服务原语传递过程。3839图5-7举例说明了两个分开的、交错的服务原语的交换。一个交换是使用有证实的服务请求、指示、响应以及证实。有些请求需要分段,因此需要使用几个CONF_SERV.request原语来传递整个请求。分段确认服务原语是另一个独立的交换,它用来通知客户,服务器已准备接收下一分段了。40414243445.6应用层服务约定用法本标准中所使用的描述术语和符号用法遵循ISOTR8509,这是关于服务约定用法的OSI技术报告。在此OSI约定用法中,定义了协议服务提供者与协议服务用户之间的交互。两者之间的信息交流,也被抽象成一种“服务原语”的交换。服务原语是功能规范与用户层交互的抽象表示,这些抽象定义并不包括服务用户/服务提供者交互的具体实现细节。每个原语一般包含有一组参数,这些参数代表要传递的数据元素,它们被传递给由原语所调用的可用函数。参数表示服务用户/服务提供者交互中可用的信息,在任何特定的界面上,某些参数或者被明确地定义(尽管可能没有明确地在原语中定义),或者隐含地与服务访问点相关联。同样,在任何特定的协议规范中,与一个服务原语相对应的函数也或者被明确地定义,或者隐含地说明为可用的。本协议的第13节到第17节以及第24节用列表的形式,明确地描述了BACnet服务原语中的参数。每个表由5列组成,一列是服务参数名称,其它四列分别对应请求“Req”、指示“Ind”、响应“Rsp”和证实“Cnf”原语。对于非证实服务,“Req”与“Cnf”所对应的列是空缺的。表的每一行包含了一个参数或子参数,同时在每种服务原语所在的列,都用一个符号指出该参数在这种服务原语中的使用类型。这些符号按ISO关于约定用法方面的技术报告(ISOTR8509)的建议,命名如下:M—对于此原语,该参数是必需的。U—此参数是用户选择的,可以不提供。C—此参数是有条件的(Conditional),它取决于其它一些参数。S—此参数是个选择参数,即从多个可能的选择参数集合中选取一个。组成选择参数集合的参数在表中按45如下方式表示:(a)选择参数集合中的每个参数,用符号“S”表示;(b)表中属于同一选择参数集合的每个参数名称,位于参数列中相同的缩格位置;(c)取下列两选择之一1.每个参数名称位于表中的最左端;2.每个参数分别属于不同的参数组,每个参数组中的成员参数名称又具有相同的缩格位置。所谓参数组,指的是所有具有同一父参数的参数所构成的集合。在表中,父参数位于该参数组所有成员参数之上,并且在水平位置上没有成员参数的缩格。在下面的例子中,参数A与参数B组成了一个参数组:参数X参数A参数B参数Y参数C对于同一选择参数集合所包含的参数,在表中用相同的缩格来表示其属于该参数组。也就是说,位于同一“高层”参数且具有相同水平缩格的参数,都属于同一选择集合。在符号M、U、C或S后跟着有符号“(=)”,这表示此列的服务原语中的参数与在(=)左边的字母单独所在列的服务原语中的参数,在语义上是相等的。例如,在指示原语列中符号为“M(=)”,而“M”单独在请求原语列中,这就表示指示原语中的参数与请求原语中对应的参数,语义上是相等的。某些参数可能还包含子参数,这些子参数也同样用缩格来标注。子参数是否出现,总是取决于父参数是否出现。比如在上面的例子中,参数A与参数B都是参数X的子参数,而参数C是参数Y的子参数。如果参数X是可选的,在某个服务原语中不提供时,那么其子参数(参数A与参数B)也将不提供。某些服务参数命名采用了“Listof...”的约定用法。若没有特别说明,这些参数指定了由跟在“Listof…”关键词后的若干个项目(item)所构成的列表。4612.控制设备的对象模型不同的设备具有不同的存储信息的数据结构。为了应用本协议实现设备间的信息交换,必须定义一种标准的、“网络可见”的信息描述方式。为实现这种网络可见的描述方式,采用的方法是面向对象的方法。本节定义一组标准的对象类型,这组标准对象类型给出了一种抽象的数据结构,为建立应用层服务提供一个框架。大部分应用层服务设计成为对这些标准对象类型的属性进行访问和操作。在不同的设备中,把应用层服务功能映射为对物理设备实际数据结构的作用有不同的方式,并且设备所能支持的某种对象类型的实例数也是可以不同的,具体的实现方式由生产商自行确定。所有对象均由对象标识符属性所引用。每个BACnet设备的对象均有一个唯一的对象标识符属性值。将一个对象的对象标识符与具有系统全局唯一性质的BACnet设备对象标识符结合使用,就提供了一种在整个控制网络中引用每个对象的机制。本标准并不要求设备支持在本标准中定义的所有对象类型才算符合标准。根据第2332节有关设备一致性类别的定义,属于不同类别的设备所必须支持的对象类型是不同的。另外,对象类型的属性是可选的。在每个对象类型规范的开始,是其属性的列表。列表项包括属性标识符、属性数据类型和O、W、R之一的属性一致性代码。其中,O:表示属性是可选的,R:表示属性是必需的,并且是BACnet服务可读的,W:表示属性是必需的,并且是BACnet服务可读、可写的。3当属性是必需的,即一致性代码为R时,表示在所有的BACnet标准对象中这个属性都是必需的。当属性是可选的,即一致性代码为O时,表示这个属性不是必需的。R或O类型的属性值可以通过本标准定义的一个或多个读属性(ReadProperty)服务读取。除非本标准明文禁止,否则R或O类型的属性在不同的实现方式中都可以是可写的。当属性为可写的,即一致性代码为W时,表示这个属性在所有的BACnet标准对象中都是必需的,并可以通过本标准定义的一个或多个写属性(WriteProperty)服务来写入。W类型的属性值也可以使用一个或多个读属性服务读取。对于O类型,如果存在于某个对象中,除非本标准明文规定是可写的,否则不必是可写的。在某些设备中,属性值在内部以不同的数据类型存贮,而不是按照属性的数据类型存贮。例如,实数可能在内部被存为整型。这种情况可能导致的结果是,属性值被写属性服务修改后,紧接着读出返回的值会略有不同。但只要在存储这个修改的数据时作了“最大努力(besteffort)”,这种情况是可以接受的。在本标准中定义的对象类型及其属性已经非常全面,但在实现标准时仍然允许自由定义附加的非标准对象类型或标准对象类型的非标准属性。随着控制技术的发展,这种方法是扩充标准的主要方法。创新的修改可以立即被采纳,而不必等待本标准的正式修改版本。这种易于扩充的能力可以把本标准应用到其它的楼宇设备领47域。参见第23.3节和第23.4节。非标准对象类型必需支持下列属性:对象标识符(Object_Identifier)BACnetObjectIdentifier对象名称(Object_Name)CharacterString对象类型(Object_Type)BACnetObjectType当这些属性实现时,其行为应与在标准BACnet对象中的行为一样。也就是说,对象标识符和对象名称属性在拥有它们的BACnet设备应是唯一的。对象名称字符串至少为一个字符,并且应仅由可打印字符组成。BACnet标准对象应支持标准中规定的所有必需属性。除此之外,还可以支持标准中规定的可选属性或标准中未定义的属性。对象类型中的必需属性在这种类型的所有对象中的功能都必须是本标准所规范的功能。如果实现的对象支持本标准中的可选属性,则可选属性的功能也必须是本标准所规范的功能。必需属性必须在该类型的所有对象中出现。如果某一对象中有可选属性,则该类型的所有对象不必均有可选属性。一个属性,不论是必需的,还是可选的,都应返回本标准中规定的数据类型,除了明文规定之外,并不要求属性的返回值能够返回数据类型的所有数值。在对象中,对于所支持的属性,不论是必需的,还是可选的,如果读操作或者写操作限制了属性值的取值范围,使得不能返回数据类型的所有数值,则要在协议实现一致性声明(PICS)中对每个有这种限制的属性进行明确规定。某些BACnet对象的某些属性必须用于表示同一类型数据元素的集合,而不是一个简单数据值或者由其它数据类型构造而成的复合数据类型。在某些对象实例中,这种数据元素集合的个数是固定的,而在另一些实例中,数据元素集合的个数是变化的。在有些情况下,数据元素集合中的元素是可以单个访问的,因此,数据元素的顺序是很重要的。BACnet为表示同类型数据元素集合,提供两种形式的属性数据类型:“BACnet数组(BACnetARRAY)”和“列表(Listof)”。“BACnet数组”数据类型是一个结构化的数据类型,由一组有序的数据元素序列构成,这些数据元素都具有相同的数据类型。属性数组中的元素可以通过“数组索引”(无符号整型值)单个访问(读取或写入)。索引号为0的元素将返回数组元素的个数。忽略索引号则访问数组的所有元素。索引号N(大于0)表示该数组序列中的第N个元素。当数组属性用在BACnet对象中时,“BACnet数组[N]数据类型(BACnetARRAY[N]ofdatetype)”这个标记表示N个数据元素组成的有序序列,其中的每个元素都有相同的数据类型。“列表”数据类型是结构化的数据类型,由一组(0个或多个)数据元素序列构成,每个元素都有相同的数据类型。每个“列表”类型的长度是可变的,除了明确规定为某一特殊用途而有确定的长度要求之外,一般“列表”类型不对最大元素数目进行限制。“列表类型(Listofdatatype)”这个标记表示0个或多个数据元素组成的序列,其中的每个元素都有相同的数据类型。“BACnet数组”和“列表”的区别在于,数组中的元素可以通过索引唯一地访问,而“列表”中的元素不能通过索引访问。并且“BACnet数组”中元素数目可以通过使用索引为0而确定,而“列表”中元素数目只能通过读取所有属性并通过计算确定。在本节中定义的几个对象类型:命令(Command)、事件登记(EventEnrollment)、组(Group)、环(Loop)、和时间表(Schedule)都有一个或多个类型为BACnet对象属性引用(BACnetObjectPropertyReference)的属性。这些引用的属性标识符成员可以不是全部的(ALL)、必需的(REQUIRED)或可选的(OPTIONAL)这些特别属性标识。这些属性标识保留在条件读属性(ReadPropertyConditional)和读多个属性(ReadPropertyMultiple)服务中或者标准中未定义的服务中。本节中定义的对象类型中,有几个对象类型有被称为“可靠性(Reliability)”的属性。这个属性是枚举48数据类型,对于不同的对象类型有不同的属性值。下面列举的数值是所有对象类型的可靠性属性的超集。可能的取值范围在相应的对象类型定义中有描述。未发现故障(NO_FAULT_DETECTED)当前值是可靠的,即未发现如下列举的故障。无传感器(NO_SENSOR)没有与输入对象相对应的传感器。超出范围(OVER_RANGE)映射为输入对象的传感器读取值超出正常值。如果是二进制输入对象,当其状态由模拟传感器或装有电子循环监测管理电路的二进制输入设备派生时,可能会发生这种情况。低于范围(UNDER_RANGE)映射为输入对象的传感器读取值小于正常值。如果是二进制输入对象,当其状态只是从模拟传感器计算得到时,可能会发生这种情况。开路(OPEN_LOOP)映射为定义对象的物理设备产生表示开路的数值。短路(SHORTED_LOOP)映射为定义对象的物理设备产生表示短路的数值。无输出(NO_OUTPUT)没有与输出对象相对应的物理设备。其它不可靠(UNRELIABLE_OTHER)控制器探测到当前值是不可靠的,而又不能确定问题的原因。此时,除上述的原因外,所有其它错误原因均返回此值,如:二进制输入对象没有按预期循环操作。12.1模拟输入对象类型(AnalogInputObjectType)模拟输入对象类型定义为一个标准对象,其属性表示一个模拟输入的外部可见一致性代码。这个对象及其属性见表12-1,本节进行详细规范。表12-1模拟输入对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value实数REALR1描述Description字符串CharacterStringO设备类型Device_Type字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR更新间隔Update_Interval无符号整型UnsignedO单位UnitsBACnet工程单位BACnetEngineeringUnitsR最小值Min_Pres_Value实数REALO最大值Max_Pres_Value实数REALO分辨率Resolution实数REALO49COV增量COV_Increment实数REALO2时间延迟Time_Delay无符号整型UnsignedO3通告类Notification_Class无符号整型UnsignedO3高阈值High_Limit实数REALO3低阈值Low_Limit实数REALO3阈值宽度Deadband实数REALO3阈值使能Limit_EnableBACnet阈值使能BACnetLimitEnableO3事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO3确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO3通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO31当脱离服务为TRUE时该属性必需是可写的。2如果对象支持COV报告则该属性是必需的。3如果对象支持内部报告则该属性是必需的。12.1.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.1.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.1.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为模拟输入(ANALOG_INPUT)。12.1.4当前值属性这个属性的类型是实数类型,以工程单位表示输入测量的当前值(见12.1.12节)。当脱离服务为TRUE时,当前值属性是可写的。12.1.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.1.6设备类型属性这个属性的类型是字符串类型,是一段对映射为这个模拟输入对象的物理设备的文本描述。通常用于描述与模拟输入对象对应的传感器型号。5012.1.7状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示模拟输入设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中(IN_ALARM)如果事件状态(见12.1.8节)属性值为正常(NORMAL)则为FALSE(0),否则为TRUE(1)。故障(FAULT)如果可靠性(见12.1.9节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制(OVERRIDDEN)如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值和可靠性属性值不再随物理设备的输入变化而变化。脱离服务(OUT_OF_SERVICE)如果脱离服务(Out_Of_Service)属性值(见12.1.10节)为TRUE则为TRUE(1),否则为FALSE(0)。12.1.8事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.1.9可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值或物理输入设备的运行是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,无传感器,超出范围,低于范围,开路,短路,其它不可靠}12.1.10脱离服务属性这个属性的类型是布尔类型,表示该对象代表的物理输入是(TRUE)否(FALSE)不与设备相关。当脱离服务为TRUE时,当前值属性与物理输入设备分离,并不会随着物理输入设备的改变而变化。当脱离服务为TRUE时,可靠性属性和对应的状态标志属性中的故障标志的状态也与物理输入设备分离。当脱离服务为TRUE时,当用于模拟专门的固定条件或用于测试时,当前值与可靠性属性可以为任何值。而其它依靠当前值或可靠性属性的功能将响应这些变化,就像这些变化发生在输入中一样。12.1.11更新间隔属性这个属性的类型是无符号整型类型,表示在正常运行时两次正常更新当前值之间的最大时间间隔(以百分之一秒为单位)。5112.1.12单位属性这个属性的类型是BACnet工程单位类型,表示这个对象的测量单位。详见第21节中BACnetEngineeringUnitsASN.1部分,其中定义了一系列标准工程单位。12.1.13最小值属性这个属性的类型是实数类型,表示当前值属性的最小可靠数值(用工程单位表示)。12.1.14最大值属性这个属性的类型是实数类型,表示当前值属性的最大可靠数值(用工程单位表示)。12.1.15分辨率属性这个属性的类型是实数类型,表示当前值属性中以工程单位可分辨的最小变化(只读)。12.1.16COV增量属性这个属性的类型是实数类型,定义当前值属性的最小改变值,这个最小改变值将导致向COV客户发布COV通告(COVNotification)。如果对象支持COV报告,则必须具备这个属性。12.1.17时间延迟属性这个属性的类型是无符号整型类型,定义从当前值属性处于由高阈值和低阈值确定的范围之外开始,到生成一个进入异常(TO_OFFNORMAL)事件之间的最小时间间隔(以秒为单位),或者从当前值属性进入由高阈值和低阈值确定的范围(包括阈值宽度属性值确定的范围)之内时,到生成一个进入正常(TO_NORMAL)事件的最小时间间隔(以秒为单位)。如果对象支持内部报告则必须具备这个属性。12.1.18通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.1.19高阈值属性这个属性的类型是实数类型,定义生成一个事件的当前值属性的上限值。如果对象支持内部报告则必须具备这个属性。12.1.19.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(a)当前值超过高阈值一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为高阈值使能(HighLimitEnable)标志,(c)事件使能属性设置为进入异常标志。12.1.19.2生成进入正常事件条件52一旦当前值超过高阈值之后,只有在当前值下降到低于(高阈值-阈值宽度)之后,才能生成进入正常事件。进入正常事件在达到下列三个条件的情况下生成:(a)当前值下降到低于(高阈值-阈值宽度)之后一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为高阈值使能标志,(c)事件使能属性设置为进入正常标志。12.1.20低阈值属性这个属性的类型是实数类型,定义生成一个事件的当前值属性的下限值。如果对象支持内部报告则必须具备这个属性。12.1.20.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(a)当前值低于低阈值一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为低阈值使能标志,(c)事件使能属性设置为进入异常标志。12.1.20.2生成进入正常事件条件一旦当前值低于低阈值之后,只有在当前值上升到高于(低阈值+阈值宽度)之后,才能生成进入正常事件。进入正常事件在达到下列三个条件的情况下生成:(a)当前值上升到高于(低阈值+阈值宽度)之后一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为低阈值使能标志,(c)事件使能属性设置为进入正常标志。12.1.21阈值宽度属性这个属性的类型是实数类型,定义高阈值属性和低阈值属性之间的一个宽度范围值。如果要生成一个进入正常的事件,当前值属性值必须维持在这个范围之内。进入正常事件在达到下列五个条件的情况下生成:(a)当前值低于(高阈值-阈值宽度),(b)当前值高于(低阈值+阈值宽度),(c)当前值维持在这个范围之内一段由时间延迟属性确定的最小时间间隔的时间,(d)阈值使能属性设置为高阈值使能或者低阈值使能之一的标志,(e)事件使能属性设置为进入正常标志。如果对象支持内部报告则必须具备这个属性。12.1.22阈值使能属性这个属性的类型是BACnet阈值使能类型,用两个标志分别表示使能或者禁止对于高阈值异常事件和低阈值异常事件以及各自返回到正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.1.23事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障53(TO_FAULT)和进入正常事件的报告。在模拟输入对象环境中,向高阈值和低阈值的事件状态的转换称为“异常”事件。如果对象支持内部报告则必须具备这个属性。12.1.24确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。在模拟输入对象环境中,向高阈值和低阈值的事件状态的转换称为“异常”事件。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.1.25通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件(Events)还是报警(Alarms)。如果对象支持内部报告则必须具备这个属性。5412.2模拟输出对象类型(AnalogOutputObjectType)模拟输出对象类型定义为一个标准对象,其属性表示一个模拟输出的外部可见一致性代码。这个对象及其属性见表12-2,本节进行详细规范。表12-2模拟输出对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value实数REALW描述Description字符串CharacterStringO设备类型Device_Type字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR单位UnitsBACnet工程单位BACnetEngineeringUnitsR最小值Min_Pres_Value实数REALO最大值Max_Pres_Value实数REALO分辨率Resolution实数REALO优先值数组Priority_ArrayBACnet优先值数组BACnetPriorityArrayR释放缺省Relinquish_Default实数REALRCOV增量COV_Increment实数REALO1时间延迟Time_Delay无符号整型UnsignedO2通告类Notification_Class无符号整型UnsignedO2高阈值High_Limit实数REALO2低阈值Low_Limit实数REALO2阈值宽度Deadband实数REALO2阈值使能Limit_EnableBACnet阈值使能BACnetLimitEnableO2事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO2确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO255通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO21如果对象支持COV报告则这个属性是必需的。2如果对象支持内部报告则这个属性是必需的。12.2.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.2.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.2.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为模拟输出(ANALOG_OUTPUT)。12.2.4当前值属性(可命令的)这个属性的类型是实数类型,以工程单位表示输出的当前值(见12.2.11节)。12.2.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.2.6设备类型属性这个属性的类型是字符串类型,是一段对映射为这个模拟输出对象的物理设备的文本描述。通常用于描述与模拟输出对象对应的设备型号。12.2.7状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示模拟输出设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.2.8节)属性值为正常则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.2.9节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”56表示当前值和可靠性属性值不再随物理设备的输出变化而变化。脱离服务如果脱离服务属性值(见12.2.10节)为TRUE则为TRUE(1),否则为FALSE(0)。12.2.8事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.2.9可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值或物理输出设备的运行是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,开路,短路,无输出,其它不可靠}12.2.10脱离服务属性这个属性的类型是布尔类型,表示该对象代表的物理节点是(TRUE)否(FALSE)不与设备相关。当脱离服务为TRUE时,当前值属性与物理输出设备分离。当脱离服务为TRUE时,可靠性属性和对应的状态标志属性中的故障标志的状态也与物理输出设备分离。当脱离服务为TRUE时,当用于模拟专门的固定条件或用于测试时,当前值与可靠性属性可以为任何值。而其它依靠当前值或可靠性属性的功能将响应这些变化,就像这些变化发生在物理输出中一样。在脱离服务为TRUE的情况下,当前值属性还要被BACnet命令优先机制控制,参见19节。12.2.11单位属性这个属性的类型是BACnet工程单位类型,表示这个对象的测量单位。详见第21节中BACnetEngineeringUnitsASN.1部分,其中定义了一系列标准工程单位。12.2.12最小值属性这个属性的类型是实数类型,表示当前值属性的最小可靠数值(用工程单位表示)。12.2.13最大值属性这个属性的类型是实数类型,表示当前值属性的最大可靠数值(用工程单位表示)。12.2.14分辨率属性这个属性的类型是实数类型,表示当前值属性中以工程单位可分辨的最小变化(只读)。12.2.15优先值数组属性这个属性是优先值的只读数组。详见第19节有关优先机制的描述。12.2.16释放缺省属性当优先值数组中的所有命令优先值为NULL时,这个属性的值是当前值属性的缺省值。详见第19节。5712.2.17COV增量属性这个属性的类型是实数类型,定义当前值属性的最小改变值,这个最小改变值将导致向COV客户发布COV通告。如果对象支持COV报告,则必须具备这个属性。12.2.18时间延迟属性这个属性的类型是无符号整型类型,定义从当前值属性处于由高阈值和低阈值确定的范围之外开始,到生成一个进入异常事件之间的最小时间间隔(以秒为单位),或者从当前值属性进入由高阈值和低阈值确定的范围(包括阈值宽度属性值确定的范围)之内时,到生成一个进入正常事件的最小时间间隔(以秒为单位)。如果对象支持内部报告则必须具备这个属性。12.2.19通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.2.20高阈值属性这个属性的类型是实数类型,定义生成一个事件的当前值属性的上限值。如果对象支持内部报告则必须具备这个属性。12.2.20.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(d)当前值超过高阈值一段由时间延迟属性确定的最小时间间隔的时间,(e)阈值使能属性设置为高阈值使能标志,(f)事件使能属性设置为进入异常标志。12.2.20.2生成进入正常事件条件一旦当前值超过高阈值之后,只有在当前值下降到低于(高阈值-阈值宽度)之后,才能生成进入正常事件。进入正常事件在达到下列三个条件的情况下生成:(a)当前值下降到低于(高阈值-阈值宽度)之后一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为高阈值使能标志,(c)事件使能属性设置为进入正常标志。12.2.21低阈值属性这个属性的类型是实数类型,定义生成一个事件的当前值属性的下限值。如果对象支持内部报告则必须具备这个属性。12.2.21.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(a)当前值低于低阈值一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为低阈值使能标志,58(c)事件使能属性设置为进入异常标志。12.2.21.2生成进入正常事件条件一旦当前值低于低阈值之后,只有在当前值上升到高于(低阈值+阈值宽度)之后,才能生成进入正常事件。进入正常事件在达到下列三个条件的情况下生成:(a)当前值上升到高于(低阈值+阈值宽度)之后一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为低阈值使能标志,(c)事件使能属性设置为进入正常标志。12.2.22阈值宽度属性这个属性的类型是实数类型,定义高阈值属性和低阈值属性之间的一个宽度范围值。如果要生成一个进入正常的事件,当前值属性值必须维持在这个范围之内。进入正常事件在达到下列五个条件的情况下生成:(a)当前值低于(高阈值-阈值宽度),(b)当前值高于(低阈值+阈值宽度),(c)当前值维持在这个范围之内一段由时间延迟属性确定的最小时间间隔的时间,(d)阈值使能属性设置为高阈值使能或者低阈值使能之一的标志,(e)事件使能属性设置为进入正常标志。如果对象支持内部报告则必须具备这个属性。12.2.23阈值使能属性这个属性的类型是BACnet阈值使能类型,用两个标志分别表示使能或者禁止对于高阈值异常事件和低阈值异常事件以及各自返回到正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.2.24事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障和进入正常事件的报告。在模拟输出对象环境中,向高阈值和低阈值的事件状态的转换称为“异常”事件。如果对象支持内部报告则必须具备这个属性。12.2.25确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。在模拟输出对象环境中,向高阈值和低阈值的事件状态的转换称为“异常”事件。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。5912.2.26通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。12.3模拟值对象类型(AnalogValueObjectType)模拟值对象类型定义为一个标准对象,其属性表示一个模拟值的外部可见一致性代码。BACnet设备的一个“模拟值”是驻留在这个设备的内存中的一个控制系统参数。这个对象及其属性见表12-3,本节进行详细规范。表12-3模拟值对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value实数REALW60描述Description字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR单位UnitsBACnet工程单位BACnetEngineeringUnitsR优先值数组Priority_ArrayBACnet优先值数组BACnetPriorityArrayO1释放缺省Relinquish_Default实数REALO1COV增量COV_Increment实数REALO2时间延迟Time_Delay无符号整型UnsignedO3通告类Notification_Class无符号整型UnsignedO3高阈值High_Limit实数REALO3低阈值Low_Limit实数REALO3阈值宽度Deadband实数REALO3阈值使能Limit_EnableBACnet阈值使能BACnetLimitEnableO3事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO3确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO3通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO31如果可选属性中的一个存在,那么必需都存在。2如果对象支持COV报告则这个属性是必需的。3如果对象支持内部报告则该属性是必需的。12.3.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.3.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.3.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为模拟值(ANALOG_VALUE)。12.3.4当前值属性(可命令的)这个属性的类型是实数类型,以工程单位表示输出的当前值(见12.3.10节)。由于当前值是可命令的,61可选的优先值数组必须存在。12.3.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.3.6状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示模拟值设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.3.7节)属性值为正常则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.3.8节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值属性值不再能够通过BACnet服务而被改变。脱离服务如果脱离服务属性值(见12.3.9节)为TRUE则为TRUE(1),否则为FALSE(0)。12.3.7事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.3.8可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,超出范围,低于范围,其它不可靠}12.3.9脱离服务属性这个属性的类型是布尔类型,表示模拟值对象的当前值属性值能(TRUE)否(FALSE)被含有这个对象的BACnet设备有关的软件所修改。当脱离服务为TRUE时,当前值属性还可以随意的写入。如果有优先值数组和释放缺省属性,那么当前值属性的写入将受到BACnet命令优先机制的控制。参见19节。12.3.10单位属性这个属性的类型是BACnet工程单位类型,表示这个对象的测量单位。详见第21节中BACnetEngineeringUnitsASN.1部分,其中定义了一系列标准工程单位。6212.3.11优先值数组属性这个属性是只读数组,包括这个对象有效时的优先命令。详见第19节关于优先机制的描述。这个属性必须与释放缺省属性同时具备。12.3.12释放缺省属性当优先值数组中的所有命令优先值为NULL时,这个属性的值是当前值属性的缺省值。详见第19节。该属性必须与优先值数组属性同时具备。12.3.13COV增量属性这个属性的类型是实数类型,定义当前值属性的最小改变值,这个最小改变值将导致向COV客户发布COV通告。如果对象支持COV报告,则必须具备这个属性。12.3.14时间延迟属性这个属性的类型是无符号整型类型,定义从当前值属性处于由高阈值和低阈值确定的范围之外开始,到生成一个进入异常事件之间的最小时间间隔(以秒为单位),或者从当前值属性进入由高阈值和低阈值确定的范围(包括阈值宽度属性值确定的范围)之内时,到生成一个进入正常事件的最小时间间隔(以秒为单位)。如果对象支持内部报告则必须具备这个属性。12.3.15通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.3.16高阈值属性这个属性的类型是实数类型,定义生成一个事件的当前值属性的上限值。如果对象支持内部报告则必须具备这个属性。12.3.16.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(g)当前值超过高阈值一段由时间延迟属性确定的最小时间间隔的时间,(h)阈值使能属性设置为高阈值使能标志,(i)事件使能属性设置为进入异常标志。12.3.16.2生成进入正常事件条件一旦当前值超过高阈值之后,只有在当前值下降到低于(高阈值-阈值宽度)之后,才能生成进入正常事件。进入正常事件在达到下列三个条件的情况下生成:(a)当前值下降到低于(高阈值-阈值宽度)之后一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为高阈值使能标志,(c)事件使能属性设置为进入正常标志。6312.3.17低阈值属性这个属性的类型是实数类型,定义生成一个事件的当前值属性的下限值。如果对象支持内部报告则必须具备这个属性。12.3.17.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(a)当前值低于低阈值一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为低阈值使能标志,(c)事件使能属性设置为进入异常标志。12.3.17.2生成进入正常事件条件一旦当前值低于低阈值之后,只有在当前值上升到高于(低阈值+阈值宽度)之后,才能生成进入正常事件。进入正常事件在达到下列三个条件的情况下生成:(a)当前值上升到高于(低阈值+阈值宽度)之后一段由时间延迟属性确定的最小时间间隔的时间,(b)阈值使能属性设置为低阈值使能标志,(c)事件使能属性设置为进入正常标志。12.3.18阈值宽度属性这个属性的类型是实数类型,定义高阈值属性和低阈值属性之间的一个宽度范围值。如果要生成一个进入正常的事件,当前值属性值必须维持在这个范围之内。进入正常事件在达到下列五个条件的情况下生成:(a)当前值低于(高阈值-阈值宽度),(b)当前值高于(低阈值+阈值宽度),(c)当前值维持在这个范围之内一段由时间延迟属性确定的最小时间间隔的时间,(d)阈值使能属性设置为高阈值使能或者低阈值使能之一的标志,(e)事件使能属性设置为进入正常标志。如果对象支持内部报告则必须具备这个属性。12.3.19阈值使能属性这个属性的类型是BACnet阈值使能类型,用两个标志分别表示使能或者禁止对于高阈值异常事件和低阈值异常事件以及各自返回到正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.3.20事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障和进入正常事件的报告。在模拟值对象环境中,向高阈值和低阈值的事件状态的转换称为“异常”事件。如果对象支持内部报告则必须具备这个属性。12.3.21确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。在模拟值对象环境中,向高阈值和低阈值的事件状态的转换称为“异常”事件。这些标志将在64相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.3.22通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。12.4二进制输入对象类型(BinaryInputObjectType)二进制输入对象类型定义为一个标准对象,它的属性表示二进制输入的外部可见一致性代码。“二进制输入”是物理设备或硬件的输入,该输入只存在两种状态,即“活动(ACTIVE)”状态和“非活动(INACTIVE)”状态。二进制输入的主要用途是指明机械设备状态,如:风机或水泵是否运行。活动表示设备开或运转,非活动表示设备关或未运行。在某些应用中,电路使应用层逻辑状态的活动和非活动与底层硬件的物理状态相反。如:当继电器通电时,常开型继电器导致活动状态,而常合型继电器却导致非活动状态。二进制输入对象通过使用极性(Polarity)属性确定具体状态。参见12.4.4节和12.4.11节。这个对象及其属性见表12-4,本节进行详细规范。表12-4二进制输入对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_ValueBACnet二进制值BACnetBinaryPVR1描述Description字符串CharacterStringO设备类型Device_Type字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR极性PolarityBACnet极性BACnetPolarityR非活动文本Inactive_Text字符串CharacterStringO2活动文本Active_Text字符串CharacterStringO265状态改变时间Change_Of_State_TimeBACnet日期时间BACnetDateTimeO3状态改变次数Change_Of_State_Count无符号整型UnsignedO3改变时间置0Time_Of_State_Count_ResetBACnet日期时间BACnetDateTimeO3当前值活动累计Elapsed_Active_Time32位无符号整型Unsigned32O4活动时间置0Time_Of_Active_Time_ResetBACnet日期时间BACnetDateTimeO4时间延迟Time_Delay无符号整型UnsignedO5通告类Notification_Class无符号整型UnsignedO5报警值Alarm_ValueBACnet二进制值BACnetBinaryPVO5事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO5确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO5通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO51当脱离服务为TRUE时该属性必须是可写的。2可选属性非活动文本与活动文本必须同时存在。3可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。4可选属性当前值活动累计、活动时间置0必须同时存在。5如果对象支持内部报告,则必须具备这个属性。12.4.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.4.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.4.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为二进制输入(BINARY_INPUT)。12.4.4当前值属性这个属性的类型是BACnet二进制值类型,反映了二进制输入对象的逻辑状态,逻辑状态只有非活动或活动66两种。当前值与输入物理状态间的关系由极性属性决定。可能的状态见下表12-5。表12-5BACnet极性关系当前值属性极性属性输入物理状态设备物理状态非活动正向(NORMAL)OFF或非活动未运行活动正向(NORMAL)ON或活动运行非活动反向(REVERSE)ON或活动未运行活动反向(REVERSE)OFF或非活动运行当脱离服务为TRUE时,当前值属性必须可写(见12.4.10节)。12.4.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.4.6设备类型属性这个属性的类型是字符串类型,是一段对映射为这个二进制输入对象的物理设备的文本描述。通常用于描述与二进制输入对应的设备的型号。12.4.7状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示二进制输入设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.4.8节)属性值为正常则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.4.9节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值和可靠性属性值不再随物理设备的输入变化而变化。脱离服务如果脱离服务属性值(见12.4.10节)为TRUE则为TRUE(1),否则为FALSE(0)。12.4.8事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.4.9可靠性属性67这个属性的类型是BACnet可靠性类型,表示当前值或物理输入设备的运行是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,无传感器,开路,短路,其它不可靠}12.4.10脱离服务属性这个属性的类型是布尔类型,表示该对象代表的物理输入是(TRUE)否(FALSE)不与设备相关。当脱离服务为TRUE时,当前值属性与物理输入设备分离,并不会随着物理输入设备的改变而变化。当脱离服务为TRUE时,可靠性属性和对应的状态标志属性中的故障标志的状态也与物理输入设备分离。当脱离服务为TRUE时,当用于模拟专门的固定条件或用于测试时,当前值与可靠性属性可以为任何值。而其它依靠当前值或可靠性属性的功能将响应这些变化,就像这些变化发生在输入中一样。12.4.11极性属性这个属性的类型是BACnet极性类型,表述了输入的物理状态和当前值代表的逻辑状态之间的关系。当脱离服务为FALSE时,如果这个属性为正向,当前值中的活动就是物理输入中的活动或ON状态;如果该属性为反向,当前值中的活动是物理输入中的非活动或OFF状态。见表12-5。因此,当脱离服务为FALSE时,对于某一恒定的物理输入状态,极性属性的改变将导致当前值属性的变化。如果脱离服务为TRUE,极性属性将对当前值属性无影响。12.4.12非活动文本属性这个属性的类型是字符串类型,从人操作的角度描述了当前值在非活动状态下的预期效果。字符串的内容由生产商自行确定,但一定要表示非活动状态的可读描述。例如:如果物理输入设备连接在一个转换开关上,那么非活动文本可能被赋值为“风机1关”。非活动文本属性与活动文本属性必须同时存在。12.4.13活动文本属性这个属性的类型是字符串类型,从人操作的角度描述了当前值在活动状态下的预期效果。字符串的内容由生产商自行确定,但一定要表示活动状态的可读的描述。例如:如果物理输入连接在一个转换开关上,那么活动文本可能被赋值为“风机1开”。活动文本属性与非活动文本属性必需同时存在。12.4.14状态改变时间属性这个属性的类型是BACnet日期时间类型,表示最近一次状态发生改变的日期和时间。“状态改变”是指任何引起当前值属性改变的事件。当脱离服务为FALSE时,极性属性的改变将导致当前值属性的变化,因而被认为是状态改变。如果脱离服务为TRUE,极性属性将对当前值属性无影响。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.4.15状态改变次数属性这个属性的类型是无符号整型类型,表示从该属性最近一次被设置为0以来,当前值属性改变状态的次数。该属性取值范围为0-65535或更大。“状态改变”是指任何引起当前值属性改变的事件。当脱离服务为FALSE时,极性属性的改变将导致当前值属性的变化,因而被认为是状态改变。如果脱离服务为TRUE,极性属性将对68当前值属性无影响。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.4.16改变时间置0属性这个属性的类型是BACnet日期时间类型,表示状态改变次数属性最近一次被设置为0的日期和时间。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.4.17当前值活动累计属性这个属性的类型是32位无符号整型类型,表示从该属性最近一次被设置为0以来,当前值属性为活动的累积时间(以秒为单位)。可选属性当前值活动累计、活动时间置0必须同时存在。12.4.18活动时间置0属性这个属性的类型是BACnet日期时间类型,表示当前值活动累计属性最近一次被设置为0的日期和时间。可选属性当前值活动累计、活动时间置0必须同时存在。12.4.19时间延迟属性这个属性的类型是无符号整型类型,表示生成进入异常事件时当前值必须保持等于报警值属性的最小时间(以秒为单位),或者生成进入正常事件时当前值必须保持不等于报警值属性的最小时间(以秒为单位)。如果对象支持内部报告则必需具备该属性。12.4.20通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.4.21报警值属性这个属性的类型是BACnet二进制值类型,表示生成事件时,当前值属性的值。如果对象支持内部报告则必需具备该属性。12.4.21.1生成进入异常事件条件进入异常事件在下列两个条件下生成:(a)当前值必须等于报警值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入异常标志。12.4.21.2生成进入正常事件条件一旦当前值等于报警值,要生成进入正常事件,当前值必须不等于报警值。进入正常事件在下列两个条件下生成:(a)当前值必须不等于报警值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入正常标志。6912.4.22事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障和进入正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.4.23确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.4.24通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。7012.5二进制输出对象类型(BinaryOutputObjectType)二进制输出对象类型定义为一个标准对象,它的属性表示二进制输出的外部可见一致性代码。“二进制输出”是物理设备或硬件的输出,该输出只存在两种状态,即“活动”状态和“非活动”状态。二进制输出的主要用途是切换机械设备状态,如:风机或水泵的开和关。活动表示设备开或运转,非活动表示设备关或未运行。在某些应用中,电路使应用层逻辑状态的活动和非活动与底层硬件的物理状态相反。如:当继电器通电时,常开型继电器导致活动状态,而常合型继电器却导致非活动状态。二进制输出对象通过使用极性属性确定具体状态。参见12.5.4节和12.5.11节。这个对象及其属性见表12-6,本节进行详细规范。表12-6二进制输出对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_ValueBACnet二进制值BACnetBinaryPVW描述Description字符串CharacterStringO设备类型Device_Type字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR极性PolarityBACnet极性BACnetPolarityR非活动文本Inactive_Text字符串CharacterStringO1活动文本Active_Text字符串CharacterStringO1状态改变时间Change_Of_State_TimeBACnet日期时间BACnetDateTimeO2状态改变次数Change_Of_State_Count无符号整型UnsignedO2改变时间置0Time_Of_State_Count_ResetBACnet日期时间BACnetDateTimeO2当前值活动累计Elapsed_Active_Time32位无符号整型Unsigned32O3活动时间置0Time_Of_Active_Time_ResetBACnet日期时间BACnetDateTimeO3非活动最小值Minimum_Off_Time32位无符号整型Unsigned32O活动最小值32位无符号整型Unsigned32O71Minimum_On_Time优先值数组Priority_ArraBACnet优先值数组BACnetPriorityArraR释放缺省Relinquish_DefaultBACnet二进制值BACnetBinaryPVR时间延迟Time_Delay无符号整型UnsignedO4通告类Notification_Class无符号整型UnsignedO4反馈值Feedback_ValueBACnet二进制值BACnetBinaryPVO4事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO4确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO4通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO41可选属性非活动文本与活动文本必须同时存在。2可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。3可选属性当前值活动累计、活动时间置0必须同时存在。4如果对象支持内部报告,则必须具备这个属性。12.5.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.5.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.5.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为二进制输出(BINARY_OUTPUT)。12.5.4当前值属性这个属性的类型是BACnet二进制值类型,反映了二进制输出对象的逻辑状态,逻辑状态只有非活动或活动两种。当前值与输出物理状态间的关系由极性属性决定。可能的状态见下表12-5。表12-7BACnet极性关系当前值属性极性属性输入物理状态设备物理状态非活动正向(NORMAL)OFF或非活动未运行活动正向(NORMAL)ON或活动运行非活动反向(REVERSE)ON或活动未运行活动反向(REVERSE)OFF或非活动运行7212.5.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.5.6设备类型属性这个属性的类型是字符串类型,是一段对映射为这个二进制输出对象的物理设备的文本描述。通常用于描述与二进制输出对应的设备的型号。12.5.7状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示二进制输出设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.5.8节)属性值为正常则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.5.9节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值和可靠性属性值不再随物理设备的输出变化而变化。脱离服务如果脱离服务属性值(见12.5.10节)为TRUE则为TRUE(1),否则为FALSE(0)。12.5.8事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.5.9可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值或物理输出设备的运行是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,无输出,开路,短路,其它不可靠}12.5.10脱离服务属性这个属性的类型是布尔类型,表示该对象代表的物理输出是(TRUE)否(FALSE)不与设备相关。当脱离服务为TRUE时,当前值属性与物理输出设备分离。当脱离服务为TRUE时,可靠性属性和对应的状态标志属性中的故障标志的状态也与物理输出设备分离。当脱离服务为TRUE时,当用于模拟专门的固定条件或用于测试时,当前值与可靠性属性可以为任何值。而其它依靠当前值或可靠性属性的功能将响应这些变化,就像这些变化发生在输出中一样。在脱离服务为TRUE的情况下,当前值属性还要被BACnet命令优先机制控制,参见19节。7312.5.11极性属性这个属性的类型是BACnet极性类型,表述了输出的物理状态和当前值代表的逻辑状态之间的关系。当脱离服务为FALSE时,如果这个属性为正向,当前值中的活动就是物理输出中的活动或ON状态;如果该属性为反向,当前值中的活动是物理输出中的非活动或OFF状态。见表12-7。如果脱离服务为TRUE,极性属性将对当前值属性无影响。12.5.12非活动文本属性这个属性的类型是字符串类型,从人操作的角度描述了当前值在非活动状态下的预期效果。字符串的内容由生产商自行确定,但一定要表示非活动状态的可读描述。例如:如果物理输出设备连接在一个控制灯开关的继电器上,那么非活动文本可能被赋值为“关灯”。非活动文本属性与活动文本属性必须同时存在。12.5.13活动文本属性这个属性的类型是字符串类型,从人操作的角度描述了当前值在活动状态下的预期效果。字符串的内容由生产商自行确定,但一定要表示活动状态的可读的描述。例如:如果物理输出设备连接在一个控制灯开关的继电器上,那么活动文本可能被赋值为“开灯”。活动文本属性与非活动文本属性必需同时存在。12.5.14状态改变时间属性这个属性的类型是BACnet日期时间类型,表示最近一次状态发生改变的日期和时间。“状态改变”是指任何引起当前值属性改变的事件。极性属性的改变并不导致状态改变。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.5.15状态改变次数属性这个属性的类型是无符号整型类型,表示从该属性最近一次被设置为0以来,当前值属性改变状态的次数。该属性取值范围为0-65535或更大。“状态改变”是指任何引起当前值属性改变的事件。极性属性的改变并不导致状态改变。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.5.16改变时间置0属性这个属性的类型是BACnet日期时间类型,表示状态改变次数属性最近一次被设置为0的日期和时间。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.5.17当前值活动累计属性这个属性的类型是32位无符号整型类型,表示从该属性最近一次被设置为0以来,当前值属性为活动的累积时间(以秒为单位)。可选属性当前值活动累计、活动时间置0必须同时存在。12.5.18活动时间置0属性这个属性的类型是BACnet日期时间类型,表示当前值活动累计属性最近一次被设置为0的日期和时间。可选属性当前值活动累计、活动时间置0必须同时存在。7412.5.19非活动最小值属性这个属性的类型是32位无符号整型类型,表示向当前值属性写入非活动状态后当前值保持该状态的最短时间(以秒为单位)。具体机制见19.3节。12.5.20活动最小值属性这个属性的类型是32位无符号整型类型,表示向当前值属性写入活动状态后当前值保持该状态的最短时间(以秒为单位)。具体机制见19.3节。12.5.21优先值数组属性这个属性是只读数组,该数组包含对该对象有效的优先命令。详见第19节关于优先机制的描述。12.5.22释放缺省属性当优先值数组中的所有命令优先值为NULL时,该属性是用于当前值属性的缺省值。详见19节。12.5.23时间延迟属性这个属性的类型是无符号整型类型,表示生成进入异常事件时当前值必须保持不等于反馈值属性的最小时间(以秒为单位),或者生成进入正常事件时当前值必须保持等于反馈值属性的最小时间(以秒为单位)。如果对象支持内部报告则必需具备该属性。12.5.24通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.5.25反馈值属性这个属性的类型是BACnet二进制值类型,表示生成事件时,当前值属性的值必须与之不同的一个反馈值的状态。如果对象支持内部报告则必需具备该属性。如何确定反馈值的方法由生产商自行确定。12.5.25.1生成进入异常事件条件进入异常事件在下列两个条件下生成:(a)当前值必须不等于反馈值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入异常标志。12.5.25.2生成进入正常事件条件一旦当前值不等于反馈值,要生成进入正常事件,当前值必须等于反馈值。进入正常事件在下列两个条件下生成:(a)当前值必须等于反馈值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入正常标志。12.5.26事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障75和进入正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.5.27确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.5.28通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。12.6二进制值对象类型(BinaryValueObjectType)二进制值对象类型定义为一个标准对象,它的属性表示二进制值的外部可见一致性代码。“二进制值”是驻留在BACnet设备内存中的控制系统参数。这个参数只存在两种状态即:“活动”状态和“非活动”状态。二进制值对象及其属性见表12-8,本节进行详细规范。表12-8二进制值对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_ValueBACnet二进制值BACnetBinaryPVR1描述Description字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR非活动文本Inactive_Text字符串CharacterStringO2活动文本Active_Text字符串CharacterStringO2状态改变时间Change_Of_State_TimeBACnet日期时间BACnetDateTimeO3状态改变次数无符号整型UnsignedO376Change_Of_State_Count改变时间置0Time_Of_State_Count_ResetBACnet日期时间BACnetDateTimeO3当前值活动累计Elapsed_Active_Time32位无符号整型Unsigned32O4活动时间置0Time_Of_Active_Time_ResetBACnet日期时间BACnetDateTimeO4非活动最小值Minimum_Off_Time32位无符号整型Unsigned32O活动最小值Minimum_On_Time32位无符号整型Unsigned32O优先值数组Priority_ArraBACnet优先值数组BACnetPriorityArraO5释放缺省Relinquish_DefaultBACnet二进制值BACnetBinaryPVO5时间延迟Time_Delay无符号整型UnsignedO6通告类Notification_Class无符号整型UnsignedO6报警值Alarm_ValueBACnet二进制值BACnetBinaryPVO6事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO6确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO6通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO61当脱离服务为TRUE时该属性必须是可写的。2可选属性非活动文本与活动文本必须同时存在。3可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。4可选属性当前值活动累计、活动时间置0必须同时存在。5可选属性优先值数组、释放缺省必须同时存在。当前值属性也必须是可写的。6如果对象支持内部报告,则必须具备这个属性。12.6.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.6.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.6.3对象类型属性77这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为二进制值(BINARY_VALUE)。12.6.4当前值属性(可命令的)这个属性的类型是BACnet二进制值类型,反映了二进制值对象的逻辑状态,逻辑状态只有非活动或活动两种。由于当前值是可命令的,可选的优先值数组必须存在。当脱离服务为TRUE时,当前值属性是可写的。参见12.6.9节12.6.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.6.6状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示二进制值设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.6.7节)属性值为正常则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.6.8节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值属性值不再能够通过BACnet服务而被改变。脱离服务如果脱离服务属性值(见12.6.9节)为TRUE则为TRUE(1),否则为FALSE(0)。12.6.7事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.6.8可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,其它不可靠}12.6.9脱离服务属性78这个属性的类型是布尔类型,表示二进制值对象的当前值属性值能(TRUE)否(FALSE)被含有这个对象的BACnet设备有关的软件所修改。当脱离服务为TRUE时,当前值属性还可以随意的写入。如果有优先值数组和释放缺省属性,那么当前值属性的写入将受到BACnet命令优先机制的控制。参见19节。12.6.10非活动文本属性这个属性的类型是字符串类型,从人操作的角度描述了当前值在非活动状态下的预期效果。字符串的内容由生产商自行确定,但一定要表示非活动状态的可读描述。非活动文本属性与活动文本属性必须同时存在。12.6.11活动文本属性这个属性的类型是字符串类型,从人操作的角度描述了当前值在活动状态下的预期效果。字符串的内容由生产商自行确定,但一定要表示活动状态的可读的描述。活动文本属性与非活动文本属性必需同时存在。12.6.12状态改变时间属性这个属性的类型是BACnet日期时间类型,表示最近一次状态发生改变的日期和时间。“状态改变”是指任何引起二进制值对象的逻辑状态改变的事件。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.6.13状态改变次数属性这个属性的类型是无符号整型类型,表示从该属性最近一次被设置为0以来,二进制值对象改变状态的次数。该属性取值范围为0-65535或更大。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.6.14改变时间置0属性这个属性的类型是BACnet日期时间类型,表示状态改变次数属性最近一次被设置为0的日期和时间。可选属性状态改变时间、状态改变次数、改变时间置0必须同时存在。12.5.15当前值活动累计属性这个属性的类型是32位无符号整型类型,表示从该属性最近一次被设置为0以来,当前值属性为活动的累积时间(以秒为单位)。可选属性当前值活动累计、活动时间置0必须同时存在。12.6.16活动时间置0属性这个属性的类型是BACnet日期时间类型,表示当前值活动累计属性最近一次被设置为0的日期和时间。可选属性当前值活动累计、活动时间置0必须同时存在。12.6.17非活动最小值属性这个属性的类型是32位无符号整型类型,表示向当前值属性写入非活动状态后当前值保持该状态的最短时间(以秒为单位)。根据第19节,如果当前值属性是可命令的,19.3节中给出了实现的机制。否则可以由生产商自行确定实行的机制。12.6.18活动最小值属性79这个属性的类型是32位无符号整型类型,表示向当前值属性写入活动状态后当前值保持该状态的最短时间(以秒为单位)。具体机制见19.3节。根据第19节,如果当前值属性是可命令的,19.3节中给出了实现的机制。否则可以由生产商自行确定实行的机制。12.6.19优先值数组属性这个属性是只读数组,该数组包含对该对象有效的优先命令。参见第19节有关优先机制的规范。可选属性优先值数组与释放缺省必须同时存在。此时当前值也必须是可写的。12.6.20释放缺省属性当优先值数组中的所有命令优先值为NULL时,该属性是用于表示当前值属性的缺省值。参见第19节。可选属性优先值数组与释放缺省必须同时存在。此时当前值也必须是可写的。12.6.21时间延迟属性这个属性的类型是无符号整型类型,表示生成进入异常事件时当前值必须保持不等于报警值属性的最小时间(以秒为单位),或者生成进入正常事件时当前值必须保持等于报警值属性的最小时间(以秒为单位)。如果对象支持内部报告则必需具备该属性。12.6.22通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.6.23报警值属性这个属性的类型是BACnet二进制值类型,表示生成进入异常事件时,当前值属性的值必须具有的值。如果对象支持内部报告则必需具备该属性。12.6.23.1生成进入异常事件条件进入异常事件在下列两个条件下生成:(a)当前值必须等于由报警值属性所规定的值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入异常标志。12.6.23.2生成进入正常事件条件一旦当前值等于报警值,要生成进入正常事件,当前值必须不等于报警值。进入正常事件在下列两个条件下生成:(a)当前值必须不等于报警值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入正常标志。12.6.24事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障80和进入正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.6.25确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.6.26通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。12.7日期表对象类型(CalendarObjectType)日期表对象类型定义为一个标准对象,用于描述日期列表,例如,“节假日”、“特别日”或简单的日期列表。这个对象及其属性见表12-9。本节进行详细规范。表12-9日期表对象的属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR描述Description字符串CharacterStringO当前值Present_Value布尔BOOLEANR日期列表Date_ListBACnet日期表目列表ListofBACnetCalendarEntryR12.7.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.7.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。8112.7.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为日期表(CALENDER)。12.7.4描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.7.5当前值属性这个属性的类型是布尔类型,表示当前日期是否在日期表中。如果当前日期在日期列表属性中,则当前值为TRUE,否则为FALSE。12.7.6日期列表属性这个属性的类型是BACnet日期表目列表类型,其中列表中的每个表目或者是一个单独的日期(用Date表示),或者是一个日期范围(用BACnetDataRange表示),或者是月份/月的周数/周的天数(用BACnetWeekNDay表示)。如果当前日期与日期表的表目标准匹配,那么日期表对象的当前值为TRUE。当上述不同结构中的某个域没有定义时,该域的作用相当于一个“通配域”,用来匹配当前日期。例如,在日期范围中,如果开始日期(startDate)域未定义,则表示“从任何日期至截止日期(endDate)并且包括截止日期的日期”;如果截止日期域未定义,则表示“从开始日期开始的日期”。如果日期表的表目为BACnetWeekNDay形式,并且没有定义“月份(month)”和“月的周数(week-of-month)”域,但是定义了“周的天数(day-of-week)”域,那么日期表对象将在一年中所有符合该“周的天数”的时候为TRUE。如果BACnet设备允许向日期列表属性进行写入操作,则BACnet日期表目列表可以选择所有形式。12.8命令对象类型(CommandObjectType)命令对象类型定义为一个标准对象,其属性反映了多操作命令过程的外部可见一致性代码。命令对象的作用是,根据写入到命令对象自己的当前值属性中的“操作代码(actioncode)”,向一组对象属性写入一组值。无论何时,只要命令对象的当前值属性被写入,就会触发命令对象采取一组改变其它对象的属性值的操作。通常,命令对象用于表示有多变量的复杂场合,尤其适用于表示有多状态的场合。例如,某个楼宇中有个特殊区域,可能有三种状态:“无人”状态、“保暖”状态和“有人”状态。为建立各状态的运行环境,需要将大量对象的属性设置成为一组已知数值。如,当处于“无人”状态时,温度设定值可能为65℉,并且灯是关的;而当处于“有人”状态时,温度设定值可能为72℉,并且灯是开的,等等。命令对象定义了某一状态与一组数值间的关系,这些数值将写入实现这一状态的一组不同对象的属性中。通常,命令对象是被动的。当命令对象的处理中属性为FALSE时,表示该对象正在等待其当前值属性被写入一个数值。当当前值属性被写入一个数值后,命令对象执行一系列操作。当处理中属性为TRUE时,表示命令对象已开始执行操作序列中的某一个操作,这个操作是根据写入到当前值属性中的值选取的。当处理中属性为TRUE时,如果使用写属性服务向当前值属性写入值,均会返回Result(-),表示拒绝写入。82当前值属性值确定在命令对象的操作序列中,当前应该执行哪个操作。这些操作定义在一个通过当前值可以检索到的一个操作序列表数组中。操作属性包含这个操作序列表。操作序列表可以为空,在这种情况下,除了处理中返回FALSE和所有写入成功属性被设置为TRUE外,不会产生任何操作。如果操作序列表不为空,那么对于操作序列表中的每个操作,命令对象将向某个BACnet设备中的某个对象的某个属性写入一个相应的值。但对远程设备的写操作不作规定。另外,命令对象不保证每次写操作都会成功,并且只要有一个写操作失败时,就不会使那些成功写入的属性回复到以前的值。如果发生任何写操作失败,所有写入成功属性设置为FALSE,并且BACnet操作命令的写入成功标志也设置为FALSE。对于操作失败的BACnet操作命令,如果失败退出标志为TRUE,那么操作序列表中所有后续的BACnet操作命令都应把它们的写入成功标志设置为FALSE。如果某个写入成功,那么该BACnet操作命令的写入成功标志设置为TRUE。如果所有的写入都成功,则所有写入成功属性设置为TRUE。一旦所有的写操作都通过命令对象处理完成,则处理中属性重新回到FALSE,命令对象处于被动状态并等待下一指令。特别值得注意的一种情况是,写入当前值属性的那个值不是触发任何其它操作的值,而是触发写自己本身的操作。例如在这种情况下,如果当前值属性为5且又被写入5,那么操作序列表中的第五个操作将再次执行。向当前值属性中写入0时,则无操作产生,与调用空操作序列表的结果相同。命令对象是一个功能强大的对象,可以有许多应用。但如果配置不合适,命令对象也会导致系统混乱甚至使系统瘫痪的负面效应。由于命令对象可以操作其它对象的属性,它也可以操作本身。因此,处理中属性用于联锁以防止命令对象自我操作。但命令对象还是可以命令另一个命令对象,而这另一个命令对象又可以操作其它命令对象,等等。因此存在这样的可能性,一些命令对象形成了命令对象组,在“循环引用”的情况下,有可能发生导致系统混乱的负作用。当引用在另一个BACnet设备中的对象时,时间延迟可能增大,这将导致在循环引用错误配置的命令对象间的不确定行为的发生。因此,配置那些引用其它BACnet设备中对象的命令对象时,要特别小心。命令对象及其属性见表12-10,本节进行详细规范。表12-10命令对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR描述Description字符串CharacterStringO当前值Present_Value无符号整型UnsignedW处理中In_Processs布尔BOOLEANR所有写入成功All_Writes_Successful布尔BOOLEANR操作ActionBACnet操作序列表的BACnet数组BACnetARRAY[N]ofBACnetActionListR操作文本Action_Text字符串的BACnet数组BACnetARRAY[N]ofCharacterStringO8312.8.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.8.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.8.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为命令(COMMAND)。12.8.4描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.8.5当前值属性这个属性的类型是无符号整型类型,表示命令对象将采取或已采取何种操作。无论何时,只要写入当前值,都将触发命令对象执行改变一组其它对象属性值的一系列操作。当前值可以写入从0到操作属性所支持的最大操作值的任意值。当当前值被写入时,命令对象执行一系列操作。当前值属性值确定在命令对象的操作序列中,当前应该执行哪个操作。这些操作定义在操作属性中,后者是一个关于要执行的操作的序列表数组,这个数组可以通过向当前值属性写入的值进行索引。操作序列表数组可以为空,表示无操作发生。如果操作序列表数组不为空,那么对于操作序列表中的每个操作,命令对象将向某个BACnet设备中的某个对象的某个属性写入一个相应的值。12.8.6处理中属性这个属性的类型是布尔类型,当写入当前值属性时,设置为TRUE,表示命令对象正在执行某个操作序列。一旦所有的写入完成,该属性被设置为FALSE。12.8.7所有写入成功属性这个属性的类型是布尔类型,表示当前值属性写入时触发的操作序列是否成功完成。当处理中属性为TRUE时,这个属性设置为FALSE。如果所有的操作都成功完成,那么设置本属性为TRUE,同时设置处理中属性为FALSE。因此,在处理中为TRUE时,这个属性不能指出当前或以前操作是否成功完成。12.8.8操作属性这个属性的类型是BACnet操作序列表的BACnet数组类型,定义为“操作序列表”的数组。这些操作序列表可以通过写入在当前值属性中的值索引。操作序列表可以为空,在这种情况下,除了处理中返回FALSE和所有写入成功属性被设置为TRUE外,不会产生任何操作。如果操作序列表不为空,那么对于操作序列表中的每个84操作,命令对象将根据BACnet操作命令中的规定向某个BACnet设备中的某个对象的某个属性写入一个相应的值。每个写操作执行的顺序与使用读属性服务读取BACnet操作命令序列表中的元素所得到的顺序相同。当前值属性值为0时,表示没有进行任何操作,其行为与空序列表相同。通过读取操作属性的0号下标的数组元素,可以获得所定义的操作序列表的数目。每一个BACnet操作命令就是一个关于向一个对象的一个属性写入一个值的规范说明。BACnet操作命令由九个部分组成,分别是:BACnet设备标识符(可选)、对象标识符、属性标识符、条件属性数组索引、要写入的数值、条件优先级、写入延迟时间(可选)、中途退出标志和成功写入标志。各个部分及其数据类型如下:组件数据类型设备标识符Device_IdentifierBACnet对象标识符BACnetObjectIdentifier(可选)对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifier属性标识符Property_IdentifierBACnet属性标识符BACnetPropertyIdentifier属性数组索引Property_Array_Index无符号整型Unsigned(条件)属性值Property_Value任何值Any优先级Priority无符号整型Unsigned(1..16)(条件)向后延迟Post_Delay无符号整型Unsigned(可选)失败退出Quit_On_Failure布尔BOOLEAN写入成功Write_Successful布尔BOOLEAN如果设备标识符不存在,写操作应作用于包含命令对象设备中的对象。支持命令对象类型的设备不必支持向外部设备的写操作。如果属性标识符引用了数组属性,则应存在属性数组索引属性,以确定要被写入的属性数组的索引。如果要被写入的属性为可命令属性,则应提供优先值,否则忽略该属性。如果失败退出标志为TRUE,则如果是由于任何原因而导致的写操作失败,设备都将提前终止操作序列的运行,否则,则在失败后应继续执行操作序列中的下一个写操作。不论哪种情况,所有写入成功属性在所有操作过程中均应为FALSE。如果向后延迟存在,就表示在每个不论成功与否的写操作之后,与执行下一个写操作之前的一段时间延迟(以秒为单位),或者在完成所有写操作之后,与设置处理中为FALSE之前的一段延迟时间(以秒为单位)。如果不论什么原因致使写操作失败,则写入成功标志都要设置为FALSE。如果失败退出标志为TRUE,则第一次写操作失败也将提前终止操作序列的运行。在这种情况下,要将这个序列表中后续表目中的写入成功都设置为FALSE。如果写操作成功,设置写入成功为TRUE。12.8.9操作文本属性这个属性的类型是字符串的BACnet数组[N]类型,用文本字符串描述当前值的可能取值。字符串的内容不受限制。12.9设备对象类型(DeviceObjectType)设备对象类型定义为一个标准对象,其属性表示BACnet设备的外部可见一致性代码。每个BACnet设备有且只有一个设备对象。每个设备对象由它的对象标识符属性确定,该属性在BACnet设备中乃至整个BACnet互联网中都是唯一的。85设备对象及其属性见表12-11,本节中进行详细规范。表12-11设备对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR系统状态System_StatusBACnet系统状态BACnetDeviceStatusR生产商名称Vendor_Name字符串CharacterStringR生产商标识符Vendor_Identifier16位无符号整型Unsigned16R型号名称Model_Name字符串CharacterStringR固件版本Firmware_Revision字符串CharacterStringR应用软件版本Application_Software_Version字符串CharacterStringR位置Location字符串CharacterStringO描述Description字符串CharacterStringO协议版本Protocol_Version无符号整型UnsignedR协议一致类别Protocol_Conformance_Class无符号整型Unsigned(1..6)R协议服务支持Protocol_Service_SupportedBACnet服务支持BACnetServiceSupportedR协议对象类型支持Protocol_Object_Types_SupportedBACnet对象类型支持BACnetObjectTypesSupportedR对象列表Object_ListBACnet对象标识符的BACnet数组BACnetARRAY[N]ofBACnetObjectIdentifierR最大APDU长度支持Max_APDU_Length_Accepted无符号整型UnsignedR分段支持Segmentation_SupportedBACnet分段BACnetSegmentationR虚拟终端类型支持VT_Classes_SupportedBACnet虚拟终端类列表ListofBACnetVTClassO1活动虚拟终端会话Active_VT_SessionsBACnet虚拟终端会话列表ListofBACnetVTSessionO1本地时间Local_Time时间TimeO本地日期Local_Date时期DateO时差UTC_Offset整型INTEGERO86夏令时状态Daylight_Savings_Status布尔BOOLEANOAPDU分段超时APDU_Segment_Timeout无符号整型UnsignedO2APDU超时APDU_Timeout无符号整型UnsignedRAPDU重传次数Number_Of_APDU_Retries无符号整型UnsignedR会话密钥列表List_Of_Session_KeysBACnet会话密钥列表ListofBACnetSessionKeyO时间同步容器Time_Synchronization_RecipientsBACnet容器列表ListofBACnetRecipientO3最大主节点数Max_Master无符号整型Unsigned(1..127)O4最大信息帧数Max_Info_Frame无符号整型UnsignedO4设备地址捆绑Device_Address_BindingBACnet地址捆绑列表ListofBACnetAddressBindingR1虚拟终端类型支持属性与活动虚拟终端会话必需同时存在。如果PICS中有对VT服务的支持,那么这两个属性是必需的。2如果支持任何形式的分段,那么该属性是必需的。3如果PICS指出该设备是时间主设备(TimeMaster),那么该属性是必需的。如果存在,则该属性必须是可写的。4如果设备是MS/TP主节点,那么这些属性是必需的。12.9.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。对于设备对象,它的对象标识符在整个BACnet互联网中是唯一的。12.9.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.9.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为设备(DEVICE)。12.9.4系统状态属性这个属性的类型是BACnet系统状态类型,表示BACnet设备当前的物理状态和逻辑的状态。这个属性可以取如下值:{可操作的(OPERATIONAL),只读可操作的(OPERATIONAL_READ_ONLY),下载必需的87(DOWNLOAD_REQUIRED),下载正在处理中(DOWNLOAD_IN_PROGRESS),不可操作的(NON_OPERATIONAL)}在一个具体设备中这些状态的具体含义,以及它们与设备内部其它操作的同步机制,或者与BACnet服务运行的同步机制的实现方式,都由生产商自行确定,本标准不作定义。12.9.5生产商名称属性这个属性的类型是字符串类型,标明了BACnet设备的制造商。12.9.6生产商标识符属性这个属性的类型是16位整型类型,是由ASHRAE分配的唯一的生产商标志代码,用于区别生产商对协议的专用扩展。详见第23节。12.9.7型号名称属性这个属性的类型是字符串类型,由生产商确定的表示设备型号的字符串。12.9.8固件版本属性这个属性的类型是字符串类型,由生产商分配的表示安装在设备中的固化软件修订版本号的字符串。12.9.9应用软件版本属性这个属性的类型是字符串类型,表示设备中安装的应用软件版本号。字符串内容由生产商自行确定,但建议是日期时间标记、程序员姓名、主文件版本号等。12.9.10位置属性这个属性的类型是字符串类型,表示设备的物理位置。12.9.11描述属性这个属性的类型是字符串类型,是描述BACnet设备的功能或其它本地信息的可打印字符。12.9.12协议版本属性这个属性的类型是无符号整型类型,表示BACnet设备支持的BACnet协议版本。每次修正都将版本号加1,初始发布的版本号为1。12.9.13协议一致性类别属性这个属性的类型是无符号整型类型,取值范围为1-6,表示设备支持的一组标准协议服务和对象类型。当设备的这个属性取某个值时,表示这个设备至少支持与这个取值所代表的一致性类别的规定相符合的一组标准服务、对象类型和属性,同时,设备的协议实现还可以支持附加的服务、对象类型和属性。所有标准服务和对象类型组在下面两个属性中规定。12.9.14协议服务支持属性这个属性的类型是BACnet协议服务支持类型,表示这个设备的协议实现所支持的标准协议服务。除了在协88议一致性类别属性中规定的服务之外,设备的实现还可自由支持附加标准服务。12.9.15协议对象类型支持属性这个属性的类型是BACnet协议对象类型支持类型,表示设备协议实现所支持的标准对象类型。表示这个设备的协议实现所支持的标准协议服务。除了在协议一致性类别属性中规定的对象类型之外,设备的实现还可自由支持附加的标准的和非标准的对象类型,以及它们各自所拥有的属性。某个对象的所有属性可使用ALL的属性引用的读多个属性服务获取。12.9.16对象列表属性这个属性的类型是BACnet对象标识符的BACnet数组[N]类型,列出设备中可通过BACnet服务访问的所有对象标识符。12.9.17最大APDU长度支持属性这个属性的类型是无符号整型类型,表示一个不可分割的APDU所能容纳的最大字节数。这个属性值不小于50。这个属性值还受到底层数据链路技术的限制。参见第6节至11节。12.9.18分段支持属性这个属性的类型是BACnet分段类型,表示BACnet设备是否支持报文分段、分段传输和分段接收。取值为:{支持报文分段(SEGMENTED_BOTH),支持传输分段(SEGMENTED_TRANSMIT),支持分段接收(SEGMENTED_RECEIVE),不分段(NO_SEGMENTATION)}12.9.19虚拟终端类型支持属性这个属性的类型是BACnet虚拟终端类列表类型,表示一组终端的一致性代码。为了区别不同类型的终端或不同类型的操作接口程序,BACnet设备可以支持多种形式的操作。至少支持17.5节中定义的“缺省终端”VT_class。虚拟终端类型支持属性与活动虚拟终端会话必须同时存在。如果PICS中有对VT服务的支持,那么这两个属性是必需的。12.9.20活动虚拟终端会话属性这个属性的类型是BACnet虚拟终端会话列表类型,列表中每项包含本地VT会话标识符(LocalVTSessionIdentifier)、远程VT会话标识符(RemoteVTSessionIdentifier)和远程VT地址(RemoteVTAddress)。这个属性提供了网络可见的虚拟终端会话(简称VT-Sessions)指示,而这些虚拟终端会话在任何时间里都是激活的。无论何时通过VT-Open服务创建虚拟终端会话,都要在活动虚拟终端会话列表中加入新的元素。类似的,无论何时终止虚拟终端会话,都要从活动虚拟终端会话列表中删除相应的信息。虚拟终端类型属性与活动虚拟终端会话必需同时存在。如果PICS中有对VT服务的支持,那么这两个属性是必需的。8912.9.21本地时间属性这个属性的类型是时间类型,表示设备信息的时间。如果BACnet设备没有时间和日期的任何信息,那么这个属性可以被忽略。12.9.22本地日期属性这个属性的类型是日期类型,表示设备信息的日期。如果BACnet设备没有时间和日期的任何信息,那么该属性可以被忽略。12.9.23时差属性这个属性的类型是整型类型,表示本地时间与国际标准时间的时差(以分为单位,-720到+720)。0度子午线以西的时区为正值,以东的时区为负值。12.9.24夏令时状态属性这个属性的类型是布尔类型,用TRUE或FALSE表示BACnet设备所在地是否采用夏令时。12.9.25APDU分段超时属性这个属性的类型是无符号整型类型,表示APDU分段超时重传的等待时间(以毫秒为单位)。缺省值为2000毫秒。如果APDU重传次数属性不为0,那么这个属性值也不为0。参见5.3节。如果支持任何形式的分段,那么这个属性是必须存在的。为了实现可靠通信,建议所有互联设备的设备对象的APDU分段超时属性取相同值。12.9.26APDU超时属性这个属性的类型是无符号整型类型,以毫秒表示对APDU超时重传的等待时间。对于允许修改该参数的设备,缺省值为3000毫秒。否则为60000毫秒。如果APDU重传次数属性不为0,那么这个属性值也不为0。参见5.3节。为了实现可靠通信,建议所有互联设备的设备对象的APDU超时属性取相同值。12.9.27APDU重传次数属性这个属性的类型是无符号整型类型,表示APDU重传的最大次数。缺省值为3。如果设备不允许重传,那么该属性值为0。如果该属性取值大于0,则APDU超时属性值为非0值。参见5.3节。12.9.28会话密钥列表属性这个属性的类型是BACnet会话密钥列表类型,用于与有保密要求的BACnet设备进行通信的密钥表。除了作为“密钥服务器(KeyServer)”的设备之外,任何设备不可写也不可读这个属性。会话密钥由56位密钥和对等设备请求用来进行安全通信的BACnet地址组成。12.9.29时间同步容器属性这个属性的类型是BACnet容器列表类型,用于控制和限制使用时间同步服务的设备。如果该表的长度为900,则设备禁止自动发送时间同步请求。如果列表长度不为0,则设备可以自动发送时间同步请求,但只能向所列出的设备或地址发送。如果这个属性存在,则这个属性是可写的。如果PICS指出该设备是时间主设备,那么应具有这个属性。12.9.30最大主节点数属性这个属性的类型是无符号整型类型,如果设备是MS/TP网络的主节点,该属性存在,表示最大主节点数(小于等于127)。如果该属性不能通过BACnet服务写入,那么它的值将为127。参见9.5.3节。12.9.31最大信息帧数属性这个属性的类型是无符号整型类型,如果设备是MS/TP网络的节点,该属性存在,表示节点在占有令牌时能够发送的信息帧的最大数量。如果该属性不可写,或用户不可配置时,它的值应为1。参见9.5.3节。12.9.32设备地址捆绑属性这个属性的类型是BACnet地址捆绑列表类型,列表的表目是BACnet设备对象的对象标识符和BACnet地址。列表中的每一项确定了实际设备的地址,这些地址用于通过BACnet服务请求访问远程设备。如果对象没有设备标识符和设备地址捆绑时,列表为空。12.10事件登记对象类型(EventEnrollmentObjectType)事件登记对象类型定义为一个标准对象,表示BACnet系统内管理事件的信息。“事件”是指满足预先规定条件的所有对象的任何属性值的变化。事件登记对象主要用于定义一个事件和提供在事件发生与通告消息向一个或多个接收者进行传输这两者之间的联系。事件登记对象包含有:事件类型描述,事件发生时须确定的参数,和时间发生时必须通告的设备。一个通告类对象也可以用于确定事件通告的接收者。如果一个设备是通告的接收者或者是由事件登记对象所引用的通告类对象中的接收者,那么该设备被登记为事件通告设备。第13节描述了事件登记对象与报警和事件应用服务间的相互作用。事件登记对象及其属性见表12-1,本节中进行详细规范。表12-12事件登记对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR描述Description字符串CharacterStringO事件类型Event_TypeBACnet事件类型BACnetEventTypeR通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeR事件参数Event_ParametersBACnet事件参数BACnetEventParameterR91对象属性引用Object_Property_ReferenceBACnet对象属性引用BACnetObjectPropertyReferenceR事件状态Event_StateBACnet事件状态BACnetEventStateR事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsR确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsR通告类Notification_Class无符号整型UnsignedO1接收者RecipientBACnet接收者BACnetRecipientO2进程标识符Process_Identifier无符号整型UnsignedO2优先级Priority无符号整型UnsignedO2发送确认的通告Issue_Confirmed_Notifications布尔BOOLEANO21如果接收者属性不存在,那么通告类属性必须存在。2如果通告类属性不存在,那么所有这些属性必须存在。12.10.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。对象标识符在设备中是唯一的。12.10.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.10.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为事件登记(EVENT_ENROLLMENT)。12.10.4描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容未作规定。12.10.5事件类型属性这个属性的类型是BACnet事件类型类型,表示事件算法类型,这个算法用来侦测事件的发生并且向事件登记设备报告。事件类型属性是一个枚举类型,可以取下列值:{比特位串改变,状态改变,值改变,命令失败,偏移阈值,偏离范围}事件算法,参数表和事件类型间存在一定的关系。事件类型属性表示一个用于侦测事件状态的算法,对于每个事件类型的算法在第13节中定义。事件参数属性提供算法所需的参数。92表12-13列出了事件类型、事件状态、事件参数的有效组合。表12-13事件类型、事件状态和它们的参数事件类型事件状态事件参数比特位串改变CHANG_OF_BITSTRING正常NORMAL异常OFFNORMAL时间延迟(Time_Delay)比特掩码(Bitmask)比特位串值列表(List_Of_Bitstring_Values)状态改变CHANGE_OF_STATE正常NORMAL异常OFFNORMAL时间延迟(Time_Delay)值列表(List_Of_Values)值改变CHANGE_OF_VALUE正常NORMAL异常OFFNORMAL时间延迟(Time_Delay)比特掩码(Bitmask)引用的属性增量(Referenced_Property_Increment)命令失败COMMAND_FAILURE正常NORMAL异常OFFNORMAL时间延迟(Time_Delay)反馈属性引用(Feedback_Property_Reference)偏移阈值FLOATING_LIMIT正常NORMAL高阈值HIGH_LIMIT低阈值LOW_LIMIT时间延迟(Time_Delay)设置点引用(Setpoint_Reference)低偏离阈值(Low_Diff_Limit)高偏离阈值(Hi_Diff_Limit)阈值宽度(Deadband)偏离范围OUT_OF_RANGE正常NORMAL高阈值HIGH_LIMIT低阈值LOW_LIMIT时间延迟(Time_Delay)低阈值(Low_Limit)高阈值(High_Limit)阈值宽度(Deadband)12.10.6通告类型属性这个属性的类型是BACnet通告类型类型,表示由事件类型属性定义的监测算法所产生的通告是事件类型,还是报警类型。12.10.7事件参数属性这个属性的类型是BACnet事件参数类型。每个事件类型属性规定用于监测引用对象的算法,而事件参数属性提供这个算法所需的参数值。事件参数中每个值的含义根据表12-13中事件类型属性确定。这些参数的意义93如下:比特掩码:这个参数的类型是比特位串类型,应用于引用属性为比特位串类型的比特位串改变事件算法和值改变事件算法。这是一个位掩码,用于指示算法所引用的属性位。比特位为1表明引用属性中的这个比特位被算法监测。比特位为0表明引用属性中的这个比特位对侦测比特流改变或值改变事件不起作用。比特位串值列表:这个参数是一个比特位串的列表,应用于比特位串改变事件算法。这个比特位串列表定义了引用属性为异常时的一组状态。只有比特掩码指定的比特位才是有意义的。如果引用属性值改变成为比特位串值列表中的某个值时,事件登记对象的事件状态属性将转换成为进入异常,并产生相应的通告。值列表:这个参数是一个BACnet属性状态的列表,应用于状态改变事件算法。这个事件算法应用于有离散值或枚举值的引用属性。值列表为这个属性的子集。如果引用属性值变为值列表中的某一值,事件登记对象的事件类型属性值变为进入异常,并产生相应的通告。引用的属性增量:这个参数是实数类型,应用于值改变事件算法。表示要产生一个事件时引用属性的变化量。时间延迟:这个参数是无符号整型类型,表示用秒为单位的时间,应用于所有的事件类型。表示产生事件通告时,由事件算法监测的条件必需保持的时间。反馈属性引用:这个参数是BACnet对象属性引用类型,应用于命令失败算法。这个参数标识那些可以提供反馈值从而保证命令属性已经改变了它的值的对象和属性。这个属性仅引用有枚举值或是布尔类型的对象属性。设置点引用:这个参数是BACnet对象属性引用类型,应用于偏移阈值事件算法。表示引用属性间隔的设置点引用。阈值宽度、高偏离阈值、低偏离阈值、高阈值、低阈值:这些参数都是实数类型参数,应用于偏移阈值和偏离范围事件算法。它们的用法见13节中的有关的算法说明。12.10.8对象属性引用属性这个属性的类型是BACnet对象属性引用类型。这个属性指向被事件登记对象所引用的那个对象和属性。将由事件类型属性所规定的算法应用于引用的属性,可以确定事件的事件类型。12.10.9事件状态属性这个属性的类型是BACnet事件状态类型,表示事件的当前状态。这个属性的允许值对于不同的事件类型是不同的。参见表12-13。事件状态属性的值与事件使能标志无关。参见12.10.10节。12.10.10事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示允许产生进入异常、进入故障和进入正94常事件。当标志位被设置时,表示相应的事件可以向所有登记设备发送通告。当标志位清除时,表示不会报告相应的事件。不论事件使能属性值为多少,对象的事件状态属性都可以不断更新。12.10.11确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。12.10.12通告类属性这个属性的类型是无符号整型类型,缺省引用含有事件登记对象的设备中的通告类对象。这个属性用来规定一个或多个对于事件起始的对象的事件处理,事件报告和通告确认的方法。如果通告类属性不存在,则应该存在接收者属性、进程标识符属性、优先级属性、和发送确认的通告属性。如果这个属性存在,但接收者属性为非空值(表示接收者属性正用于通告)时,该属性可以为任何值,并且不应使用该属性。12.10.13接收者属性这个属性的类型是BACnet接收者类型,表示不使用通告类对象时,登记事件通告的接收设备。如果这个属性存在,则进程标识符属性、优先级属性和发送确认的通告属性也应存在。如果这个属性存在,并且通告类属性用于通告时,那么这个属性应为空值。如果这个属性为非空值(表示一个接收者正用于通告),那么通告类属性可以为任何值,并且不应使用本属性。12.10.14进程标识符属性这个属性的类型是无符号整型类型。在不使用通告类对象时,本属性表示驻留在登记为事件通告的接收者设备中的进程的数字句柄。如果进程标识符属性存在,则接收者属性、优先级属性和发送确认的通告属性也应存在。如果进程标识符属性存在且接收者属性为空值(表示通告类属性正用于通告),那么进程标识符属性可以为任何值,并且不应使用进程标识符属性。12.10.15优先级属性这个属性的类型是无符号整型类型,表示在不使用通告类对象的情况下,产生事件通告的优先级。优先级是保证有严格时刻要求的事件或报警通告不会出现不必要的延迟。本属性取值范围为0-255。数字越小,优先级越高。如果本属性存在,那么接收者属性、进程标识符属性和发送确认的通告属性也应存在。如果本属性存在且接收者属性为空值(表示通告类属性正用于通告),那么本属性可以为任何值,并且不应使用本属性。12.10.16发送确认的通告属性这个属性的类型是布尔类型,表示在不使用通告类对象的情况下,证实(TRUE)或不证实(FALSE)事件通告。如果本属性存在,那么接收者属性、进程标识符属性和优先级属性也应存在。如果本属性存在且接收者属性为空值(表示通告类属性正用于通告),那么本属性可以为任何值,并且不应使用本属性。12.11文件对象类型(FileObjectType)95文件对象类型定义为一个标准对象,用于定义可以通过文件服务(见第14节)访问的数据文件的属性。文件对象对象及其属性见表12-14,本节中进行详细规范。表12-14文件对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR描述Description字符串CharacterStringO文件类型File_Type字符串CharacterStringR文件大小File_Size无符号整型UnsignedR修改日期Modification_DateBACnet日期时间BACnetDateTimeR存档Archive布尔BOOLEANW只读Read_Only布尔BOOLEANR文件访问方法File_Access_MethodBACnet文件访问方法BACnetFileAccessMethodR12.11.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的12.11.2对象名称属性这个对象的类型是字符串类型,表示对象名称,在有这个对象的BACnet设备中是唯一的。字符串最小长度为1,而且字符必需为可打印字符。12.11.3对象类型属性这个对象的类型是BACnet队形类型类型,表示对象本身的类型名称。在本对象中,其值为文件(FILE)。12.11.4描述属性这个对象的类型是字符串类型,是一个由可打印字符组成的字符串,其内容未作规定。12.11.5文件类型属性这个属性的类型是字符串类型,表明文件用途。下列文本字符串是ASHRAE定义的文件结构所保留的:EVENTLOG和VALUELOG。12.11.6文件大小属性这个属性的类型无符号整型类型,以字节表明文件数据的大小。9612.11.7修改日期属性这个属性的类型是BACnet日期时间类型,表示本对象最后被修改的时间。当文件对象创建或写入时可以认为被修改。12.11.8存档属性这个属性的类型是布尔类型,表明文件对象是否被保存或备分。只有在从文件对象被最后一次存档时刻以来,文件数据一直没有被任何内部程序或者文件访问服务修改过,本属性值才能为TRUE。12.11.9只读属性这个属性的类型是布尔类型,表示是(TURE)否(FALSE)不允许使用BACnet基本写文件服务修改文件数据。12.11.10文件访问方法属性这个属性的类型是BACnet文件访问方法类型,表示本对象支持的文件访问的类型。本属性的可能取值为:{记录访问(RECORD_ACCESS)、流访问(STREAM_ACCESS)、记录和流访问(RECORD_AND_STREAM_ACCESS)}12.12组对象类型(GroupObjectType)组对象类型定义为一个标准对象,其属性表示一个其它对象的集合以及这些对象的一个或多个属性。组对象提供一种快速的方式,可以一次确定组的成员,从而简化BACnet设备间的信息交换。一个组对象可以是任何对象类型的组合。组对象及其属性见表12-15,本节中进行详细规范。表12-15组对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR描述Description字符串CharacterStringO组成员列表List_Of_Group_Members读访问规范列表ListofReadAccessSpecificationR当前值Present_Value读访问结果列表ListofReadAccessResultR12.12.1对象标识符塑像这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的12.12.2对象名称属性97这个对象的类型是字符串类型,表示对象名称,在有这个对象的BACnet设备中是唯一的。字符串最小长度为1,而且字符必需为可打印字符。12.12.3对象类型属性这个对象的类型是BACnet队形类型类型,表示对象本身的类型名称。在本对象中,其值为组(GROUP)。12.12.4描述属性这个对象的类型是字符串类型,是一个由可打印字符组成的字符串,其内容未作规定。12.12.5组成员列表属性这个属性的类型是读访问规范列表类型,是一个或多个读访问规范表。在一个协议事务处理中,如果定义了组对象,则本属性用来定义将要被引用的组的成员。每个读访问规范由两部分组成:1)一个对象标识符,2)一个属性引用表。所有组成员都应该是同一设备中的对象。参见第21节有关ReadAccessSpecification的ASN.1说明。不允许组对象嵌套,即本属性不能引用组对象的当前值属性。12.12.6当前值属性这个属性的类型是读访问结果列表类型,是组成员列表属性中定义的所有属性值的表,为“只读”属性。本属性不能用于向组成员写入一组值。在每次采用取出成员属性的方法进行读属性操作之后,都应该重构当前值属性列表。(注:这个规定是为了减少因存储当前值而可能产生的并发问题。)9812.13环对象类型(LoopObjectType)环对象类型定义为一个标准对象,其属性表示任何形式的反馈控制环路的外部可见一致性代码。环对象通过提供三个独立的无单位增益常数,可以具有广泛的适用性。每个增益常数由控制算法具休确定,如何使用不同的算法确定增益常数的方法,由生产商自行确定。环对象及其属性见表12-16,本节中进行详细规范。图12-1示出环对象属性与该对象引用的其它对象间的关系。表12-16环对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value实数REALR描述Description字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR更新间隔Update_Interval无符号整型UnsignedO输出单位Output_UnitsBACnet工程单位BACnetEngineeringUnitsR操作变量引用Manipulated_Variable_ReferencetBACnet对象属性引用BACnetObjectPropertyReferenceR控制变量引用Controlled_Variable_ReferencetBACnet对象属性引用BACnetObjectPropertyReferenceR控制变量值Controlled_Variable_Value实数REALR控制变量单位Controlled_Variable_UnitsBACnet工程单位BACnetEngineeringUnitsR设置点引用Setpoint_ReferenceBACnet设置点引用BACnetSetpointReferenceR设置点Setpoint实数REALR操作ActionBACnet操作BACnetActionR比例常数Proportional_Constant实数REALO199比例常数单位Proportional_Constant_UnitsBACnet工程单位BACnetEngineeringUnitsO1积分常数Integral_Constant实数REALO2积分常数单位Integral_Constant_UnitsBACnet工程单位BACnetEngineeringUnitsO2微分常数Derivative_Constant实数REALO3微分常数单位Derivative_Constant_UnitsBACnet工程单位BACnetEngineeringUnitsO3偏差Bias实数REALO最大输出Maximum_Output实数REALO最小输出Minimum_Output实数REALO写入优先级Priority_For_Writing无符号整型UnsignedRCOV增量COV_Increment实数REALO4时间延迟Time_Delay无符号整型UnsignedO5通告类Notification_Class无符号整型UnsignedO5误差阈值Error_Limit实数REALO5事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO5确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO5通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO51如果这些可选属性中的一个存在,那么必须都存在。2如果这些可选属性中的一个存在,那么必须都存在。3如果这些可选属性中的一个存在,那么必须都存在。4如果对象支持COV报告,那么该属性是必需的。5如果对象支持内部报告,则这些属性是必需的。12.13.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.13.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.13.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为环(LOOP)。10012.13.4当前值属性这个属性的类型是实数类型,本属性以输出单位属性定义的单位表示环算法的当前输出值。12.13.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.13.6状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示环对象运行的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.13.7节)属性值为正常则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.13.8节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值和可靠性属性值不再能够通过BACnet服务而改变。脱离服务如果脱离服务属性值(见12.13.9节)为TRUE则为TRUE(1),否则为FALSE(0)。12.13.7事件状态属性这个属性的类型是BACnet事件状态类型,用于确定本对象是否有与之有关的活动事件状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。10112.13.8可靠性属性这个属性的类型是BACnet可靠性类型,表示环的当前值是否可靠。如果不可靠,指明原因。本属性可能取值如下:{未发现故障,开路,其它不可靠}12.13.9脱离服务属性这个属性的类型是布尔类型,表示本对象所表示的算法是(TRUE)否(FALSE)能够使用。10212.13.10更新间隔属性这个属性的类型是无符号整型类型,用微秒表示环对象算法更新输出值(当前值属性)的间隔。注:本对象没有定义过程变量取样或算法运行时间间隔参数的属性。更新间隔属性值在不同算法中可能与上述参数相同,也可能不相同。取样或运行间隔时间由生产商自行确定,因而没必要在本对象中定义。12.13.11输出范围属性这个属性的类型是BACnet工程单位类型,表示控制环对象输出(当前值属性)的工程单位。12.13.12操作变量引用属性这个属性的类型是BACnet对象属性引用类型。操作变量引用属性指向控制环对象输出(当前值属性)写入的对象和属性,这个引用通常是用于定位一个设备的模拟输出对象的当前值属性,也可以是诸如阶段多态的二进制输出对象。12.13.13控制变量引用属性这个属性的类型是BACnet对象属性引用类型,控制变量引用属性指向环对象中用来设置控制变量值属性值的属性。这个引用通常是用于过程测量的参数(如温度)的模拟输出对象的当前值属性,也可以是诸如阶段多态的二进制输出对象。12.13.14控制变量值属性这个属性的类型是实数类型,是由控制变量引用属性所引用的对象的属性的值。控制环对象通过比较本属性与设置点属性来计算误差。12.13.15控制变量单位属性这个属性的类型是BACnet工程单位类型,表示环对象的控制变量值属性的工程单位。12.13.16设置点引用属性这个属性的类型是BACnet设置点引用类型,是一个长度为0或1的引用表。长度为0表示控制环对象的设置点是固定的,并且设置在这个对象的设置点属性内。长度为1表示在一个对象的属性中包含有为这个环对象设置的设置点值,并且定义了那个属性。12.13.17设置点属性这个属性的类型是实数类型,用控制变量单位属性定义的单位,表示环对象设置点的值,或者表示由设置点引用属性所引用对象的属性值。12.13.18操作属性这个属性的类型是BACnet操作类型,定义环对象是直接(DIRECT)操作还是逆向(REVERSE)操作。12.13.19比例常数属性103这个属性的类型是实数类型,是环对象算法的比例增益参数的值。本属性表示在比例控制模式中的任何形式的增益,如,总增益量,节流范围等。比例常数属性与比例常数单位属性必须同时存在。12.13.20比例常数单位属性这个属性的类型是BACnet工程单位类型,表示本对象的比例常数属性的工程单位。比例常数属性与比例常数单位属性必须同时存在。12.13.21积分常数属性这个属性的类型是实数类型,是环对象算法的积分参数的值。本属性表示在积分控制模式的任何形式的增益量,如,复位时间,速率等。积分常数属性与积分常数单位属性必须同时存在。12.13.22积分常数单位属性这个属性的类型是BACnet工程单位类型,表示本对象的积分常数属性的工程单位。积分常数属性与积分常数单位属性必须同时存在。12.13.23微分常数属性这个属性的类型是实数类型,是环对象算法的微分参数的值。本属性表示在微分控制模式的任何形式的增益量,如,微分时间,速率时间等。微分常数属性与微分常数单位属性必须同时存在。12.13.24微分常数单位属性这个属性的类型是BACnet工程单位类型,表示本对象的微分常数属性的工程单位。微分常数属性与微分常数单位属性必须同时存在。12.13.25偏差属性这个属性的类型是实数类型,用输出单位属性中的单位表示环对象算法的偏差值。12.13.26最大输出属性这个属性的类型是实数类型,是被PID算法所限制的当前值属性的最大值。这个属性通常用于防止算法的控制行为超出控制设备的范围,以及防止发生“停摆”现象。12.13.27最小输出属性这个属性的类型是实数类型,是被PID算法所限制的当前值属性的最小值。这个属性通常用于防止算法的控制行为超出控制设备的范围,以及防止发生“停摆”现象。12.13.28写入优先级属性这个属性的类型是无符号整型类型。环对象可能用于控制一个对象的可命令属性,本属性提供了一个可供命令优先级机制使用的优先级的值。本属性在这个环对象控制的控制变量引用属性中的优先级数组(Priority_Array)中定义了一个范围,取值范围为1-16。10412.13.29COV增量属性这个属性的类型是实数类型,定义当前值属性的最小改变值,这个最小改变值将导致向COV客户发布COV通告。如果对象支持COV报告,则必须具备这个属性。12.13.30时间延迟属性这个属性的类型是无符号整型类型。定义从(设置点属性值-控制变量值属性值)(即误差(Error))处于由误差阈值属性确定的范围之外开始,到生成一个进入异常事件之间的最小时间间隔(以秒为单位),或者从(设置点属性值-控制变量值属性值)(即误差)处于由误差阈值属性确定的范围之内时,到生成一个进入正常事件的最小时间间隔(以秒为单位)。如果对象支持内部报告则必须具备这个属性。12.13.31通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.13.32误差阈值属性这个属性的类型是实数类型,定义生成进入异常事件时,(设置点属性值-控制变量值属性值)(即误差)必须超过的绝对值。如果对象支持内部报告,则该属性是必需的。12.13.33事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障和进入正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.13.34确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.13.35通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。12.14多态输入对象类型(Multi-stateInputObjectType)多态输入对象类型定义了一个标准对象,它的当前值属性表示对象驻留的BACnet设备内算法处理的结果。105算法处理方法由生产商自行确定,本协议中未作定义。例如,多态输入对象的状态或当前值可能是多个二进制输入的逻辑组合,或者是多个模拟输入的阈值,或者是一个数学计算的结果。当前值属性是一个表示状态的整型数。状态文本属性对每个状态进行了描述。多态输入对象及其属性归纳在表12-17中。注:不要混淆当前值状态与事件状态属性(它反映了多态输入的异常状态)。表12-17多态输入对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value无符号整型UnsignedR1描述Description字符串CharacterStringO设备类型Device_Type字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR状态数Number_of_States无符号整型UnsignedR状态文本State_Text字符串的BACnet数组BACnetARRAY[N]ofCharacterStringO时间延迟Time_Delay无符号整型UnsignedO2通告类Notification_Class无符号整型UnsignedO2报警值Alarm_Values无符号整型列表ListofUnsignedO2故障值Fault_Values无符号整型列表ListofUnsignedO2事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO2确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO2通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO21当脱离服务为TRUE时该属性必需是可写的。2如果对象支持内部报告则该属性是必需的。12.14.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.14.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。10612.14.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为多态输入(MULTISTATE_INPUT)。12.14.4当前值属性这个属性的类型是无符号整型类型,反映了输入的逻辑状态。逻辑状态为n个状态之一,n是状态数属性中定义的状态数目。当前状态的确定方法由生产商自行确定。当前值属性值应该总是大于0。当脱离服务为TRUE时,本属性必须是可写的。参见12.14.10节。12.14.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.14.6设备类型属性这个属性的类型是字符串类型,是一段对多态输入的文本描述。通常用于描述与多态输入对应的设备的型号。12.14.7状态标志属性这个属性的类型是BACnet状态标志(BACnetStatusFlags)类型,表示四种布尔标志,这些标志表示多态输入设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.14.8节)属性值为正常(NORMAL)则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.14.9节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值和可靠性属性值不再随物理设备的输入变化而变化。脱离服务如果脱离服务属性值(见12.14.10节)为TRUE则为TRUE(1),否则为FALSE(0)。12.14.8事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。12.14.9可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值或物理输入设备的运行是否“可靠”,如果不可靠,107则指明原因。这个属性有下列值:{未发现故障,无传感器,超出范围,低于范围,开路,短路,其它不可靠}12.14.10脱离服务属性这个属性的类型是布尔类型,表示该对象代表的物理输入是(TRUE)否(FALSE)不与设备相关。当脱离服务为TRUE时,当前值属性与物理输入设备分离,并不会随着物理输入设备的改变而变化。当脱离服务为TRUE时,可靠性属性和对应的状态标志属性中的故障标志的状态也与物理输入设备分离。当脱离服务为TRUE时,当用于模拟专门的固定条件或用于测试时,当前值与可靠性属性可以为任何值。而其它依靠当前值或可靠性属性的功能将响应这些变化,就像这些变化发生在输入中一样。12.14.11状态数属性这个属性的类型是无符号整型类型,定义了当前值可能具有的状态数目。本属性取值总大于0。12.14.12状态文本属性这个属性是一个由字符串构成的BACnet数组,描述所有的当前值的可能状态。描述的数目要与状态数属性中定义的数目一致。当前值中的整型值作为数组的索引。12.14.13时间延迟属性这个属性的类型是无符号整型类型,定义从当前值属性等于报警值属性开始,到生成一个进入异常事件之间的最小时间间隔(以秒为单位),或者从当前值属性不等于报警值属性开始,到生成一个进入正常事件的最小时间间隔(以秒为单位)。如果对象支持内部报告则必须具备这个属性。12.14.14通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.14.15报警值属性这个属性是一个无符号整型列表,定义生成一个进入异常事件时,当前值属性必须等于的所有状态值。如果对象支持内部报告则必须具备这个属性。12.14.15.1生成进入异常事件条件进入异常事件在达到下列三个条件的情况下生成:(a)当前值属性必须等于至少一个报警值列表中的值,(b)当前值必须等于这个报警值一段由时间延迟属性确定的最小时间间隔的时间,(c)事件使能属性设置为进入异常标志。12.14.15.2生成进入正常事件条件一旦当前值等于某个报警值之后,只有在当前值不等于任何一个报警值之后,才能生成进入正常事件。进入正常事件在达到下列两个条件的情况下生成:108(a)当前值必须不等于任何一个报警值属性中的值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入正常标志。12.14.16故障值属性这个属性是一个无符号整型列表,定义生成一个进入故障事件时,当前值属性必须等于的所有状态值。如果对象支持内部报告则必须具备这个属性。12.14.16.1生成进入故障事件条件进入异常事件在达到下列三个条件的情况下生成:(a)当前值属性必须等于至少一个故障值列表中的值,(b)当前值必须等于这个故障值一段由时间延迟属性确定的最小时间间隔的时间,(c)事件使能属性设置为进入故障标志。12.14.16.2生成进入正常事件条件一旦当前值等于某个故障值之后,只有在当前值不等于任何一个故障值之后,才能生成进入正常事件。进入正常事件在达到下列两个条件的情况下生成:(a)当前值必须不等于任何一个故障值属性中的值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入正常标志。12.14.17事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障和进入正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.14.18确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.14.19通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。10912.15多态输出对象类型(Multi-stateOutputObjectType)多态输出对象类型定义了一个标准对象,它的属性表示这个对象驻留的BACnet设备内的处理程序或一个或多个物理输出的期望状态。特定状态的实际功能由生产商自行确定,本协议中未作定义。例如,特定当前值属性是一个表示状态的无符号整型数。状态文本属性对每个状态进行了描述。多态输出对象及其属性归纳在表12-18中。本节进行详细规范。表12-18多态输出对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value无符号整型UnsignedW描述Description字符串CharacterStringO设备类型Device_Type字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR事件状态Event_StateBACnet事件状态BACnetEventStateR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR状态数Number_of_States无符号整型UnsignedR状态文本State_Text字符串的BACnet数组BACnetARRAY[N]ofCharacterStringO优先级数组Priority_ArrayBACnet优先级数组BACnetPriorityArraR释放缺省Relinquish_Default无符号整型UnsignedR时间延迟Time_Delay无符号整型UnsignedO1通告类Notification_Class无符号整型UnsignedO1反馈值Feedback_Values无符号整型UnsignedO1事件使能Event_EnableBACnet事件转换比特BACnetEventTransitionBitsO1确认转换Acked_TransitionsBACnet事件转换比特BACnetEventTransitionBitsO1通告类型Notify_TypeBACnet通告类型BACnetNotifyTypeO11如果对象支持内部报告则该属性是必需的。12.15.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。11012.15.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.15.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为多态输出(MULTISTATE_OUTPUT)。12.15.4当前值属性这个属性的类型是无符号整型类型,反映了输出的逻辑状态。逻辑状态为n个状态之一,n是状态数属性中定义的状态数目。当前状态的确定方法由生产商自行确定。当前值属性值应该总是大于0。12.15.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.15.6设备类型属性这个属性的类型是字符串类型,是一段对多态输出的文本描述。通常用于描述与多态输出对应的设备的型号。12.15.7状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示多态输出设备运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中如果事件状态(见12.15.8节)属性值为正常(NORMAL)则为FALSE(0),否则为TRUE(1)。故障如果可靠性(见12.15.9节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示当前值和可靠性属性值不再反映物理输出的变化。脱离服务如果脱离服务属性值(见12.15.10节)为TRUE则为TRUE(1),否则为FALSE(0)。12.15.8事件状态属性这个属性的类型是BACnet事件状态类型,用于检测对象是否处于事件活动状态。如果对象支持内部报告,这个属性表示对象的事件状态。如果对象不支持内部报告,这个属性的值为正常。11112.15.9可靠性属性这个属性的类型是BACnet可靠性类型,表示当前值或物理输出设备的运行是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,开路,短路,无输出,其它不可靠}12.15.10脱离服务属性这个属性的类型是布尔类型,表示该对象代表的物理输出或者处理结果是(TRUE)否(FALSE)不与设备相关。当脱离服务为TRUE时,当前值属性的变化与物理输出设备分离。当脱离服务为TRUE时,可靠性属性和对应的状态标志属性中的故障标志的状态也与物理输出设备分离。当脱离服务为TRUE时,当用于模拟专门的固定条件或用于测试时,当前值与可靠性属性可以为任何值。而其它依靠当前值或可靠性属性的功能将响应这些变化,就像这些变化发生在输出中一样。如果脱离服务为TRUE,当前值属性还要受BACnet命令优先机制的控制。12.15.11状态数属性这个属性的类型是无符号整型类型,定义了当前值可能具有的状态数目。本属性取值总大于0。12.15.12状态文本属性这个属性是一个由字符串构成的BACnet数组,描述所有的当前值的可能状态。描述的数目要与状态数属性中定义的数目一致。当前值中的整型值作为数组的索引。12.15.13优先级数组属性这个属性时一个只读数组,包含对这个对象有效的优先命令。参见19节中对优先机制的描述。12.15.14释放缺省属性当优先值数组中的所有命令优先值为NULL时,这个属性是用于当前值属性的缺省值。详见19节。12.15.15时间延迟属性这个属性的类型是无符号整型类型,定义从当前值属性不等于反馈值属性开始,到生成一个进入异常事件之间的最小时间间隔(以秒为单位),或者从当前值属性等于反馈值属性开始,到生成一个进入正常事件的最小时间间隔(以秒为单位)。如果对象支持内部报告则必须具备这个属性。12.15.16通告类属性这个属性的类型是无符号整型类型,用于定义这个对象处理和生成事件通告时的通告类别。这个属性缺省引用有相同通告类属性值的通告类对象。如果对象支持内部报告则必须具备这个属性。12.15.17反馈值属性这个属性是一个无符号整型列表,定义生成一个进入异常事件时,当前值属性必须不等于的所有状态值。如果对象支持内部报告则必须具备这个属性。确定反馈值的方法由生产商自行确定。11212.15.17.1生成进入异常事件条件进入异常事件在达到下列两个条件的情况下生成:(a)当前值必须不等于反馈值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入异常标志。12.15.17.2生成进入正常事件条件一旦当前值不等于反馈值之后,只有在当前值等于反馈值之后,才能生成进入正常事件。进入正常事件在达到下列两个条件的情况下生成:(a)当前值必须等于反馈值属性的值一段由时间延迟属性确定的最小时间间隔的时间,(b)事件使能属性设置为进入正常标志。12.15.18事件使能属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示使能或者禁止对于进入异常、进入故障和进入正常事件的报告。如果对象支持内部报告则必须具备这个属性。12.15.19确认转换属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示收到对于进入异常、进入故障和进入正常事件的确认。这些标志将在相应事件出现的情况下被清除,并在下列任一条件下设置:(a)收到相应的确认;(b)如果事件使能属性中相应的标志未设置时,事件发生(即在这种情况下,不会产生事件通告,因此也不会产生确认);(c)如果事件使能属性中设置了相应的标志,并且在通告类对象的确认转换属性中未设置相应标志时,事件发生(即无确认产生)。如果对象支持内部报告则必须具备这个属性。12.15.20通告类型属性这个属性的类型是BACnet通告类型类型,表示对象生成的通告是事件还是报警。如果对象支持内部报告则必须具备这个属性。12.16通告类对象类型(NotificationClassObjectType)通告类对象类型定义了一个标准对象,表示在BACnet系统内事件通告发布所需的信息。通告类对事件起始的对象特别有用,它提供了如何处理通告、怎样规划通告目标、以及怎样获得确认的方式。一个通告类规范事件通告根据进入异常、进入故障、进入正常事件在处理中如何实现优先机制,事件目录是否需要确认(几乎总是由操作员完成),以及哪个目标设备和处理程序应当接收通告这些事宜。优先机制提供了一种方式,保证重要的报警或事件通告不会出现不必要的延迟。优先值取值范围是0-255。较小的数值表示较高的优先级。在通告类中优先级可以分配给进入异常、进入故障、进入正常事件。确认的目的是保证通告已被其它代理处理,而不仅仅是简单的被设备正确收到。在大多数情况下,确认来自操作员。在通告类中,进入异常、进入故障、进入正常事件可以要求单独确认也可以不要求。113经常需要将事件通告发送给多个目的地址,或者根据日期与时间的不同发送事件通告给不同的地址。通告类可以根据时间、日期和处理类型定义一个目的地址列表。目的地址定义了一组日期(从星期一到星期日),在这组日期中,这个目的地址对于通告类对象来说是可用的。另外,每个目的地址还定义了起止时间,表示在一周内这些天的这些时候,目的地址对于通告类对象可用。如果使用通告类对象的事件发生,并且发生的日期处于给定目的地址定义的有效日期内,而且发生的时间也处于给定目的地址所定义的时间窗口内,那么就会向该地址发送通告。目的地址可以进一步与进入异常、进入故障、进入正常事件传输相结合,满足具体的应用要求。目的地址定义了接收通告并进行处理的接收设备。使用只对目标设备有意义的数字句柄来表示处理过程。对于这些句柄的管理由生产商自行确定。接收设备可以通过它独一无二的设备对象标识符或者BACnet地址来确定。对于后者,将用到专门的节点地址、多播地址、广播地址。目的地址还可以进一步规定是否需要使用确认或不确认的事件通告。通告类对象及其属性归纳在表12-19中。表12-19通告类对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR描述Description字符串CharacterStringO通告类Notification_Class无符号整型UnsignedR优先级Priority无符号整型的BACnet数组BACnetARRAY[3]ofUnsignedR确认要求Acked_RequiredBACnet事件转换比特BACnetEventTransitionBitsR接收者列表Recipient_ListBACnet目标列表ListofBACnetDestinationR12.16.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.16.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.16.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为通告类(NOTIFICATION_CLASS)。11412.16.4描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.16.5通告类属性这个属性的类型是无符号整型类型,表示这个通告类的数字值。事件起始的对象将使用这个数字间接引用通告类对象。生产商可以选择使本属性值等于通告类对象的实例数。具体的实现方式由生产商自行确定。12.16.6优先级属性这个属性的类型是无符号整型的BACnet数组[3]类型,表示用于进入异常、进入故障、进入正常事件的事件通告的使用优先级。取值范围为0-255。较低的数值表示较高的优先级。12.16.7确认要求属性这个属性的类型是BACnet事件转换比特类型,用三个标志分别表示对于进入异常、进入故障、进入正常事件转换所生成的通告,是否需要确认。12.16.8接收者列表属性这个属性的类型是BACnet目标列表类型,表示有一个或多个接收地址的列表,当事件起始的对象使用这个类探测到事件发生时,通告将被发送到列表中的目的地址。目的地址定义了一个参数结构,见表12-20。表12-20BACnet目标列表的组成部分参数类型描述有效日期ValidDaysBACnetDaysOfWeek目的地址可用的日期(用星期表示)起止时间FromtimeToTimeTime目的地址在可用日期内的可用时间(用时间窗口表示)接收者RecipientBACnetRecipient接收通告的目的设备进程标识符ProcessIdentifierUnsigned接收通告的设备内的处理进程的句柄产生确认的通告IssueConfirmedNotificationsBoolean发送需确认通告时为TRUE发送无需确认通告时为FALSE转换TransitionsBACnetEventTransitions三个标识{进入异常、进入故障、进入正常}转换的标志,表示接收者适合的传输12.17程序对象类型(ProgramObjectType)程序对象类型定义了一个标准对象,它的属性表示应用程序的外部可视一致性代码。在本协议中,应用程115序是指对一个在BACnet设备中的处理过程的抽象表示,这个处理过程执行一个指令集,对某个数据结构集合进行操作。这些指令集的运行逻辑以及这些数据结构的形式和内容都不是本协议的规范内容,由生产商自行确定。程序对象的属性提供了一个应用程序的一些参数的表征。本标准中定义了一些属性,这些属性表示了在不同的BACnet设备之间的一致行为。通过这些标准的属性,可以观察和控制运行应用程序的进程的运行状态。所有的程序对象都必须具有这些标准属性。除了这些标准属性之外,程序对象还提供了生产商定义的属性,这些属性可以作为程序的输入或输出。如果存在生产商定义的属性,本标准不对生产商定义的属性的工作方式作任何定义,这些属性只是专用于某个应用程序或生产商的。程序对象及其属性归纳在表12-21中。表12-21程序对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR程序状态Program_StateBACnet程序状态BACnetProgramStateR程序改变Program_ChangeBACnet程序请求BACnetProgramRequestW暂停原因Reason_For_HaltBACnet程序错误BACnetProgramErrorO1暂停描述Description_Of_Halt字符串CharacterStringO1程序位置Program_Location字符串CharacterStringO描述Description字符串CharacterStringO实例Instance_Of字符串CharacterStringO状态标志Status_FlagsBACnet状态标志BACnetStatusFlagsR可靠性ReliabilityBACnet可靠性BACnetReliabilityO脱离服务Out_Of_Service布尔BOOLEANR1可选属性暂停原因与暂停描述必须同时存在。12.17.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.17.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.17.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为程序(PROGRAM)。12.17.4程序状态属性116这个属性的类型是BACnet程序状态类型,反映本对象所代表的运行应用程序运的进程的当前逻辑状态。本属性为只读属性,可能取值为:空闲(IDLE)进程未运行装入程序(LOADING)正在装入应用程序运行(RUNNING)进程当前正在运行等待(WAITING)进程正在等待某个外部事件已暂停(HALTED)由于某个错误导致进程暂停卸载(UNLOADING)请求进程终止12.17.5程序改变属性这个属性的类型是BACnet程序请求类型,用于请求改变本对象所代表的进程的运行状态。程序改变属性提供了改变进程的运行状态的方法。进程也可以将改变它自己的状态作为一个运行结果。本属性可能取值为:就绪(READY)这是正常状态,表示准备接收改变请求装入程序(LOAD)如果还未装载应用程序,则请求装入应用程序运行(RUN)如果还未运行进程,则请求进程开始执行暂停(HALT)请求进程暂停运行重启(RESTART)请求进程从初始点开始重新运行卸载(UNLOAD)请求进程暂停运行并且卸载正常情况下程序改变属性值为就绪,表示程序已经就绪准备接收改变它自己状态的新的请求。如果程序改变属性值不为就绪,则不可写入,而且任何写入操作都会导致返回Result(-)。如果程序改变属性值具有其它列出的值,那么先前改变状态的请求不会被执行,所以新的请求也不会被接受。当最后开始执行先前的改变状态的请求时,本属性值将变为就绪,同时新的状态将体现在程序状态属性中。根据当前的程序状态,关于程序改变的某个请求值可能是无效,这时如果进行任何写操作,也将返回Result(-)。图12-2描述了有效的状态转换和导出的新的程序状态。117值得注意的是,在装入程序的过程中,可能由于发生错误或者收到一个暂停请求而终止程序的装入。在任一种情况下,都可能得到“程序状态=已暂停”,并且在此有一个不完整的或不可行的程序。在这种情况下,重启请求意味着重新装入程序。如果已经装入了完整的程序,但由于任何原因导致已暂停,那么重启只是简单的从初始点开始重新运行程序。在有些情况下BACnet设备可能已经内装了应用程序,所以不要求装入应用程序,这时,装入程序意味着“准备运行”,具体规范由生产商自行确定。12.17.6暂停原因属性如果运行本对象代表的应用程序的进程发生任何形式的错误,导致进程中止运行,则本属性反映出进程中止的原因。暂停原因属性是一种枚举类型,称之为BACnet程序错误,可能取值如下:正常(NORMAL)进程没有因为任何错误原因而暂停装入程序故障(LOAD_FAULT)应用程序不能完整载入118内部原因(INTERNAL)进程由于内部机制而中止程序原因(PROGRAM)进程由于程序改变请求而中止其它原因(OTHER)进程由于其它原因而中止可选属性暂停原因属性与暂停描述属性必须同时存在。12.17.7暂停描述属性这个属性的类型是字符串类型,用于描述程序中止的原因。暂停描述属性提供的信息与暂停原因属性相同,但暂停描述属性以可供人阅读的格式表示。字符串的内容由生产商自行确定。可选属性暂停原因与暂停描述必需同时存在。12.17.8程序位置属性这个属性的类型是字符串类型,被应用程序用于指出它在程序代码中的位置,例如,一行数字,或者程序标记,或者分区的名称。字符串内容由生产商自行确定。12.17.9描述属性这个属性的类型是字符串类型,用于描述被执行的应用程序或其它的生产商所期望的描述信息。12.17.10实例属性这个属性的类型是字符串类型,描述被运行的应用程序的本地名称。字符串的内容由生产商自行确定。12.17.11状态标志属性这个属性的类型是BACnet状态标志类型,表示四种布尔标志,这些标志表示程序运行时刻的状况。三个标志与这个对象的其它属性值有关。通过读取与这些标志相关的属性值可以获取更详细的状态。在本协议不对标志之间的关系进行定义。这四个标志是:{报警中,故障,管制,脱离服务}其中,报警中这个标志的值是逻辑FALSE(0)。故障如果可靠性(见12.17.12节)属性存在并且其值不是未发现故障,则为TRUE(1),否则为FALSE(0)。管制如果某值被与BACnet设备本身的有关机制所管制,则为TRUE(1)。在此情况下,“管制”表示通过BACnet设备不能改变程序改变属性、程序状态属性、或者其它程序相关的属性中的任何一个。脱离服务如果脱离服务属性值(见12.17.15节)为TRUE则为TRUE(1),否则为FALSE(0)。12.17.12可靠性属性这个属性的类型是BACnet可靠性类型,表示程序对象中与应用相关的属性值、或者执行应用程序的进程119是否“可靠”,如果不可靠,则指明原因。这个属性有下列值:{未发现故障,进程错误,其它不可靠}12.17.13脱离服务属性这个属性的类型是布尔类型,表示本对象所表示的进程是(TRUE)否(FALSE)不处在服务中。在这里,“处在服务中”表示应用程序能够正确载入和初始化,不论进程是否正在运行。如果程序状态属性为空闲,则脱离服务属性为TRUE。12.18时间表对象类型(ScheduleObjectType)时间表对象类型定义了一个标准对象,用于描述一个周期性的时间表。这个时间表中确定了某事件在一个日期范围内可能重复发生,同时表示有些日期是事件不发生的日期。时间表对象还用于把预定时间和在该时间内向特定对象的特定属性写入的特定值这样两个事务绑定。时间表对象及其属性归纳在表12-22中。时间表按天来分配,有两种形式:正常日(工作日)和例外日。如果包含时间表的BACnet设备重启,或者设备内的时间被改变,那么时间表将恢复。恢复模型规定每天的时间表是自然循环。如果BACnet设备在午夜后但在当天的BACnet时间值(BACnetTimeValues)列表中定义的第一时间前重启,那么当天的列表中最后一个值用作恢复值。如果期望是其它的值,那么时间00:00应当作为列表的第一个时间。表12-22时间表对象属性属性标识符属性数据类型一致性代码对象标识符Object_IdentifierBACnet对象标识符BACnetObjectIdentifierR对象名称Object_Name字符串CharacterStringR对象类型Object_TypeBACnet对象类型BACnetObjectTypeR当前值Present_Value任何类型的值AnyR描述Description字符串CharacterStringO有效周期Effective_PeriodBACnet日期范围BACnetDataRangeR按周时间表Weekly_Schedule按日时间表的数组BACnetARRAY[7]ofBACnetDailyScheduleO1例外时间表特别事件的数组BACnetARRAY[N]ofO1120Exception_ScheduleBACnetSpecialEvent对象属性引用列表List_Of_Object_Property_ReferencesBACnet对象属性引用列表ListofBACnetObjectPropertyReferenceR写入优先级Priority_For_Writing无符号整型Unsigned(1..16)R1这些属性中至少一个是必需的。12.18.1对象标识符属性这个属性的类型是BACnet对象标识符类型,是一个用来标识对象的数值代码。在有这个属性的BACnet设备中是唯一的。12.18.2对象名称属性这个属性的类型是字符串类型,表示对象名称,在有这个属性的BACnet设备中是唯一的。字符串最小长度为一个字符。对象名称中的字符必需为可打印字符。12.18.3对象类型属性这个属性的类型是BACnet对象类型类型,表示在某个特别对象类型分类中的隶属关系。在本对象中,这个属性的值为时间表(SCHEDULE)。12.18.4当前值属性这个属性表明了时间表的当前值。例如,最近向对象属性引用列表属性成员所引用对象的属性写入的数值。这些数值可以是任何数据类型。因此,模拟、数字、枚举值都可以列在时间表中。12.18.5描述属性这个属性的类型是字符串类型,是一个由可打印字符组成的字符串,其内容不作规定。12.18.6有效周期属性这个属性定义了时间表对象处于活动状态的日期范围。实现季节时间表的方法是,定义几个时间表对象,它们没有重叠的有效周期,这样可以控制相同的属性引用。12.18.7按周时间表属性这个属性是一个BACnet数组,严格包含七个成员。每个成员包含一个BACnet按日时间表(BACnetDailySchedule)。BACnet按日时间表由BACnet时间值列表组成,该列表为时间-数值对,描述了当例外时间表(Exception_Schedule)无效时,一周中的某一天的时间表操作序列。数组成员1-7分别对应星期一到星期日。本属性为可选属性,但是按周时间表与非空的例外时间表之一应被时间表对象的每个实例支持。12.18.8例外时间表属性121这个属性是由BACnet特别事件组成的BACnet数组。每个BACnet特别事件描述了一个时间表操作序列,这些操作将在特定的日期取代正常的操作。BACnetSpecialEvent::=(Period,ListofBACnetTimeValues,EventPriority)Period::=Choiceof{BACnetCalendarEntryCalendarReference}EventPriority::=Unsigned(1..16)周期(Period)可以是BACnet日期表表目(BACnetCalendarEntry),或者引用日期表对象(参见12.7节)。如果时间表对象用到了例外时间表属性,则也可能用到BACnet日期表表目,日期表中可能定义了那些被多个时间表对象引用的普通假日。每个BACnet日期表表目为单个日期(Date)、日期范围(BACnetDataRange)或月/周-月/日-周(BACnetWeekNDay)。如果当前日期符合日期表的任何表目内容,则激活例外时间表属性并且可以使用BACnet时间值列表中的值。在使用BACnet日期表表目确定当前日期是否落在例外时间表的区域内时,BACnet日期表表目的各种结构的单个部分可能是一个“通配符”(表示时间范围很宽)。举例来说,对于日期范围,如果起始日期是一个通配符(表示没有起始日期),则意味着可以从任何日期开始到截止日期。如果截至日期是一个通配符(表示没有截止日期),则表示从起始日期开始到任何日期为止。如果日期表的表目原来是一个具有“月”域和“周-月”域都是通配符的BACnetWeekNDay类型(对于月和周-月未定义但有特定的日-周),那么将在全年的那个日-周都应用例外时间表。每个BACnet特别事件都包含一个事件优先级(EventPriority)。事件优先级决定了在同样的例外时间表中,这个BACnet特别事件相对于其它BACnet特别事件的重要性。由于在同一个例外时间表中的特别事件(SpecialEvent)有重叠的时段,那么采用一种机制确定在所给日期应用哪个特别事件是必要的。如果在所给日期中有多于一个的特别事件应用,那么有较高的事件优先级的将有效,其它的将在当天被忽略。如果多个特别事件有同样的优先级,那么最早发生的将有效。最高的事件优先级为1,最低的事件优先级为6。事件优先级与时间表对象的写入优先级属性无关。如果BACnet设备支持向例外时间表属性写入,那么将支持BACnet特别事件中所有可能的选择。12.18.9对象属性引用列表属性这个属性定义了在特定日期的特定时间被写入特定值的属性的对象标识符和属性标识符。12.18.10写入优先级属性这个属性定义了引用属性被命令时的优先级,对应于写属性服务的“优先级”参数。本属性为无符号整型,取值范围为1-16。1表示最高的优先级,16表示最低的优先级。参见19节。14.文件访问服务本节定义一组访问和操作在BACnet设备中的文件的服务。在本节的定义中,文件表示一个任意长度和意义的字节集合的网络可见形式。这只是一个抽象的概念,并不表示在服务器设备中用到了磁盘,磁带或其它的大容量存储设备。这些服务可以访问BACnet协议标准定义的特定文件,也可以访问生产商定义的文件。每一个能被文件访问服务访问的文件,在BACnet设备中都有一个对应的文件对象。这个文件对象标识特定122的文件的名称。另外,文件对象还提供诸如文件总长度、文件创建日期、和文件类型这样的访问“头信息”。文件访问服务给出两种文件模型:连续字节流模型和编号记录的连续序列模型。文件访问服务提供基本读和写操作。在本协议中,“基本的(atomic)”表示在读和写操作的执行期间,不允许有其它的基本读文件操作或者基本写文件操作作用在同一个文件上。具有BACnet设备内部操作性质的服务如何同步的问题由生产商自行解决,本标准不作任何规定。14.1基本读文件(AtomicReadFile)服务一个客户端的BACnet用户使用基本读文件服务对某个文件进行一个“打开-读出-关闭”的操作。访问的文件可以是字节流,也可以是编号记录。14.1.1结构表14-1表示基本读文件服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表14-1基本读文件服务原语结构参数名称ReqIndRspCnf参数(Argument)文件标识符(FileIdentifier)流访问(StreamAccess)文件开始位置(FileStartPosition)MMSMM(=)M(=)S(=)M(=)123请求的字节数目(RequestedOctetCount)记录访问(RecordAccess)文件开始记录(FileStartRecord)请求的记录数目(RequestedRecordCount)Result(+)文件结束(EndOfFile)流访问(StreamAccess)文件开始位置(FileStartPosition)文件数据(FileData)记录访问(RecordAccess)文件开始记录(FileStartRecord)返回的记录数目(ReturnedRecordCount)文件记录数据(FileRecordCount)Result(-)错误类型(ErrorType)MSMMM(=)S(=)M(=)M(=)SMSMCSMMCSMS(=)M(=)S(=)M(=)C(=)S(=)M(=)M(=)C(=)S(=)M(=)14.1.2参数这个参数为基本读文件有证实服务请求传送参数值。14.1.2.1文件标识符这个参数是标识被读文件的文件对象的对象标识符。14.1.2.2流访问这个参数指明要求面向流的文件访问。流访问包含‘文件开始位置’参数和‘请求的字节数目’参数。14.1.2.2.1文件开始位置这个参数是整型类型,表示从读操作开始执行的文件开始位置之后的字节的标号。‘文件开始位置’0表示文件的第一个字节。14.1.2.2.2请求的字节数目这个参数是无符号整型类型,表示从文件开始被读的字节的数目。14.1.2.3记录访问这个参数指明要求面向记录的文件访问。记录访问包含‘文件开始记录’参数和‘请求的记录数目’参数。14.1.2.3.1文件开始记录这个参数是整型类型,表示从读操作开始执行的文件开始位置之后的记录的标号。‘文件开始记录’0表示文件的第一个记录。12414.1.2.3.2请求的记录数目这个参数是无符号整型类型,表示从文件开始被读的记录的数目。14.1.3Result(+)参数‘Result(+)’指明服务请求已经成功,一个成功的请求包含下列参数。14.1.3.1文件结束参数‘文件结束’是布尔类型,如果这个响应包含文件的最后一个字节,则本参数为TRUE,否则,本参数都为FALSE。这个参数用来检查文件是否结束,因为返回的字节的标号可能小于‘请求的字节数目’,或者‘返回的记录数目’可能小于‘请求的记录数目’,存在这种可能性的原因是文件本身所具有的数据数目就小于请求的数目。这个参数还可以向这个服务的用户提供一种独立于文件数据的检查文件末端的方法。14.1.3.2流访问这个参数指明被请求的是面向流的文件访问。流访问包含‘文件开始位置’参数和‘文件数据’参数。14.1.3.2.1文件开始位置这个参数是整型类型,表示从被读数据开始的文件开始位置之后的字节的标号。‘文件开始位置’0表示文件的第一个字节。14.1.3.2.2文件数据这个参数是一个请求的文件数据字节串(OCTETSTRING)。14.1.3.3记录访问这个参数指明被请求的是面向记录的文件访问。记录访问包含‘文件开始记录’参数、‘返回的记录数目’参数和‘文件记录数据’参数。14.1.3.3.1文件开始记录这个参数是整型类型,表示从被读数据开始的文件开始位置之后的记录的标号。‘文件开始记录’0表示文件的第一个记录。14.1.3.3.2返回的记录数目这个参数是无符号整型类型,表示从文件开始实际被读的记录的数目,这个数目可能小于‘请求的记录数目’。14.1.3.3.3文件记录数据这个参数是一个请求的文件数据字节串的列表。14.1.4Result(-)125参数‘Result(-)’指明服务请求失败,失败的原因在‘错误类型’参数中说明。14.1.4.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。14.1.5服务过程响应的BACnet用户首先检验‘文件标识符’的有效性,如果文件对象未知、如果当前存在另外一个正在运行的基本读文件或者基本写文件服务、如果文件对象由于其它的原因当前不可访问,则返回一个‘Result(-)’,并给出一个适当地错误类和代码。如果‘文件开始位置’参数、或者‘文件开始记录’参数或者小于0、或者大于文件的实际尺寸,则返回一个‘Result(-)’,并给出一个适当地错误类和代码。如果不是上述情况,响应的BACnet用户就读出由‘请求的字节数目’参数规定的字节数,或者读出由‘请求的记录数目’参数规定的记录数。如果文件中保存的字节数或者记录数小于请求的数目,则返回的‘文件数据’参数的长度、或者‘返回的记录数目’参数指明实际读出的数目。如果返回的响应包含文件的最后一个字节或者记录,则‘文件结束’参数应该为TURE,否则,这个参数为FALSE。12614.2基本写文件(AtomicWriteFile)服务一个客户端的BACnet用户使用基本写文件服务对某个字节流进行一个“打开-写入-关闭”的操作,将它写入到文件的某个位置,或者对某个字节流列表进行一个“打开-写入-关闭”的操作,将它写入到文件中记录的某个组里。访问的文件可以是字节流,也可以是编号记录。14.2.1结构表14-2表示基本写文件服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表14-2基本写文件服务原语结构参数名称ReqIndRspCnf参数(Argument)文件标识符(FileIdentifier)流访问(StreamAccess)文件开始位置(FileStartPosition)文件数据(FileData)记录访问(RecordAccess)文件开始记录(FileStartRecord)记录数目(RecordCount)文件记录数据(FileRecordData)Result(+)流访问(StreamAccess)文件开始位置(FileStartPosition)记录访问(RecordAccess)文件开始记录(FileStartRecord)Result(-)错误类型(ErrorType)MMSMMSMMMM(=)M(=)S(=)M(=)M(=)S(=)M(=)M(=)M(=)SSMSMSMS(=)S(=)M(=)S(=)M(=)S(=)M(=)14.2.2参数这个参数为基本写文件有证实服务请求传送参数值。14.2.2.1文件标识符这个参数是标识被写文件的文件对象的对象标识符。14.2.2.2流访问这个参数指明要求面向流的文件访问。流访问包含‘文件开始位置’参数和‘文件数据’参数。12714.2.2.2.1文件开始位置这个参数是整型类型,表示从写操作开始执行的文件开始位置之后的字节的标号。‘文件开始位置’0表示文件的第一个字节。‘文件开始位置’-1表示当前文件的末端,即,一个文件操作的附加(append)。14.2.2.2.2文件数据这个参数是一个请求被写入到文件中的字节串。14.2.2.3记录访问这个参数指明要求面向记录的文件访问。记录访问包含‘文件开始记录’参数、‘记录数目’参数和‘文件记录数据’参数。14.2.2.3.1文件开始记录这个参数是整型类型,表示从写操作开始执行的文件开始位置之后的记录的标号。‘文件开始记录’0表示文件的第一个记录。‘文件开始记录’-1表示当前文件的末端,即,一个文件操作的附加。14.2.2.3.2记录数目这个参数是无符号整型类型,表示从文件开始处开始,将被写入到文件中的记录的数目。14.2.2.3.3文件记录数据这个参数是一个请求写入到文件中的字节串的列表。14.2.3Result(+)参数‘Result(+)’指明服务请求已经成功,一个成功的请求包含下列参数。14.2.3.1流访问这个参数指明被请求的是面向流的文件访问。流访问包含‘文件开始位置’参数。‘文件开始位置’参数是整型类型,表示从实际被写数据写入的文件开始位置之后的字节的标号。‘文件开始位置’0表示文件的第一个字节。14.2.3.2记录访问这个参数指明被请求的是面向记录的文件访问。记录访问包含‘文件开始记录’参数。‘文件开始记录’参数是整型类型,表示从实际被写数据写入的文件开始位置之后的记录的标号。‘文件开始记录’0表示文件的第一个字节。14.2.4Result(-)参数‘Result(-)’指明服务请求失败,失败的原因在‘错误类型’参数中说明。14.2.4.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。12814.2.5服务过程响应的BACnet用户首先检验‘文件标识符’的有效性,如果文件对象未知、如果当前存在另外一个正在运行的基本读文件或者基本写文件服务、如果文件对象由于其它的原因当前不可访问,则返回一个‘Result(-)’,并给出一个适当地错误类和代码。如果‘文件开始位置’参数、或者‘文件开始记录’参数大于文件的实际尺寸,则文件将被扩展到指定的尺寸,但是插入的字节或者记录的内容和多少是个本地事务。如果这些参数中有一个具有特别值-1,则将写操作处理为从当前文件的末端进行附加写入。然后,响应的BACnet用户向文件中写入由‘字节数目’参数规定的字节数,或者写入由‘记录数目’参数规定的记录数。如果由于任何原因导致写操作失败,则返回一个‘Result(-)’,并给出一个适当地错误类和代码。如果全部成功写入,则返回一个‘Result(+)’。‘文件开始位置’参数、或者‘文件开始记录’参数指明被写数据的实际位置或者记录。15.对象访问服务本节定义九个应用服务,这些服务共同提供一组访问和操作BACnet对象的方法。一个BACnet对象,不论它在所驻留的设备中具有什么功能,都可以使用本节定义的服务,访问它的属性。这些服务可以访问本标准定义的标准对象,也可以访问生产商定义的专有对象。15.1添加列表元素(AddListElement)服务一个客户端的BACnet用户使用添加列表元素服务向一个具有列表的对象的属性添加一个或者多个列表元素。15.1.1结构表15-1表示添加列表元素服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-1添加列表元素服务原语结构参数名称ReqIndRspCnf参数(Argument)对象标识符(ObjectIdentifier)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)元素列表(ListofElements)Result(+)Result(-)错误类型(ErrorType)第一次失败元素标号(FirstFailedElementNumber)MMMCMM(=)M(=)M(=)C(=)M(=)SSMMS(=)S(=)M(=)M(=)15.1.1.1参数129这个参数为添加列表元素有证实服务请求传送参数值。15.1.1.1.1对象标识符这个参数是BACnet对象标识符类型,提供标识被本服务修改其列表属性的对象的方法。15.1.1.1.2属性标识符这个参数是BACnet属性标识符类型,提供唯一标识被本服务修改的属性的方法。15.1.1.1.3属性数组索引如果被按上述方法标识的属性是一个数据类型的数组,则可以使用这个条件的无符号整型参数,指明被本服务修改的引用属性的元素的数组索引。否则,省略这个参数。15.1.1.1.4元素列表这个参数表示一个或者多个将要添加到由‘属性标识符’参数规定的属性中的元素。这个参数的元素的数据类型由被‘对象标识符’参数规定的对象的类型定义所确定。15.1.1.2Result(+)参数‘Result(+)’指明服务请求已经成功,所有规定的元素都已经被添加到列表中。15.1.1.3Result(-)参数‘Result(-)’指明服务请求失败,没有一个规定的元素被添加到列表中。失败的原因在‘错误类型’参数中说明。15.1.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.1.1.3.2第一次失败元素标号这个参数是无符号整型类型,传送在请求中所接收的‘元素列表’参数中错误元素的标号,标号从1开始排列。如果认为造成请求无效的原因‘元素列表’参数的不同,则设置‘第一次失败元素标号’为0。15.1.2服务过程响应的BACnet用户检验了请求的合法性之后,开始对‘对象标识符’参数标识的对象进行修改操作。如果标识的对象存在,并且具有‘属性标识符’参数规定的属性,就向规定的属性中添加在‘元素列表’参数中定义的所有元素。如果操作成功,发送一个‘Result(+)’原语。如果有一个或者多个元素在列表中已经存在,则忽略这个(些)元素,即不向列表中添加这个(些)元素。忽略一个已经存在的元素,并不导致服务的失败。如果标识的对象不存在,或者标识的属性不存在,或者标识的属性不是一个列表,则服务都失败,发送一个‘Result(-)’原语。如果有一个或者多个元素不能添加到列表中,而且它(们)又不是列表本身的成员,则发送一个‘Result(-)’原语,并且不向列表中添加任何元素。这个服务的效果是,要么向列表中添加所有规定的且在列表中不存在的元素,要么不向列表中添加任何元130素。15.2删除列表元素(RemoveListElement)服务一个客户端的BACnet用户使用删除列表元素服务从一个具有列表的对象的属性中删除一个或者多个列表元素。15.2.1结构表15-2表示删除列表元素服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-2删除列表元素服务原语结构参数名称ReqIndRspCnf参数(Argument)对象标识符(ObjectIdentifier)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)元素列表(ListofElements)Result(+)Result(-)错误类型(ErrorType)第一次失败元素标号(FirstFailedElementNumber)MMMCMM(=)M(=)M(=)C(=)M(=)SSMMS(=)S(=)M(=)M(=)15.2.1.1参数这个参数为删除列表元素有证实服务请求传送参数值。15.2.1.1.1对象标识符这个参数是BACnet对象标识符类型,提供标识被本服务修改其列表属性的对象的方法。15.2.1.1.2属性标识符这个参数是BACnet属性标识符类型,提供唯一标识被本服务修改的属性的方法。15.2.1.1.3属性数组索引如果被按上述方法标识的属性是一个数据类型的数组,则可以使用这个条件的无符号整型参数,指明被本服务修改的引用属性的元素的数组索引。否则,省略这个参数。15.2.1.1.4元素列表这个参数表示一个或者多个将要被从由‘属性标识符’参数规定的属性中删除的元素。这个参数的元素的数据类型由被‘对象标识符’参数规定的对象的类型定义所确定。15.2.1.2Result(+)131参数‘Result(+)’指明服务请求已经成功,所有规定的元素都已经从列表中删除。15.2.1.3Result(-)参数‘Result(-)’指明服务请求失败,失败的原因在‘错误类型’参数中说明。没有一个的元素从标识的对象中被删除。15.2.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.2.1.3.2第一次失败元素标号这个参数是无符号整型类型,传送在请求中所接收的‘元素列表’参数中错误元素的标号,标号从1开始排列。如果认为造成请求无效的原因‘元素列表’参数的不同,则设置‘第一次失败元素标号’为0。15.2.2服务过程响应的BACnet用户检验了请求的合法性之后,开始对‘对象标识符’参数标识的对象进行修改操作。如果标识的对象存在,并且具有‘属性标识符’参数规定的属性,就从标识的对象的属性中删除在‘元素列表’参数中定义的所有元素。如果标识的对象不存在,或者标识的属性不存在,或者标识的属性不是一个列表,则服务都失败,发送一个‘Result(-)’原语。如果列表中不存在规定的一个或者多个元素,或者由于不具有授权而不能删除元素,则发送一个‘Result(-)’原语,并且不从列表中删除任何元素。15.3创建对象(CreateObject)服务一个客户端的BACnet用户使用创建对象服务创建一个对象的新实例。这个服务既可以创建标准对象的实例,也可以创建生产商定义的对象的实例。在PICS中规定了这个服务所支持的对象类型。对于使用本服务创建的对象的属性,使用两种方式进行初始化,分别是:创建对象服务将属性的初始化值作为请求的一部分提供给创建的对象,以及,使用BACnet写属性服务向新创建的对象写入属性值。非标准对象的初始化问题由生产商自行解决。本服务所创建的对象中,那些在初始化属性值中没有提供的性能,与设备有关,由生产商自行解决。15.3.1结构表15-3表示创建对象服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-3创建对象服务原语结构参数名称ReqIndRspCnf参数(Argument)对象说明符(ObjectSpecifier)初始值元素列表(ListofInitialValues)Result(+)对象标识符(ObjectIdentifier)MMUM(=)M(=)U(=)SMS(=)M(=)132Result(-)错误类型(ErrorType)第一次失败元素标号(FirstFailedElementNumber)SMMS(=)M(=)M(=)15.3.1.1参数这个参数为创建对象有证实服务请求传送参数值。15.3.1.1.1对象说明符这个参数传送关于要创建的对象的类型的信息。数据类型在对象类型和对象标识符之间选择。如果选择使用对象类型,则规定的对象类型成为新创建对象的对象类型属性值,响应的BACnet用户选择一个对象标识符。如果选择使用对象标识符,则创建一个具有这个选定的对象标识符的对象。15.3.1.1.2初始值列表这个参数传递一个BACnet属性值类型的列表,此表用来提供初始化新创建对象的特定属性值。15.3.1.2Result(+)参数‘Result(+)’指明服务请求已经成功,包括使用所有在‘初始值列表’参数中定义的属性值对新创建的对象的相关属性进行了初始化。参数‘Result(+)’将一个‘对象标识符’作为自己的参数返回,这个参数作为新创建的对象的对象标识符属性的值。这个标识符在服务器设备中是唯一的。15.3.1.3Result(-)参数‘Result(-)’指明服务请求失败,没有一个规定的元素被添加到列表中。失败的原因在‘错误类型’参数中说明。15.3.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.3.1.3.2第一次失败元素标号这个参数是无符号整型类型,传送在请求中所接收的‘初始值列表’参数中错误元素的标号,标号从1开始排列。如果认为造成请求无效的原因‘初始值列表’参数的不同,则设置‘第一次失败元素标号’为0。15.3.2服务过程响应的BACnet用户检验了请求的合法性之后,开始进行创建一个具有‘对象说明符’参数所规定的类型的新对象的操作。如果‘对象说明符’参数中包含一个对象类型,则新创建对象的对象标识符属性被初始化为一个在响应的BACnet用户设备中唯一的值。用来产生对象标识符的方法由生产商自行确定。对象类型属性被初始化为‘对象说明符’参数的值。如果不能创建规定类型的新对象,则返回一个‘Result(-)’原语,并且将‘第一次失败元133素标号’参数设置为0。如果‘对象说明符’参数中包含一个对象标识符,则响应的BACnet用户确定这个标识符的对象是否已经存在。如果已经存在一个这样的对象,就不创建新的对象,返回一个‘Result(-)’原语,并且将‘第一次失败元素标号’参数设置为0。如果不存在这样的对象,但是不能创建这个对象,则返回一个‘Result(-)’原语,并且将‘第一次失败元素标号’参数设置为0。如果这样的对象不存在,并且可以创建,则创建一个新对象。新对象的对象标识符属性具有‘对象说明符’参数所规定的值,对象类型属性具有一个与对象标识符的对象类型域一致的值。参见20.2.14节。如果原语中包含有可选的‘初始值列表’参数,则列表中的所有属性都要被初始化为指定值。其它属性的初始化问题由生产商自行解决。如果不能成功完成初始化过程,则返回一个‘Result(-)’原语,将‘第一次失败元素标号’参数指定在‘初始值列表’参数中的第一个不能被初始化属性,并且不创建对象。如果创建新对象的操作成功,则返回一个‘Result(+)’原语,其中传送了新创建对象的对象标识符属性的值。15.4删除对象(DeleteObject)服务一个客户端的BACnet用户使用删除对象服务删除一个已有的对象。虽然从原理上说可以使用这个服务删除任何类型的对象,但是从控制系统安全方面考虑,希望大部分对象都不能使用这个服务删除。只有某一些对象可以被动态地创建和删除,这些对象包括组对象和事件登记对象。本服务主要用于删除这些类型对象,也可用于删除上场上定义的可删除的专有对象。15.4.1结构表15-4表示删除对象服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-4删除对象服务原语结构参数名称ReqIndRspCnf参数(Argument)对象标识符(ObjectIdentifier)Result(+)Result(-)错误类型(ErrorType)MMM(=)M(=)SSMS(=)S(=)M(=)15.4.1.1参数这个参数为删除对象有证实服务请求传送参数值。15.4.1.1.1对象标识符这个参数是BACnet对象标识符类型,指明本服务要删除的对象。15.4.1.2Result(+)134参数‘Result(+)’指明服务请求已经成功,指定的对象已经被删除。15.4.1.3Result(-)参数‘Result(-)’指明服务请求失败,没有删除指定的对象。失败的原因在‘错误类型’参数中说明。15.4.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.4.2服务过程响应的BACnet用户检验了请求的合法性之后,开始进行删除一个具有请求/指示原语中‘对象标识符’参数所规定的对象的操作。如果指定的对象存在,并且可以被删除,则删除这个对象,发送一个‘Result(+)’原语。如果指定的对象不存在,或者指定的对象存在但是不能被删除,则发送一个‘Result(-)’原语。15.5读属性(ReadProperty)服务一个客户端的BACnet用户使用读属性服务请求一个BACnet对象的一个属性值。本服务允许读访问任何一个对象的任何属性,不论对象是否BACnet的标准对象。15.5.1结构表15-5表示读属性服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-5读属性服务原语结构参数名称ReqIndRspCnf参数(Argument)对象标识符(ObjectIdentifier)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)Result(+)对象标识符(ObjectIdentifier)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)属性值(PropertyValue)Result(-)错误类型(ErrorType)MMMUM(=)M(=)M(=)U(=)SMMUMSMS(=)M(=)M(=)U(=)M(=)S(=)M(=)15.5.1.1参数这个参数为读属性有证实服务请求传送参数值。13515.5.1.1.1对象标识符这个参数是BACnet对象标识符类型,提供标识一个对象的方法,这个对象的属性将要被本服务读出并且返回给客户端BACnet用户。15.5.1.1.2属性标识符这个参数是BACnet属性标识符类型,提供唯一标识被本服务读出并且返回的属性的方法。因为本服务用于读出单个对象的单个属性的值,所以,这个参数值不会是全部,必需的,可选的这样的属性标识符。15.5.1.1.3属性数组索引如果被按上述方法标识的属性是一个数据类型的数组,则可以使用这个可选的无符号整型参数,指明被本服务引用的属性的元素的数组索引。如果省略这个参数,表示整个数组都被引用。如果被按上述方法标识的属性不是一个数据类型的数组,则省略这个参数。15.5.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。一个成功的结果包含有下列参数:15.5.1.2.1对象标识符这个参数是BACnet对象标识符类型,标识一个对象,这个对象的属性已经被读出并且正在被返回给客户端BACnet用户。15.5.1.2.2属性标识符这个参数是BACnet属性标识符类型,标识那个已经被读出并且正在被本服务返回的属性。因为本服务用于读出单个对象的单个属性的值,所以,这个参数值不会是全部,必需的,可选的这样的属性标识符。15.5.1.2.3属性数组索引如果被按上述方法标识的属性是一个数据类型的数组,并且在请求中规定了一个‘属性数组索引’参数,则可以使用这个无符号整型参数,指明被本服务引用的属性的元素的数组索引。否则,省略这个参数。15.5.1.2.4属性值如果对特定对象的特定属性访问操作成功,则返回这个参数。这个参数的数据类型与访问的属性的数据类型一样,并且包含请求的属性的值。15.5.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。15.5.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。13615.5.2服务过程响应的BACnet用户检验了请求的合法性之后,开始执行对特定对象的特定属性的访问操作。如果访问成功,生成并且返回一个‘Result(+)’原语,其中包含有访问的值。如果访问失败,发送一个‘Result(-)’原语。15.6条件读属性(ReadPropertyConditional)服务一个客户端的BACnet用户使用条件读属性服务请求那些满足一个选择准则列表的所有BACnet对象的对象标识符和0个或者多个特定属性的值,这个选择准则列表也称之为“条件”。条件以布尔表达式的形式表示(Property.Relational_Operator.Constant)。另外,条件列表可以是逻辑‘或’或者逻辑‘与’,用来确定是否将某个对象包含进入其属性将被读的对象集合内。终极概率是所有的(ALL)对象都被选择,它们的某个属性值被读。本服务与读属性服务之间的差别是,在读属性服务中,客户端的BACnet用户明确标识了要读属性值的对象,而在本服务中,客户端的BACnet用户通过提供一个选择准则来标识要读属性值的对象。15.6.1结构表15-6表示条件读属性服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-6条件读属性服务原语结构参数名称ReqIndRspCnf参数(Argument)对象选择准则(ObjectSelectionCriteria)属性引用列表(ListofPropertyReferences)Result(+)读访问结果列表(ListofReadAccessResults)Result(-)错误类型(ErrorType)MMUM(=)M(=)U(=)SMSMS(=)M(=)S(=)M(=)15.6.1.1参数这个参数为条件读属性有证实服务请求传送参数值。15.6.1.1.1对象选择准则这个参数包括一个‘选择逻辑(SelectionLogic)’参数和一个或者多个根据条件而定的‘选择准则(SelectionCriteria)’列表。每个显式准则包含有四个参数,分别是:(1)一个‘属性标识符’,(2)一个可选的‘属性数组索引’,(3)一个‘关系说明符(RelationSpecifier)’,(4)一个适合指定属性的‘比较值(ComparisonValue)’。参见15.6.3.1节。15.6.1.1.2属性引用列表这个参数是是一个可选的参数,如果存在,则是一个或者多个BACnet属性引用类型的列表,每一个列表直137接对应一个特定的属性,这个属性是任何一个按照‘对象选择准则’选择的对象的属性。说明属性域为全部,指明返回选择的对象的所有属性,包括专有属性。说明属性域为必需的,指明返回特征为“R”或者“W”的属性。说明属性域为可选的,指明返回特征为“O”的属性。参见12节中关于某个对象类型的规范。如果这个参数不存在,则在‘Result(+)’原语的‘读访问结果列表’中没有返回的属性值,但是在‘对象标识符’参数中有对象标识符返回。15.6.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。一个成功的结果包含有下列参数:15.6.1.2.1读访问结果列表对于所有的按照‘对象选择准则’选择的对象的每一个指定的属性,这个参数指明读属性操作是否成功。每一个‘读访问结果’都提供‘对象标识符’,‘属性标识符’和条件的‘属性数组索引’,指明每一个读访问操作。如果读访问操作成功,则下一个参数就是指定的属性的值。如果读属性操作失败,则下一个参数是一个错误代码,表明访问失败的原因。如果按照‘对象选择准则’要求没有选中一个对象,则‘读访问结果列表’的长度为0。如果在请求中不存在‘属性引用列表’参数,则‘读访问结果列表’包含具有空属性值的‘读访问结果’列表,只传递与选择准则匹配的对象的标识符。15.6.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。15.6.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.6.2服务过程响应的BACnet用户检验了请求的合法性之后,就搜寻自己的对象数据库,选择满足特定选择准则的对象。对于每一个选中的对象,根据特定的‘属性引用列表’参数,构造一个‘读访问结果’。虽然没有要求请求要被自动执行,但是响应的BACnet用户应该保证,除了服从优先级准则之外,要在尽可能最短的时间内读出所有的属性值。请求被连续执行下去,直到所有的选择的对象的指定属性都被访问完成。如果没有搜寻到满足准则的对象,则返回一个‘Result(+)’原语,其中‘读访问结果列表’的长度为0。如果搜寻到一个或者多个满足准则的对象,则返回一个‘Result(+)’原语,其中在‘读访问结果列表’中传送所有的访问结果。15.6.3条件读属性服务引用的参数以下是在条件读属性服务原语中出现的参数:15.6.3.1对象选择准则参数表15-7表示‘对象选择准则’参数,表中所用的术语和符号在5.6节中给出了解释。表15-7‘对象选择准则’参数结构参数名称ReqIndRspCnf数据类型138选择逻辑(SelectionLogic)选择准则列表(ListofSelectionCriteria)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)关系说明符(RelationSpecifier)比较值(ComparisonValue)MCMCMMM(=)C(=)M(=)C(=)M(=)M(=)枚举类型BACnet属性标识符无符号整型枚举类型任何值15.6.3.1.1选择逻辑这个参数指明要返回其属性值的对象的范围,可以取三个值:AND,OR,ALL。对于在这个参数取AND或者OR的情况,参数表示将多个选择准则组合来确定选择要返回其属性值的对象的方法。如果这个参数值为AND,则对于选择的对象,必须所有的选择准则都得出TRUE才能选中。如果这个参数为OR,则对于选择的对象,必须至少有一个选择准则得出TRUE才能选中。如果这个参数为ALL,则包含在响应的BACnet用户的对象数据库中的所有对象都被选中,并且在请求原语中省略‘选择准则列表’。15.6.3.1.2选择准则列表如果这个参数存在,它包含一个或者多个属性关系列表,用于选择上述规定的特定对象。每个关系包含一个‘属性标识符’,一个条件的‘属性数组索引’,一个‘关系说明符’,和‘比较值’。当响应的BACnet用户进行评价时,每一组这样的参数一起组成一个布尔表达式,取值为TRUE或者FALSE。如果规定了多于一个的属性关系式,则所有评价的结果根据‘选择逻辑’参数组合起来,产生总的TRUE值或者FALSE值。如果总的评价值为TRUE,则响应的BACnet用户返回关于这个对象的由‘属性引用列表’参数指定的属性值。15.6.3.1.2.1属性标识符这个参数是BACnet属性标识符类型,标识在对象选择过程中要使用的属性。这个参数值可能不是特定属性标识符ALL,REQUIRED,或者OPTIONAL之一。15.6.3.1.2.2属性数组索引如果按照上述方法标识的属性是数据类型的数组,这个条件的无符号整型类型的存在,指明本服务引用属性的元素的数组索引。否则,省略这个参数。不允许0值的‘属性数组索引’的参数存在。15.6.3.1.2.3关系说明符这个参数代表下列的6个布尔操作符之一:=(相等)>(大于)≠(不等)≤(小于等于)<(小于)≥(大于等于)可以不对每个对象的每个属性都使用布尔操作符,有些属性值可能只允许进行等于(=)和不等于(≠)的比较。表15-8示出每一种数据类型可以运用的操作符。表15-8对于BACnet数据类型合法的布尔操作符139数据类型允许的操作符空(NULL)=≠布尔类型(BOOLEAN)=≠无符号整型(Unsigned)=≠<>≤≥整型(INTEGER)=≠<>≤≥实型(REAL)=≠<>≤≥比特流(BITSTRING)=≠BACnet对象标识符(BACnetObjectIdentifier)=≠<>≤≥字符串(CharacterString)=≠<>≤≥字节串(OCTETSTRING)=≠枚举类型(ENUMERATED)=≠日期类型(Date)=≠<>≤≥时间类型(Time)=≠<>≤≥其它类型(Others)=≠15.6.3.1.2.4比较值这个参数是一个具有与被比较的属性相同数据类型的常数。如果使用比较值选择字符串类型的属性,则可以使用通配符“?”和“”表示=或者≠操作符。“?”字符用来精确匹配字符串中某个位置上的字符。比较值可以包含多个“?”的发生。因此,“??1”可以匹配“AC1”,“CP1”和“SF1”,但是不能匹配“C1”,“P1”或者“PUMP1”。“”字符用来匹配从这个字符在字符串中的位置开始向右的0个或者多个字符。每个比较值只使用一个“”通配符。因此,“C1”匹配“C1”,“CP1”和“Chiller1”。当使用比较值选择对象标识符时,认为对象标识符是一个32位的无符号整型,其高位字节是对象标识符的第一个字节。当使用比较值选择字符串时,比较对大小写字母区分。当使用不等号(<,>,≤,≥=比较字符串时,其比较是根据字符的数字编码,从左向右进行。例如:“ABC”<“ABCD”<“DE”<“DEF”。当使用比较值选择字符串时,比较对大小写字母区分。当使用不等号(<,>,≤,≥=比较字符串时,其比较是根据字符的数字编码,从左向右进行。例如:“ABC”<“ABCD”<“DE”<“DEF”。当属性的类型是日期类型或者时间类型,并且进行不相等的比较时,比较按照日期顺序进行。例如:1-Jan-1991<2-Feb-1992,7:00:00.00<23:00:00.00对于日期或者时间类型中的子部分,例如年份,可以使用通配符表示这些部分具有“不规定”值的情况。对于具有“不规定”值的日期或者时间的子部分,在比较时,不对这个部分作比较运算,并且认为这些部分是相等的。存在三种情况,一种情况是在比较值中有具有“不规定”值的子部分,第二种情况是在属性值中有具有“不规定”值的子部分,第三种情况是在比较值和属性值中都有“不规定”值部分,在任何一种情况下,都要应用“不规定”值的匹配规则。例如(使用表示“不规定”值):比较值属性值原因-Sun=29-Jan-1995SunSun=Sun1401-Jan-<2-Feb-19951-Jan<2-Feb-Aug->10-Mar-1995Aug>Mar:59:00.00>6:23:99.059:00.00>23:99.006:..=6:25:00.006=6具有空、布尔、比特流、字节流、枚举类型的属性,或者任何具有复杂结构的原语类型的属性,只能够进行等于和不等于的比较运算。15.6.3.2读访问结果表15-9表示‘读访问结果’参数,表中所用的术语和符号在5.6节中给出了解释。表15-9‘读访问结果’参数结构参数名称ReqCnf数据类型对象标识符(ObjectIdentifier)结果列表(ListofResults)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)属性值(PropertyValue)属性访问错误(PropertyAccessError)MUMUSSM(=)U(=)M(=)U(=)S(=)S(=)BACnet对象标识符BACnet属性标识符无符号整型任何值错误类型15.6.3.2.1对象标识符这个参数是BACnet对象标识符类型,标识其属性要被返回给服务请求的对象。15.6.3.1.2结果列表读访问一个给定属性的结果,要么是这个属性值,要么是一个指明访问失败的错误代码。注意,如果在原始请求中没有给出对‘属性引用列表’参数的说明,则省略‘结果列表’参数。这个特性提供了一种方法,可以在不接收对象的任何属性值的情况下,获得满足‘对象选择最准则’的所有对象的标识符。15.6.3.2.2.1属性标识符这个参数是BACnet属性标识符类型,标识要返回其值的属性。15.6.3.2.2.2属性数组索引如果按照上述方法标识的属性是数据类型的数组,并且在请求中规定了‘属性数组索引’,则存在这个无符号整型类型的参数,它指明本服务引用属性的元素的数组索引。否则,省略这个参数。15.6.3.2.2.3属性值如果对选择的对象的某个属性的读访问成功,则返回这个参数,它的类型与指定的属性值的类型相同,并且包含请求的属性的值。15.6.3.2.2.4属性访问错误如果响应的BACnet用户不能访问特定对象的特定属性,则返回这个参数,其中包含一个指明访问失败原因的值。141这个参数包含两个部分:(1)一个‘错误类’,和(2)一个‘错误代码’。参见18节。注意,这个参数只是关于对特定对象的特定属性访问失败的问题,而在‘Result(-)’原语中返回的‘错误类型’参数,则是关于整个条件读属性服务请求的失败的问题。15.7读多个属性(ReadPropertyMultiple)服务一个客户端的BACnet用户使用读多个属性服务请求一个或者多个BACnet对象的一个或者多个特定属性的值。本服务允许对任何对象的任何属性进行访问,不论是否BACnet定义的对象。用户可以读单个对象的单个属性,单个对象的一个属性列表,或者,任意多个对象的任意多个属性。可以使用具有属性标识符全部的‘读访问规范’参数,了解一个对象的属性和它们的值得实现方式。15.7.1结构表15-10表示读多个属性服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-10读多个属性服务原语结构参数名称ReqIndRspCnf参数(Argument)读访问规范列表(ListofReadAccessSpecifications)Result(+)读访问结果列表(ListofReadAccessResults)Result(-)错误类型(ErrorType)MMM(=)M(=)SMSMS(=)M(=)S(=)M(=)15.7.1.1参数这个参数为读多个属性有证实服务请求传送参数值。15.7.1.1.1读访问规范列表这个参数包括一个或者多个‘读访问规范’的列表,每个规范包括两个参数:(1)一个‘对象标识符’,(2)一个‘属性引用列表’。参见15.7.3.1节。15.7.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。一个成功的结果包含有下列参数:15.7.1.2.1读访问结果列表这个参数指明对每个指定的属性的访问是否成功。在15.7.3.2节中定义每个读访问结果的内容。15.7.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。15.7.1.3.1错误类型142这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.7.2服务过程响应的BACnet用户检验了请求的合法性之后,开始进行访问特定对象的特点属性的操作,并且构造一个按照请求中规定的顺序的‘读访问结果列表’。如果‘读访问规范列表’参数中的‘属性引用列表’部分包含属性标识符全部、必需的、或者可选的,则按照每个被返回的属性已经被明确地引用的方法构造‘读访问结果列表’(参见15.7.3.1.2节)。虽然没有要求请求要被自动执行,但是响应的BACnet用户应该保证,除了服从优先级准则之外,要在尽可能最短的时间内读出所有的属性值。请求被连续执行下去,直到所有的选择的对象的指定属性都被访问完成。如果没有搜寻到满足准则的对象,或者如果指定对象的指定属性不能被访问,则发送一个‘Result(-)’原语。如果指定对象的指定属性中只要有一个能够被访问,则发送一个‘Result(+)’原语,其中,返回所有的访问值,以及对于不能访问的属性返回错误代码。15.7.3读多个属性服务引用的参数以下是在读多个属性服务原语中出现的参数:15.7.3.1读访问规范参数表15-11表示‘读访问规范’参数,表中所用的术语和符号在5.6节中给出了解释。表15-11‘读访问规范’参数结构参数名称ReqIndRspCnf数据类型对象标识符(ObjectIdentifier)属性引用列表(ListofPropertyReferences)MMM(=)M(=)BACnet对象标识符BACnet属性引用列表15.7.3.1.1对象标识符这个参数是BACnet对象标识符类型,提供一种方法,标识将要读出其属性值并且返回给服务请求的对象。15.7.3.1.2属性引用列表这个参数是一个或者多个BACnet属性引用类型的列表,每一个列表直接对应上述标识的对象的一个特定的属性。属性标识符ALL表示对象的所有定义的属性都可以被访问,包括专有属性。属性标识符REQUIRED表示只返回特征为“R”或者“W”的属性。属性表标识符OPTIONAL表示只返回特征为“O”的属性。参见12节中关于某个对象类型的规范。15.7.3.2读访问结果表15-12表示‘读访问结果’参数,表中所用的术语和符号在5.6节中给出了解释。表15-12‘读访问结果’参数结构参数名称ReqCnf数据类型143对象标识符(ObjectIdentifier)结果列表(ListofResults)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)属性值(PropertyValue)属性访问错误(PropertyAccessError)MMMUSSM(=)M(=)M(=)U(=)S(=)S(=)BACnet对象标识符BACnet属性标识符无符号整型任何值错误类型15.7.3.2.1对象标识符这个参数是BACnet对象标识符类型,标识其属性要被返回给服务请求的对象。15.7.3.1.2结果列表读访问一个给定属性的结果,要么是这个属性值,要么是一个指明访问失败的错误代码。‘结果列表’中的每个元素都包含有一个‘属性标识符’,一个条件的‘属性数组索引’,一个‘属性值’或者‘属性访问错误’参数。15.7.3.2.2.1属性标识符这个参数是BACnet属性标识符类型,标识要返回其值的属性。15.7.3.2.2.2属性数组索引如果按照上述方法标识的属性是数据类型的数组,并且在请求中规定了‘属性数组索引’,则存在这个无符号整型类型的参数,它指明本服务引用属性的元素的数组索引。否则,省略这个参数。15.7.3.2.2.3属性值如果对选择的对象的某个属性的读访问成功,则返回这个参数,它的类型与请求的属性值的类型相同,并且包含请求的属性的值。15.7.3.2.2.4属性访问错误如果响应的BACnet用户不能访问特定对象的特定属性,则返回这个参数,其中包含一个指明访问失败原因的值。这个参数包含两个部分:(1)一个‘错误类’,和(2)一个‘错误代码’。参见18节。注意,这个参数只是关于对特定对象的特定属性访问失败的问题,而在‘Result(-)’原语中返回的‘错误类型’参数,则是关于整个条件读属性服务请求的失败的问题。15.8写属性(WriteProperty)服务一个客户端的BACnet用户使用写属性服务修改一个BACnet对象的一个属性值。本服务本质上允许写访问任何一个对象的任何属性,不论对象是否BACnet的标准对象。然而,有些系统希望禁止对某些对象的某些属性的写访问,在这种情况下,任何对禁止的属性进行写操作都将导致返回一个‘错误类’为PROPERTY和‘错误代码’为WRITE_ACCESS_DENIED的错误值。注意,这些被禁止的属性可以通过使用虚拟终端(VirtualTerminal)服务或者其它的方法进行访问。14415.8.1结构表15-13表示写属性服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-13写属性服务原语结构参数名称ReqIndRspCnf参数(Argument)对象标识符(ObjectIdentifier)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)属性值(PropertyValue)优先级(Priority)Result(+)Result(-)错误类型(ErrorType)MMMUMCM(=)M(=)M(=)U(=)M(=)C(=)SSMS(=)S(=)M(=)15.8.1.1参数这个参数为写属性有证实服务请求传送参数值。15.8.1.1.1对象标识符这个参数是BACnet对象标识符类型,提供标识一个对象的方法,这个对象的属性将要被本服务修改。15.8.1.1.2属性标识符这个参数是BACnet属性标识符类型,提供唯一标识被本服务写入属性的方法。因为本服务用于写入单个对象的单个属性的值,所以,这个参数值不会是全部,必需的,可选的这样的属性标识符。15.8.1.1.3属性数组索引如果被按上述方法标识的属性是一个数据类型的数组,则可以使用这个可选的无符号整型参数,指明被本服务引用的属性的元素的数组索引。如果省略这个参数,表示整个数组都被引用。如果被按上述方法标识的属性不是一个数据类型的数组,则省略这个参数。15.8.1.1.4属性值如果对特定对象的特定属性的访问成功,则使用这个参数在访问时刻置换访问的属性值。这个参数的数据类型是任何对修改的属性有效的数据类型。15.8.1.1.5优先级这个参数是取值范围在1-16之间的整数,表示分配给这个写操作的优先级。如果向一个可命令的属性进行没有说明优先级的写操作,则缺省的优先级设定为16(最低的优先级)。如果向一个非可命令的属性进行规定优先级的写操作,则忽略优先级。参见第19节。15.8.1.2Result(+)参数‘Result(+)’指明服务请求已经完全成功。15.8.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。15.8.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。14515.8.2服务过程响应的BACnet用户检验了请求的合法性之后,使用‘属性值’参数提供的值执行对特定对象的特定属性的修改操作。如果修改操作成功,发送一个‘Result(+)’原语。如果修改操作失败,发送一个‘Result(-)’原语,指明失败的原因。在第19节中定义条件的优先级参数的意义。15.9写多个属性(WritePropertyMultiple)服务一个客户端的BACnet用户使用写多个属性服务修改一个或者多个BACnet对象的一个或者多个特定属性的值。本服务在本质上允许对任何对象的任何属性进行访问,不论是否BACnet定义的对象。本服务按照‘写访问规范列表’参数说规定的顺序对属性进行修改操作,这个操作连续执行,直到所有的指定属性都被写操作完成,或者直到遇到一个属性因为某种原因而不能按照请求的要求被修改为止。有些系统希望禁止对某些对象的某些属性的写访问,在这种情况下,任何对禁止的属性进行写操作都将导致返回一个‘错误类’为PROPERTY和‘错误代码’为WRITE_ACCESS_DENIED的错误值。注意,这些被禁止的属性可以通过使用虚拟终端服务或者其它的方法进行访问。15.9.1结构表15-14表示写多个属性服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表15-14写多个属性服务原语结构参数名称ReqIndRspCnf参数(Argument)写访问规范列表(ListofWriteAccessSpecifications)Result(+)Result(-)错误类型(ErrorType)第一个失败写操作(FirstFailedWriteAttempt)MMM(=)M(=)SSMMS(=)S(=)M(=)M(=)15.9.1.1参数这个参数为写多个属性有证实服务请求传送参数值。15.9.1.1.1写访问规范列表每个‘写访问规范’传送为了执行对一个BACnet对象的一个或者多个属性进行修改所需要的信息。这个规范包括5个参数:(1)一个‘对象标识符’;一个属性列表,其中每个属性包括(2)一个‘属性标识符’;(3)一个可选的‘属性数组索引’;(4)一个‘优先级值’;和(5)一个可选的‘优先级’。15.9.1.2Result(+)参数‘Result(+)’指明服务请求已经完全成功,所有指定的属性都被正确地修改。15.9.1.3Result(-)参数‘Result(-)’指明至少有一个指定的属性不能按照请求的要求被修改。失败的原因在‘错误类型’参数中说明,并且同时传送第一次遇到的不能被正确写入的属性的‘对象标识符’,‘属性标识符’,和‘属性146数组索引’。15.9.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。15.9.1.3.2第一个失败写操作这个参数是BACnet对象属性引用类型,传送在‘写访问规范列表’中的第一个写操作失败元素的‘对象标识符’,‘属性标识符’,和‘属性数组索引’。15.9.2服务过程响应的BACnet用户对于包含在‘写访问规范列表’中的每一个‘写访问规范’,检验指定的对象是否在本地设备中存在、引用的属性是否是可修改的、以及每个指定的属性值是否具有正确的数据类型和处于有效的范围。如果检验都正确,使用‘写访问规范’中提供的属性值置换指定的属性值,并且发送一个‘Result(+)’原语,指明服务请求已经正确执行完毕。第19节中给出了条件的优先级参数的意义。如果在按照‘写访问规范列表’规定的顺序进行对指定的属性修改操作时,遇到了一个不能进行修改的属性,则发送一个‘Result(-)’响应原语,指明失败的原因。这个服务的结果,要么是所有的属性都被正确修改,要么是只对‘第一个失败写操作’参数中指明的属性之前的属性(不包括这个属性)进行了成功修改。15.9.3写多个属性服务引用的参数表15-15表示‘写访问规范’参数,表中所用的术语和符号在5.6节中给出了解释。表15-15‘写访问规范’参数结构参数名称ReqIndRspCnf数据类型对象标识符(ObjectIdentifier)结果列表(ListofResults)属性标识符(PropertyIdentifier)属性数组索引(PropertyArrayIndex)属性值(PropertyValue)优先级(Priority)MMMUMCM(=)M(=)M(=)U(=)M(=)C(=)BACnet对象标识符BACnet属性标识符无符号整型任何值无符号整型(1…16)15.9.3.1对象标识符这个参数是BACnet对象标识符类型,标识其属性要被修改的对象。15.9.3.2属性列表这个参数表示一个或者多个列表,其中内容是上述标识符标识的对象的属性、写入到每个属性的值、和写操作所分配的优先级。列表中的每个元素规范下列参数。15.9.3.2.1属性标识符这个参数是BACnet属性标识符类型,提供唯一标识本服务要写入的属性的方法。这个参数值不会是特定属性标识符全部,必需的,和可选的中的一种。15.9.3.2.2属性数组索引如果按照上述方法标识的属性是数据类型的数组,则这个可选的无符号整型类型的参数指明本服务引用属性的元素的数组索引。如果对于某个数组省略了这个参数,表示整个数组都被引用。15.9.3.2.3属性值147如果对选择的对象的某个属性的读访问成功,则在访问的时刻,使用这个参数置换访问的属性值。这个参数的数据类型是一个与被修改属性相一致的数据类型。15.9.3.2.4优先级这个参数是取值范围在1-16之间的整数,表示分配给这个写操作的优先级。如果向一个可命令的属性进行没有说明优先级的写操作,则缺省的优先级设定为16(最低的优先级)。如果向一个非可命令的属性进行规定优先级的写操作,则忽略优先级。参见第19节。16.远程设备管理服务16.1设备通信控制(DeviceCommunicationControl)服务一个客户端的BACnet用户使用设备通信控制服务向一个远程设备发送指令,指示这个设备在一个规定的时间内停止起始和响应除了设备通信控制或者重新初始化设备(ReinitializeDevice)之外的所有的APDU。本服务主要由操作者用来进行设备诊断。在客户端可以要求使用密码,时间期限可以设定为“不确定”,表示必须使用设备通信控制服务或者重新初始化设备服务重新使能设备的通信。16.1.1结构表16-1表示设备通信控制服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-1设备通信控制服务原语结构参数名称ReqIndRspCnf参数(Argument)时间期限(TimeDuration)使能/禁止(Enable/Disable)密码(Password)Result(+)Result(-)错误类型(ErrorType)MUMUM(=)U(=)M(=)U(=)SSMS(=)S(=)M(=)16.1.1.1参数这个参数为设备通信控制有证实服务请求传送参数值。16.1.1.1.1时间期限这个可选的参数是16位无符号整型类型,表示为一个时间分钟的数值,说明要求远程设备忽略除了设备通信控制服务APUD和重新初始化设备服务APDU之外的所有APDU的时间期间。如果本参数不存在,则认为时间期限是不确定的,意味着只有一个明确的设备通信控制服务APDU或者重新初始化设备服务APDU可以重新使能设备的通信。如果‘使能/禁止’参数具有ENABLE值,则忽略‘时间期限’参数,并且认为期间期限是不确定的。16.1.1.1.2使能/禁止这个参数是枚举类型,取值为ENABLE或者DISABLE。这个参数用来表示响应的BACnet用户是使能还是禁止网络接口的通信。如果这个参数值是ENABLE,则通信将被使能。如果这个参数值是DISABLE,则通信将被禁止。当网络通信被禁止时,设备只能处理设备通信控制服务和重新初始化设备服务APDU,而不会起始任何报文。14816.1.1.1.3密码这个可选的参数是一个不超过20个字符的字符串。对于那些要求进行密码检验的设备,如果没有密码或者密码不正确,则不能执行本服务。对于那些不要求密码的设备,忽略这个参数。16.1.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。16.1.1.3Result(-)参数‘Result(-)’指明服务请求失败。失败的原因在‘错误类型’参数中说明。16.1.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。16.1.2服务过程响应的BACnet用户检验了包括密码在内的请求的合法性之后,响应一个‘Result(+)’服务原语,如果‘使能/禁止’参数是DISABLE,停止对除了设备通信控制报文和重新初始化设备报文之外的任何报文的响应,也停止起始报文。通信被禁止的状态一直延续到下列两种情况之一发生时为止:‘时间期限’参数值规定的时间到期,或者收到一个具有‘使能/禁止’=ENABLE的设备通信控制报文,或者一个重新初始化设备报文。如果响应的BACnet用户没有时钟并且‘时间期限’参数没有设置为“不确定”,则忽略这个APDU,并且发送一个‘Result(-)’服务原语。如果要求使用密码,但是密码不合法,或者密码不存在,则忽略这个APDU,并且发送一个‘Result(-)’响应原语。16.2有证实专有传输(ConfirmedPrivateTransfer)服务一个客户端的BACnet用户使用有证实专有传输服务调用远程设备中的专有的或者非标准的服务。本标准不定义给定设备可能提供的专有服务,专有传输服务提供一种机制,使用标准化的方法说明某个专有服务。对于这些服务唯一要求的参数是生产商的标识代码和一个服务标号。如果需要,每种服务都可以增加参数,本标准不定义增加的参数的形式和内容。生产商的标识代码和服务标号一起可以明确地标识后续的APDU要求传送信息的目标,或者标识远程设备基于后续APDU中参数所完成的服务。生产商的标识代码是由ASHRAE分配给生产商的唯一代码。对于这个代码的管理机制不在本标准中定义。参见第23节。16.2.1有证实专有传输服务结构表16-2表示有证实专有传输服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-2有证实专有传输服务原语结构参数名称ReqIndRspCnf参数(Argument)生产商ID(VendorID)服务标号(ServiceNumber)服务参数(Parameters)Result(+)MMMUM(=)M(=)M(=)U(=)SS(=)149生产商ID(VendorID)服务标号(ServiceNumber)附加结果(ResultBlock)Result(-)错误类型(ErrorType)生产商ID(VendorID)服务标号(ServiceNumber)错误参数(ErrorParameters)MMCSMMMMM(=)M(=)C(=)S(=)M(=)M(=)M(=)M(=)16.2.1.1参数这个参数为有证实专有传输有证实服务请求传送参数值。16.2.1.1.1生产商ID这个参数是无符号整型类型,表示一个唯一的生产商标识代码,这个代码是要执行的生产商专有服务的类型所需要的。16.2.1.1.2服务标号这个参数是无符号整型类型,表示要执行的服务。16.2.1.1.3服务参数这个可选的参数传送附加的参数,这些参数是由‘生产商ID’和‘服务标号’指定的服务所需要的。这些参数的数据类型和意义由生产商自行确定。16.2.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。一个成功的结果指明请求的APDU已经收到,并且能够执行指定的专有服务。16.2.1.2.1生产商ID这个参数是无符号整型类型,表示一个唯一的生产商标识代码,这个代码是为得出这个结果的生产商专有服务所设定的。16.2.1.1.2服务标号这个参数是无符号整型类型,表示得出这个结果的专有服务。16.2.1.2.3附加结果这个条件的参数是一个任何类型的列表,传送执行请求的服务得到的附加的结果。这些结果的意义由生产商自行确定。16.2.1.3Result(-)参数‘Result(-)’指明服务请求失败。失败的原因在‘错误类型’参数中说明。16.2.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。16.2.1.3.2生产商ID这个参数是无符号整型类型,表示一个唯一的生产商标识代码,这个代码是为得出这个错误结果的生产商专有服务所设定的。16.2.1.3.3服务标号这个参数是无符号整型类型,表示得出这个错误结果的专有服务。15016.2.1.3.4错误参数这个可选的参数传送执行请求的服务得到的附加的错误结果。这些结果的意义由生产商自行确定。16.2.2服务过程响应的BACnet用户检验了请求的合法性之后,进行执行指定的专有服务请求的操作。如果操作成功,发送一个‘Result(+)’响应原语。如果请求失败,发送一个‘Result(-)’响应原语。16.3无证实专有传输(UnconfirmedPrivateTransfer)服务一个客户端的BACnet用户使用无证实专有传输服务调用远程设备中的专有的或者非标准的服务。本标准不定义给定设备可能提供的专有服务,专有传输服务提供一种机制,使用标准化的方法说明某个专有服务。对于这些服务唯一要求的参数是生产商的标识代码和一个服务标号。如果需要,每种服务都可以增加参数,本标准不定义增加的参数的形式和内容。生产商的标识代码和服务标号一起可以明确地标识后续的APDU要求传送信息的目标,或者标识远程设备基于后续APDU中参数所完成的服务。生产商的标识代码是由ASHRAE分配给生产商的唯一代码。对于这个代码的管理机制不在本标准中定义。参见第23节。16.3.1无证实专有传输服务结构表16-3表示无证实专有传输服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-3无证实专有传输服务原语结构参数名称ReqInd参数(Argument)生产商ID(VendorID)服务标号(ServiceNumber)服务参数(Parameters)MMMUM(=)M(=)M(=)U(=)16.3.1.1参数这个参数为无证实专有传输服务请求传送参数值。16.3.1.1.1生产商ID这个参数是无符号整型类型,表示一个唯一的生产商标识代码,这个代码是要执行的生产商专有服务的类型所需要的。16.3.1.1.2服务标号这个参数是无符号整型类型,表示要执行的服务。16.3.1.1.3服务参数这个可选的参数传送附加的参数,这些参数是由‘生产商ID’和‘服务标号’指定的服务所需要的。这些参数的数据类型和意义由生产商自行确定。16.3.2服务过程因为这是一个无确认的服务,所以没有响应原语。生产商自行确定如何对这个服务请求进行响应。16.4重新初始化设备(ReinitializeDevice)服务151一个客户端的BACnet用户使用重新初始化设备服务向一个远程设备发送指令,指示这个设备重新冷启动,或者重新热启动到某个预设的初始状态。本服务主要由操作者用来进行设备诊断。因为这个服务的性质,可以要求在响应的BACnet用户执行这个服务之前,输入密码。16.4.1结构表16-4表示重新初始化设备服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-4重新初始化设备服务原语结构参数名称ReqIndRspCnf参数(Argument)设备重新初始化的状态(ReinitializedStateofDevice)密码(Password)Result(+)Result(-)错误类型(ErrorType)MMUM(=)M(=)U(=)SSMS(=)S(=)M(=)16.4.1.1参数这个参数为重新初始化设备有证实服务请求传送参数值。16.4.1.1.1设备重新初始化的状态这个参数允许客户端用户指定设备在重新初始化之后所希望的状态。这个参数的值是下列二者之一:冷启动(COLDSTART)或者热启动(WARMSTART)。热启动是指重启动设备并开始工作之后,所有数据和程序正常保留。冷启动的准确意义由生产商自行定义。16.4.1.1.2密码这个可选的参数是一个不超过20个字符的字符串。对于那些要求进行密码检验的设备,如果没有密码或者密码不正确,则不能执行本服务。对于那些不要求密码的设备,忽略这个参数。16.4.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。16.4.1.3Result(-)参数‘Result(-)’指明服务请求失败。失败的原因在‘错误类型’参数中说明。16.4.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。16.4.2服务过程响应的BACnet用户检验了包括密码在内的请求的合法性之后,占先在所有的未完成请求之前,响应一个‘Result(+)’服务原语,并且立即执行停止系统运行的应用程序,然后按照在请求中由请求的BACnet用户所规定的方式重新初始化设备。如果服务请求要求热启动,而设备由于自己的初始特征记录正在进行中而没有准备好进行热启动,则发送一个‘Result(-)’服务原语。如果要求使用密码,但是密码不合法,或者密码不存在,则发送一个‘Result(-)’响应原语。15216.5有证实文本报文(ConfirmedTextMessage)服务一个客户端的BACnet用户使用有证实文本报文服务向另一个BACnet设备发送一个文本报文。这个服务不是一个广播服务或者多播服务。这个服务用于收到的文本报文要求有证实的情况。这个证实并不保证操作者已经看到了这个报文。报文可以被分为正常报文和紧急报文,从而可以确定优先级。另外,可以可选的为文本报文划分数字类别代码或者类别标识串。这个分类可以被接收的BACnet设备用来确定如何处理文本报文。例如,报文类可以指定某个输出设备打印文本,或者指定接收文本之后的一组操作。如何进行分类由生产商自行确定。16.5.1有证实文本报文服务结构表16-5表示有证实文本报文服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-5有证实文本报文服务原语结构参数名称ReqIndRspCnf参数(Argument)文本报文源设备(TextMessageSourceDevice)报文类(MessageClass)报文优先级(MessagePriority)报文(Message)Result(+)Result(-)错误类型(ErrorType)MMUMMM(=)M(=)U(=)M(=)M(=)SSMS(=)S(=)M(=)16.5.1.1参数这个参数为有证实文本报文服务请求传送参数值。16.5.1.1.1文本报文源设备这个参数是BACnet对象标识符类型,传送起始这个文本报文的设备的设备对象的对象标识符属性值。16.5.1.1.2报文类如果这个参数存在,它表示接收的报文的类别。这个参数的数据类型可以选择为是无符号整型或者字符串。关于这个参数选用的数值以及它的意义,由生产商自行确定。16.5.1.1.3报文优先级这个参数是枚举类型,指明关于报文处理的优先级:{正常(NORMAL),紧急(URGENT)}。16.5.1.1.4报文这个参数是字符串类型,用于传送文本报文。16.5.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。16.5.1.3Result(-)参数‘Result(-)’指明服务请求失败。失败的原因在‘错误类型’参数中说明。16.5.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。16.5.2服务过程153响应的BACnet用户检验了请求的合法性之后,进行本地分派给指定的‘报文类’的报文处理操作,并且发送一个‘Result(+)’服务原语。如果服务请求不能被执行,则发送一个‘Result(-)’服务请求,指明遇到的错误。除了要求进行关于成功或者失败的响应之外,采用什么样的操作来响应这个通知由生产商自行确定。然而,通常,接收报文的设备要取出‘报文’参数中的文本,并且显示、打印、或者根据‘报文类’参数指定的类别归档。如果‘报文类’参数被省略,则可以假设报文为普通类别。如果‘报文优先级’是紧急,则认为这个报文比已有的正在等待处理的正常报文要重要。16.6无证实文本报文(UnconfirmedTextMessage)服务一个客户端的BACnet用户使用无证实文本报文服务向一个或者多个BACnet设备发送一个文本报文。这个服务可以是广播服务和多播服务,也可以只用来向单个接收者发送报文。这个服务用于收到的文本报文不要求确认的情况。报文可以被分为正常报文和紧急报文,从而可以确定优先级。另外,可以可选的为文本报文划分数字类别代码或者类别标识串。这个分类可以被接收的BACnet设备用来确定如何处理文本报文。例如,报文类可以指定某个输出设备打印文本,或者指定接收文本之后的一组操作。如何进行分类由生产商自行确定。16.6.1无证实文本报文服务结构表16-6表示无证实文本报文服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-6无证实文本报文服务原语结构参数名称ReqInd参数(Argument)文本报文源设备(TextMessageSourceDevice)报文类(MessageClass)报文优先级(MessagePriority)报文(Message)MMUMMM(=)M(=)U(=)M(=)M(=)16.6.1.1参数这个参数为无证实文本报文服务请求传送参数值。16.6.1.1.1文本报文源设备这个参数是BACnet对象标识符类型,传送起始这个文本报文的设备的设备对象的对象标识符属性值。16.6.1.1.2报文类如果这个参数存在,它表示接收的报文的类别。这个参数的数据类型可以选择为是无符号整型或者字符串。关于这个参数选用的数值以及它的意义,由生产商自行确定。16.6.1.1.3报文优先级这个参数是枚举类型,指明关于报文处理的优先级:{正常,紧急}。16.6.1.1.4报文这个参数是字符串类型,用于传送文本报文。16.6.2服务过程154因为这是一个无证实的服务,没有响应原语。采用什么样的操作来响应这个通知由生产商自行确定。然而,通常,接收报文的设备要取出‘报文’参数中的文本,并且显示、打印、或者根据‘报文类’参数指定的类别归档。如果‘报文类’参数被省略,则可以假设报文为普通类别。如果‘报文优先级’是紧急,则认为这个报文比已有的正在等待处理的正常报文要重要。16.7时间同步(TimeSynchronization)服务一个请求的BACnet用户使用时间同步服务向一个远程BACnet设备通告正确的当前时间。这个服务可以是广播服务和多播服务,也可以只用来向单个接收者发送通告。这个服务的目的是向接收者通告正确的当前时间,因此,设备可以将自己的内部时钟与其它设备同步。16.7.1时间同步服务结构表16-7表示时间同步服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-7时间同步服务原语结构参数名称ReqInd参数(Argument)时间(Time)MMM(=)M(=)16.7.1.1参数这个参数为时间同步服务请求传送参数值。16.7.1.1.1时间这个参数是BACnet日期时间类型,传送在发送这个服务请求设备中的时钟的当前日期和时间。16.7.2服务过程因为这是一个无证实的服务,没有响应原语。收到时间同步服务指示的设备更新本地的时间表达式,并且在设备对象的本地时间属性和本地日期属性中反映出更新改变。当操作者在请求中调用这个服务完成时间同步的功能时,不存在使用上的任何限制。但是在其它的情况下,这个服务的使用受设备对象中时间同步接收者属性值的控制。如果时间同步接收者列表长度为0,则设备不能自动发送时间同步请求。如果时间同步接收者列表长度为1或者多个,设备可以自动发送时间同步请求,但是只发送给时间同步接收者列表中已有的设备。16.8Who-Has和I-Have服务一个发送的BACnet用户使用Who-Has服务确定一些其它BACnet设备的设备对象标识符和网络地址,这些设备的本地数据库中包含有具有给定的对象名称属性或者给定的对象标识符属性的对象。设备使用I-Hava服务响应Who-Has服务请求,或者通告自己有一个具有给定的对象名称属性或者对象标识符属性的对象。可以在任何时候发送I-Hava服务请求,并不要求一定要在接收到Who-Has服务请求之后才能够使用。Who-Has服务和I-Hava服务是无证实的服务。16.8.1Who-Has服务结构表16-8表示Who-Has服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。155表16-8Who-Has服务原语结构参数名称ReqInd参数(Argument)设备实例低阈值范围(DeviceInstanceRangeLowLimit)设备实例高阈值范围(DeviceInstanceRangeHighLimit)对象标识符(ObjectIdentifier)对象名称(ObjectName)MUUSSM(=)U(=)U(=)S(=)S(=)16.8.1.1参数这个参数为Who-Has无证实服务请求传送参数值。16.8.1.1.1设备实例低阈值范围这个参数是无符号整型类型,取值范围是0-4,194,303。这个参数与‘设备实例高阈值范围’参数一起定义有资格使用I-Hava服务响应本服务的设备,这些设备还满足16.8.1.3节和16.8.1.4节规定的‘对象标识符’准则或者‘对象名称’准则。如果‘设备实例低阈值范围’参数存在,则‘设备实例高阈值范围’参数也必须存在。只有那些设备对象标识符属性值实例在范围(‘设备实例低阈值范围’≤对象标识符属性值实例≤‘设备实例高阈值范围’)之内的设备有资格进行响应。‘设备实例低阈值范围’参数值小于等于‘设备实例高阈值范围’参数值。如果省略‘设备实例低阈值范围’和‘设备实例高阈值范围’参数,则所有接收到这个报文的设备都有资格使用I-Hava服务进行响应。16.8.1.1.2设备实例高阈值范围这个参数是无符号整型类型,取值范围是0-4,194,303。这个参数与‘设备实例低阈值范围’参数一起定义有资格使用I-Hava服务响应本服务的设备,这些设备还满足16.8.1.3节和16.8.1.4节规定的‘对象标识符’准则或者‘对象名称’准则。如果‘设备实例高阈值范围’参数存在,则‘设备实例低阈值范围’参数也必须存在。只有那些设备对象标识符属性值实例在范围(‘设备实例低阈值范围’≤对象标识符属性值实例≤‘设备实例高阈值范围’)之内的设备有资格进行响应。‘设备实例高阈值范围’参数值大于等于‘设备实例低阈值范围’参数值。如果省略‘设备实例低阈值范围’和‘设备实例高阈值范围’参数,则所有接收到这个报文的设备都有资格使用I-Hava服务进行响应。16.8.1.1.3对象标识符这个参数是BACnet对象标识符类型,传送本服务正在定位的对象的对象标识符属性值。如果省略这个参数,则必须存在‘对象名称’参数。如果这个参数存在,则只有那些包含有其对象标识符属性值与这个参数值匹配的对象的设备,同时又满足16.8.1.1节和16.8.1.2节规定的资格要求,可以使用I-Hava服务进行响应。16.8.1.1.4对象名称这个参数是字符串类型,传送本服务正在定位的对象的对象名称属性值。如果省略这个参数,则必须存在‘对象标识符’参数。如果这个参数存在,则只有那些包含有其对象名称属性值与这个参数值匹配的对象的设备,同时又满足16.8.1.1节和16.8.1.2节规定的资格要求,可以使用I-Hava服务进行响应。16.8.2Who-Has服务过程发送方BACnet用户通常使用广播地址发送Who-Has服务请求。如果‘设备实例低阈值范围’和‘设备实例高阈值范围’参数存在,则那些接收到这个报文的BACnet用户设备中,设备的对象标识符属性值实例在范围(‘设备实例低阈值范围’≤对象标识符属性值实例≤‘设备实例高阈值范围’)之内的,有资格进行响应。如果‘对象名称’参数存在,则只有那些有资格的设备,同时又包含有其对象名称属性值与‘对象名称’参数156值匹配的对象的设备,使用I-Hava服务请求进行响应。如果‘对象标识符’参数存在,则只有那些有资格的设备,同时又包含有其对象标识符属性值与‘对象标识符’参数值匹配的对象的设备,使用I-Hava服务请求进行响应。16.8.3I-Have服务结构表16-9表示I-Have服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-9I-Have服务原语结构参数名称ReqInd参数(Argument)设备标识符(DeviceIdentifier)对象标识符(ObjectIdentifier)对象名称(ObjectName)MMMMM(=)M(=)M(=)M(=)16.8.3.1参数这个参数为I-Have无证实服务请求传送参数值。16.8.3.1.1设备标识符这个参数是BACnet对象标识符类型,是起始I-Have服务请求的设备的设备对象标识符。16.8.3.1.2对象标识符这个参数是BACnet对象标识符类型,传送在起始设备中作为定位而通告的对象的对象标识符。这个标识符对应被通告对象的对象标识符属性值。16.8.3.1.3对象名称这个参数是字符串类型,传送在起始设备中作为定位而通告的对象的对象名称。这个标识符对应被通告对象的对象名称属性值。16.8.4I-Have服务过程发送方BACnet用户广播I-Have服务请求。根据应用的需要,这个广播可以是在本地网络范围内的广播,也可以是在一个远程网络范围内的广播,或者是在所有网络中的全局广播。如果正在被发送的I-Have服务请求是对前面接收到的一个Who-Has服务的响应,则要按照发送Who-Has服务的BACnet用户应该接收到的I-Have服务结果的方式发送这个I-Have服务请求。因为这个请求是无证实的,所以不要求进一步的操作。一个BACnet用户可以在任何时候发送一个I-Have服务请求。16.9Who-Is和I-Am服务一个发送方BACnet用户使用Who-Is服务确定在同一个互联网上的其它BACnet设备的设备对象标识符和网络地址,Who-Is服务是一个无证实服务,这个服务可以用于下列两种情况:(1)确定在网络上的所有设备的设这对象标识符和网络地址,或者(2)确定某个已知其设备对象标识符但是不知其网络地址的设备的网络地址。I-Am服务也是一个无证实的服务,这个服务用于响应Who-Is服务请求。I-Am服务也可以在任何时候被发送,并不一定要求只有接收到Who-Is服务请求之后才能够发送I-Am服务请求。特别是,当一个设备刚启动之后,可能需要广播一个I-Am服务请求。如果发送I-Am服务请求的设备与接收这个报文的设备处于同一个本地网络,则可以从I-Am服务请求报文中的MAC地址推导出发送设备的网络地址。如果发送设备位于一个远程网络,则可以从报文的NPCI域中推导出设备的网络地址。15716.9.1Who-Is服务结构表16-10表示Who-Is服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-10Who-Is服务原语结构参数名称ReqInd参数(Argument)设备实例低阈值范围(DeviceInstanceRangeLowLimit)设备实例高阈值范围(DeviceInstanceRangeHighLimit)MUUM(=)U(=)U(=)16.9.1.1参数这个参数为Who-Is无证实服务请求传送参数值。16.9.1.1.1设备实例低阈值范围这个参数是无符号整型类型,取值范围是0-4,194,303。这个参数与‘设备实例高阈值范围’参数一起定义有资格使用I-Am服务响应本服务的设备。如果‘设备实例低阈值范围’参数存在,则‘设备实例高阈值范围’参数也必须存在。只有那些设备对象标识符属性值实例在范围(‘设备实例低阈值范围’≤对象标识符属性值实例≤‘设备实例高阈值范围’)之内的设备有资格进行响应。‘设备实例低阈值范围’参数值小于等于‘设备实例高阈值范围’参数值。如果省略‘设备实例低阈值范围’和‘设备实例高阈值范围’参数,则所有接收到这个报文的设备都有资格使用I-Am服务进行响应。16.9.1.1.2设备实例高阈值范围这个参数是无符号整型类型,取值范围是0-4,194,303。这个参数与‘设备实例低阈值范围’参数一起定义有资格使用I-Am服务响应本服务的设备。如果‘设备实例高阈值范围’参数存在,则‘设备实例低阈值范围’参数也必须存在。只有那些设备对象标识符属性值实例在范围(‘设备实例低阈值范围’≤对象标识符属性值实例≤‘设备实例高阈值范围’)之内的设备有资格进行响应。‘设备实例高阈值范围’参数值大于等于‘设备实例低阈值范围’参数值。如果省略‘设备实例低阈值范围’和‘设备实例高阈值范围’参数,则所有接收到这个报文的设备都有资格使用I-Am服务进行响应。16.9.2Who-Is服务过程发送方BACnet用户通常使用广播地址发送Who-Is服务请求。如果省略了‘设备实例低阈值范围’和‘设备实例高阈值范围’参数,则所有这个报文的BACnet用户设备都使用I-Am服务单独响应自己的设备对象标识符。如果‘设备实例低阈值范围’和‘设备实例高阈值范围’参数存在,则那些接收到这个报文的BACnet用户设备中,设备的对象标识符属性值实例在范围(‘设备实例低阈值范围’≤对象标识符属性值实例≤‘设备实例高阈值范围’)之内的设备,使用I-Am服务请求响应它们的设备对象标识符。16.9.3I-Am服务结构表16-11表示I-Am服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表16-11I-Am服务原语结构参数名称ReqInd参数(Argument)I-Am设备标识符(I-AmDeviceIdentifier)最大APDU长度支持(MaxAPDULengthAccepted)分段支持(SegmentationSupported)生产商标识符(VendorIdentifier)MMMMMM(=)M(=)M(=)M(=)M(=)15816.9.3.1参数这个参数为I-Am无证实服务请求传送参数值。16.9.3.1.1I-Am设备标识符这个参数是BACnet对象标识符类型,是起始I-Am服务请求的设备的设备对象标识符。16.9.3.1.2最大APDU长度支持这个参数是无符号整型类型,传送可以包含在一个单独的、不可分割的APDU中的最大的字节数量。这个参数值应该与设备对象的最大APDU长度支持属性值相同。参见12.9.17节。16.9.3.1.3分段支持这个参数是BACnet分段类型,传送起始I-Am服务请求的设备处理分段报文的能力。这个参数值应该与设备对象的分段支持属性值相同。参见12.9.18节。16.9.3.1.4生产商标识符这个参数是16位无符号整型类型,传送起始I-Am服务请求的设备的生产商的标识符。这个参数值应该与设备对象的生产商标识符属性值相同。参见12.9.6节和23节。16.9.4I-Am服务过程发送方BACnet用户广播I-Am服务请求。根据应用的需要,这个广播可以是在本地网络范围内的广播,也可以是在一个远程网络范围内的广播,或者是在所有网络中的全局广播。如果正在被广播的I-Am服务请求是对前面接收到的一个Who-Is服务的响应,则要按照发送Who-Is服务的BACnet用户应该接收到的I-Am服务结果的方式发送这个I-Am服务请求。因为这个请求是无证实的,所以不要求进一步的操作。一个BACnet用户可以在任何时候发送一个I-Am服务请求。17.虚拟终端服务一个客户端BACnet用户使用虚拟终端(以下将虚拟终端简称为VT--译者注)服务建立一个与另一个BACnet设备上的应用程序服务器的连接。建立这个连接的目的是为了实现数据的面向字符双工交换。VT服务通常被用来使一个BACnet设备上的应用程序作为一个“终端模拟器”,与另一个BACnet设备上的“操作员接口”应用程序交互。这种类型的连接称之为VT会话(VT-session)。一旦建立了一个VT会话,客户端应用程序和服务器端应用程序都称之为VT用户(VT-user)。VT会话向VT用户提供下面一些特征和服务:(a)提供在两个对等VT用户之间建立能够进行虚拟终端信息交换的VT会话的手段;(b)提供在不同的VT类型之间进行选择的方法,包括对字符清单和编码的选择;(c)提供控制通信完整性的方法;(d)提供单方终止VT会话的方法;(e)提供交换虚拟终端数据的方法。17.1虚拟终端模型(VirtualTerminalModel)每个VT会话都是建立在两个对等应用进程之间的双工连接。一旦在两个对等实体之间建立了一个会话,就可以通过使用虚拟终端队列(VirtualTerminalQueues,VTQ)进行数据交换。VTQ是先进先出(FIFO)队列。两对等进程之间的数据流采用先进先出队列模型的目的,是为了使VT会话的任意一方上的应用进程的实现独立159CRT终端显示“输出队列”操作员接口应用“输出”CRT终端键盘“输入队列”操作员接口应用“输入”图17-1操作员接口程序和物理设备之间关系图17-2延伸VT模型以容纳队列应用程序VT用户VT服务提供者VT用户应用程序图17-3VT数据流于另一方。通常,使用BACnet设备的操作者请求操作员接口应用程序建立一个与另一个BACnet设备上的操作员接口应用程序之间的VT会话。VTQ模型使用两个先进先出队列,以使操作员接口,或者其它能提供双工数据交换的应用程序,通过BACnet协议进行工作。图17-1表示一个操作员接口应用程序与一个诸如CRT终端的物理设备之间的典型关系。图17-2表示这种模型是如何延伸使用VT队列概念的。VT会话每一端上的对等进程可以不是诸如CRT终端这样的物理设备的实际代理。VTQ允许在每个BACnet设备中以灵活的方式实现。实际上,在每一个BACnet设备内可以有几个不同的进程,这些进程协调它们对VT服务的使用。例如,在多窗口操作员接口程序中,可以有几个窗口,每个窗口都和其它某个BACnet设备进行VT会话。所以,每个VT会话都是建立在两个唯一的进程之间的,而不是建立在两个BACnet设备之间。每一个会话由两个进程组成,这两个进程作为它们各自应用程序和各自VTQ的代理。这些代理进程和它们的VTQ一起称之为VT用户。图17-3表示这个数据流的模型。一旦建立了VT会话,两个对等进程就可以通过各自的VTQ进行字符数据交换。通常,操作员所键入的字符将直接传送到输入队列,这个输入队列继续把字符传输到对等进程的输入队列。在这个过程中与操作员连接的本地设备不产生任何回送信号。对等应用程序在收到来自于它自己的输入队列的字符后,把字符放入它的输出队列,这样,字符可以发回到操作员设备的输出队列中,如此继续。特别地,本地操作员接口应用程序将负责产生全“屏幕”输出,包括回车控制和适当的字符回送。虽然VT服务模型提供了一种如17-3图所示的对等体之间的连接,但一般来说,操作员总是使用一个BACnet设备建立与第二个BACnet设备之间的虚拟终端连接。第二个BACnet设备包含一个“操作员接口”应用160程序,操作员的按键无过滤地送到这个程序。操作员接口应用程序的输出,通过VT服务被传输,最后显示给操作员。通常,与操作员真正相连的BACnet设备可以识别一些本地的“结束VT会话”的信息,但是除此之外,不会过滤按键操作结果。17.1.1基本服务有三种基本服务:VT开启(VT-Open)、VT关闭(VT-Close)、VT数据(VT-Data)。VT开启服务用于在两个对等进程之间建立一个VT会话。VT关闭服务用来释放已建立的VT会话。VT数据服务用于在两个对等进程之间进行数据交换。17.1.2VT类型通过检测对等BACnet设备对象,可以确定一个对等VT服务中VT的类型。BACnet设备对象有一个虚拟终端类型支持属性,使用读属性服务、读多个属性服务,或者条件读属性服务可以读取这个属性值,从而确定设备中所具有的有效VT类型。17.1.3活动VT会话通过检测对等设备中的BACnet设备对象,可以确定对等VT服务中是否存在活动的VT会话。BACnet设备对象有一个活动虚拟终端会话属性,使用读属性服务、读多个属性服务,或者条件读属性服务可以读取这个属性值,从而确定在这个设备中正在使用的VT会话的ID。17.1.4VT开启、VT关闭和VT数据的状态图在一个VT会话过程中,有三个操作状态:空闲(IDLE)状态、数据交换(DATAEXCHANGE)状态和等待(HOLD)状态。在空闲状态,不存在VT会话。如果使用VT开启服务创建了一个VT会话,则VT会话过程就进入数据交换状态。如果发生下列两个事件之一,则VT过程离开数据交换状态,这两个事件是:(a)成功地执行了VT关闭服务,释放了VT会话;(b)VT数据请求返回一个‘Result(-)’。当一个VT数据请求还没有被确认时,会话进入等待状态。图17-4表示各状态之间的关系。16117.1.5VT会话同步参与VT会话的每一个对等体都有两个用于同步VT会话的VT数据标志(VT-dataflags)。一个标志表示设备作为发送方BACnet用户的角色,是一个序列号,交替取0和1值,代表下一个要发送的VT数据请求。当收到对于一个VT数据请求的‘Result(+)’响应时,序列号以2为模加1变化。当VT会话建立时,这个标志被初始化为0(第一个VT数据请求使用序列号0)。另一个标志表示设备作为接收方BACnet用户的角色,是一个序列号,代表最后一个正确接收的VT数据请求。当VT会话建立时,这个标志被初始化为0(下一个期待接收的VT数据请求指示应该具有序列号0)。当收到一个其指示具有期待的序列号的VT数据请求,并且成功处理之后,序列号以2为模加1变化。接收方VT会话过程还应该保存上一次收到的‘全部收到的新数据(AllNewDataAccepted)’和‘接收到的字节数(AcceptedOctetCount)’参数。如果对VT数据指示的‘Result(+)’响应发生丢失,就需要这些数据。如果收到一个VT数据指示,检查其中的‘VT数据标志(VT-DataFlag)’参数和先前已收到并记录在这个VT会话过程中的‘VT数据标志’是否相同,从而判断响应是否丢失。17.1.6VT会话标识符每个VT会话有两个会话标识符,一个是‘本地VT会话标识符(LocalVTSessionIdentifier)’,另一个是‘远程VT会话标识符(RemoteVTSessionIdentifier)’。这两个标识符提供了一种方法,能够将某个VT数据请求的数据同处理它的进程相联系。VT开启服务的一个功能就是建立这两个会话标识符的值。每一个设备选择自己的‘本地VT会话标识符’,不论设备在会话中的角色是客户还是服务器,这个标识符在设备的所有活动VT会话中是唯一的。通过VT开启服务的参数可以获得合适的‘远程VT会话标识符’。在VT数据被传送给162一个远程设备时,这个设备的‘远程VT会话标识符’一起被传送到远程设备上,远程设备使用这个会话标识符来标识正确的VT会话。17.2VT开启服务VT开启服务可以用来在两个对等VT用户之间建立一个VT会话。VT开启服务请求包括一个VT类型,这个类型标识一组在会话中要使用的有关字符指令表和编码。17.2.1结构表17-1表示VT开启服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表17-1VT开启服务原语结构参数名称ReqIndRspCnf参数(Argument)VT类型(VT-class)本地VT会话标识符(LocalVTSessionIdentifier)Result(+)远程VT会话标识符(RemoteVTSessionIdentifier)Result(-)错误类型(ErrorType)MMMM(=)M(=)M(=)SMSMS(=)M(=)S(=)M(=)17.2.1.1参数这个参数为VT开启确认服务请求传送参数值。17.2.1.1.1VT类型VT类型参数标识希望建立的会话类别,标准的类别枚举值如下:DEFAULT-TERMINALANSI-X3.64DEC-VT52DEC-VT100DEC-VT220HP-700/94IBM-3130枚举值DEFAULT-TERMINAL指特性由17.5节所定义的终端。所有的VT用户都必须至少支持DEFAULT-TERMINAL这个VT类别。一个给定的VT用户也可以支持其它的VT类别。通过读取设备对象的虚拟终端类型支持属性值,可以知道用户支持的VT类别。17.2.1.1.2本地VT会话标识符这个参数是无符号整型类型,取值范围是0-255,表示在请求的VT用户中的一个VT会话。这个标识符可以用于从开启的VT接收输出的VT数据。这个标识符对于响应的VT用户来说是‘远程VT会话标识符’。17.2.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。一个成功的结果包含下列参数。16317.2.1.2.1远程VT会话标识符这个参数是无符号整型类型,取值范围是0-255,表示在响应的VT用户中的一个VT会话。对于响应的VT用户来说,这个参数是‘本地VT会话标识符’。17.2.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。17.2.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。17.2.2服务过程响应的BACnet用户检验了请求的合法性之后,分配必要的资源建立一个VT会话。如果没有VT用户能提供期望的VT类别,则返回一个‘Result(-)’。如果有一个VT用户能提供期望的VT类别,则响应方BACnet用户就建立一个新的VT会话。如果VT用户没有足够的资源建立另一个VT会话,则返回一个‘Result(-)’。如果VT用户有足够的资源,则建立一个新的VT会话。本地VT数据标志按照17.1.5节中的规范进行初始化,新的VT会话标识符在‘Result(+)’响应中返回。17.3VT关闭服务VT关闭服务用来释放在两个对等VT用户之间已经建立的一个VT会话。VT关闭服务请求说明要释放的某个VT会话,或者一个VT会话列表。17.3.1结构表17-2表示VT关闭服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表17-2VT关闭服务原语结构参数名称ReqIndRspCnf参数(Argument)远程VT会话标识符列表(ListofRemoteVTSessionIdentifier)Result(+)Result(-)错误类型(ErrorType)VT会话标识符列表(ListofVTSessionIdentifier)MMM(=)M(=)SSMCS(=)S(=)M(=)C(=)17.3.1.1参数这个参数为VT关闭确认服务请求传送参数值。17.3.1.1.1远程VT会话标识符列表这个参数是一个列表,其中有一个或者多个‘远程VT会话标识符’。每一个‘远程VT会话标识符’指明一个要释放连接的VT会话。17.3.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。16417.3.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。17.3.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。17.3.1.3.2VT会话标识符列表如果‘错误类型’参数返回一个VT_SESSION_TERMINATION_FAILURE的‘错误代码’,则必须包含本参数。如果‘错误类型’参数指明是某些其它的错误,则省略本参数。‘VT会话标识符列表’参数是一个列表,其中包含有一个或者多个‘VT会话标识符’。每一个‘VT会话标识符’指明一个不能被释放连接的VT会话。返回的会话标识符相对于接收‘Result(-)’原语的设备(也就是请求方VT用户)来说,是本地的标识符。17.3.2服务过程响应的BACnet用户检验了请求的合法性之后,执行释放‘VT会话标识符列表’参数中指定的每个VT会话的操作。从响应方BACnet用户的观点来看,这些标识符都是‘本地VT会话标识符’。如果因为某种原因,有一个或者多个VT会话不能被释放,则释放所有能够被释放的会话,然后返回一个‘Result(-)’响应。如果所有的指定的VT会话都被成功释放,则返回一个‘Result(+)’响应。17.4VT数据服务VT数据服务用来在两个已经建立了VT会话的对等VT用户之间交换数据。发送方BACnet用户向对等VT用户提供新输入数据,VT用户可以接收这些新数据,也可以拒绝这些新数据。如果向数据被拒绝,则要等待发送方BACnet用户重新发送请求。17.4.1结构表17-3表示VT数据服务原语的结构,表中所用的术语和符号在5.6节中给出了解释。表17-3VT数据服务原语结构参数名称ReqIndRspCnf参数(Argument)VT会话标识符(VT-sessionIdentifier)VT新数据(VT-newData)VT数据标志(VT-dataFlag)Result(+)全部收到的新数据(AllnewDataAccepted)接收的字节数(AcceptedOctetCount)Result(-)错误类型(ErrorType)MMMMM(=)M(=)M(=)M(=)SMCSMS(=)M(=)C(=)S(=)M(=)17.4.1.1参数这个参数为VT数据确认服务请求传送参数值。17.4.1.1.1VT会话标识符165这个参数标识一个VT会话,其中,数据将要发送给这个VT会话。从请求方的BACnet用户的观点来看,这个参数是‘远程VT会话标识符’。从响应方BACnet用户的观点来看,这个参数是‘本地VT会话标识符’。17.4.1.1.2VT新数据这个参数规定将要发送给对等VT用户的新数据的字节。17.4.1.1.3VT数据标志这个参数是无符号整型类型,指明VT数据请求的期待序列号。这个参数的值应该是0或者1。在同一个VT会话中,对于每一个新的VT数据请求,这个参数值交替改变。17.4.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。一个成功的结果包含有下列参数。17.4.1.2.1全部收到的新数据这个参数是布尔类型,如果所有的‘VT新数据’的字节都被对等VT用户所接收,这个参数等于TRUE。在这种情况下,认为服务被完成。如果本参数等于FALSE,则有一些‘VT新数据’的字节不能够被对等VT用户所接收。通常,这种情况发生的原因是对等VT用户的资源有限。在这种情况下,等待BACnet用户重新发送VT数据请求。即使仅仅只有那些不能被接收的字节要传送,也需要等待新的请求。17.4.1.2.2接收的字节数只有在‘全部收到的新数据’参数等于FALSE的情况下,本参数才存在。在这种情况下,本参数指明从服务请求的‘VT新数据’参数中实际接收的字节的数目。如果‘全部收到的新数据’参数等于TRUE,则省略本参数。17.4.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。17.4.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。参见18节。17.4.2服务过程发送方BACnet用户使用一个0值‘VT数据标志’发送初始的VT数据请求。对同一个会话来说,除了重发之外,其后的VT数据请求的‘VT数据标志’在0和1之间交替取值。只有在收到了一个对先前VT数据请求的‘Result(+)’响应之后,才能发送取交替序列号的新VT数据。接收方BACnet用户检验了请求的合法性之后,就搜寻由‘VT会话标识符’参数所指定的会话。如果不能搜寻到指定的VT会话,则返回‘Result(-)’。如果能够找到指定的VT会话,而且会话接收到的‘VT数据标志’和上一次收到的‘VT数据标志’相同,则认为这是一个重复的VT数据请求。接收方BACnet用户丢弃这个数据,同时返回一个‘Result(+)’响应,其中包含从前一个VT数据请求中得到、并且保存这个VT会话过程中的‘全部收到的新数据’参数值和‘接收的字节数’参数值。如果能够找到指定的VT会话,而且会话接收到的‘VT数据标志’和上一次收到的‘VT数据标志’不相同,则认为这是一个新的VT数据请求。如果所有的数据都能加入会话的输入队列,则将数据加入排队队列,而且返回一个‘Result(+)’响应,其中‘全部收到的新数据’参数等于TRUE,‘接收的字节数’参数不存在。如果所有的数据不能都进入会话的输入队列,则将数据把输入队列排满,丢弃剩余的数据,返回一个‘Result(+)’响应,其中的‘全部收到的新数据’参数等于FALSE,‘接收的字节数’参数等于能够加入到队列的字节数。在每一种情况下,都要把‘全部收到的新数据’参数值和‘接收的字节数’参数值保存在这个VT会话过程中。16617.5缺省终端的指标每一个VT用户至少要实现一种VT类型,这就是DEFAULT_TERMINAL(缺省终端)类型。缺省终端取通常使用的交互式终端设备功能的一个有限集。缺省终端的指标包括一个字符清单,控制功能,页尺寸设定。除此之外,再没有对VT用户的其它要求。17.5.1缺省终端字符清单缺省终端字符清单定义为在单个字节值与它们的意义之间的一个特定映射关系。缺省终端字符清单包含三个项目,分别是:(a)一个特定的符号(SYMBOL),例如:“A”;(b)一个特定的隐含的控制功能(CONTROL),例如:回车;(c)一个空(NUL),例如:不用,忽略。在缺省终端字符清单中规定为空的那些字节没有设定的意义,如果VT用户接收到这些字符,就忽略它们。缺省终端字符清单是ASSCII码的一个子集。表17-4给出缺省终端字符清单中每个字符的字节编码。“字节值”域以十进制表示字节编码,取值范围是0-255。字节值的范围用两个十进制数表示,例如,000-006。表17-4缺省终端字符清单字节值类型意义000-006007008009010011-012013014-031032033034035036037038039040041042043044045NULCONTROLCONTROLCONTROLCONTROLNULCONTROLNULSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOL空声音提示(BEL)不删除后退(BS)水平制表符(TAB)下移(LF)空回车(CR)空空格!感叹号“双引号#英镑符号$美元符号%百分号&“与”符号‘省略符号(左圆括号)右圆括号星号+加号,逗号-减号167046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084SYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOL.句号/正斜线0123456789:冒号;分号<左尖括号(小于号)=等号>右尖括号(大于号)?问号@ABCDEFGHIJKLMNOPQRST168085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123SYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLSYMBOLUVWXYZ[左方括号\\反斜线]右方括号^脱字符_下划线`重音标记符abcdefghijklmnopqrstuvwxyz{左花括号169124125126127128-255SYMBOLSYMBOLSYMBOLCONTROLNUL垂直线段}右花括号~代字号不删除后退(DEL)空17.5.2控制功能在缺省终端字符清单中,有6个字节代码执行控制功能。在本协议中,控制功能表示,接收到这种控制代码的设备,要执行这个代码所隐含的操作。17.5.2.1字节代码007字节代码007表示一个声音提示(BEL)。通常,这个声音是发声器产生的一个声调音或者响铃信号。17.5.2.2字节代码008和127字节代码008表示一个不删除后退操作(BS)。这个操作使得虚拟“输出设备”的光标向左移动一个字符位。如果光标位置处于左端顶位置或者一个线的开始位置,则BS操作不产生任何效果。这个操作只改变光标的当前位置,并不改写或者改变光标向左移动位置原来的字符。字节代码127的功能与008相同。17.5.2.3字节代码013字节代码013表示回车(CR)操作。这个操作使得光标重新定位在当前“线”的开始。在这个操作之后,接收到的字符将改写位于当前“线”上的已有的字符。17.5.2.4字节代码010字节代码010表示下移(LF)操作。这个操作使得光标移动到下一行线上,但是不改变光标在线内的位置。通常,这个代码与CR一起使用。17.5.2.5字节代码009字节代码009表示水平前移到下一个制表位(TAB)操作。这个操作使得光标移动到当前行的下一个制表位上。这个操作只改变光标的位置,并不会改写或者改变光标移动位置上原来的字符。每进行一次制表位操作,光标向右移动8个字符位置,如图17-5所示。17.5.3页尺寸设定在缺省终端的规范中,只有两个对页尺寸的设定。第一个设定是,设定一页有80列。每个接收的SYMBOL字符占据一列。空字符对列位置不产生任何影响。CONTROL字符对列位置的影响各不相同,在17.5.2节中已有规定。第二个设定是,每一页的长度没有限制。这个设定等价与一个有连续形式纸的打印机。18.错误、拒绝和中止代码本节列出在BACnet协议中涉及到的所有错误,这些错误按照“错误类”进行分类。在每一个错误类别中,170进一步按照“错误代码”进行分类。这样分类,使得应用程序可能按照两个尺度,对错误采取不同的补救方式。18.1错误类-设备(ErrorClass-DEVICE)这种错误类涉及影响整个BACnet设备功能的环境。出现这种类别的错误,通常表示整个服务请求已经失败。18.1.1设备忙(DEVICE_BUSY)一个服务请求被暂时拒绝,因为它所寻址的BACnet设备希望处理更高优先级的进程,而这所需要的时间超出了正常请求/确认的超时等待时间。18.1.2正在进行配置(CONFIGURATION_IN_PROGRESS)一个服务请求被暂时拒绝,因为它所寻址的BACnet设备正在进行配置,这种对设备的配置可能是通过本地设备进行,也可能是通过其它的协议服务进行。18.1.3运行问题(OPERATIONAL_PROBLEM)一个服务请求被暂时拒绝,因为它所寻址的BACnet设备检测到了阻碍执行请求的服务的运行问题。18.1.4其它(OTHER)如果出现的设备错误不是上面所提到的,则返回这个错误代码。18.2错误类-对象(ErrorClass-OBJECT)这种错误类涉及在验证、访问和操作BACnet对象时出现的错误,不论这些对象是否是BACnet定义的标准对象。因为这种错误一般与单个对象特性相关,所以不必发送整个服务请求已失败的信号。18.2.1不支持动态创建(DYNAMIC_CREATION_NOT_SUPPORTED)这种错误是指试图用一种不能动态创建的对象类型创建一个对象。18.2.2无指定类型的对象(NO_OBJECT_OF_SPECIFIED_TYPE)这种错误是指在BACnet设备中的对象数据库不能找到服务请求指定的对象类型的对象。18.2.3不支持对象删除(OBJECT_DELETION_NOT_PERMITED)这种错误是指试图删除一个不能被删除,或者当前被保护的对象。18.2.4对象标识符已存在(OBJECT_INDENTIFIER_ALREADY_EXISTS)这种错误是指试图用已经在使用的对象标识符来定义一个新的对象。18.2.5读访问拒绝(READ_ACCESS_DENIED)这种错误是指试图用BACnet协议读服务对一个已被定义为不可访问的对象的属性进行读操作。18.2.6未知对象(UNKNOWN_OBJECT)这种错误是指所寻址的BACnet设备对象数据库中不存在对象标识符所表示的对象。18.2.7不支持的对象类型(UNSUPPORTED_OBJECT_TYPE)这种错误是指所寻址的BACnet设备不支持或不知道服务参数所指定的对象类型。18.2.8其它(OTHER)当出现的对象错误不是以上所提到的,则返回这个错误代码。18.3错误类-属性(ErrorClass-PROPERTY)这种错误类涉及在对BACnet对象的属性进行验证、访问和操作时出现的错误,不论这些对象属性是否是BACnet定义的标准对象属性。因为这种错误一般与单个属性有关,所以不必发送整个服务请求已失败的信息。18.3.1不支持字符集(CHARACTER_SET_NOT_SUPPORTED)这种错误是指遇到了不支持的字符集中的字符串值。18.3.2选择准则不一致(INCONSISTENT_SELECTION_CRITERION)这种错误是指属性的数据类型和‘对象选择准则’服务参数中指定的‘比较值’不一致。例如,如果一个171模拟属性和一个布尔常数相比较,就会发生这样的错误,反之亦然。18.3.3无效数组索引(INVALID_ARRAY_INDEX)这个错误是指试图使用超出范围的数组索引访问一个数组属性。18.3.4无效数据类型(INVALID_DATATYPE)这个错误是指在一个服务参数中指定的属性值的类型与属性标识符指定的引用属性的类型不匹配。18.3.5读访问拒绝(READ_ACCESS_DENIED)这种错误是指试图用BACnet协议读服务对一个已被定义为不可访问的属性进行读操作。18.3.6未知属性(UNKNOWN_PROPERTY)这种错误是指所寻址的BACnet设备中的对象所支持的属性不包含服务参数中指定的属性标识符。18.3.7写访问拒绝(WRITE_ACCESS_DENIED)这种错误是指试图用BACnet协议写服务向一个已被定义为不可访问的属性进行写操作。18.3.8值超出阈值(VALUE_OUT_OF_RANGE)这种错误是指试图用超出阈值的值给属性赋值。18.3.9其它(OTHER)如果出现的属性错误不是以上所提到的,则返回这个错误代码。18.4错误类-资源(ErrorClass-RESOURCES)这种错误类涉及影响BACnet设备执行协议服务请求能力的设备资源方面的错误。18.4.1无空间创建对象(NO_SPACE_FOR_OBJECT)这种错误是指在寻址的BACnet设备内没有足够的动态存储空间来创建一个对象。18.4.2无空间添加列表元素(NO_SPACE_TO_ADD_LIST_ELEMENT)这种错误是指在寻址的BACnet设备内没有足够的动态存储空间用来进行在一个列表中增加一个元素的操作。18.4.3无空间写属性(NO_SPACE_TO_WRITE_PROPERTY)这种错误是指在寻址的BACnet设备内没有足够的动态存储空间用来进行写属性值的操作。18.4.4其它(OTHER)当出现的资源错误不是以上所提到的,则返回这个错误代码。18.5错误类-安全(ErrorClass-SECURITY)这种错误类涉及安全性服务执行方面的错误。毫无例外,这种类型错误表示响应方BACnet用户完全不能执行要求的服务。这种错误是“致命”错误。18.5.1认证失败(AUTHENTICATION_FAILED)这个错误是指服务提供者没有生成报文的认证信息。18.5.2不支持字符集(CHARACTER_SET_NOT_SUPPORTED)这种错误是指遇到了不被支持的字符集中的字符串值。18.5.3不兼容的安全等级(INCOMPATIBLE_SECURPITY_LEVELS)这种错误是指两客户的安全权限不相同。18.5.4无效的操作员名字(INVALID_OPERATOR_NAME)这种错误是指‘操作员姓名’和已知道的操作员名字不符合。18.5.5密钥生成错误(KEY_GENERATION_ERROR)这种错误是指密钥服务器不能生成一个会话密钥(SessionKey,SK)。18.5.6密码错误(PASSWORD_FAILURE)172这种错误是指‘操作员姓名’和‘操作员口令’不匹配。18.5.7不支持安全性(SECURITY_NOT_SUPPORTED)这种错误是指远程客户不支持任何BACnet安全机制。18.5.8超时(TIMEOUT)这种错误是指在等待时间耗尽之前,还没有收到带有期待调用ID(InvokeID)的APDU。18.5.9其它(OTHER)当出现的安全错误不是以上所提到的,则返回这个错误代码。18.6错误类-服务(ErrorClass-SERVICES)这种错误类涉及协议服务请求执行方面的错误,不论服务请求是否是BACnet定义的标准服务。毫无例外,这种类型错误表示响应方BACnet用户完全不能执行要求的服务。这种错误是“致命”错误。18.6.1不支持字符集(CHARACTER_SET_NOT_SUPPORTED)这种错误是指遇到了不被支持的字符集中的字符串值。18.6.2文件访问拒绝(FILE_ACCESS_DENIED)这种错误是指,当使用基本读文件或者基本写文件服务请求访问一个当前被写保护或者不能被访问的文件时,产生在响应中的错误指示。18.6.3参数不一致(INCONSISTENT_PARAMETERS)这种错误是指服务请求中的两个或者多个参数互相矛盾。18.6.4无效的文件访问方法(INVALID_FILE_ACCESS_METHOD)这个代码产生在对一个基本读文件或者基本写文件服务请求的响应中,指出这个基本读文件或者基本写文件服务请求中指定的‘文件访问方法’对于指定的文件无效。18.6.5无效的文件开始位置(INVALID_FILE_START_POSITION)这个代码产生在对一个基本读文件或者基本写文件服务请求的响应中,指出这个基本读文件或者基本写文件服务请求指定了一个无效的‘文件开始位置’或者‘文件开始记录’参数。18.6.6无效的参数类型(INVALID_PARAMETER_DATATYPE)这种错误是指服务参数指定的数据类型不适合这个参数。18.6.7无效的时间戳(INVALID_TIME_STAMP)这种错误是指由确认报警服务请求传送的‘时间戳’参数和正在被确认的事件的最近发生时间不匹配。18.6.8属性非列表元素(PROPETY_IS_NOT_A_LIST)这种错误是指试图使用添加列表元素或者删除列表元素服务访问一个非列表数据类型的属性。18.6.9缺少必要的参数(MISSING_REQUIRED_PARAMETER)这种错误是指没有提供执行服务请求所需的参数。18.6.10服务请求拒绝(SERVICE_REQUST_DENIED)这种错误是指请求方BACnet设备没有权限要求执行这个服务请求。18.6.11其它(OTHER)如果出现的服务错误不是以上所提到的,则返回这个错误代码。18.7错误类-虚拟终端(ErrorClass-VT)这种错误类涉及执行虚拟终端服务时出现的错误。18.7.1未知VT类别(UNKNOWN_VT_CLASS)这种错误是指目标设备不能识别VT开启服务请求指定的‘VT类别’。17318.7.2未知VT会话(UNKNOWN_VT_SESSION)这种错误是指目标设备不能识别VT关闭服务请求或者VT数据服务请求指定的‘VT会话ID’。18.7.3无可用的VT会话(NO_VT_SESSION_AVAILABLE)这种错误是指因为资源的限制,目标设备不能完成一个VT开启请求。18.7.4VT会话已经关闭(VT_SESSION_ALREADY_CLOSED)这种错误是指试图关闭一个已经关闭了的VT会话。18.7.5释放VT会话失败(VT_SESSION_TERMINATION_FAILURE)这种错误是指由于实现方面的原因,不能释放VT关闭服务请求指定的一个‘VT会话’。18.7.6其它(OTHER)如果出现的VT错误不是以上所提到的,则返回这个错误代码。18.8拒绝原因(RejectReason)只有确认请求PDU能够被拒绝,拒绝的原因有下面几种。18.8.1缓冲器溢出(BUFFER_OVERFLOW)这个拒绝的原因是指超出了输入缓冲器容量。18.8.2参数不一致(INCONSISTENT_PARAMETERS)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU省略了一个应该存在的条件服务参数或者包含了一个不应该存在的条件服务参数。18.8.3无效参数类型(INVALID_PARAMETER_DATA_TYPE)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU中一个或多个服务参数的编码不符合正确的类型规范。18.8.4无效标志(INVALID_TAG)这个拒绝的原因是指在分析一个报文时,遇到一个无效的标志。18.8.5缺少必要的参数(MISSING_REQUIRED_PARAMETER)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU至少缺少一个必需的服务参数。18.8.6参数超出阈值(PARAMETER_OUT_OF_RANGE)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU传送的参数值超出了服务所规定的范围。18.8.7过多参数(TOO_MANY_PARAMETER)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU中的服务参数的总数多于服务所规定的数量。18.8.8未定义枚举(UNDEFINED_ENUMERATION)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU中有一个或者多个服务参数解码得到的枚举是没有被该参数类型规范所定义的。18.8.9不支持的服务(UNRECOGNIZED_SERVICE)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU的服务选择域中所指定的服务是一个未知或者不被支持的服务。18.8.10其它(OTHER)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU包含一个非上述原因的语法错误。17418.9中止原因(AbortReason)18.9.1缓冲器溢出(BUFFER_OVERFLOW)指出中止的原因是超出了输入缓冲器的容量。18.9.2在本状态下无效的APDU(INVALID_APDU_IN_THIS_STATE)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU不是事务处理状态机当前状态的期待状态。18.9.3高优先级任务抢占(PREEMPTED_BY_HIGHER_PRIORITY_TASK)这个中止的原因是因为要中止这个事务处理而运行更高优先级的进程。18.9.4不支持分段(SEGMENTATION_NOT_SUPPORTED)这个代码产生在对一个有确认请求APDU的响应中,指出这个请求APDU中的分段位设置为TRUE,但是接收设备不支持分段。18.9.5其它(OTHER)如果中止是非上述原因所引起的,则返回这个错误代码。19.命令优先级机制在楼宇自动控制系统中,一个对象可能被多个实体操作。例如,一个二进制输出对象的当前值可能被多个应用程序设置,诸如查询计量读数,优化启/停操作等等。每一个这样的应用程序都有一个明确的功能需要执行。当有两个或者多个应用程序都要操作一个属性值而发生冲突时,就需要在这些应用程序之间进行协调。协调处理的目的是要保证被多个程序(或者非程序)实体操作的对象达到期望的状态。例如,一个启/停程序可能规定某个二进制输出对象应该为ON,而查询计量读数的程序可能规定同一个二进制输出对象为OFF。在这种情况下,OFF应该具有优先权。操作者可以不顾查询计量读数程序,强行设置这个二进制输出对象为ON,在这种情况下,ON就具有优先权。在BACnet协议中,采用一个优先级机制提供这种协调处理方法。这个优先级机制根据整个系统要求,给命令实体分配不同的优先级的级别。每个包含有一个可命令属性的对象负责按照命令的优先级顺序执行相应的操作。任何这样的机制都必须在复杂性和稳定性之间进行折中,本协议确定优先级机制应该是简单有效,并且可以应用到非常简单的BACnet设备中。下列的属性类型涉及优先级机制:(a)可命令属性:每一个支持命令优先级的对象都有一个或者多个称之为“可命令属性(CommandableProperties)”的属性。这些属性的值可以被命令优先级机制控制。(b)优先值数组属性:这个属性是一个只读数组,其中包含按优先级别递减排列的具有优先级的命令或者空。具有非空值的最高优先级(最低的数组索引)是活动命令。(c)释放缺省属性:这个属性与可命令属性具有相同的数据类型(和工程单位)。当优先值数组属性的所有表目都为空值时,可命令属性的值取释放缺省属性规定的值。虽然可以使用命令对象向一组对象属性写入值,但是只能对可命令的属性写入命令优先级。19.1优先级机制对于BACnet对象,命令的优先级依据分配给发送命令的实体的优先值确定。一个区分先后顺序的命令是一个直接对一个对象的一个可命令属性进行作用的命令,使用写属性服务请求或者写多个属性服务请求执行这个175命令。写属性服务请求或者写多个属性服务请求原语包含有一个条件的‘优先级’参数,取值为1-16。一个对象的每个可命令属性都有一个相关的优先级表,其中表示优先值数组属性。优先值数组属性包含有一个按递减优先级顺序排列的命令值的数组。这个数组的第一个值对应优先级1(最高级),第二个值对应优先级2,依此类推,直到第十六个值对应优先级16(最低级)。在优先值数组属性的表目中,可以是一个命令值,也可以是一个空值。空值表示不存在这个优先值的命令。对象顺序检查优先级表中的所有表目,搜寻出具有最高优先级的非空值,设置可命令属性为这个值。一个发布命令的实体(应用程序,操作员,等等)可以发送一个命令对一个对象的可命令属性进行写操作,或者指示放弃以前发送的命令。使用类似于命令本身的写操作执行放弃命令操作。在可命令属性为空值的情况下,放弃命令操作将空值放置在优先值数组属性中对应于合适的优先值的位置。这个优先级机制应用于改变可命令属性值的本地操作,也应用于通过BACnet服务进行的写操作。如果要对一个可命令属性进行没有明确规定优先值的写操作,则假定这个操作使用缺省的16级优先级(最低优先级)。如果要对一个不可命令的属性进行有明确规定优先值的写操作,则忽略优先级。优先值数组属性是只读属性,只能通过对这个可命令属性自身进行写操作才能间接改变这个属性的值。19.1.1可命令属性(CommandableProperties)优先级机制只能应用于某些对象的某些属性。本标准中规定的可命令属性和对象如下:对象可命令属性模拟输出当前值二进制输出当前值多态输出当前值模拟值当前值二进制值当前值这些对象的指定属性定义为标准的可命令属性,另外生产商也可以决定对任何一个生产商定义的属性应用优先级机制。这些附加的可命令属性也以适当的名字具有相应的优先值数组属性和释放缺省属性。参见23.3节。19.1.2优先级命令(PrioritizedCommand)所谓优先级命令是指直接作用于可命令属性的命令,这个命令是写属性服务请求或者写多个属性服务请求中的一个。在每一种情况下,请求原语都包含下列参数:属性标识符:可命令属性属性值:希望的值优先级:优先级一个成功写操作的最后结果是将一个希望的值放置在优先级表中适当优先值的位置。如果在这个优先值位置处已经存在一个另外的值,则新值将覆盖旧值,不论是否与先前的命令实体相符。19.1.3释放命令(RelinquishCommands)如果一个命令实体不再希望控制一个可命令属性,则发送一个释放命令。释放命令也是释放命令也是写属性服务请求或者写多个属性服务请求中的一个。在每一种情况下,请求原语都包含下列参数:属性标识符:可命令属性属性值:空值优先级:优先级176优先级表中的元素的值为空值表示在这个优先值处不存在任何命令。如果优先级表中的所有元素都是空值,则可命令属性认为取对象的释放缺省属性中定义的值。存在着一个应用实体释放不是它自己的优先级的可能性,这将导致无法预料的结果。如果有多个应用被分配为相同的优先级级别,则有可能一个应用实体释放了来自其它应用实体的命令,从而导致无法预料的操作。为了减少这种可能性,在系统内不允多个命令实体具有相同的优先级级别就格外重要。19.1.4命令源标识符(CommandSourceID)本标准没有规定把维护命令源标识符作为优先级表的一部分。对命令源标识符的任何实现都具有生产商专用特征。19.1.5命令改写(CommandOverwrite)只要向可命令属性发送一个命令,就在优先值数组中的适当优先值位置放置了一个值,不论该位置当前是什么,新的命令将改写原来的命令值,而且这种改写操作并不导致向原命令实体发送任何通知。19.2应用优先级的分配(ApplicationPriorityAssignments)命令实体被分配16个可能的优先级级别中的一个。多数优先级的分配与站点有关,表示站点管理的客观需要。表19-1列出了标准优先级的级别。另外一些需要分配优先级的应用有温度超值(TemperatureOverride)、查询限制(DemandLimiting)、最佳启/停、任务循环(DutyCycling)和时间表。这些应用的相关优先级在不同的站点有不同的等级,没有一个标准。为了在任何站点都可以互相操作,只需所有的设备都按照相同的优先级方案实现相应设置。表中标记为可利用(Available)的位置的优先级级别可以分配给DDC、EMS等程序。至于什么条件构成手动操作的人身安全或者自动操作的人生安全的判别准则,由生产商自行确定。表19-1.标准的命令优先级级别优先级级别PRIORITYLEVEL应用APPLICATION1手动操作的人身安全Manual-LifeSafety2自动操作的人身安全Automatic-LifeSafety3可利用Available4可利用Available5关键仪器设备的控制CriticalEquipmentControl6活动/非活动最小值MinimumOn/Off7可利用Available8人工操作者ManualOperator9可利用Available10可利用Available11可利用Available12可利用Available13可利用Available14可利用Available15可利用Available16可利用Available17719.3活动最小值和非活动最小值(Minimum-On-TimeandMinimum-Off-Time)如果可命令属性是二进制输出对象或者二进制值对象的当前值属性,且对象具有可选的活动最小值和非活动最小值属性,则最小活动时间和最小非活动时间将遵循下列算法的规律。命令优先级的级别6专门为这种算法保留,任何对象都不能用作它用。(a)如果当前值是ACTIVE,最近一次当前值的改变到现在的时间小于活动最小值,则优先级数组的元素6包含的值为ACTIVE。(b)如果当前值是INACTIVE,最近一次当前值的改变到现在的时间小于非活动最小值,则优先级数组的元素6包含的值为INACTIVE。(c)如果(a)、(b)都不成立,则优先级数组的元素6包含的值为NULL。这些规则规定了根据写入的当前值和活动时间的状态应该执行的操作。如何实现这些操作由生产商自行确定,只要求所产生的效果符合这些规则。在向任何优先级的可命令属性进行写入赋值时,不论活动最小值或者非活动最小值如何,总是直接向优先级表中的适当位置写入指定值或者空值。本地优先级维护实体检验优先级数组,确定具有非零值的最高优先级。如果这个值与写入操作前的当前值不同,则发生状态改变。如果这样的状态改变发生,则将新值写入优先级数组的优先级6的位置,且记录改变的时间。如何进行计时操作由生产商自行确定。如果由优先级级别6中的非零值表示的最小活动时间或者最小非活动时间已经到达,则本地最小时间维护实体向优先级级别6写入空值,并重新检查优先级数组,确定新的当前值。如果新的当前值指示状态改变,则按照上述的方法进行适当的操作。如果优先级级别6的非空值的作用是对任何低优先级(大的优先级号码)进行写操作,这些操作都不导致状态的改变。这样,就可以达到对这些优先级相关的最小活动时间或者最小非活动时间的保护。对任何一个高于级别6(更小的优先值号码)的优先级进行写操作,都将导致状态改变,不论活动最小值或者非活动最小值如何。因此,这些优先级都只作为紧急应用。还必须注意到,向这些高级别的优先级进行写操作所导致的状态改变,又将导致向级别6进行写操作,并且产生上述的其它操作。因此,如果一个空值接着写入高优先级中,而最小时间又处于有效时间内,则可以观察到在较低优先级的值改变所引起的状态改变之前的这段时间。对于最小活动时间和最小非活动时间处理的进一步的讨论参见附录Ⅰ。19.4命令对象的优先级机制(PrioritizationforCommandObjects)一个命令对象能够像其它命令发布实体一样发布命令。可以将一个命令对象与一个具有任何优先级的应用相关联。命令对象的行为属性包含所有的向可命令属性进行写操作所必需的参数。19.5环对象的优先级机制(PrioritizationforLoopObjects)一般来说,环对象不使用BACnet服务进行命令方面的操作,但是还是有可能需要与具有可命令属性的对象相互作用。为此,每个环对象都有一个写入优先级属性,它指定了与可命令属性相关的控制环的优先级。参见12.13.28节。19.6时间表对象的优先级机制(PrioritizationforScheduleObjects)一般来说,时间表对象不使用BACnet服务进行命令方面的操作,但是还是有可能需要与具有可命令属性的对象相互作用。为此,每个时间表对象都有一个写入优先级属性,它指定了与可命令属性相关的控制环的优先178级。参见12.13.10节。20.BACnet协议数据单元编码在BACnet中,使用应用层协议数据单元(APDU)传送包含在应用服务原语和相关参数中的信息。ISO标准8824是关于抽象句法结构符号1(AbstractSyntaxNotationOne,ASN.1)的规范说明,这个规范被选定作为表述BACnet服务中的数据内容的方法。第21节给出本标准中定义的所有服务的ASN.1定义。ASN.1提供了一个抽象的句法结构。然而,一个APDU可以有多种比特格式,这些取决于所采用的编码规则。在OSI模式中,由表示层使用一个协商程序选定所用的编码规则。协同工作的系统使用这个协商程序,不仅确定诸如ISO8825、ASN.1的基本编码规则规范说明这样的基本编码规则,而且确定APDU是否要遵守的诸如数据压缩、加密、字符代码转换这样的处理规则。因为BACnet采用简化的OSI体系结构,不包含任何表示层的功能,必须预先定义好通信设备一致遵守的编码规则。BACnet的编码规则设计考虑到了楼宇自动控制体系对简单化、紧凑化的要求。因此,这个编码规则在一些方面与ISO8825有所不同。但是仍然允许使用ASN.1对BACnet的APDU进行编码。这意味着在将来的全OSI网络中,应用实体仍然可以通过增加表示层的功能而使用BACnet服务及其程序,这些表示层的功能是协调本标准的编码规则与以后可能使用的编码规则的一致性。在ISO8825中规范的ASN.1编码对PDU中的所有数据元素都适用。每个数据元素由三个部分组成:1.标识符字节,2.长度字节,3.内容字节。由于每个数据元素都有明确的标识,这就能够开发出解析器,在不用已知PDU的格式或者语义内容的情况下,对任何PDU进行解码。另外一种替代的方法是隐含地标识数据元素,这要求共同遵守统一的数据格式和元素在PDU中的位置。前一种方法一般会有更大的开销,而后一种方法节省开销,但是限制了将来的扩展性。在BACnet中采用的是一种折中的方法。每个APDU分为固定部分和可变部分。固定部分包含协议控制信息,采用隐含式的编码方法,在20.1节详细规范可变部分包含具体的服务信息,采用明确表示的编码方式,在20.2节中详细规范。这种方案显著地减少了开支而又保持了将来较容易地增加新服务的特征。20.1BACnetAPDU的固定部分的编码BACnetAPDU由协议控制信息和用户数据所组成。“协议控制信息”(PCI)包含进行应用层协议操作所需的数据,这些数据包括APDU的类型、匹配服务请求和服务响应的信息以及重组分段报文的信息。这些信息包含在APDU的“头部”,也称之为固定部分。“用户数据”包含单个服务请求和服务响应的具体信息,APDU的这一部分称之为‘可变部分’。因为每个BACnet的APDU都具有PCI域,尽管在ASN.1中规定可以使用标记(tag)进行APDU的句法结构描述,但是在BACnet中,对PCI编码中不使用标记或者长度信息。而对内容可变的用户数据进行编码时,则使用标记,20.2节详细规范。有选择地使用标记可以大大减少开销。本节后面的内容对APDU类型的格式进行详细说明。20.1.1BACnetPDU选择标记的编码所有的被ANS.1定义的BACnet报文称之为BACnetPDU。参见21节。在BACnet中,一共有8种BACnetAPDU的ANS.1编码类型,每一种类型就形成一个BACnetPDU。对所有的BACnetAPDU,头部的第一个字节(8位)中的第4-7位被编码成为一个4比特的二进制数,其中第7位是高位,表示BACnetAPDU的类型。这4个比特编码表示标记的值(0-7),代表APDU的类型选择。下面给出每一种APDU类型的编码例程。17920.1.2BACnet有证实请求PDUBACnet有证实请求PDU用于传送包含在有证实服务请求原语中的信息。BACnet-Confirmed-Request-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--0forthisPDUtypesegmentedmessage[1]BOOLEAN【报文分段】morefollows[2]BOOLEAN【后继】segmented-response-accepted[3]BOOLEAN【收到的分段响应】reserved[4]Unsigned(0..31),--mustbesettozero【】max-APDU-lenth-accepted[5]Unsigned(0..15)【接收的最大APDU长度】invokeID[6]Unsigned(0..255)【调用ID】sequencenumber[7]Unsigned(0..255)OPTIONAL,onlyifsegmentedmsg【序列号】proposed-window-size[8]Unsigned(0..127)OPTIONAL,onlyifsegmentedmsg【预设窗口尺寸】service-choice[9]BACnetConfirmedServiceChoice【服务选择】service-request[10]BACnet-Confirmed-Service-Request【服务请求】--在头部编码中不使用上下文特定标记0..10}BACnet有证实请求PDU的参数意义如下所述。20.1.2.1报文分段(segmented-message)参数这个参数包含在当前PDU中,指明有证实服务请求是完整的还是仅是一部分。如果当前PDU是一个整体,则‘segmented-message’参数值应为FALSE。如果当前PDU仅包含了请求的一段,则该参数值应为TRUE20.1.2.2后继(more-follows)参数只有‘segmented-message’参数值为TRUE时,‘more-follows’参数才有意义。如果‘segmented-message’为TRUE,则除了最后一段之外的所有组成有证实服务请求的段的‘more-follows’参数值都是TRUE,最后一段的‘more-follows’的参数值为FALSE。如果‘segmented-message’参数值为FALSE,则‘more-follows’参数被编码器置为FALSE,而解码器忽略这个参数。20.1.2.3收到的分段响应(segmented-response-accepted)参数如果发送有证实请求的设备要求收到分段的复杂确认作为响应,则应该将这个参数值设置为TRUE。否则将其设置为FALSE。这个参数包含在有证实请求中以便响应设备可以确定如何传送响应。20.1.2.4接收的最大APDU长度(max-APDU-length-accepted)参数这个参数说明发送设备能接收的单个APDU的最大尺寸。这个参数包含在有证实请求中以便响应设备可以确定如何传送响应。这个参数的编码如下:注:octets表示八位位组,八位字节(=byte)B‘0000’UptoMinimumMessageSize(50octets)B‘0001’Upto128octetsB‘0010’Upto206octets(fitsinaLonTalkframe)B‘0011’Upto480octets(fitsinanARCNETframe)B‘0100’Upto1024octets180B‘0101’Upto1476octets(fitsinaISO8802-3frame)B‘0110’reservedbyASHRAE【保留的】B‘0111’reservedbyASHRAEB‘1000’reservedbyASHRAEB‘1001’reservedbyASHRAEB‘1010’reservedbyASHRAEB‘1011’reservedbyASHRAEB‘1100’reservedbyASHRAEB‘1101’reservedbyASHRAEB‘1110’reservedbyASHRAEB‘1111’reservedbyASHRAE20.1.2.5调用ID(invokeID)参数这个参数是一个整数,取值范围是0-255,由服务请求者分配。这个参数用于把对于有证实服务请求的响应和原始请求联系起来。在没有错误发生的情况下,服务提供者使用一个BACnet简单确认PDU或者一个BACnet复杂确认PDU返回‘invokeID’参数。在有错误发生的情况下,服务提供者使用一个BACnet错误PDU、一个BACnet拒绝PDU或者一个BACnet中止PDU返回‘invokeID’参数。发送服务请求的设备产生参数‘invokeID’。此参数在所有的由该设备产生的还没有被确认的APDU中是唯一的。一个分段服务请求的所有分段都有一个相同的‘invokeID’。一旦一个‘invokeID’分配给了一个APDU,则这个‘invokeID’将保留在设备中,直到收到一个具有相同的‘invokeID’的响应APDU,或者设备的计时器到时仍没有收到任何响应。不论是收到了正确响应,还是计时器到时,都要将‘invokeID’释放,以便重新分配。如何维护当前没有被使用的‘invokeID’值,以及如何挑选一个‘invokeID’值分配给新的APDU,由生产商自行确定。如何在请求设备和响应设备中维护正在使用的‘invokeID’值也由生产商自行确定。请求设备可以给所有的有证实APDU分配一个‘invokeID’空间,也可以给每一个目标设备地址都分配一个‘invokeID’空间。因为‘invokeID’值只是源设备唯一,所以响应设备只将请求设备地址和‘invokeID’值保留到发送响应为止。在发送了响应之后,响应设备就可以丢弃‘invokeID’信息。20.1.2.6序列号(sequence-number)参数如果‘segmented-message’参数为TRUE,则存在可选参数‘sequence-number’,这个参数是无符号整型类型,取值范围是0-256,连续递增变化。这个参数标示分段请求的每一个分段,响应设备根据收到的‘sequence-number’值确定这个分段是否已收到。分段请求的第一分段的‘sequence-number’值为0。20.1.2.7预设窗口尺寸(proposed-window-size)参数如果‘segmented-message’参数为TRUE,则存在可选参数‘proposed-window-size’,这个参数是无符号二进制整数,取值范围是1-127,指定包含‘invokeID’的报文分段的最大数目,这个值是发送设备在等待分段确认PDU之前能够发送的最大报文分段的数目。(参见5.2节和5.3节)。20.1.2.8服务选择(service-choice)参数这个参数包含BACnet有证实服务选择(BACnetConfirmedServiceChoice)的值。参见21节。20.1.2.9服务请求(service-request)参数这个参数包含被请求的特定服务的参数,它的编码是根据20.2节中的规则进行的。这些参数在本标准的每个服务规范中定义,在21节,使用ASN.1规则对它们进行了详细规定。18120.1.2.10BACnet有证实请求PDU的格式BACnet-Confirmed-Request-PDU的格式如下:PDU域的值如下:PDUType=0(BACnet-Confirmed-Request-PDU)SEG=0(UnsegmentedRequest)=1(segmentedRequest)MOR=0(NoMoreSegmentsFollow)=1(NoMoreSegmentsFollow)SA=0(SegmentedResponsenotaccepted)=1(SegmentedResponseaccepted)MaxResp=(0..5)(SizeofMaximumAPDUaccepted)InvokeID=(0..255)SequenceNumber=(0..255)只有当SEG=1时才存在ProposedWindowSize=(0..127)只有当SEG=1时才存在ServiceChoice=BACnetConfirmedServiceChoiceServiceRequest=VariableEncodingper20.2上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.3BACnet无证实请求PDUBACnet无证实请求PDU用于传送包含在无证实服务请求原语中的信息。BACnet-Unconfirmed-Request-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--1forthisPDUtypereserved[1]Unsigned(0..15),--mustbesettozeroservice-choice[2]BACnetUnConfirmedServiceChoice【服务选择】service-request[3]BACnet-UnConfirmed-Service-Request【服务请求】--Contextspecifictags0..3areNOTusedinheaderencoding}182BACnet无证实请求PDU的参数的意义如下所述。20.1.3.1服务选择(service-choice)参数这个参数包含BACnet无证实服务选择的值。参见21节。20.1.3.2服务请求(service-request)参数这个参数包含被请求的特定服务的参数,它的编码是根据20.2节中的规则进行的。这些参数在本标准的每个服务规范中定义,在21节,使用ASN.1规则对它们进行了详细规定。20.1.3.3BACnet无证实请求PDU的格式BACnet-Unconfirmed-Request-PDU的格式如下:PDU域的值如下:PDUType=1(BACnet-UNConfirmed-Request-PDU)ServiceChoice=BACnetConfirmedServiceChoiceServiceRequest=VariableEncodingper20.2上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.4BACnet简单确认PDUBACnet简单确认PDU用于传送包含在一个服务响应原语(‘Result(+)’)中的信息,这个信息是服务请求已经成功执行。BACnet-SimpleACK-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--2forthisPDUtypereserved[1]Unsigned(0..15),--mustbesettozerooriginal-invokeID[2]Unsigned(0..225)【初始调用ID】service-ACK-choice[3]BACnetConfirmedServiceRequest【服务确认选择】--Contextspecifictags0..3areNOTusedinheaderencoding}BACnet简单确认PDU的参数意义如下所述。20.1.4.1初始调用ID(original-invokeID)参数这个参数是包含在正在被确认的有证实服务请求中的‘invokeID’。20.1.4.2服务确认选择(service-ACK-choice)参数183这个参数包含BACnet有证实服务选择的值,这里的BACnet有证实服务选择是对包含在先前的、导致这个确认的BACnet有证实服务请求中的服务而言的。20.1.4.3BACnet简单确认PDU的格式BACnet-SimlieACK-PDU的格式如下:这个APDU总是具有三个字节。PDU域的值如下:PDUType=2(BACnet-SimpleACK-PDU)OriginalInvokeID=(0..255)ServiceACKChoice=BACnetConfirmedService上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.5BACnet复杂确认PDUBACnet复杂确认PDU用于传送包含在一个服务响应原语(‘Result(+)’)中的信息,这个信息除了包含服务请求已经成功执行之外,还有其它一些信息。BACnet-ComplexACK-PDU::=SEQUENCE{pdu–type[0]Unsigned(0..15),--3forthisPDUtypesegmentedmessage[1]BOOLEAN【报文分段】morefollows[2]BOOLEAN【后继】reserved[3]Unsigned(0..3),--mustbesettozerooriginal-invokeID[4]Unsigned(0..225)【初始的调用ID】sequencenumber[5]Unsigned(0..255)OPTIONAL,--onlyifsegment【序列号】proposed-window-size[6]Unsigned(0..127)OPTIONAL,--onlyifsegment【预设窗口尺寸】service-ACK-choice[7]BACnetConfirmedServiceChoice,【服务确认选择】service-ACK[8]BACnet-Confirmed-Service-ACK【服务确认】--在头部编码中不使用上下文特定标记0..8}BACnet复杂确认PDU的参数的意义如下所述。20.1.5.1报文分段(segmented-message)参数184这个参数包含在当前PDU中,指明有证实服务响应是完整的还是仅是一部分。如果当前的响应PDU是一个整体,则‘segmented-message’参数值应为FALSE。如果当前PDU仅包含了响应的一段,则该参数值应为TRUE20.1.5.2后继(more-follows)参数只有‘segmented-message’参数值为TRUE时,‘more-follows’参数才有意义。如果‘segmented-message’为TRUE,则除了最后一段之外的所有组成有证实服务响应的段的‘more-follows’参数值都是TRUE,最后一段的‘more-follows’的参数值为FALSE。如果‘segmented-message’参数值为FALSE,则‘more-follows’参数被编码器置为FALSE,而解码器忽略这个参数。20.1.5.3初始的调用ID(original-invokeID)参数这个参数是包含在正在被确认的有证实服务请求中的‘invokeID’参数。一个分段确认的所有分段都使用一个相同的‘original-invokeID’参数。20.1.5.4序列号(sequence-number)参数如果‘segmented-message’参数为TRUE,则存在可选参数‘sequence-number’,这个参数是无符号整型类型,取值范围是0-256,连续递增变化,模256。这个参数标示分段响应的每一个分段,请求设备根据收到的‘sequence-number’值确定这个分段是否已收到。分段响应的第一分段的‘sequence-number’值为0。20.1.5.5预设窗口尺寸(proposed-window-size)参数如果‘segmented-message’参数为TRUE,则存在可选参数‘proposed-window-size’,这个参数是无符号二进制整数,取值范围是1-127,指定包含‘original-invokeID’的报文分段的最大数目,这个值是发送设备在等待分段确认PDU之前能够发送的最大报文分段的数目。(参见5.2节和5.3节)。20.1.5.6服务确认选择(service-ACK-choice)参数这个参数包含BACnet有证实服务选择的值,这里的BACne有证实服务选择是对包含在先前的、导致这个确认的BACnet有证实服务请求中的服务而言的。20.1.5.7服务确认(service-ACK)参数这个参数包含特定服务确认的参数,它的编码是根据20.2节中的规则进行的。这些参数在本标准的每个服务规范中定义,在21节,使用ASN.1规则对它们进行了详细规定。20.1.5.8BACnet复杂确认PDU的格式BACnet-ComplexACK-PDU的格式如下:185PDU域的值如下:PDUType=3(BACnet-ComplexACK-PDU)SEG=0(UnsegmentedRequest)=1(segmentedRequest)MOR=0(NoMoreSegmentsFollow)=1(MoreSegmentsFollow)OriginalInvokeID=(0..255)SequenceNumber=(0..255)只有当SEG=1时才存在ProposedWindowSize=(0..127)只有当SEG=1时才存在ServiceACKChoice=BACnetConfirmedServiceChoiceServiceACK=VariableEncodingper20.2上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.6BACnet分段确认PDUBACnet分段确认PDU用于对收到一个或者多个PDU进行确认,这些PDU包含一个分段报文的分段。BACnet分段确认PDU也用于对分段报文的下一个或者几个分段的请求。BACnet-SegmentACK-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--4forthisPDUtypereserved[1]Unsigned(0..15),--mustbesettozeronegative-ACK[2]BOOLEAN【否定确认】server[3]BOOLEAN【服务器】original-invokeID[4]Unsigned(0..225)【初始的调用ID】sequencenumber[5]Unsigned(0..255)【序列号】actual-window-size[6]Unsigned(0..127)【实际窗口尺寸】--在头部编码中不使用上下文特定标记0..6}186BACnet分段确认PDU的参数的意义如下所述。20.1.6.1否定确认(negative-ACK)参数如果正在被发送的BACnet分段确认PDU指示收到的分段乱序,则这个参数为TURE,否则为FALSE。20.1.6.2服务器(server)参数如果BACnet分段确认PDU是一个服务器所发送的,即BACnet分段确认PDU是对一个有证实请求PDU的一个或者几个分段的确认,则这个参数为TURE。如果BACnet分段确认PDU是一个客户所发送的,即BACnet分段确认PDU是对一个复杂确认PDU的一个或者几个分段的确认,则这个参数为FALSE。20.1.6.3初始的调用ID(original-invokeID)参数这个参数是包含在正在被确认的分段中的‘invokeID’参数。20.1.6.4序列号(sequence-number)参数这个参数是先前收到的报文分段的‘sequence-number’参数。这个参数用于对本参数标明的报文分段以及这个分段之前的所有分段的正确接收的确认。如果接收的报文分段的‘more-follows’参数为TRUE,则‘sequence-number’参数也表示请求接收其‘sequence-number’参数值为(1+本参数值,模256)开始的后续报文分段。20.1.6.5实际窗口尺寸(actual-window-size)参数这个参数是无符号二进制整数,取值范围是1-127,指定包含‘original-invokeID’的报文分段的最大数目,这个值是发送设备在发送另一个分段确认PDU之前能够接收的最大报文分段的数目。(参见5.3节)。20.1.6.6BACnet分段确认PDU的格式BACnet-SegmentACK-PDU的格式如下:这个APDU总是具有四个字节。PDU域的值如下:PDUType=4(BACnet-segmentACK-PDU)NAK=0(NormalAcknowledgement)187=1(NegativeAcknowledgement,SegmentOutOrder)SRV=0(SentbyClient)=1(SentbyServer)OriginalInvokeID=(0..255)SequenceNumber=(0..255)ActualWindowSize=(0..127)上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.7BACnet差错PDUBACnet差错PDU用于传送包含在一个服务响应原语(‘Result(+)’)中的信息,这个信息指出前一个服务请求完全失败的原因。BACnet-Error-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--5forthisPDUtypereserved[1]Unsigned(0..15),--mustbesettozerooriginal-invokeID[2]Unsigned(0..225),error-choice[3]BACnetConfirmedServiceChoiceerror[4]BACnet-Error--在头部编码中不使用上下文特定标记0..4}BACnet差错PDU的参数的意义如下所述。20.1.7.1初始调用ID(original-invokeID)参数这个参数是包含在这个PDU进行差错响应的有证实服务请求中的‘invokeID’。20.1.7.2差错选择(error-choice)参数这个参数是BACnet有证实服务选择(BACnetConfirmedServiceChoice)类型,包含BACnet差错(BACnet-Error)选择的标记值。参见21节。20.1.7.3差错(error)参数这个参数是BACnet差错(BACnet-Error)类型,指出指定的服务请求不能被执行的原因。此参数采用20.2中的规则进行编码。20.1.7.4BACnet差错PDU的格式BACnet-Error-PDU的格式如下:188PDU域的值如下:PDUType=5(BACnet-Error-PDU)OriginalInvokeID=(0..255)Error-choice=BACnetConfirmedServiceChoiceError=VariableEncodingper20.2上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.8BACnet拒绝PDUBACnet拒绝PDU用于对一个有证实请求PDU的拒绝接收,其原因是这个被拒绝的PDU具有句法结构错误或者其它的协议错误,使得不能对这个PDU进行解读,或者不能够提供请求的服务。只能对有证实请求PDU进行拒绝(参见18.8节)。BACnet-Reject-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--6forthisPDUtypereserved[1]Unsigned(0..15),--mustbesettozerooriginal-invokeID[2]Unsigned(0..225),rejectreason[3]BACnetRejectReason--在头部编码中不使用上下文特定标记0..3}BACnet拒绝PDU的参数的意义如下所述。20.1.8.1初始调用ID(original-invokeID)参数这个参数是正在被拒绝的PDU的‘invokeID’。20.1.8.2拒绝原因(reject-reason)参数这个参数是BACnet拒绝原因(BACnetRejectReason)类型,包含正在被拒绝的具有指定的‘invokeID’189的PDU被拒绝的原因。20.1.8.3BACnet拒绝PDU的格式BACnet-Reject-PDU的格式如下:这个PDU总是具有三个字节。PDU域的值如下:PDUType=6(BACnet-Reject-PDU)OriginalInvokeID=(0..255)RejectReason=Oneoctetcontainingtherejectreasonenumeration上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.1.9BACnet中止PDUBACnet中止PDU用于结束两个对等实体之间的事务处理。BACnet-Abort-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--7forthisPDUtypereserved[1]Unsigned(0..7),--mustbesettozeroserver[2]BOOLEAN,original-invokeID[3]Unsigned(0..225),abortreason[4]BACnetAbortReason--在头部编码中不使用上下文特定标记0..4}BACnet中止PDU的参数的意义如下所述。20.1.9.1服务器(server)参数如果BACnet中止PDU是服务器发送的,则这个参数为TURE。如果BACnet中止PDU是客户发送的,这个参数为FALSE。20.1.9.2初始的调用ID(original-invokeID)参数这个参数是正在被中止的事务的‘invokeID’。19020.1.9.3中止原因(abort-reason)参数这个参数是BACnet中止原因(BACnetAbortReason)类型,包含具有指定‘invokeID’的事务处理被中止的原因。20.1.9.4BACnet中止PDU的格式BACnet-Abort-PDU的格式如下:这个PDU总是具有三个字节。PDU域的值如下:PDUType=7(BACnet-Abort-PDU)SRV=0(SentbyClient)=1(SentbyServer)OriginalInvokeID=(0..255)上面列表中的‘0’位设置为零值。这些位目前不用,保留为ASHRAE所用。20.2BACnetAPDU的可变部分的编码(首先参考20.2.12日期值的编码,容易理解)在20.1节中已经对BACnetAPDU的头部编码进行了详细规范,本节详细规范BACnetAPDU可变部分的编码。可变部分也称之为“服务参数(serviceparameters)”,这些参数的类型为:BACnet有证实服务请求类型,BACnet无证实服务请求类型,BACnet有证实服务确认类型,和BACnet差错类型。在21节中使用ASN.1的表述方法对每一个参数进行了明确的定义。服务参数中所有的数据元素都使用称之为“标记(tag)”构件进行标识。每一个标记都对应着一个唯一的参数或子参数。BACnet编码使用两类标记。第一类标记标识本标准定义和使用的基本数据类型,例如布尔类型、无符号整型、字符串类型、日期类型、时间类型、或者BACnet对象标识符类型。如果数据类型用大写字母表示,其语义与对应的ANS.1中相同名称的通用数据类型相同,这些在21节中已经指出。这样的标记称之为“应用”标记,在20.2.1.4节中对标记的值进行详细说明。第二类标记用于标识这样的数据元素,它们的数据类型可以从它们所处位置的上下文推导出来。这种标记称为“上下文特定(contextspecific)”标记。ANS.1定义另外两种类型的标记,称之为“通用的”和“私有的”。BACnet所采用的编码方案不允许使用这种标记,BACnetASN.1的编码表述也不要求使用这种类型的标记。在有些实例中,某个参数的数据类型不能从它所处位置的上下文推导出来。在这种情况下,就需要一个上下文标记和一个或者多个应用标记一起使用。这种情况在ANS.1表述中使用服务参数进行说明,而这些服务参191数的数据类型由关键词ABSTRACT-SYNTAX.&TYPE(ANY),CHOICE,SEQUENCE,或者SEQUENCEOF标明。下面给出每种标记元素的标识、长度规定以及值的编码。20.2.1BACnet标记编码的一般规则BACnet标记的编码是一个主字节,后续0个或者多个条件的字节。主字节定义如下:其中:TagNumber=thetagnumberwiththeclass【标记编号】Class=theclassoftag(applicationorcontextspecific)【类别】Length/Value/Type=wherethedatafollowingthetagisprimitiveorconstructedandspecifiesthelengthorvalueofprimitivedata.【长度/值/类型】20.2.1.1类别(Class)如果是应用标记,则类别比特位的值是0。如果是上下文特定标记,则类别比特位的值是1。20.2.1.2标记编号(TagNumber)对于取值为0到14(包括14)的标记编号,在主字节中表示,4-7四个比特位是标记编号域,其中第7比特位是高位。对于取值为15到254(包括254)的标记编号,则在主字节的标记编号域取值为B’1111’,在主字节其后紧跟一个字节,8个比特位全部用来表示标记编号,其中第7位是高位。编码不允许、BACnet也不要求标记编号大于254。在后续字节中,值B’11111111’保留为ASHRAE所用。20.2.1.3长度/值/类型(Length/Value/Type)主字节的长度/值/类型域的内容用于区别原语编码和构件编码,并且标明原语数据的值或者长度。原语编码是数据中不包含其它标记编码的编码,构件编码是数据中包含有其它标记编码的编码。20.2.1.3.1原语数据(PrimitiveData)如果被编码数据是应用类别的布尔数据,则当布尔值为FALSE时,设置主字节的长度/值/类型域为B’000’;当布尔值为TRUE,设置主字节的长度/值/类型域为B’001’。通过这种方式,完成对布尔值的原语数据的编码,长度/值/类型域表示的是值。如果被编码数据是原语编码(也就是非构件编码),而且不是应用类别布尔数据,则数据的值按照20.2.2节到20.2.14节中所述的规则进行编码。主标记字节的长度/值/类型域标明原语数据的长度,规则如下:如果数据长度为0到4(包括4)个字节,则在主字节的长度/值/类型域内使用3个比特位表示的二进制整数进行编码,其中第2比特位是高位。192如果数据长度为5到253(包括253)个字节,则将主字节的长度/值/类型域的值设置为B’101’,随后紧跟一个字节,全部8个比特位用来表示一个二进制整数,表示数据的长度,其中第7比特位为高位。如果标记编号的取值为15到254(包括254),则紧跟主字节之后的是一个标记编号扩展字节(参见20.2.1.2节),所以,表示数据长度的字节紧跟在标记编号扩展字节之后。如果数据长度为254到65535(包括65535)个字节,则将主字节的长度/值/类型域的值设置为B’101’,随后紧跟一个字节,其值取为D’254’,其后再附加2个字节,全部16个比特位用来表示一个二进制整数,表示数据的长度,其中第1个字节为高位字节。如果标记编号的取值为15到254(包括254),则紧跟主字节之后的是一个标记编号扩展字节(参见20.2.1.2节),所以,表示数据长度的字节紧跟在标记编号扩展字节之后。如果数据长度为65536到232-1(包括232-1)个字节,则将主字节的长度/值/类型域的值设置为B’101’,随后紧跟一个字节,其值取为D’255’,其后再附加4个字节,全部32个比特位用来表示一个二进制整数,表示数据的长度,其中第1个字节为高位字节。如果标记编号的取值为15到254(包括254),则紧跟主字节之后的是一个标记编号扩展字节(参见20.2.1.2节),所以,表示数据长度的字节紧跟在标记编号扩展字节之后。大于232-1的数据不能用原语标记编码。注:除了8字节的1EEE-754双精度浮点数和特定的比特、字节及字节串之外,BACnet应用标记原语的长度适合于标记字节,不需要扩展。20.2.1.3.2构件数据(ConstructedData)如果被编码的数据结构中包含有标记元素,则这种编码称为“构件”,它由以下几部分组成:(a)一个“opening”标记。这个标记的标记编号域包含标记编号的值,类别域标识为“上下文特定”,长/值/类型域的值为B’110’;(b)完整的编码。这个编码具有标记和组成数据的0个、1个或者多个元素;(c)一个“closing”标记。这个标记的类别域和标记编号域的值与“opening”标记的相同,而它的长/值/类型域的值为B’111’。在这种情况下,“opening”标记和“closing”标记的长度/值/类型域的值表示的是类型。注:一个被包含的标记元素可能自身就是一个构件元素,这种循环并不会导致编码混淆,因为每一个“opening”标记都必须有一个相应的“closing”标记,构件元素的“opening”标记和“closing”标记包含在每个外部的“opening”标记和“closing”标记之内。20.2.1.4应用标记(ApplicationTags)编码的BACnet应用标记的标记编号域表示应用数据类型,参数分配如下:标记编号:1930=Null1=Boolean2=UnsignedInteger3=SignedInteger(2’complementnotation)4=Real(ANSI/IEEE-754floatingpoint)5=Double(ANSI/IEEE-754doubleprecisionfloatingpoint)6=OctetString7=CharacterString8=BitString9=Enumerated10=Data11=Time12=BACnetObjectIdentifier13,14,15=ReservedforASHRAE注:所有当前定义的BACnet应用数据类型都是原语编码。20.2.1.5上下文特定标记(Context-SpecificTags)编码的BACnet上下文特定标记的标记编号域包含上下文特定标记编号的值。由上下文特定标记标定的数据类型可以是原语编码,也可以是构件编码。20.2.2空值的编码(EncodingofaNullValue)空值表示一个无内容字节,空值是原语编码。例程:Application-taggednullvalueASN.1=NULLApplicationTag=Null(TagNumber=0)EncodedTag=X’00’20.2.3布尔值的编码(EncodingofaBooleanValue)应用标记的布尔值在一个单字节中编码,如果编码的值是FALSE,则设置长度/值/类型域为B’000’;如果编码的值为TRUE,则设置长度/值/类型域为B’001。例程:Application-taggedBooleanvalueASN.1=BOOLEANValue=FALSEApplicationTag=Boolean(TagNumber=1)EncodedTag=X’10’上下文特定标记的布尔值原语数据包含一个内容字节。如果编码的值为FALSE,则这个字节为194B’00000000’;如果编码的值为TRUE,则这个字节为B’00000001’。例程:Context-taggedBooleanvalueASN.1=[2]BOOLEANValue=TRUEContextTag=2EncodedTag=X’29’EncodedData=X’01’注:在编码中,布尔数据类型的编码方式与其它的数据类型不同,表现在上下文特定标记的布尔值的编码和应用标记的布尔值的编码不一样。这样做的原因是,应用标记的值在一个单字节中编码,没有内容字节,而如果要在上下文特定标记的情况下使用与应用标记相同的编码值,则为了区分在长度/值/类型域中的内容是长度还是值,必须知道上下文关系,这是不希望出现的情况。参见20.2.20节。20.2.4无符号整型数值的编码(EncodingofaUnsignedIntegerValue)无符号整型数值是原语编码,具有至少一个内容字节。无符号整型数值在内容字节中被编码成为一个取值范围为0到(28L–1)的二进制数,其中L是用于对这个值编码的字节数,L至少为1。被编码成多个字节的值在传送时,先从高位字节传送。所有无符号整数都应该尽可能地用最少的字节数来编码。也就是说,每一个多字节编码值的第一个字节都不应该是X’00’。例程:Application-taggedunsignedintegerASN.1=UnsignedValue=72ContextTag=UnsignedInteger(TagNumber=2)EncodedTag=X’21’EncodedData=X’48’20.2.5有符号整型数值的编码(EncodingofaSignedIntegerValue)有符号整型数值是原语编码,具有至少一个内容字节。有符号整型数值在内容字节中被编码成为一个取值范围为-2(8L)到(28L–1)的、使用2的补码标记的二进制数,其中L是用于对这个值编码的字节数,L至少为1。被编码成多个字节的值在传送时,先从高位字节传送。所有有符号整数都应该尽可能地用最少的字节数来编码。也就是说,对于每一个多字节编码值来说,如果第二个字节的最高位比特(比特7)是0,则第一个字节不应该是X’00’,如果第二个字节的最高位比特是1,则第一个字节不应该是X’FF’。例程:Application-taggedsignedintegerASN.1=INTEGERValue=72ApplicationTag=SignedInteger(TagNumber=3)EncodedTag=X’31’195EncodedData=X’48’20.2.6实数的编码(EncodingofaRealNumberValue)实数是原语编码,具有4个内容字节。实数使用ASN.1L/IEEE标准754-1985中规范的方法,“IEEEStandardforBinaryFloating-PointArithmetic”,进行编码。对于细节问题应该参考这个标准。在传送这个多字节编码值时,先从最高位字节(符号和指数)传送。单精度实数的编码格式如下:其中,域长度的数值是比特数。使用方程式v=(-1)s2e-127(1·f)表示非零值,其中,符号·表示二进制点。在方程式中,设置s、e和f为0,表示零。例程:Application-taggedsingleprecisionrealASN.1=REALValue=72.0ApplicationTag=Real(TagNumber=4)EncodedTag=X’44’EncodedData=X’42900000’20.2.7双精度实数的编码(EncodingofaDoublePrecisionRealNumberValue)双精度实数是原语编码,具有8个内容字节。双精度实数使用ASN.1L/IEEE标准754-1985中规范的方法,“IEEEStandardforBinaryFloating-PointArithmetic”,进行编码。对于细节问题应该参考这个标准。在传送这个多字节编码值时,先从最高位字节(符号和指数)传送。双精度实数的编码格式如下:其中,域长度的数值是比特数。使用方程式v=(-1)s2e-1023(1·f)表示非零值,其中,符号·表示二进制点。在方程式中,设置s、e和f为0,表示零。例程:Application-taggeddoubleprecisionrealASN.1=DoubleValue=72.0ApplicationTag=Double(TagNumber=5)EncodedTag=X’55’196EncodedData=X’4052000000000000’BACnet不支持ASNI/IEEE-754扩展精度格式。20.2.8字节串值的编码(EncodingofaOctetStringValue)字节串值是原语编码。字节串的编码包含0个、1个或者多个内容字节,其字节数等于它们的数据值的字节数,其顺序与它们的数据值表示的顺序一样,数据值中的一个字节的最高位与内容字节中的一个字节的最高位对应。例程:Application-taggedoctetstringASN.1=OCTETValue=X‘1234FF’ApplicationTag=OctetString(TagNumber=6)EncodedTag=X’63’EncodedData=X’1234FF’20.2.9字符串值的编码(EncodingofaCharacterStringValue)字符串是原语编码。字符串的编码包含一个主内容字节和0个、1个或者多个附加内容字节,这些字节等于它们的数据值的字节,其顺序与它们的数据值表示的顺序一样,也就是说,最高位的字节在先,数据值中的一个字节的最高位与内容字节中的一个字节的最高位对应。主字节用下面编码表示字符集:X’00’ANSIX3.4X’01’IBM/MicrosoftDBCSX’02’JISC6226X’03’ISO10646(UCS-4)X’04’ISO10646(UCS-2)X’05’ISO8859-1主字节的其它值都被保留为ASHRAE所用。例程:Application-taggedcharaterstringASN.1=CharacterStringValue=“ThisisaBACnetstring”(ANSIX3.4)ApplicationTag=CharacterString(TagNumber=6)EncodedTag=X’75’LengthExtension=X’19’CharacterSet=X’00’EncodedData=X’546869732069732061204241436E657420737472696E6721’在IBM/MicrosoftDBCS(X’01’)的情况下,主字节后紧跟着两个附加字节,这两个附加字节是无符号整数,高位字节在先,它表示后面字符的设定代码页。197例程:Application-taggedcharacterstring(DBCS)ASN.1=CharacterStringValue=“ThisisaBACnetstring!”(IBM/MicrosoftDBCS,codepage850)ApplicationTag=CharacterString(TagNumber=7)EncodedTag=X’75’LengthExtension=X’1B’EncodedData=X’010352546869732069732061204241436E657420737472696E6721’在ISO10646UCS-2(X’04’)和UCS-4(X’03’)情况下,字符串的每个字符分别由两个或者四个字节表示。UCS-2的字节顺序是Row-Cell,而UCS-4的字节顺序是Group-Plane-Row-Cell。例程:Application-taggedcharacterstring(UCS-2)ASN.1=CharacterStringValue=“ThisisaBACnetstring!”(ISO10646UCS-2)ApplicationTag=CharacterString(TagNumber=7)EncodedTag=X’75’LengthExtension=X’31’EncodedData=X’040054006800690073002000690073002000610020004200410043006E0065007400200073007400720069006E00670021’20.2.10比特串值的编码(EncodingofaBitStringValue)比特串是原语编码。原语码的内容字节包含一个主字节和其后的0个或者多个字节,这些字节包含了比特位串。主字节编码成为一个无符号二进制整数,表示最后一个后续字节中未使用的比特的数目,未使用的比特的数目可以在0到7之间取值,包括0和7。本标准中定义的比特位串,例如,状态标志属性,按照定义的顺序编码,其被定义的第一个布尔值位于第一个后续字节的最高位比特位,即比特7。比特位串中的比特依次从第一个后续字节的第7到第0位顺序放置,然后是第二个字节的第7到0位,第三个字节的第7位到第0位,等等,直到放置完所有比特的最后一个后续字节,都是从第7位开始。如果比特位串是个空位串,则没有后续字节,且主字节为0。例程:Application-taggedbitstringASN.1=BITSTRINGValue=B’10101’ApplicationTag=BitString(TagNumber=8)EncodedTag=X’82’EncodedData=X’03A8’20.2.11枚举值的编码(EncodingofaEnumeratedValue)枚举值是原语编码,具有至少一个内容字节。198枚举值在内容字节中被编码成为一个取值范围为0到(28L–1)的二进制数,其中L是用于对这个值编码的字节数,L至少为1。被编码成多个字节的值在传送时,先从高位字节传送。所有枚举值都应该尽可能地用最少的字节数来编码。也就是说,任何一个多字节编码值的第一个字节都不应该是X’00’。例程:Application-taggedenumerationASN.1=BACnetObjectTypeValue=ANALOG-INPUT(0)ApplicationTag=Enumerated(TagNumber=9)EncodedTag=X’91’EncodedData=X’00’20.2.12日期值的编码(EncodingofaDateValue)日期值是原语编码,具有4个内容字节。日期值在内容字节中被编码成为四个二进制整数,第一个字节表示年份减去1900;第二个字节表示月份,一月用1表示;第三个字节表示月中的日;第四个字节表示星期,星期一用1表示。这四个字节中只要有一个字节中的值为X’FF’=D’255’,则表示该值超出规定的范围。如果四个字节都等于X’FF’,则对应的日期表示“任意”或者“不必管”。例程:Application-taggeddatevalueASN.1=DateValue=January24,1991(Dayofweek=Thursday)ApplicationTag=Date(TagNumber=10)EncodedTag=X’A4’EncodedData=X’5B011804’20.2.13时间值的编码(EncodingofaTimeValue)时间值是原语编码,具有4个内容字节。时间值在内容字节中被编码成为四个二进制整数,第一个内容字节表示小时,这里采用24小时制(1P.M=D’13’);第二个字节表示小时内的分钟;第三个字节表示分钟内的秒钟;第四个字节表示一秒的百分之几。这四个字节中只要有一个字节的值为X’FF’=D’255’,则表示该值超出了规定的范围。如果四个字节都等于X’FF’,则对应的时间表示“任意”或者“不必管”。例程:Application-taggedtimevalueASN.1=TimeValue=5:35:45.17P.M.=17:35:45.17ApplicationTag=Time(TagNumber=11)EncodedTag=X’B4’EncodedData=X’11232D11’19920.2.14对象标识符值的编码(EncodingofanObjectIdentifierValue)一个BACnet对象标识符的值由两部分组成:(1)一个10比特的对象类型,表示对象的BACnet对象类型属性值,其中比特9是最高位,比特0是最低位。对于本标准定义的对象,这个域值由21节所述的BACnet对象类型枚举值确定。(2)一个22比特的对象实例编号,其中比特21是最高位,比特0是最低位。对象标识符值是原语编码,具有4个内容字节,表示如下:比特9至比特2所表示的对象类型被编码成为第一个内容字节的第7位至第0位,而比特1至比特0所表示的对象类型被编码成为第二个内容字节的第7位至第6位。比特21至比特16所表示的对象实例被编码成为第二个内容字节的第5位至第0位,比特15至比特8所表示的对象实例编码成为第三个内容字节的第7位至第0位,比特7至比特0所表示的对象实例被编码成为第四个内容字节的第7位至第0位。例程:Application-taggedobjectidentifiervalueASN.1=ObjectIdentifierValue=(BinaryInput,15)ApplicationTag=ObjectIdentifier(TagNumber=12)EncodedTag=X’C4’EncodedData=X’00C0000F’20.2.15标记值的编码(EncodingofaTaggedValue)标记值的编码由对应的数据值的完整编码推导而得。ISO8824定义了关键字“隐式(IMPLICIT)”和“显式(EXPLICIT)”,缺省为显式。第21节,使用“隐式标记定义(DEFINITIONIMPLICITTAGS)”作为开始,将缺省值改变成为隐式。BACnetASN.1的定义都采用这种缺省方式,只是在作为强制实行时,才使用显式。如果“显式”关键字用于类型的表述中,则编码是构件编码,内容字节是包含标记的完整基本编码。如果“显式”关键字没有被用于类型的定义中,则a)如果基本代码是构件代码,则类型定义为构件编码,否则,是原语编码,或者b)如果基本代码不是原语标记应用布尔类别,则内容字节应和基本代码的内容字节相同,或者c)如果基本代码是原语标记应用布尔类别,则内容字节用值B’00000000’表示布尔值为FALSE,用值B’00000001’表示布尔值TRUE。下面的例程所表示的上下文标记编号仅用来说明目的。200例程:Context-taggednullvalueASN.1=[3]NULLEncodedTag=3EncodedData=X’38’例程:Context-taggedBooleanvalueASN.1=[6]BOOLEANValue=FALSEContextTag=6EncodedTag=X’69’EncodedData=X’00’例程:Context-taggedunsignedintegerASN.1=[0]UnsignedValue=256ContextTag=0EncodedTag=X’0A’EncodedData=X’0100’例程:Context-taggedsignedintegerASN.1=[5]INTEGERValue=-72ContextTag=5EncodedTag=X’59’EncodedData=X’B8’例程:Context-taggedsingleprecisionrealASN.1=[0]REALValue=-33.3ContextTag=0EncodedTag=X’0C’EncodedData=X’C2053333’例程:Context-taggeddoubleprecisionrealASN.1=[1]DoubleValue=-33.3ContextTag=0EncodedTag=X’1D’ExtendedLength=X’08’201EncodedData=X’C040A66666666666’例程:Context-taggedoctetstringASN.1=[1]OctetStringValue=X’4321’ContextTag=1EncodedTag=X’1A’EncodedData=X’4321’例程:Context-taggedcharacterstringASN.1=[5]CharacterStringValue=“ThisisaBACnetstring!”(ANSIX3.4)ContextTag=5EncodedTag=X’5D’LengthExtension=X’19’CharacterSet=X’00’(ASNIX3.4)EncodedData=X’546869732069732061204241436E657420737472696E6721’例程:Context-taggedbitstringASN.1=[0]BITSTRINGValue=B’10101’ContextTag=0EncodedTag=X’0A’UnusedBitsinLastOctet=X’08’EncodedData=X‘A8’例程:Context-taggedenumerationASN.1=[9]BACnetObjectTypeValue=ANALOG-INPUT(0)ContextTag=9EncodedTag=X’99’EncodedData=X’00’例程:Context-taggeddatevalueASN.1=[9]DateValue=January24,1991(Dayofweek=Thursday)ContextTag=9EncodedTag=X’9C’EncodedData=X’5B011805’202例程:Context-taggedtimevalueASN.1=[4]TimeValue=5:35:45.17P.M.=17:35:45.17ContextTag=4EncodedTag=X’4C’EncodedData=X’11232D11’例程:Context-taggedobjectidentifiervalueASN.1=[4]ObjectIdentifierValue=(BinaryInput,15)ContextTag=4EncodedTag=X’4C’EncodedData=X’00C0000F’20.2.16序列值的编码(EncodingofaSequenceValue)序列值的编码由包含标记的完整编码组成,这个编码是由每一个列于ASN.1表述的序列类型中的一个数据值的编码所得来的,其顺序与出现在定义中的顺序相同,只有在引用类型时使用了关键字“可选的”这种情况除外。对于使用了关键字“可选的”引用的类型,其数据值的编码可以存在,但是并不是必需的。如果编码存在,则它在编码中所处于的位置应和相应的ASN.1定义的类型出现的位置相同。例程:SEQUENCEvalueASN.1=BACnetDateTimeValue=January24,1991,5:35:45.17P.M.ApplicationTag=Date(TagNumber=9)EncodedTag=X’94’EncodedData=X’5B011805’ApplicationTag=Time(TagNumber=10)EncodedTag=X’A4’EncodedData=X’11232D11’例程:Context-taggedSEQUENCEvalueASN.1=[0]BACnetDateTimeValue=January24,1991,5:35:45.17P.M.ContextTag=0EncodedTag=X’0E’(openingtag)ApplicationTag=Date(TagNumber=9)EncodedTag=X’94’203EncodedData=X’5B011805’ApplicationTag=Time(TagNumber=10)EncodedTag=X’A4’EncodedData=X’11232D11’EncodedTag=X’0F’(closingtag)包含构件元素的所有序列的ASN.1表述都有明确的标记,这样才能进行准确的编码和解码。下面的例程表示出这种要求。(incorrectusage)Var1::=SEQUENCE{varn1SEQUENCE{varn2[1]INTEGER,varn3[2]INTEGEROPTIONAL},varn4SEQUENCE{varn5[1]INTEGEROPTIONALvarn6[2]INTEGER}}(correctusage)Var1::=SEQUENCE{varn1SEQUENCE{varn2[1]INTEGER,varn3[2]INTEGEROPTIONAL},varn4SEQUENCE{varn5[3]INTEGEROPTIONALvarn6[4]INTEGER}}20.2.17Sequence-Of值的编码(EncodingofaSequence-OfValue)Sequence-Of值的编码由0个、1个或者多个包含标记的完整编码组成,这些编码是由列于ASN.1定义的类型中的数据值的编码所得来的。数据值的编码顺序和在被编码的sequence-of之中的数据值的顺序一致。例程:SEQUENCEOFprimitivedata204ASN.1=SEQUENCEOFINTEGERValue=1,2,4ApplicationTag=UnsignedInteger(TagNumber=2)EncodedTag=X’21EncodedData=X’01’ApplicationTag=UnsignedInteger(TagNumber=2)EncodedTag=X’21’EncodedData=X’04’例程:Context-taggedSEQUENCEOFprimitivedataASN.1=[1]SEQUENCEOFINTEGERValue=1,2,4EncodedTag=X’1E’(openingtag)ApplicationTag=UnsignedInteger(TagNumber=2)EncodedTag=X’21’EncodedData=X’01’ApplicationTag=UnsignedInteger(TagNumber=2)EncodedTag=X’21’EncodedData=X’01’EncodedTag=X’1F’(closingtag)例程:SEQUENCEOFconstructeddataASN.1=SEQUENCEOFBACnetDateTimeValue=(January24,1991,5:00P.M.),(January24,1991,6:45P.M.)ApplicationTag=Date(TagNumber=9)EncodedTag=X’94’EncodedData=X’5B011805’ApplicationTag=Time(TagNumber=10)EncodedTag=X’A4’EncodedData=X’11000000’ApplicationTag=Date(TagNumber=9)EncodedTag=X’94’EncodedData=X’5B011805’ApplicationTag=Time(TagNumber=10)EncodedTag=X’A4’EncodedData=X’122D0000’20.2.18选择值的编码(EncodingofaChoiceValue)205选择值的编码和已选中的类型的值的编码相同,选择值可以是原语编码,也可以是构件编码,依据所选择的类型而定。例程:CHOICEofprimitivedataASN.1=BACnetTimeStampValue=5:35:45.17P.M.=5:35:45.17ContextTag=0(Choicefor‘time’inBACnetTimeStamp)EncodedTag=X’0C’EncodedData=X’11232D11’例程:CHOICEofconstructeddataASN.1=BACnetTimeStampValue=January24,1991,5:45.17P.M.ContextTag=2(Choicefor‘dateTime’inBACnetTimeStamp)EncodedTag=X’2E’(openingtag)ApplicationTag=Date(TagNumber=9)EncodedTag=X’94’EncodedData=X’5B011804’ApplicationTag=Time(TagNumber=10)EncodedTag=X’A4’EncodedData=X’11232D11’EncodedTag=X’2F’(closingtag)20.2.19ANY类型值的编码(EncodingofaValueoftheANYType)一个ANY类型值的编码是一个本标准规范的完整编码,其中用占位符ANY替代值类型。在ASN.1中的ABSTRACT-SYNTAX.&Type对这种编码进行了说明。20.2.20标记规则总结(SummaryoftheTaggingRules)虽然在不了解上下文的情况下不能够对一个BACnetPDU的标记部分进行解释,但是20.2节中对标记规则的描述,使得能够在不了解上下文的情况下,准确地解析一个具有标记的比特流。(a)一个比特流的第一个字节是一个标记,这个标记或者是上下文特定类别,或者是应用类别。(b)如果标记是应用类别,则根据20.2节中的定义,可以知道标记的数据的格式和内容。特别地,可以跳过数据,找出比特流中的下一个标记。(c)如果标记是上下文特定类别和原语编码,则它包含某种类型的原语数据(没有被标记)。标记的长度/值/类型域指定了这个数据的长度。这样,当数据的数据类型和格式不知道时,它的长度仍然可准确知道。这样就可以跳过数据,找出比特流中的下一个标记。(d)如果标记是构件编码(长度/值/类型=6),则它是一对标记的开始标记。跟在这个标记后面的是0个或者多个标记的元素,然后是这一对标记的结束标记(长度/值/类型=7)。在开始标记和结束标记之间的标记比特流也可以根据同样的四条规则来解析,其过程是循环递减的,直到找出原语标记,或者直到再没有标206记。21.应用层协议数据单元的正式描述本节给出ASN.1模块,这个模块定义所有的BACnetAPDU,及其数据类型。在13节至17节中有许多被定义为条件的或者可选的服务参数,这些参数在ASN.1的表述中都标注为OPTINAL,说明这些参数可以在PDU中存在,也可以不在PDU中存在。在ASN.l表述中只使用OPTIONAL标注,不改变在服务规范中对条件的参数的要求。BACnetModuleDEFINITIONSIMPLICITTAGS::=BEGIN--APDU定义BACnetPDU::=CHOICE{confirmed-request-PDU[0]BACnet-Confirmed-Request-PDU,unconfirmed-request-PDU[l]BACnet-Unconfirmed-Request-PDU,simpleACK-PDU[2]BACnet-SimpleACK-PDU,complexACK-PDU[3]BACnet-ComPlexACK-PDU,segmentAck-PDU[4]BACnet-SegmenACK-PDU,error-PDU[5]BACnet-Error-PDU,reject-PDU[6]BACnet-Reject-PDU,abort-PDU[7]BACnet-Abort-PDU}BACnet-Confirmed-Request-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用0segmented-message[1]BOOLEAN,more-follows[2]BOOLEAN,segmented-response-accepted[3]BOOLEAN,reserved[4]Unsigned(0..31),--必须设置为0max-APDU-length-accepted[5]Unsigned(0..15),--如20.1.2.4节所分配invokeID[6]Unsigned(0..255),sequence-number[7]Unsigned(0..255)OPTIONAL,--只在分段报文中使用proposed-window-size[8]Unsigned(1..l27)OPTIONAL,--只在分段报文中使用service-choice[9]BACnetConfirmedServiceChoice,service-request[10]BACnet-Confirmed-Service-RequestOPTIONAL--在头部编码中不使用上下文特定标记0..l0}207BACnet-Unconfirmed-Request-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用1reserved[l]Unsigned(0..l5),--必须设置为0service-choice[2]BACnetUnconfirmedServiceChoice,service-request[3]BACnet-Unconfirmed-Service-Request--在头部编码中不使用上下文特定标记0..3}BACnet-SimpleACKPDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用2reserved[l]Unsigned(0..l5),--必须设置为0invokeID[2]Unsigned(0..255),service-ACK-choice[3]BACnetConfirmedServiceChoice--在头部编码中不使用上下文特定标记0..3}BACnet-ComplexACK-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用3segmented-message[1]BOOLEAN,more-follows[2]BOOLEAN,reserved[3]Unsigned(0..3),--必须设置为0invokeID[4]Unsigned(0..255),sequence-number[5]Unsigned(0..255)OPTIONAL,--只在分段报文中使用proposed-window-size[6]Unsigned(1..l27)OPTIONAL,--只在分段报文中使用service-ACK-choice[7]BACnetConfirmedServiceChoice,service-ACKt[8]BACnet-Confirmed-Service-ACK--在头部编码中不使用上下文特定标记0..8}BACnet-SegmentACK-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用4reserved[1]Unsigned(0..3),--必须设置为0negative-ACK[2]BOOLEAN,server[3]BOOLEAN,original-invokeID[4]Unsigned(0..255),sequence-number[5]Unsigned(0..255),actual-window-size[6]Unsigned(1..127)--在头部编码中不使用上下文特定标记0..6}208BACnet-Error-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用5reserved[1]Unsigned(0..15),--必须设置为0original-invokeID[2]Unsigned(0..255),error-choice[3]BACnetConfirmedServiceChoice,error[4]BACnet-Error--在头部编码中不使用上下文特定标记0..4}BACnet-Reject-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用6reserved[1]Unsigned(0..15),--必须设置为0original-invokeID[2]Unsigned(0..255),reject-reason[3]BACnetRejectReason--在头部编码中不使用上下文特定标记0..4}BACnet-Abort-PDU::=SEQUENCE{pdu-type[0]Unsigned(0..15),--这个PDU类型使用7reserved[1]Unsigned(0..7),--必须设置为0server[2]BOOLEAN,original-invokeID[3]Unsigned(0..255),abort-reason[4]BACnetAbortReason--在头部编码中不使用上下文特定标记0..4}有证实服务的表述BACnetconfirmedserviceChoice::=ENUMERATED{--AlarmandEventServicesacknowledgeAlarm(0),confirmedCOVNotification(1),confirmedEventNotification(2),getAlarmSummny(3),getEnrollmentSummary(4),subscribeCOV(5),209--FileAccessServicesatomicReadFile(6),atomicWriteFile(7),--ObjectAccessServicesaddListElement(8),removeListElement(9),createobjeet(10),deleteObjeCt(11),readProperty(l2),readPropertyCondtional(l3),readProPertyMultiple(14),writeProperty(l5),writeProPertyMultiPle(l6),--RemoteDeviceManagementServicedeviceCommunicationControl(17),confirmedPrivateTransfer(l8),confirmedTestMessage(l9),reinitializeDevice(20),--VirtualTerminalServicesvtOpen(21),vtClose(22),vtData(23),--SecurityServicesauthenticate(24),requestKey(25)}--新定义的服务可以增加到上述的枚举类型中。本表述中的所有枚举值都保留为ASHRAE用作定义中。使用有证实专有转换服务或者无证实专有转换服务进行专有服务扩展。参见23节。BACnet-confirmed-Service-Request::=CHOICE{--AlarmandEventServicesacknowledgeAlarm[0]AckowledgeAlarm-Request,confirmedCOVNotification[1]ConfirmedCOVNotification-Request,confirmedEventNotification[2]ConfirmedEventNotification-Request,--getAlarmSummaryconveysnoparameters210getEnrollmentSummary[4]GetEnrollmentSummary-Requst,subscribeCOV[5]SubscribeCOV-Request,--FileAccessServicesatomicReadFile[6]AtomicReadFile-Request,atomicWriteFile[7]AtomicWritFile-Request,--ObjectAccessServicesaddListElement[8]AddListElement-Reqest,removeListElement[9]RemoveListElement-Request,createObject[10]CreateObect-Request,deleteObject[1l]DeleteObeCt-Request,readProperty[12]ReadPrOPrty-Request,readProPertyConditional[l3]ReadPropertyConditional-Request,readPropenyMultip1e[l4]ReadProPertyMultiple-Request,writeProperty[15]WriteProperty-Request,writeProPertyMultiPle[16]WriteProPertyMultiple-Request,--RemoteDeviceManagementServicesdeviceCommunicationControl[17]DeviceCommunicationControl-Requet,confirmedPrivateTransfer[18]ConfirmedPrivateTransfer-Request,confirmedTextMesssage[19]ConfirmedTextMessage-Requet,reinitializeDevice[20]ReinitializeDevice-Request,--VirtualTerminalServicesvtOpen[21]VT-Open-Request,vtClosc[22]VT-Close-Request,vtData[23]VT-DataRequest,--Securityservicesauthenticate[24]Anthenicate-Request,requestKey[25]RequestKey-Request}--在编码中没有使用上下文特定标记0..25。标记编号在BACnet有证实请求PDU中作为服务选择参数传送。--新定义的服务可以增加到上述的枚举类型中。本表述中的所有枚举值都保留为ASHRAE用作定义中。使用有证实专有转换服务进行专有服务扩展。参见23节。BACnet-Confirmed-Service-ACK::=CHOICE{--这个表述表示为每个有证实服务所定义的‘Result(+)’参数,这些服务在‘Result(+)’中返回一个或者多211个参数。--AlarmandEventServicesgetA1armSummary[3]GetAlarmSummary-ACK,getEnrollmentSummary[4lGetEnrolImentSummary-ACK,--FileAccessServicesatomicReadFile[6]AtomicReadFile-ACK,atomicWriteFile[7]AtomicWriteFile-ACK,--ObjectAccessServicescreateObject[l0]CreateObject-ACK,readProperty[12]ReadProperty-ACK,readPropertyConditional[13]ReadPropertyConditional-ACK,readProPertyMultiple[l4]ReadPropertyMultiPle-ACK,--RemoteDeviceManagementServicesconfirmedPrivateTransfer[l8]ConfirmedPrivateTransfer-ACK,--VirtualTerminalServicesvtOpen[21]VT-Open-ACK,vtData[23]VT-Data-ACK,--SecurityServicesauthenticate[24]Authenticate-ACK--在编码中没有使用上下文特定标记3..24。标记编号在BACnet复杂确认PDU中作为服务确认选择参数传送。--新定义的服务可以增加到上述的枚举类型中。本表述中的所有枚举值都保留为ASHRAE用作定义中。使用有证实专有转换服务进行专有服务扩展。参见23节。}--有证实报警和事件服务AcknowledgeAlarmRequest::=SEQUENCE{acknowledgingProcessIdentifier[0]Unsigned,eventObjectIdentifier[1]BACnetObjectIdentifier,evenStateAcknowledged[2]BACnetEventState,timeStamp[3]BACnetTimeStamp,acknowledgmenSource[4]CharacterString,timeOfAcknowledgment[5]BACnetTimeStamp212}ConfirmedCOVNotification-Request::=SEQUENCE{subscriberProcessIdenifier[0]Unsigned,initiatingDeviceIdenifier[1]BACnetObjectIdentifier,monitoredObjectIdenifier[2]BACnetObectIdenifier,timeRemaining[3]Unsigned,listOfValues[4]SEQUENCEOFBACnetPropertyValue}ConfirmedEventNotification-Request::=SEQUENCE{processIdentifier[0]Unsigned,initiatingDeviceIdentifier[l]BACnetObjectIdentifier,eventObjectIdentifier[2]BACnetObectIdentifier,timeStamp[3]BACnetTimeStamp,notificationClass[4]Unsigned,priority[5]Unsigned8,eventType[6]BACnetEventType,messageText[7]CharacterStringOPTIONAL,notifyType[8]BACnetNotifyType,ackRequired[9]BOOLEANOPTIONALfromState[l0]BACnetEventStateOPTIONALtoState[11]BACnetEVentStateOPTIONAL.eventValues[l2]BACnetNotificationParametersOPTIONAL}GotAlarmSummary-ACK::=SEQUENCEOFSEQUENCE{objectIdentifierBACnetObjectIdentifier,alarmStateBACnetEventState.acknowledgedTransitionsBACnetEventTransitionBits}GotEnrollmentSummary-Request::=SEQUENCE{acknowledgementFilter[0]ENUMERATED{all(0),acked(1),not-acked(2)},enrollmentFilter[l]BACnetRecipientProcessOPTIONAL,213eventStateFilter[2]ENUMERATED{offnormal(0),fault(l),normal(2),all(3),active(4)}OPTIONAL,eventTypeFilter[3]BACnetEvenTypeOPTIONAL,priorityFilter[4]SEQUENCE{minPriority[0]Unsigned8,maxPriority[l]Unsigned8}OPTIONAL,notificationClassFilter[5]UnsignedOPTIONAL}GetEnrolImentSummary-ACK::=SEQUENCEOFSEQUENCE{objectIdentifierBACnetObjectIdenifier,eventTyPeBACnetEvenType,eventStateBACnetEventStatepriorityUnsigned8,notificationClassUnsignedOPTIONAL}SubscribeCOV-Request::=SEQUENCE{subscriberProcessIdentifier[0]Unsigned,monitoredObectIdentifier[l]BACnetObjectIdentifier,issueConfirmedNotifications[2]BOOLEANOPTIONAL,lifetime[3]UnsignedOPTIONAL}--有证实文件访问服务AtomicReadfile-Request::=SEQUENCE{fileIdentifierBACnetObectIdentifier,accessMethodCHOICE{streamAccess[0]SEQUENCE{fileStartPositionINTEGER,requestedOctetCountUnsigned},214recordAccess[l]SEQUENCE{fileStartRecordINTEGER,requestedRecordCountUnsigned}}}AtomicReadfile-ACK::=SEQUENCE{endOfFileBOOLEAN,accessMethodCHOICE{streamAccess[0]SEQUENCE{fileStartPositionINTEGER,fileDataOCTETSTRING},recordAccess[l]SEQUENCE{fileStartRecordINTEGER,returnedRecordCountUnsigned,fileRecordDareSEQUENCEOFOCTETSTRING}}}AtomicWriteflle-Request::=SEQUENCE{fileIdentifierBACnetObjectIdenifier,accessMethodCHOICE{streamAccess[0]SEQUENCE{fileStartPositinnINTEGER,fileDataOCTETSTRING},recordAccess[l]SEQUENCE{fileSartRecordINTEGER,recordCOuntUnsigned,fileRecordDataSEQUENCEOFOCTETSTRING}}}AtomicWriteFile-ACK::=CHOICEfileStartPosition[0]INTEGER,215fileStartRecord[l]INTEGER}--有证实对象访问服务AddListElement-Request::=SEQUENCE{objectIdenifier[0]BACnetObjectIndifier,propertyIdenifier[l]BACnetProPertyIdenifier,propertyArrayIndex[2]UnsignedOPTIONAL,--只与数组数据类型一起使用listOffilements[3]ABSTRACT-SYNTAX.&Type}CreaeObect-Request::=SEQUENCEobjectSpecifier[0]CHOICE{objectTyPe[0]BACnetObjectType,objectIdentifier[l]BACnetObjectIdentifier},listOfInitialValues[1]SEQUENCEOFBACnetPrpertyValueOPTIONAL}CreatObject-ACK::=BACnetObjectIdentifierDeleteObjectRequest::=SEQUENCE{ObjectIdenifierBACnetObjectIdenifier}ReadProperty-Request::=SEQUENCE{objectIdentifier[0]BACnetObjectIdenifier,propertyIdentifier[l]BACnetProPertyIdentifier,propertyArrayIndex[2]UnsignedOPTIONAL--只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组}ReadProperty-ACK::=SEQUENCE{objectIdentifier[0]BACnetObjectIdentifier.proPertyIdenifier[l]BACnetPropertyIdentifier,PropertyArrayIndex[2]UnsignedOPTIONAL,--只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组propertyValue[3]ABSTRACT-SYNTAX.&Type216}ReadProPertyConditional-Request::=SEQUENCE{objectSelectionCriteria[0]SEQUENCE{selectionLogic[0]ENUMERATED{and(0),or(l),all(2)},listOfSelectionCriteria[l]SEQUENCEOFSEQUENCE{propertyIdenifier[0]BACnetPropertyIdentifier,propertyArrayIndex[l]UnsignedOPTIONAL,relationSpecifier[2]ENUMERATED{equal(0),not-equal(l),ess-than(2),greater-than(3),less-than-or-equal(4),greater-than-or-equal(5)}comparisonValue[3]ABSTRACT-SYNTAX.&Type}OPTIONAL},listOfPropertyReferences[l]SEQUENCEOFBACnetPropertyReferenceOPTIONAL}ReadProPertyConditional-ACK::=SEQUENCE{listOfReadAccessResultsSEQUENCEOFReadAccessResultOPTIONAL}ReadPrpertyMultiple-Request::=SEQUENCE{listOfReadAccessSpecsSEQUENCEOFReadAccessSpecification}ReadPropertyMultiple-ACK::=SEQUENCE{listOfReadAccessResultsSEQUENCEOFReadAccessResult}RemoveListElement-Request::=SEQUENCE{217objectIdenifier[0]BACnetObjectIdenifier,propertyIdenifier[1]BACnetPrOpertyIdentifier,propertyArrayIndex[2]UnsignedOPTIONAL,--只与数组数据类型一起使用listOfElements[3]ABSTRACT-SYNTAX.&Type}WriteProperty-Request::=SEQUENCE{objectIdenifier[0]BACnetObjectIdentifier,propertyIdentifier[1]BACnetPropertyIdentifier,propertyArrayIndex[2]UnsignedOPTIONAL,--只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组propertyValue[3]ABSTRACT-SYNTAX.&Type,priority[4]Unsigned8(l..l6)OPTIONAL--只与命令属性一起使用}WritePropertyMultiple-Request::=SEQUENCE{ListOfwriteAccessSpecificationsSEQUENCEOFWriteAccessSpecification}--有证实远程设备管理服务DeviceCommunicationControl-Requet::=SEQUENCE{timeDuration[0]Unsigned16OPTIONAL,enable-disable[1]ENUMERATED{enable(0),disable(l)},password[2]CharacterString(SIZE(1..20))OPTIONAL}ConfirmedPrivateTransfer-Request::=SEQUENCE{vendorID[0]Unsigned,serviceNumber[1]Unsigned,serviceParameters[2]ABSTRACT-SYNTAX.&TypeOPTIONAL}ConfirmedPrivateTransferACK::=SEQUENCE{vendorID[0]Unsigned,serviceNumber[l]Unsigned,218resultBlock[2]ABSTRACT-SYNTAX.&TypeOPTIONAL}ConfirmedTextmessage-Request::=SEQUENCE{textMessageSourceDevice[0]BACnetObectIdentifier,messageClass[1]CHOICE{numeric[0]Unsigned,character[1]CharacterString}OPTIONAL,messagePriority[2]ENUMERATED{normal(0),urgent(1)},message[3]CharacterString}ReinitializeDevice-Request::=SEQUENCE{reinitializedStateOfDevice[0]ENUMERATED{coldstart(0),warmstart(l)},password[l]CharacterString(SIZE(1..20))OPTIONAL}--有证实虚拟终端服务VT-Open-Request::=SEQUENCE{vtClassBACnetVTClass,localVTSessionIdentifierUnsigned8}VT-Open-ACK::=SEQUENCE{RemoteVTSessionIdentifierUnsigned8}VT-Close-Request::=SEQUENCE{listOfRemoteVTSessionIdentifierSEQUENCEOFUnsigned8}219VT-Data-Request::=SEQUENCE{vtSessionIdenifierUnsigned8,vtNewDataOCTETSTRING,vtDataFlagUnsigned(0..1)}VT-Data-ACK::=SEQUENCE{allNewDataAccepted[0]BOOLEAN,aceeptedOctetCount[1]UnsignedOPTIONAL--只在allNewDataAccepted=FALSE--条件下存在}--有证实安全服务Authenticate-Request::=SEQUENCE{pseudoRandomNumber[0]Unsigned32,exPectedInvokeID[1]Unsigned8OPTIONAL,operatorName[2]CharacterStringOPTIONAL,operatorPassword[3]CharacterString(SIZE(1..20))OPTIONAL,startEnciPheredSession[4]BOOLEANOPTIONAL}Authenticate-ACK::=SEQUENCE{modifiedRandomNumberUnsigned32}RequestKey-Request::=SEQUENCE{requestingDeviceIdentifierBACnetObjectIdenifier,requestingDeviceAddressBACnetAddress,remoteDeviceIdenifierBACnetObectIdentifier,remoteDeviceAddressBACnetAddress}--无证实请求的表述BACnetUnconfirmedServiceChoice::=ENUMERATED{i-Am(0),i-Have(1),unconfirmedCOVNotification(2),220unconfirmedEventNotification(3),unconfirmedPrivateTransfer(4),unconfirmedTextMessage(5),timeSynchronizaion(6),Who-Has(7),who-Is(8)}--新定义的服务可以增加到上述的枚举类型中。本表述中的所有枚举值都保留为ASHRAE用作定义中。使用无证实专有转换服务进行专有服务扩展。参见23节。BACnet-Unconfirmed-Service-Request::=CHOICE{i-Am[0]I-Am-Request,i-Have[1]I-Have-Request,unconfirmedCOVNotification[2]UnconfirmedCOVNotification-Request,unconfirmedEventNotification[3]UnconfirmedEventNotification-Reqest,unconfirmedPrivateTransfer[4]UnconfirmedPrivateTransfer-Request,unconfirmedTextMessage[5]UnconfirmedTextMessage-Request,timeSynchronizaion[6]TimeSynchronization-Request,who-Has[7]Who-Has-Request,Who-Is[8]Who-Is-Request}--在编码中没有使用上下文特定标记0..8。标记编号在BACnet无证实请求PDU中作为服务选择参数传送。--新定义的服务可以增加到上述的枚举类型中。本表述中的所有枚举值都保留为ASHRAE用作定义中。使用有证实专有转换服务或者无证实专有转换服务进行专有服务扩展。参见23节。}--无证实报警和事件服务UnconfirmedCOVNotificationHequest::=SEQUENCE{subscriberProcessIdentifier[0]Unsigned,initiatingDeviceIdentifier[l]BACnetObjectIdenifier,monitoredObjectIdentifier[2]BACnetObjectIdentifier,timRemaining[3]Unsigned,listOfValues[4]SEQUENCEOFBACnetPropertyValue}UnconfirmedEventNotification-Request::=SEQUENCE{processIdentifier[0]Unsigned,221initiatingDeviceIdentifier[l]BACnetObjectIdenifier,eventObjectIdentifier[2]BACnetObjectIdentifier,timeStamp[3]BACnetTimeStamp,notificationClass[4]Unsigned,priority[5]Unsigned8,eventType[6]BACnetEventType,messageText[7]CharacterStringOPTIONAL,notifyType[8]BACnetNotifyType,ackRequired[9]BOOLEANOPTIONAL,fromState[l0]BACnetEventStateOPTIONAL,toState[1l]BACnetEventStateOPTIONAL,evenValues[12]BACnetNotificationParametersOPTIONAL}--无证实远程设备管理服务I-Am-Request::=SEQUENCE{iAInDeviceIdentifierBACnetObjectIdentifier,maxAPDULengthAcceptedUnsigned,segmentationSupportedBACnetSegmentation,vendorIDUnsigned}I-have-Request::=SEQUENCE{deviceIdentifierBACnetObjectIdentifier,objectIdenifierBACnetObjectIdentifier,objectNameCharacterString}UnconfirmedPrivateTransfer-Request::=SEQUENCE{vendorID[0]Unsigned,serviceNumber[l]Unsigned,serviceParameters[2]ABSTRACT-SYNTAX.&TypeOPTIONAL}UnconfirmedTextMessage-Request::=SEQUENCE{textMessageSourceDevice[0]BACnetObjectIdentifier,messageClass[1]CHOICE{numeric[0]Unsigned,222characer[l]CharacterString}OPTIONAL,messagePriority[2]ENUMERATED{normal(0),urgent(l)},message[3]CharacterString}TimeSynchroniation-Request::=SEQUENCE{timeBACnetDateTime}Who-Has-Request::=SEQUENCE{limitsSEQUENCE{deviceInstanceRangeLowLimit[0]Unsigned(0..4l94303),deviceInstanceRangeHighLimit[1]Unsigned(0..4l94303)}OPTIONAL,objectCHOICE{objectIdentifier[2]BACnetObjectIdenifier,objectName[3]CharacerString}}Who-Is-Request::==SEQUENCE{DeviceInstanceRangeLowLimit[0]Unsigned(0..4l94303)OPTIONAL,--必须成对使用,参见16.9节deviceInstanceRangeHighLimit[l]Unsigned(0..4l94303)OPTIONAL--必须成对使用,参见16.9节}--差错报文的表述BACnetAbortReason::=ENUMERATED{Other(0),buffer-overflow(1),invalid-apdu-in-this-state(2),preempted-by-higher-Priority-task(3),segmentation-not-supported(4),223…….}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnet-Error::=CHOICE{other[127]Error,--本表述其余的选择表示对有证实服务所定义的‘Result(-)’参数。--AlarmandEventServicesacknowledgeAlarm[0]Error,confirmedCOVNotification[1]Error,confirmedEventNotification[2]Error,getAlarmSummary[3]Error,getEnrollmentSummary[4]Error,subscribeCOV[5]Error,--FileAccessServicesatomicReadFile[6]Error,atomicWriteFile[7]Error,--ObjectAccessServicesaddListElement[8]ChangeList-Error,removeListElement[9]ChangeList-Error,createObject[l0]CreateObject-Error,deleteObject[11]Error,readProPerty[l2]Error,readPropertyConditional[l3]Error,readPropertyMultiple[l4]Error,writeProperty[15]Error,writeProPertyMultiPle[16]WritePropertyMultiPle-Error,--RemoteDeviceManagementServicesdeviceCornmunicationControl[l7]Error,confirmedPrivateTransfer[18]ConfirmedPrivateTransfer-Error,confirmedTextMessage[19]Error,reinitializeDevice[20]Error,--VirtualTerminalServices224vtOPen[21]Error,vtClose[22]VTClose-Error,vtData[23]Error,--SecurityServicesauthenicate[24]Error,requestKey[25]Error}--在编码中没有使用上下文特定标记0..25和127。标记编号在BACnet差错PDU中作为差错选择参数传送。--新定义的服务可以增加到上述的枚举类型中。本表述中的所有枚举值都保留为ASHRAE用作定义中。参见23节。BACnetRejectReason::=ENUMERATED{other(0),buffer-overflow(1),inconsistent-Parameters(2),invalid-Parameter-datatype(3),invalid-tag(4),missing-required-parameter(5),parameter-out-ofrange(6),too-man-arguments(7),undefined-enumeration(8),unrecognized-service(9),}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。ChangeLiSt-Error::=SEQUENCE{errorType[0]Error,firstFailedElementNumber[1]Unsigned}CreateObect-Error::=SEQUENCE{errorType[0]Error,firstFailedElementNumber[1]Unsigned}ConfirmedPrivateTransfor-Error::=SEQUENCE{errorType[0]Error,vendorID[1]Unsigned,225serviceNumber[2]Unsigned,errorParameters[3]ABSTRACT-SYNTAX.&TypeOPTIONAL}Error::=SEQUENCE{--注:在18节中定义了错误类别和错误代码的有效结合。error-classENUMERATED{device(0),object(1),property(2),resources(3),security(4),services(5),vt(6),…},--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。error-codeENUMERATED{other(0),authentication-failed(1),character-set-not-supported(41),configuration-in-progress(2),device-busy(3),dynamic-creation-not-supported(4),file-access-denied(5),incompatible-security-levels(6),inconsistent-parameters(7),inconsistent-selection-criterion(8),Invalid-array-index(42),Invalid-data-type(9),invalid-file-access-method(10),invalid-file-start-position(11),operator-name(12),invalid-parameter-data-type(13),invalid-time-stamp(14),key-generation-error(15),missing-required-parameter(16),226no-objects-of-specified-type(17),no-space-for-object(18),no-space-to-add-list-element(19),no-space-to-write-property(20),no-vt-sessions-available(21),object-deletion-not-permitted(23),object-identifier-already-exists(24),operational-problem(25),password-failure(26),property-is-not-a-list(22),read-access-denied(27),security-not-supported(28),service-request-denied(29),timeout(30),unknown-object(31),unknown-property(32),thisenumerationwasremoved(33),unknown-vt-class(34),unknown-vt-session(35),unsupported-object-type(36),value-out-ofrange(37),vt-session-already-closed(38),vt-session-termination-failure(39),write-access-denied(40),…}--枚举值0-255保留为ASHRAE用作定义中。枚举值256-65535可以被其它机构根据23节中的规定使用。本版本使用的最后一个枚举值是42。}WritePropertyMultiple-Error::=SEQUENCE{errorType[0]Error,firstFailedWriteAttempt[1]BACnetObjectPropertyReference}VTClose-Error::=SEQUENCE{errorType[0]Error,listOfVTSessionIdentifiers[1]SEQUENCEOFUnsigned8OPTIONAL}227--应用类型--下面的表述是关于应用数据类型的定义,参见20.2.1.4节。NULL[APPLICATION0],equivalentto[UNIVERSAL5]BOOLEAN[APPLICATION1],equivalentto[UNIVERSAL1]Unsigned::=[APPLICATION21INTEGER(0..MAX)UnSigned8::=Unsigned(0..255)UnSigned16::=Unsigned(0..65535)Unsigned32::=Unsigned(0..4294967295)INTEGER[APPLICATION3],equivalentto[UNIVERSAL2]REAL[APPLICATION4],equivalentto[UNIVERSAL9]ANSI/IEEE-754singleprecisionfloatingpointDouble::=[APPLICATION51OCTETSTRING(SIZE(8))--ANSI/IEEE-754doubleprecisionfloatingpointOCTETSTRING[APPLICATION6],equivalentto[UNIVERSAL4]CharacterString::=[APPLICATION71OCTETSTRING--see20.2.9forsupportedtypesBITSTRING[APPLICATION8],equivalentto[UNIVERSAL3]ENUMERATED[APPLICATION9],equivalentto[UNIVERSAL10]Date::=[APPLICATION10]OCTETSTRING(SIZE(4))--参见20.2.12节--firstoctetyearminus1900X‘FF'=unspecified--secondoctetmonth(1..12)l=JanuaryX‘FF'=unspecified--thirdoctetdayofmonth(l..31),X‘FF'=unspecified--fourthoctetdayofweek(1..7)1=Monday--7=Sunday--X‘FF'=unspecifiedTime::=[APPLICATION1l]OCTETSTRING(SIZE(4))--see20.2.13--firstoctethour(0..23),(X‘FF')=Unspecified--secondoctetminute(0..59),(X‘FF')=Unspecified--thirdoctetsecond(0..59),(X‘FF')=unspeCified--fourthoctethunredths(0..99),(X‘FF')=UnspecifiedBACnetObjectIdentifier::=[APPLICATION12]OCTETSTRING(SIZE(4))--参见20.2.l4节--基本类型BACnetAction::=ENUMERATED{228direct(0),reverse(l)}BACnetActionCommand::=SEQUENCE{deviceIdentifier[0]BACnetObjectIdentifierOPTIONAL,objectIdentifier[1]BACnetObjectIdenifier,propertyIdenifier[2]BACnetPropertyIdentifier,propertyArrayIndex[3]UnsignedOPTIONAL,--只与数组数据类型一起使用propertyValue[4]ABSTRACT-SYNTAX.&Type,priority[5]Unsigned(l..l6)OPTIONAL,--只与命令属性一起使用postDelay[6]UnsignedOPTIONAL,quitOnFailure[7]BOOLEAN,writeSuccessful[8]BOOLEAN}BACnetActionList::=SEQUENCE{action[0]SEQUENCEOFBACnetActionCornmand}BACnetAddress::=SEQUENCE{network-numberUnsigned16,mac-addressOCTETSTRING--长度为0的字节串表示广播}BACnetAddressBinding::=SEQUENCE{deviceObjectIdentifierBACnetObjectIdentifier,deviceAddressBACnetAddress}BACnetBinaryPV::=ENUMERATED{inactive(0),active(l)}BACnetCalendarEntry::=CHOICE{date[0]Date,dateRange[l]BACnetDateRange,weekNDay[2]BACnetWeekNDay229}BACnetDailySchedule::=SEQUENCE{day-schedule[0]SEQUENCEOFBACnetTimeValue}BACnetDateRange::=SEQUENCE{startDateDate,endDateDate}BACnetDateTime::=SEQUENCE{dateDate,timeTime}BACnetDaysOfWeek::=BITSTRING{monday(0),tuesday(1),wednesday(2),thursday(3),friday(4),saturday(5),sundav(6)}BACnetDestination::=SEQUENCE{validDaysBACnetDaysOfWeek,fromTimeTime,toTimeTime,recipientBACnetRecipient,processIdentifierUnsigned,issueConfirmedNotificationsBOOLEAN,transitionsBACnetEventTransitionBits}BACnetDeviceStatus::=ENUMERATED{Operational(0),operational-read-only(1),230download-required(2),download-in-progress(3),non-operational(4),}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnetEngineeringUnits::=ENUMERATED{--Areasquare-meters(0),square-feet(1),--currencycurrencyl(105),currency2(106),currency3(l07),currency4(l08),currency5(109),currency6(l10),currency7(1ll),currency8(ll2),currency9(ll3),currency10(ll4),--Electricalmilliamperes(2),amperes(3),ohms(4),kilohms(l22),megohms(123),vo1ts(5),millivolts(l24),kilovolts(6),megavolts(7),volt-amperes(8),kilovolt-amperes(9),megavolt-amperes(l0),volt-amperes-reactive(1l),kilovolt-amperes-reactive(l2),megavolt-amperes-reactive(l3),degrees-phase(l4),power-factor(l5),231--Energyjoules(16),kilojoules(17),kilojoules-per-kilogram(l25),megajoules(l26),watt-hours(l8),kilowatt-hours(19),btus(20),therms(21),ton-hours(22),--Enthalpyjoules-per-kilogram-dry-air(23),btus-per-pound-dry-air(24),--Entropyjoules-per-degree-Kelvin(127),joules-per-kilogram-degree-Kelvin(128),--Frequencycycles-per-hour(25),cycles-per-minute(26),hertz(27),kilohertz(129),megahertz(130),per-hour(131),--Humiditygrams-of-water-per-kilogram-dry-air(28),.percent-relative-humidity(29),--Lengthmillimeters(30),meters(31),inches(32),feet(33),--Lightwatts-per-square-foot(34),Watts-per-square-meter(35),lumens(36),luxes(37),foot-candles(38),--Masskilograms(39),232pounds-mass(40),tons(41),--MassFlowkilograms-per-second(42),kilograms-per-minute(43),kilograms-per-hour(44),pounds-mass-per-minute(45),pounds–mass-per-hour(46),--Powermilliwatts(132),watts(47),kilowatts(48),megawatts(49),btus-per-hour(50),horsepower(51),tons-refrigeration(52),--Pressurepascals(53),hectopascals(l33),kilopascals(54),millibars(134),bars(55),pounds-force-per-square-inch(56),centimeters-of-water(57),inches-ofwater(58),millimeters-of-mercury(59),centimeters-of-mercury(60),inches-ofmercury(6l),--Temperaturedegrees-Celsius(62),degrees-Kelvin(63),degrees-Fahrenheit(64),degree-days-Celsius(65),degree-days-Fahrenheit(66),--Timeyears(67),months(68),weeks(69),days(70),233hours(7l),minutes(72),seconds(73),--Velocitymeters-per-second(74),kilometers-per-hour(75),feet-per-second(76),feet-per-minute(77),miles-per-hour(78),--volumecubic-feet(79),cubic-meters(80),imperial-gallons(8l),liters(82),us-gallons(83),--VolumetricFlowcubic-feet-per-minute(84),cubic-meters-per-second(85),cubic-meters-per-hour(135),imperial-gallons-per-minute(86),liters-per-second(87),liters-per-minute(88),liters-per-hour(l36),us-gallons-per-minute(89),--Otherdegrees-angular(90),degrees-Celsius-per-hour(91),degrees-Celsius-per-minute(92),degrees-Fahrenheit-per-hour(93),degrees-Fahrenheit-per-minute(94),kilowatt-hours-per-square-meter(137),kilowatt-hours-per-square-foot(l38),megajoules-per-square-meter(l39),megajoules-per-square-foot(l40),no-units(95),parts-per-million(96),parts-per-billion(97),percent(98),percent-per-second(99),234per-minute(l00),per-second(10l),psi-per-degree-Fahrenheit(l02),radians(l03),revolutions-per-minute(l04),watts-per-square-meter-degree-kelvin(14l),…}--枚举值0-255保留为ASHRAE用作定义中。枚举值256-65535可以被其它机构根据23节中的规定使用。本版本使用的最后一个枚举值是141,枚举值115-121已经被删除。BACnetEventParameter::=CHOICE{--这些选择与事件类型枚举值一一对应。change-of-bitstring[0]SEQUENCE{time-delay[0]Unsigned,bitmask[1]BITSTRING,list-of-bitstring-values[2]SEQUENCEOFBITSTRING},change-ofstate[1]SEQUENCE{time-delay[0]Unsigned,list-of-values[1]SEQUENCEOFBACnetPropertyStates},change-of-value[2]SEQUENCE{time-delay[0]Unsigned,cov-criteria[1]CHOICE{bitmask[0]BITSTRING,referencd-property-increment[1]REAL}},command-failure[3]SEQUENCE{time-delay[0]Unsigned,feedback-property-reference[l]BACnetObjectPropertyReference},floating-limit[4]SEQUENCE{time-del4y[0]Unsigned,setpoint-reference[l]BACnetObjectPropertyReference,low-diff-limit[2]REAL,high-diff-limit[3]REAL,235deadband[4]REAL},out-of-range[5]SEQUENCE{time-delay[0]Unsigned,low-limit[l]REAL,high-limit[2]REAL,deadband[3]REAL}}BACnetEventState::=ENUMERATED{normal(0),fault(l),offnormal(2),high-limit(3),low-limit(4),}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnetEventTransitionBits::==BITSTRING{to-offnormal(0),to-fault(1),to-normal(2)}BACnetEventType::=ENUMERATED{change-of-bitstring(0),change-of-state(l),change-of-value(2),command-failure(3),floating-limit(4),out-ofrange(5),}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnetFileAccessMethod::=ENUMERATED{record-access(0),stream-access(1),record-and-stream-access(2)236}BACnetLimitEnable::=BITSTRING{lowLimitEnable(0),highLimitAnatile(l)}BACnetNotificationParamsters::=CHOICE{--这些选择与事件类型枚举值一一对应。change-of-bitstring[0]SEQUENCE{referened-bitstring[0]BITSTRING,status-flags[1]BACnetStatusFlags},change-of-state[1]SEQUENCE{new-state[0]BACneProPertyStates,status-flags[1]BACnetStatusFlags},change-of-value[2]SEQUENCE{new-value[0]CHOICE{changed-bits[0]BITSTRING,changed-value[1]REAL},status-flags[1]BACnetStatusFlags},command-failure[3]SEQUENCE{command-value[0]ABSTRACT-SYNTAX.&Type,--与引用属性有关status-flags[1]BACnetStatusFlags,feedback-value[2]ABSTRACT-SYNTAX.&Type--与引用属性有关},floating-limit[4]SEQUENCE{reference-value[0]REAL,status-flags[l]BACnetStatusFlags,setpoint-value[2]REAL,error-limit[3]REAL},out-of-range[5]SEQUENCE{237exceeding-value[0]REAL,status-flags[1]BACnetStatusFlags,deadband[2]REAL,exceeded-limit[3]REAL},complex-event-type[6]SEQUENCEOFBACnetPropertyValue}BACnetNotifyType::=ENUMERATED{alarm(0),event(1),ack-notification(2)}BACnetObjectPropertyReference::=SEQUENCE{objectIdentifier[0]BACnetObjectIdentifier,propertyIdentifier[1]BACnetPropertyIdentifier,propertyArrayIndex[2]UnsignedOPTIONAL--只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组}BACnetObjectPrOpertyValue::=SEQUENCE{objectIdentifier[0]BACnetObjectIdenifier,propertyIdenifier[l]BACnetPropertyIdentifier,propertyArrayIndex[2]UnsignedOPTIONAL,--只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组value[3]ABSTRACT-SYNTAX.&Type,--任何适合指定属性的数据类型priority[4]Unsigned(l..l6)OPTIONAL}BACnetObjectType::=ENUMERATED{analog-input(0),analog-output(l),analog-value(2),binary-input(3),binary-output(4),binary-value(5),calendar(6),command(7),238device(8),event-enrollment(9),file(10),group(l1),loop(12),multistate-input(l3),multistate-output(l4),notification-class(l5),program(16),schedule(17),}--枚举值0-127保留为ASHRAE用作定义中。枚举值128-1023可以被其它机构根据23节中的规定使用。BACnetObjectTypesSupported::=BITSTRING{analog-input(0),analog-output(1),analog-value(2),binary-input(3),binary-output(4),binary-value(5),calendar(6),command(7),device(8),event-enrollment(9),file(10),group(11),loop(12),multistate-input(13),multistate-output(14),notification-class(15),program(16),schedule(l7)}--比特位0-127保留为ASHRAE用作定义中。BACnetPolarity::=ENUMERATED{normal(0),reverse(l)}239BACnetProrityArray::=SEQUENCESIZE(1..l6)OFBACnetPriorityValue--作为一个BACnet数组被访问BACnetPriorityValue::=CHOICE{nullNULL,realREAL,binaryBACnetBinaryPV,integerUnsigned,constructedValue[0]ABSTRACT-SYNTAX.&Type}BACnetProgramError::=ENUMERATED{normal(0),load-failed(1),internal(2),program(3),other(4),}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnetProgramRequest::=ENUMERATED{ready(0),load(1),run(2),halt(3),restart(4),unload(5)}BACnetProgramState::=ENUMERATED{idle(0),loading(l),running(2),waiting(3),halted(4),unloading(5)}BACnetPropertyIdentifier::=ENUMERATED{240acked-transitions(0),ack-required(1),action(2),action-text(3),active-text(4),active-vt-sessions(5),alarm-value(6),alarm-values(7),all(8),all-writes-successful(9),apdu-segment-timeout(10),apdu-timeout(1l),application-software-version(l2),archive(l3),bias(l4),change-of-state-count(l5),change-of-state-time(16),--seenotification-class(17),--thepropertyinthisplacewasdeleted(18),controlled-variable-reference(19),controlled-variable-units(20),controlled-variable-value(21),cov-increment(22),datelist(23),daylight-savings-status(24),deadband(25),derivative-constant(26),derivative-constant-units(27),description(28),description-of-halt(29),device-address-binding(30),device-type(31),effective-period(32),elapsed-active-time(33),error-limit(34),event-enable(35),event-state(36),event-type(37),event-parameters(83),--从以前的版本重命名而来241exception-schedule(38),fault-values(39),feedback-value(40),file-access-method(41),file-size(42),file-type(43),firmware-revision(44),high-limit(45),inactive-text(46),in-process(47),instance-of(48),integral-constant(49),integral-constant-units(50),issue-confirmed-notifications(51),limit-enable(52),list-of-group-members(53),list-of-object-property-references(54),list-of-session-keys(55),local-date(56),local-time(57),location(58),low-limit(59),manipulated-variable-reference(60),maximum-output(61),max-apdu-length-accepted(62),max-info-frames(63),max-master(64),max-pres-value(65),minimum-of-time(66),minimum-on-time(67),minimum-output(68),min-pres-value(69),model-name(70),modification-date(71),notification-class(17),--从以前的版本重命名而来notify-type(72),number-ofAPDU-retries(73),number-ofstates(74),object-identifier(75),242object-list(76),object-name(77),object-property-reference(78),object-type(79),optional(80),out-of-service(8l),output-units(82),--seeevent-parameters(83),polarity(84),present-value(85),priority(86),priority-array(87),priority-for-writing(88),process-identifier(89),program-change(90),program-location(9l),program-state(92),proportional-constant(93),proportional-constant-units(94),protocol-conformance-class(95),protocol-object-types-supported(96),protocol-services-supported(97),protocol-version(98),read-only(99),reason-for-halt(l00),recipient(101),recipient-list(l02),reliability(l03),relinquish-default(l04),required(l05),resolution(l06),segmentation-supported(107),setpoint(108),setpoint-reference(l09),state-text(ll0),status-flags(1l1),system-status(112),time-delay(l13),time-of-active-time-reset(l14),243time-of-state-count-reset(l15),time-synchronization-recipients(1l6),units(ll7),update-interval(l18),utc-offset(119),vendor-identifier(120),vendor-name(12l),vt-classes-supported(l22),weekly-schedule(l23),…}--特定的属性标识符,不论是所有、可选、还是必需,保留为条件读属性服务和读多个属性服务所用,或者为本标准没有定义的其它服务所用。--枚举值0-511保留为ASHRAE用作定义中。枚举值512-4194303可以被其它机构根据23节中的规定使用。本版本使用的最高枚举值是123。BACnetPropertyReference::=SEQUENCE{proPertyIdentifier[0]BACnetPropertyIdentifier,propertyArrayIndex[l]UnsignedOPTIONAL–-只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组}BACnetPropertyStates::=CHOICE{--本表述表示属性可能的数据类型,这些属性具有离散值或枚举值。这个选择必须与事件登记对象中引用属性的数据类型一致。boolean-value[0]BOOLEAN,binary-value[1]BACnetBinaryPV,event-type[2]BACnetEventType,Polarity[3]BACnetPolarity,program-change[4]BACneProgramRquest,Program-state[5]BACnetProgramState,reason-for-halt[6]BACnetProgramErmr,reliability[7]BACnetReliability,state[8]BACnetEvenState,system-status[9]BACnetDeviceStatus,units[l0]BACnetEngineeringUnits,…}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。244BACnetPropertyValue::==SEQUENCE{propertyIdenifier[0]BACnetPropertyIdentifier,propertyArrayIndx[l]UnsignedOPTIONAL,--只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组value[2]ABSTRACT-SYNTAX.&Type,--任何适合指定属性的数据类型priority[3]Unsigned(1..l6)OPTIONAL--只与命令属性一起使用}BACnetRecipient::=CHOICE{device[0]BACnetObjectIdentifier,address[1]BACnetAddress}BACnetRecipientProess::=SEQUENCE{recipient[0]BACnetRecipient,processIdentifier[l]Unsigned}BACnetReliability::=ENUMERATED{no-fault-detected(0),no-sensor(1),over-range(2),under-range(3),open-loop(4),shorted-loop(5),no-output(6),unreliable-other(7),process-error(8),}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnetSegmentation::=ENUMERATED{segmented-both(0),segmented-transmit(1),segmented-receive(2),no-segmentation(3)}BACnetServicesSupported::==BITSTRING{245--AlarmandEventServiceacknledgeAlarm(0),confirmedCOVNotifiotfon(l),confirmedEventNotification(2),getAlarmSummary(3),getEnrollmentSummary(4),subscribeCOV(5),--FileAccessServicesatomicReadFile(6),atomicWriteFile(7),--ObjectAccessServicesaddListElement(8),removeListElement(9),createObject(l0),deleteObject(l1),readProperty(12),readPropertyConditional(13),readPropertyMultiple(l4),writeProperty(15),writePropertyMultiple(16),--RemoteDeviceManagementServicesdeviceCommunicationControl(17),confirmedPrivateTransfer(l8),confirmedTextMessage(l9),reinitializeDevice(20),--VirtualTerminalServicesvtOpen(21),vtClose(22),vtData(23),--SecurityServicesauthenticate(24),requestKey(25),--UnconfirmedServices246i-Am(26),i-Have(27),unconfirmedCOVNotification(28),unconfirmedEventNotification(29),unconfirmedPrivateTransfer(30),unconfirmedTextMessage(3l),timeSynchronization(32),who-Has(33),who-Is(34)}BACnetSessionKey::=SEQUENCE{sessionKeyOCTETSTRING(SIZE(8)),--56比特作为密钥,8比特作为校验和peerAddressBACnetAddress}BACnetSetpointReference::=SEQUENCE{setpointReference[0]BACnetObjectPropertyRefereneOPTIONAL}BACnetSpecialEvent::=SEQUENCE{periodCHOICE{calendarEntry[0]BACnetCalendarEnry,calendarReference[1]BACnetObjectIdentifier},listOfTimeValues[2]SEQUENCEOFBACnetTimeValue,evenPriority[3]Unsigned(l..l6)}BACnetStatusFlags::=BITSTRING{in-alarm(0),fault(l),overridden(2),out-of-service(3)}BACnetTimeStamp::=CHOICE{time[0]Time,sequenceNumber[l]Unsigned(0..65535),dateTime[2]BACnetDateTime}247BACnetTimeValue::=SEQUENCE{timeTime,valueABSTRACT-SYNTAX.&Type}BACnetVTClass::=ENUMERATED{default-terminal(0),ansi-x3-64(1),dec-vt52(2),dec-vtl00(3),dec-vt220(4),hP-700-94(5),ibm-3130(6),…}--枚举值0-63保留为ASHRAE用作定义中。枚举值64-65535可以被其它机构根据23节中的规定使用。BACnetVTSession::=SEQUENCE{local-vtSessionIDUnsigned8,remote-vtSessionIDUnsigned8,remote-vtAddressBACnetAddress}BACnetWeekNDay::=OCTETSTRING(SIZE(3))--firstoctetmonth(l..12)January=1,X'FF'=anymonth--secondoctetweekOfMonthwhere:1=daysnumbered1-7--2=daysnumbered8-14--3=daysnumbered15-21--4=daysnumbered22-28--5=daysnumbered29-31--6=last7daysofthismonth.--255=anyweekofthismonth--thirdoctetdayOfWeek(l..7)where:l=Monday--7=Sunday--X‘FF'=anydayofweekReadAccessResult::=SEQUENCE{objectIdentifier[0]BACnetObjectIdentifier,248listOfResults[1]SEQUENCEOFSEQUENCE{propertyIdentifier[2]BACnetPropertyIdentifier,propertyArrayIndex[3]UnsignedOPTIONAL,–-只与数组数据类型一起使用--如果数组中省略这个参数,表示引用整个数组readResultCHOICE{propertyValue[4]ABSTRACT-SYNTAX.&Type,propertyAccessError[5]Error}}OPTIONAL}ReadAccessSpecification::=SEQUENCE{objectIdentifier[0]BACnetObjectIdentifier,listOfPropertyReferences[1]SEQUENCEOFBACnetPropertyReference}WriteAccessSpeification::=SEQUENCE{ObectIdenifier[0]BACnetObjectIdentifier,listOfProperties[1]SEQUENCEOFBACnePropertyValue}END22.一致性及其规范BACnet定义了一套具有广泛适应性的对象类型和应用服务,其目的是要满足在分布式的、具有层次结构的楼宇自动控制系统中,各个层次的控制设备对数据通信的要求。这里需要说明的是,并不要求楼宇自动控制系统中所有设备都必须支持BACnet的所有功能才能实现BACnet数据通信。本节定义一套为了实现BACnet数据通信功能,设备必须满足的要求。本节定义了六个一致性类别和十三个“功能组”。这六个一致性类别编号为1-6,具有分级结构,每一个类别的要求都包括了编号数小于该类别的所有类别的要求。功能组是若干BACnet标准对象类型和应用服务的集合,它们一起工作,可以满足一个单项的楼宇自动控制功能的通信要求。功能组的特性如下:\uf06c根据要实现的应用的要求,可以将功能组所规范的功能包含在任何一个一致性类别之中。\uf06c功能组所规范的功能必须能够被用户清楚地理解,而且使用户能够明确地确定其功能就是某个系统或者设备的特征要求。\uf06c功能组所规范的功能是能够在一个设备内实现的、满足任何一致性类别要求的增加的功能。249按照这种方式对BACnet对象和服务进行分类,给楼宇自动控制系统的设计者和使用者提供了一种方法,可以用来对多生产商的产品进行互操作的要求说明。22.1BACnet一致性类别本节定义六个BACnet协议的一致性类别,每一个类别的要求都用表格形式给出。对于应用服务来说,起始服务请求的能力的要求和执行服务请求的能力的要求是不同的。在表格中,用“x”标注在不同的列来说明这些要求。“x”在“起始”列内标注,说明设备能够起始服务请求,而“x”在“执行”列内标注,则说明设备能够执行服务请求。“对象”列包含一个标准对象列表,说明设备要满足这个一致性类别的要求所必须支持的标准对象。如果省略“对象”列,说明这个一致性类别不再专门要求增加对某个对象的支持。一致性类别的结构是一个分级结构,每一个类别的要求包含所有小于这个类别编号的类别的所有要求。22.1.1一致性类别1表22-1给出一致性类别1的要求。表22-1.一致性类别1的要求应用服务起始执行对象读属性服务x设备对象22.1.2一致性类别2表22-2给出一致性类别2的要求。表22-2.一致性类别2的要求应用服务起始执行写属性服务x22.1.3一致性类别3表22-3给出一致性类别3的要求。表22-3.一致性类别3的要求应用服务起始执行I-Am服务xxI-Have服务x250读多个属性服务x写多个属性服务xWho-Has服务xWho-Is服务x22.1.4一致性类别4表22-4给出一致性类别4的要求。表22-4.一致性类别4的要求应用服务起始执行添加列表元素服务xx删除列表元素服务xx读属性服务x读多个属性服务x写属性服务x写多个属性服务x22.1.5一致性类别5表22-5给出一致性类别5的要求。表22-5.一致性类别5的要求应用服务起始执行创建对象服务x删除对象服务x条件读属性服务x251Who-Has服务xWho-Is服务x22.1.6一致性类别6一致性类别6的BACnet设备要满足一致性类别5的所有要求,同时还要支持在22.2节中所定义的如下5个功能组:时钟功能组、PCWS功能组、事件起始功能组、事件响应功能组、和文件功能组。22.2BACnet功能组功能组对BACnet对象和服务进行分类,每一个功能组定义一组应用服务和标准对象组合,实现BACnet对特定楼宇自动控制功能的通信要求的支持。BACnet功能组表示可以添加到任何一致性类别的设备中的能力。功能组给楼宇自动控制系统的设计者和使用者提供了一种方法,可以用来对多生产商的产品进行互操作的要求说明和设计。参见附件B。对于包含在功能组中的应用服务来说,起始服务请求的能力的要求和执行服务请求的能力的要求是不同的。在表格中,用“x”标注在不同的列来说明这些要求。“x”在“起始”列内标注,说明设备能够起始服务请求,而“x”在“执行”列内标注,则说明设备能够执行服务请求。“对象”列包含一个标准对象列表,说明设备要满足这个功能组的要求所必须支持的标准对象。如果省略“对象”列,说明这个功能组不要求必须对某个对象的支持。22.2.1时钟功能组这个功能组提供与时钟相关的能力。支持这个功能组要求能够执行实现时间同步服务的服务程序,同时支持设备对象的本地时间属性、本地日期属性、时差属性、和夏令时状态属性。支持这个功能组的设备还要具有测量时间过程的手段。22.2.2手提操作设备(HHWS)功能组这个功能组提供与手提操作设备相关的能力。表22-6给出HHWS功能组的要求。表22-6.HHWS功能组的要求应用服务起始执行Who-Is服务xxI-Am服务x读属性服务x写属性服务x重新初始化设备服务x252时间同步服务x22.2.3个人计算机工作站(PCWS)功能组这个功能组提供与个人计算机相关的能力。表22-7给出PCWS功能组的要求。表22-7.PCWS功能组的要求应用服务起始执行Who-Is服务xxI-Am服务x读属性服务x条件读属性服务x读多个属性服务x写属性服务x写多个属性服务x重新初始化设备服务x时间同步服务x创建对象服务x删除对象服务x添加列表元素服务x删除接表元素服务x基本读文件服务x基本写文件服务x22.2.4事件起始(EventInitiation)功能组这个功能组提供定义报警和事件的能力、探测报警或者事件发生的能力、和起始通知报警或者事件发生的通知报文的能力。支持这个功能组的设备要求能够支持在13.2节中定义的内部报告,或者支持在13.3节中定义的算法改变报告,或者两者都支持。如果支持内部报告,则要求支持通知类对象和至少一个表13-2中所列的对象的内部报告能力。如果支持算法改变报告,则要求支持事件登记对象。表22-8给出事件起始功能组的其它253要求。表22-8.事件起始功能组的要求应用服务起始执行确认报警服务x有证实事件通知服务x获得报警摘要服务x无证实事件通知服务x22.2.5事件响应(EventResonse)功能组这个功能组提供对于事件发生通知的响应能力。表22-9给出这个功能组的要求。表22-9.事件响应功能组的要求应用服务起始执行确认报警服务x有证实事件通知服务x22.2.6COV事件起始功能组这个功能组提供起始关于COV事件发生的通知报文的能力。表22-10给出这个功能组的要求。表22-10.COV事件起始功能组的要求应用服务起始执行预订COV服务x有证实COV通知服务x22.2.7COV事件响应功能组这个功能组提供预订和接收关于COV事件发生的通知报文的能力。表22-11给出这个功能组的要求。表22-11.COV事件响应功能组的要求应用服务起始执行预订COV服务x254有证实COV通知服务x22.2.8文件功能组这个功能组提供读、写、上载、和下载文件的能力。表22-12给出这个功能组的要求。表22-12.文件功能组的要求应用服务起始执行对象基本读文件服务x文件对象基本写文件服务x22.2.9重新初始化功能组这个功能组表示对远程设备重新初始化的能力。这个功能组的要求是设备要支持对于重新初始化设备服务请求的执行。22.2.10虚拟操作员接口功能组这个功能组提供一个虚拟终端会话的操作员端所需的能力。表22-13给出这个功能组的要求。表22-13.虚拟操作员接口功能组的要求应用服务起始执行VT开启服务xVT关闭服务xxVT数据服务xx22.2.11虚拟终端功能组这个功能组提供一个虚拟终端会话的服务器端所需的能力。表22-14给出这个功能组的要求。表22-14.虚拟终端功能组的要求应用服务起始执行VT开启服务xVT关闭服务xxVT数据服务xx22.2.12设备通信功能组这个功能组提供使能和禁止对某个设备的通信的能力,主要用于诊断目的。支持这个功能组要求能够执行255设备通信控制服务。2.2.13时间主站功能组这个功能组提供自动起始时间同步服务的能力。支持这个功能组要求同时支持时钟功能组和设备对象的时间同步容器属性。22.3BACnet路由器BACnet路由器支持在6.4节中定义的网络层协议报文。如果路由器不支持PTP数据链路层,则也不要求这个路由器支持I-Could-Be-Router-To-Network报文。路由器必须能够实现在6.5节中规范的对于本地和远程的收发报文进行路由的功能。一个路由器可以提供BACnet应用功能,也可以不提供BACnet应用功能。22.4协议实现一致性声明协议实现一致性声明(PICS)是由设备制造商提供的书面文件,标出在这个设备中实现的BACnet规范中的功能。由于BACnetPICS是公共文件,任何对它感兴趣的组织都可使用它,因此,一个BACnetPICS至少要包含以下信息:(a)标明生产商和描述BACnet设备的基本信息。(b)标明设备的一致性类别。(c)标明设备支持的所有功能组。(d)标明设备支持的所有标准应用服务和专有应用服务,指明设备是能够起始服务请求,还是能够响应服务请求,或者两者都能够。(e)标明设备支持的所有标准对象和专有对象的列表。(f)对于每一个支持的对象,1.标明每一个支持的可选属性,2.标明那些属性可以使用BACnet服务写入,3.标明这些对象是否可以使用BACnet服务动态创建或者删除,4.标明对于属性数据取值范围的限制。(g)标明支持的数据链接层的选项。(h)标明是否支持分段请求。(i)标明是否支持分段响应。附件A给出了BACnetPICS的正式样本。22.5对于BACnet的一致性以下规定为了实现BACnet一致性所必须满足的要求。22.5.1最小的一致性要求所有符合BACnet协议的设备必须实现在一致性类别1中定义的对象类型和服务,实现第6节中定义的应用于非路由设备的网络层报文和协议。22.5.2PICS256所有符合BACnet协议的设备必须具有一份标明该设备实现的所有BACnet功能的PICS。这份PICS必须按照附件A的格式,给出22.4节中规定的所有信息。22.5.3一致性测试为了符合BACnet协议,所有的设备都必须通过一致性测试,以证明设备正确实现了在PICS中指定的标准对象类型和服务。一致性测试包含正向测试和反向测试,正向测试是对设备声明支持的每个对象类型和服务进行测试;反向测试是对于设备不支持的标准对象和服务测试设备的响应,以证明设备不会具有破坏行为。22.5.4数据链路层和物理层为了符合BACnet协议,所有的设备必须支持第7节到第11节中定义的5种数据链接层中的一种,支持与这些数据链路层兼容的一种物理层。22.5.5关于与非标准数据链路层的兼容问题在某些特别场合,为了与其它的网络设备进行互操作,可能需要一个BACnet设备支持本标准定义的5个数据链路层之外的某个数据链路层技术和物理层技术,这种设备只要满足22.5.1节到22.5.3节规定的准则,就称为具有非标准数据链路层的符合BACnet的设备。这种设备可以使用与数据链路层和物理层不相同的非标准协议层传送标准的BACnetLSDU,这个LSDU包含本标准定义的、按照第20节和第6节给出的准则编码的应用层和网络层信息。允许对BACnetLSDU进行分段操作。附件H给出了一个这样的例程,使用的是网际网协议和Novell互联网数据报协议。23.扩展BACnet容纳生产商专有信息257BACnet协议的目的是为楼宇自动控制设备交换信息提供一种机制。为了实现互操作性,BACnet定义了一组标准的数据结构,称之为对象。标准对象中包含的信息是在大多数楼宇系统中普遍使用的信息,同时BACnet也允许在设备中交换非标准化的信息。有4种扩展BACnet容纳非标准信息交换的方式:(a)生产商对于BACnet中使用的枚举值定义专有的扩展值。(b)生产商使用专有转换服务调用一个专有服务。(c)生产商对标准对象添加新的专有属性。(d)生产商定义新的专有对象。在每一种情况中,BACnet报文都隐含地引用生产商的标识符代码,指明生产商的枚举值、服务、属性、或者对象。生产商标识符代码由ASHRAE管理,对每一个生产商分配一个代码。ASHRAE自己的生产商标识符代码是0。可以通过读取设备对象的生产商标识符属性值获得某个设备的生产商标识符。从ASHRAE标准管理机构可以获得生产商标识符代码值列表。23.1扩展枚举值在有一些实例中,生产商需要通过向一个枚举值中增加一些值来扩展BACnet。实现的方法是在给定的枚举值中使用大于BACnet保留的值范围之外的值。表23-1给出了可以被扩展的枚举值和BACnet保留使用的取值范围。所有没有在表23-1中出现的枚举值都是不能被扩展的。表23-1.可扩展的枚举值枚举值名称保留的取值范围最大的可取值错误类错误代码BACnet中止原因BACnet设备状态BACnet工程单位BACnet事件状态BACnet事件类型BACnet对象类型BACnet程序错误BACnet属性标识符BACnet属性状态BACnet可靠性BACnet拒绝原因BACnetVT类0-630-2550-630-630-2550-630-630-1270-630-5110-630-630-630-63655356553525565535655356553565535102365535419430365535655352556553523.2使用专有传输服务调用非标准服务BACnet定义了一组适合楼宇自动控制系统的应用层服务。虽然这些标准服务已经具有广泛代表性,生产商仍然可以任意创建新的服务,同时尽可能地使用标准服务。生产商可以向BACnet中添加专有服务,使用专有传输服务调用这些专有服务。BACnet不对专有服务的服务类型和参数提出限制,但是要求使用有证实专有传输服务和无证实专有传输服务进行传送。用于处理这些APDU258的协议机制的实现方法要与本标准规定的相同。使用专有传输服务调用的专有应用层服务的格式必须遵守本标准的编码准则。如果使用专有传输服务,必须注意,差错APDU不能分段。实现方法必须保证差错APDU中的参数不能长于分段所要求的长度。23.3向标准对象添加专有属性BACnet定义了一组标准对象,每一个对象具有一组属性,可以使用BACnet服务对这些属性进行访问和操作。BACnet允许生产商给对象添加属性,从而扩展对象的能力。专有属性可以得到与标准属性相同的BACnet服务支持,所以,也能够使用与标准属性相同的方法对专有属性进行访问和操作。如果一个专有属性要成为可命令的属性,则需要向每一个这样的可命令属性提供附加的属性,执行标准属性中优先级数组属性和释放缺省属性的功能,还要应用19节中规范的优先级判断机制。生产商可以通过修改设备中定义的对象的方法,向一个标准对象添加专有属性。在设备的属性标识符属性列表中,添加专有属性的属性标识符值,这些值必须去大于512的值。任何使用属性标识符作为参数的BACnet服务都可以使用这些专有属性的属性标识符。专有属性标识符隐含地引用了所驻留设备中的设备对象的生产商标识符属性,这个机制解决了不同生产商使用相同的枚举值表示完全不同的属性的问题。23.4向BACnet中添加专有对象类型为了能够容纳标准对象不能解决的楼宇自动控制应用,BACnet允许生产商添加专有对象类型,同时尽可能地使用标准对象类型。为了增强可扩展性,BACnet向专有对象提供与标准对象相同的支持。23.4.1专有对象类型枚举值生产商可以通过使用扩展BACnet对象类型枚举值的方法来增加专有对象类型。专有对象类型的枚举值取大于128的对象类型值。任何使用对象类型属性值作为参数的BACnet服务都可以使用这些表示专有对象的对象类型值。23.4.2专有属性的数据类型生产商的专有对象的属性值可以是标准属性数据类型,也可以是专有属性数据类型。只能使用20.2.1.4节中定义的应用数据类型构造专有数据类型。23.4.3在专有对象类型中要求的属性非标准对象类型必须支持下列属性:对象标识符对象名称对象类型这些属性的功能必须与标准BACnet对象中的对应属性相同,这就意味着在BACnet设备中,对象标识符属性和对象名称属性是唯一的。对象名称字符串至少是一个字符,并且必须是可打印的字符。23.5在扩展BACnet中的限制在扩展BACnet时,有下列限制:(a)APDU类型8到类型15保留给ASHRAE将来使用。259(b)只能通过使用有证实专有传输服务和无证实专有传输服务的方法增加服务,即,BACnet有证实服务选择枚举值和BACnet无证实服务选择枚举值不能被扩展。24.网络安全本节为BACnet定义一个有限的安全体系结构。在BACnet中,网络安全是可选项。本协议的安全体系提供对等实体鉴别(authentication)、数据来源鉴别、操作员身份鉴别和数据保密性与完整性方面的安全机制,不提供诸如访问控制和非否定的通信安全机制,如果系统中需要这样的安全机制,可以使用专有的方法将它们加入到BACnet中。24.1安全体系结构24.1.1概述在BACnet中,使用握手方式实现对等实体鉴别和数据来源鉴别。握手方式可以保证通信是建立在一个通信网络内的两个已知节点之间。对于下列两种情况,要使用握手方式:(a)客户设备需要鉴别一个有证实服务请求确实被声明的设备执行,使用这个机制,无证实服务请求不能被鉴别。(b)服务器设备需要鉴别一个有证实服务请求确实被声明的设备执行,使用这个机制,无证实服务请求不能被鉴别。实现这个机制的方法是,检验使用一个公共会话密钥(SessionKey,SK)在两节点之间通信捆绑的加密数据。会话密钥从一个称为密钥服务器的设备获得。在BACnet中,使用鉴别用户密码的方式实现操作员身份鉴别。密码可以通过本地设备鉴别,也可以被跨网络鉴别。如果密码要被跨网络鉴别,则密钥服务器必须包含有主站密码列表。在BACnet中,使用加密方式实现数据保密性和完整性。使用从密钥服务器中获得的公共会话密钥对数据进行加密。采用这种机制,广播报文或者多播报文不能被加密。通过密钥服务器向需要安全的BACnet设备分配会话密钥。一个设备使用请求密钥(RequestKey)服务,向密钥服务器请求一个它与另一个设备之间的密钥。也可以在网络初始化时,或者在固定的时间间隔,由密钥服务器向设备传送密钥。密钥服务器向设备传送会话密钥的方法是,使用添加列表元素服务向设备对象的会话密260钥列表属性写入会话密钥的值。发送到BACnet网络上的会话密钥将使用每个设备的唯一的私有密钥(PrivateKey)进行加密。在设备中,可以对会话密钥进行解密使用。每个会话密钥的有效期由生产商自行确定。24.1.2私有加密密钥一个需要鉴别对等实体或者加密数据的BACnet设备(假设设备名称为X),必须具有一个唯一的私有密钥(PKX)。PKX是一个56比特的数据加密标准(DES)的加密密钥。PKX用于对会话密钥的解密。如何在BACnet中产生和分发公共密钥的方法,由生产商自行确定。24.1.3会话加密密钥密钥服务器产生和分发所有的需要的会话密钥。为了做到这一点,密钥服务器必须拥有用于BACnet网络中的会话密钥的备份。会话密钥也是一个56比特的DES加密密钥。如何产生一个会话密钥的方法由生产商自行确定。使用添加列表元素服务分发会话密钥。24.1.4加密算法使用DES算法实现数据的加密和解密。在联邦信息处理标准(FederalInformationProcissingStandard)46-2(也称为ANSIX3.92)中对DES进行了规范。为了防止数据或者加密密钥的损坏,在加密之前,要将APDU用随机数据填充到接收设备支持的最大长度。24.2.鉴别机制24.2.1获得会话密钥的过程获得会话密钥的过程如下:(a)设备A要求鉴别,向密钥服务器发送一个请求密钥服务请求,指明对远程客户B进行鉴别。(b)密钥服务器使用24.2.4节中的报文起始鉴别过程中的PKA,鉴别请求密钥服务请求是由设备A起始的。(c)密钥服务器为设备A和设备B产生一个会话密钥(SKAB)。(d)密钥服务器把SKAB和设备A的BACnet地址与设备B的PKB一起加密编码,然后使用添加列表元素服务请求把这个加密的信息发送给设备B。(e)设备B接收到添加列表元素请求之后,使用24.2.4节中的报文起始鉴别过程中的PKB,鉴别密钥确实是密钥服务器发送的。(f)一旦得到鉴别,设备B解密SKAB,将它放置在自己的设备对象中。向密钥服务器返回一个对于添加列表元素请求的‘Result(+)’。(g)密钥服务器把SKAB和设备B的BACnet地址与设备A的PKA一起加密编码,然后使用添加列表元素服务请求把这个加密的信息发送给设备A。(h)设备A接收到添加列表元素请求之后,使用24.2.4节中的报文起始鉴别过程中的PKA,鉴别密钥确实是密钥服务器发送的。(i)一旦得到鉴别,设备A解密SKAB,将它放置在自己的设备对象中。向密钥服务器返回一个对于添加列表元素请求的‘Result(+)’。26124.2.2对等实体鉴别机制对等实体鉴别的过程归纳如下:(a)一旦设备A接收到SKAB,就开始对设备B进行鉴别。(b)设备A产生一个鉴别(Authenticate)服务请求,并且发送给设备B。这个BACnet有证实请求PDU的服务请求部分与SKA一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。(c)如果设备B能够对鉴别服务请求进行解密,则按照在鉴别服务过程中规定的方式将‘伪随机数(PseudoRandomNumber)’修改成为‘修改的随机数(ModifiedRandomNumber)’,使用SKA加密‘修改的随机数’,向设备A返回一个复杂确认报文,其中的鉴别确认部分包含加密的‘修改的随机数’。(d)如果设备A接收到包含有正确的‘修改的随机数’的复杂确认报文,则完成对设备B的鉴别。24.2.3报文执行鉴别一个BACnet客户设备需要鉴别它发送的一个报文确实被正确的BACnet服务器所执行,在BACnet中,实现这个鉴别的方法是增强的对等鉴别机制,其中绑定了一个事务处理状态机(TSM)。这就是说,只能使用有证实服务请求完成报文执行鉴别。报文执行鉴别过程包括两个部分:获得一个SK和报文接收的鉴别。获得一个SK的过程已经在24.2.1节中进行了描述,以下是客户设备A鉴别服务器设备B正在执行某个报文的过程:(a)一旦客户设备A接收到SKAB,就开始对服务器设备B进行报文执行鉴别。(b)客户设备A产生一个鉴别服务请求,并且发送给服务器设备B。这个报文的‘期待的调用ID(ExpectedInvokeID)’参数中包含有么被鉴别的有证实请求APDU的调用ID。这个BACnet有证实请求PDU的服务请求部分与SKA一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。(c)客户设备A发送了鉴别服务请求之后,立即将要被鉴别的有证实请求APDU发送给服务器设备B。这个有证实请求APDU的调用ID应该与鉴别服务请求中的‘期待的调用ID’参数匹配。(d)如果服务器设备B能够对鉴别服务请求进行解密,则等待30秒时间,期待接收具有‘期待的调用ID’参数的那个有证实请求APDU。如果服务器B接收到那个APDU,则按照在鉴别服务过程中规定的方式将‘伪随机数’修改成为‘修改的随机数’,使用SKA加密‘修改的随机数’,向客户设备A返回一个复杂确认报文,其中的鉴别确认部分包含加密的‘修改的随机数’。(e)如果客户设备A接收到包含有正确的‘修改的随机数’的复杂确认报文,则完成对服务器设备B的报文执行鉴别。注:这个过程也可以被服务器用来对正确的客户是否接收到简单确认或者复杂确认进行鉴别。24.2.4报文起始鉴别一个BACnet服务器设备需要鉴别它接收的一个报文确实是声明的BACnet客户设备起始发送的,在BACnet中,实现这个鉴别的方法是增强的对等鉴别机制,其中绑定了一个事务处理状态机。这就是说,只能使用有证实服务请求完成报文起始鉴别。如果报文起始鉴别的双方有一方涉及到密钥服务器,则使用一个私有密钥PK对信息进行加密合解密。如果报文起始鉴别的双方都不涉及到密钥服务器,则使用一个会话密钥SK对信息进行加密合解密。以下是服务器设备B鉴别客户设备A已经起始某个报文的过程:(a)如果服务器设备B和客户设备A都不是密钥服务器,则在开始进行鉴别之前,必须获得一个SKAB。262(b)服务器设备B产生一个鉴别服务请求,并且发送给客户设备A。这个报文的‘期待的调用ID’参数中包含有要被鉴别的有证实请求APDU的调用ID。这个BACnet有证实请求PDU的服务请求部分与SKA一起加密编码。如果设备A或者设备B中有一个是密钥服务器,则与一个合适的PK一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。(c)如果客户设备A能够对鉴别服务请求进行解密,则搜寻自己的TSM,查找具有‘期待的调用ID’参数的有证实请求PDU。如果搜寻到TSM,则按照在鉴别服务过程中规定的方式将‘伪随机数’修改成为‘修改的随机数’,使用SKA加密‘修改的随机数’,向设备A返回一个复杂确认报文,其中的鉴别确认部分包含加密的‘修改的随机数’。(d)如果服务器设备B接收到包含有正确的‘修改的随机数’的复杂确认报文,则完成对客户设备A的报文起始鉴别。24.2.5操作员身份鉴别BACnet提供允许操作员登录网络设备的方法。操作员身份鉴别的过程归纳如下:(a)操作员登录到客户设备A,给出操作员名称和密码。对于名称和密码的唯一要求是它们必须是可打印字符。如果客户设备A有能力,就进行本地密码鉴别,否则,继续下列步骤。(b)客户设备A产生一个鉴别服务请求,并且发送给密钥服务器。这个鉴别请求报文包含有‘操作员名称’参数和‘操作员密码’参数。这个BACnet有证实请求PDU的服务请求部分与客户设备A的PK一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。(c)如果密钥服务器能够对鉴别服务请求进行解密,则检验‘操作员名称’参数与‘操作员密码’参数的正确性。如果密钥服务器鉴别了操作员身份,则按照在鉴别服务过程中规定的方式将‘伪随机数’修改成为‘修改的随机数’,使用客户设备A的PK加密‘修改的随机数’,向客户设备A返回一个复杂确认报文,其中的鉴别确认部分包含加密的‘修改的随机数’。如果密钥服务器不能鉴别操作员身份,则返回一个‘Result(-)’,其中包含有使用客户设备A的PK加密编码的BACnet差错PDU的差错部分。(d)如果客户设备A接收到包含有正确的‘修改的随机数’的复杂确认报文,则完成对操作员身份的鉴别。24.3数据保密性机制保证数据的保密性和完整性的过程由两部分组成:获得一个会话密钥SK和加密数据。获得一个SK的过程已经在24.2.1节中进行了描述,以下是加密数据的过程:(a)一旦客户设备A接收到SKAB,就开始进行设备A和设备B之间数据加密。(b)客户设备A使用鉴别服务请求开始与服务器设备B进行一个加密会话(EncipheredSession)。如果鉴别请求成功,继续进行步骤3。否则,不能建立加密会话。(c)如果A需要向B发送数据,则A使用密钥SKAB加密编码APDU的数据部分,然后将这个APDU发送给B。这个APDU的固定部分和所有低层次的PCI都不被加密。(d)如果B接收到来自A的数据,则使用密钥SKAB对APDU的数据部分进行解密。(e)如果B需要向A发送数据,则B使用密钥SKAB加密编码APDU的数据部分,然后将这个APDU发送给A。这个APDU的固定部分和所有低层次的PCI都不被加密。(f)终止加密会话的方法是,A或者B中任何一个设备都可以发送一个鉴别服务请求,其中的‘开始加密会话(StartEncipheredSession)’参数设置为FALSE。26324.3.1请求一个加密会话请求一个加密会话的过程如下:(a)客户设备A产生一个鉴别服务请求,并且发送给服务器设备B。这个鉴别请求报文包含有‘开始加密会话’参数,并且设置为TRUE。这个BACnet有证实请求PDU的服务请求部分与SKAB一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。(b)B在处理这个报文之前,使用24.2.4节描述的报文起始鉴别过程鉴别这个报文确实是A发送的。如果B能够对鉴别服务请求进行解密并且接受加密会话,则按照在鉴别服务过程中规定的方式将‘伪随机数’修改成为‘修改的随机数’,使用SKA加密‘修改的随机数’,向客户设备A返回一个复杂确认报文,其中的鉴别确认部分包含加密的‘修改的随机数’。否则,则返回一个‘Result(-)’,其中包含有使用SKAB加密编码的BACnet差错PDU的差错部分。(c)如果客户设备A接收到包含有正确的‘修改的随机数’的复杂确认报文,则开始一个加密会话。24.3.2结束一个加密会话结束一个加密会话的过程如下:(a)设备A产生一个鉴别有证实请求,并且发送给设备B。这个鉴别请求报文包含有‘开始加密会话’参数,并且设置为FALSE。这个BACnet有证实请求PDU的服务请求部分与SKAB一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。(b)B在处理这个报文之前,使用24.2.4节描述的报文起始鉴别过程鉴别这个报文确实是A发送的。如果B能够对鉴别服务请求进行解密并且接受终止加密会话,则按照在鉴别服务过程中规定的方式将‘伪随机数’修改成为‘修改的随机数’,使用SKA加密‘修改的随机数’,向客户设备A返回一个复杂确认报文,其中的鉴别确认部分包含加密的‘修改的随机数’。否则,则返回一个‘Result(-)’,其中包含有使用SKAB加密编码的BACnet差错PDU的差错部分。(c)如果客户设备A接收到包含有正确的‘修改的随机数’的复杂确认报文,则结束一个加密会话。24.4请求密钥服务一个客户端的BACnet用户使用请求密钥(RequestKey)服务请求在它自己与另一个BACnet用户之间设置一个会话密钥SK。为了保证数据的完整性,这个BACnet有证实请求PDU的服务请求部分与客户的PK一起加密编码。这个APDU的头部和所有低层次的PCI都不被加密。注:使用这个服务时,可以要求将起始设备的APDU超时属性值加大,从而能够容纳在密钥服务器客户两端的一个鉴别会话的时间要求。24.4.1结构表24-1表示请求密钥服务原语的结构。表24-1请求密钥服务原语结构参数名称ReqIndRspCnf参数(Argument)请求设备标识符(RequestingDeviceIdentifier)请求设备地址(RequestingDeviceAddress)远程设备标识符(RemoteDeviceIdentifier)MMMMM(=)M(=)M(=)M(=)264远程设备地址(RemoteDeviceIdentifier)Result(+)Result(-)错误类型(ErrorType)MM(=)SSMS(=)S(=)M(=)24.4.1.1参数这个参数为请求密钥有证实服务请求传送参数值。24.4.1.1.1请求设备标识符这个参数是BACnet对象标识符类型,传送请求产生一个会话密钥SK的客户设备的标识符。因为这个参数被加密保护,所以它的完整性得到保证。24.4.1.1.2请求设备地址这个参数是BACnet地址类型,传送请求产生一个会话密钥SK的客户设备的地址。因为这个参数被加密保护,所以它的完整性得到保证。24.4.1.1.3远程设备标识符这个参数是BACnet对象标识符类型,传送要接收一个会话密钥SK的相关远程设备的标识符。因为这个参数被加密保护,所以它的完整性得到保证。24.4.1.1.4远程设备地址这个参数是BACnet地址类型,传送要接收一个会话密钥SK的相关远程设备的地址。因为这个参数被加密保护,所以它的完整性得到保证。24.4.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。如何鉴别请求设备不接收‘Result(+)’的安全性策略由生产商自行确定。如果希望对这个报文进行鉴别,则使用报文执行鉴别。24.4.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。为了保证数据的完整性,使用客户的PK对‘错误类型’参数进行加密保护。24.4.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。错误类是SECURITY,错误代码在18.5节中定义。24.4.2服务过程服务提供者(密钥服务器)在处理请求之前,使用24.2.4节中的报文起始鉴别过程鉴别这个请求是否是请求设备起始的。如果解码成功以及鉴别了请求的合法性,则密钥服务器产生请求的会话密钥SK。然后,密钥服务器将SK分别传送给远程设备和请求设备,传送的方法是使用添加列表元素服务向设备对象的会话密钥列表属265性写入SK的值。使用接收设备的PK对会话密钥列表属性值进行加密编码。如果这些成功,密钥服务器返回一个关于这个服务的‘Result(+)’参数。如果这些失败,密钥服务器返回一个关于这个服务的‘Result(-)’参数。使用请求设备的PK对‘Result(-)’参数进行加密编码。24.5鉴别服务一个客户端的BACnet用户使用鉴别(Authenticate)服务对对等实体、起始设备、执行设备、和操作员身份进行鉴别。为了保证数据的完整性,对这个BACnet有证实请求PDU的服务请求部分进行加密。如果这个鉴别过程是在客户设备与密钥服务器之间进行,则使用客户的PK对参数进行加密和解密。如果这个鉴别过程是在两个非密钥服务器设备之间进行,则使用相应的SK对参数进行加密和解密。24.5.1结构表24-2表示鉴别服务原语的结构。表24-2鉴别服务原语结构参数名称ReqIndRspCnf参数(Argument)伪随机数(PseudoRandomNumber)期待的调用ID(ExpectedInvokeID)操作员名称(OperatorName)操作员密码(OperatorPassword)开始加密会话(StartEncipheredSession)Result(+)修改的随机数(ModifiedRandomNumber)Result(-)错误类型(ErrorType)MMUUCUM(=)M(=)U(=)U(=)C(=)U(=)SMSMS(=)M(=)S(=)M(=)24.5.1.1参数这个参数为鉴别服务请求传送参数值。24.5.1.1.1伪随机数这个参数是32位无符号整型类型,是由服务请求者产生的一个伪随机数。这个参数为‘Result(+)’参数调用修改的随机数所用。24.5.1.1.2期待的调用ID这个参数是8位无符号整型类型,是一个可选的参数,用于执行报文起始鉴别过程和报文执行鉴别过程之266中。它是要被鉴别的报文的‘调用Id’参数。24.5.1.1.3操作员名称这个参数是字符串类型,是一个条件参数,用于执行操作员身份鉴别过程之中。如果提供这个参数,它表示请求访问的操作员的名称。24.5.1.1.4操作员密码这个参数是字符串类型,是一个条件参数,用于执行操作员身份鉴别过程之中。如果‘操作员名称’参数存在,则本参数必须存在。它表示请求访问的操作员的密码。本参数的长度不能大于20个字节。24.5.1.1.5开始加密会话这个可选的参数是布尔类型,表示请求的BACnet用户是要开始(TRUE)一个加密会话,还是要结束(FALSE)一个加密会话。如果本参数不存在,则没有建立加密会话,或者已经结束了加密会话。24.5.1.2Result(+)参数‘Result(+)’指明服务请求已经成功。如何鉴别请求设备不接收‘Result(+)’的安全性策略由生产商自行确定。如果希望对这个报文进行鉴别,则使用报文执行鉴别。‘Result(+)’参数返回在24.5.2中定义的修改的随机数。24.5.1.3Result(-)参数‘Result(-)’指明服务请求完全失败。失败的原因在‘错误类型’参数中说明。为了保证数据的完整性,使用客户的PK对‘错误类型’参数进行加密保护。24.5.1.3.1错误类型这个参数有两个部分:(1)‘错误类’(2)‘错误代码’。错误类是SECURITY,错误代码在18.5节中定义。24.5.2服务过程如果解码成功以及鉴别了请求的合法性之后,服务提供者执行下列4个任务之一:(a)报文执行鉴别,(b)报文起始鉴别,(c)操作员身份鉴别,(d)加密的会话确定。如果鉴别成功,则服务提供者生成修改的随机数,生成的方法是将接收的伪随机数每一个字节的最高位和最低位互换,并且将这个数装入‘Result(+)’原语中返回。否则,发送一个‘Result(-)’。在每一种情况中,都对APDU的参数进行加密。如果这个事务处理发生在客户设备与密钥服务器之间,则使用客户的PK。如果这个事务处理发生在非密钥服务器设备之间,则使用相应的SK对参数进行加密和解密。24.5.2.1报文执行鉴别报文执行鉴别过程包含下列的步骤:267(a)解码鉴别的APDU,开始关于‘期待的调用ID’的事务处理状态机。(b)等待30秒钟时间,期待接收来自请求设备的具有‘期待的调用ID’参数的另一个APDU。(c)如果接收到具有‘期待的调用ID’参数的APDU,则生成一个‘Result(+)’参数,并且返回给请求设备。否则,生成一个‘Result(-)’参数。24.5.2.2报文起始鉴别报文起始鉴别过程包含下列的步骤:(a)解码鉴别的APDU,确定关于‘期待的调用ID’的事务处理状态机是否存在关于请求设备的。(b)如果具有‘期待的调用ID’参数的APDU是未完成的,则生成一个‘Result(+)’参数,并且返回给请求设备。否则,生成一个‘Result(-)’原语。24.5.2.3操作员身份鉴别操作员身份鉴别过程包含下列的步骤:(a)解码鉴别的APDU,确定是否有一个合法的操作员名称能够与APDU中的‘操作员名称’参数匹配。如果没有,则返回一个‘Result(-)’原语。(b)如果操作员名称存在,检验‘操作员密码’的合法性。如果密码合法,则生成一个‘Result(+)’原语,并且返回给请求设备。否则,返回一个‘Result(-)’原语。24.5.2.4加密的会话确定加密的会话确定过程包含下列的步骤:(a)解码鉴别的APDU,向请求设备发送一个报文起始鉴别请求。(b)如果请求设备对这个报文起始鉴别请求作出肯定的响应,则执行设备将确定是否接纳这个关于开始一个加密会话或者结束一个加密会话的请求。如果可以接纳这个请求,则发送一个‘Result(+)’原语。否则,发送一个‘Result(-)’原语。26825.参考文献ANSI/IEEEStandard754(1985),IEEEStandardforBinaryFloating-PointArithmetic.ANSIX3.4(1977),AmericanNationalStandardCodeforInformationInterchange.ANSIX3.41(1974),AmericanNationalStandardCodeExtensionTechniquesforUsewiththe7-bitCodeCharacterSetofAmericanNationalStandardCodeforInformationInterchange.ANSIX3.92(1981),AmericanNationalStandardDataEncryptionAlgorithm.ATA/ANSI878.1(1992),ARCNETLocalAreaNetworkStandard.DDNProtocolHandbook,Volumes1-3NIC50004,50005,and50006.Echelon,LonMarkTMLayers1-6InteroperabilityGuidelinesVersion3.2.Echelon,LonTalk®ProtocolSpecificationVersion3.0.EIA-232-E(1991),InterfaceBetweenDataTerminalEquipmentandDataCommunicationEquipmentEmployingSerialBinaryDataInterchange.EIA-458(1983),StandardforElectricalCharacteristicsofGenerateandReceiversforUsein269BalancedDigitalMultipointSystems.FIPS46-2(1993),FederalInformationProcessingStandard-DataEncryptionStandard.ISO7498(1984),Informationprocessingsystems-OpenSystemsInterconnection-BasicReferenceModel.ISOTR8509(1987),Informationprocessingsystems-OpenSystemsInterconnection-serviceconventions.ISO8649(1988),Informationprocessingsystems-OpenSystemsInterconnection-servicedefinitionfortheAssociationControlServiceElement.ISO8802-2(1989),Informationprocessingsystems-Localareanetwork-Part2:Locallinkcontrol.ISO/IEC8802-3(1993),Informationprocessingsystems-Localareanetwork-Part3:Carriersensemultipleaccesswithcollisiondetection(CAMA/CD)accessmethodandphysicallayerspecifications.ISO8822(1988),Informationprocessingsystems-OpenSystemsInterconnection-Connection-orientedpresentationservicedefinition.ISO/IEC8824(1990),Informationtechnology-OpenSystemsInterconnection-SpecificationofAbstractSyntaxNotationOne(ASN.1).ISO/IEC8825(1990),Informationtechnology-OpenSystemsInterconnection-SpecificationofBasicEncodingRulesforAbstractSyntaxNotationOne(ASN.1).ISO9545(1989),Informationtechnology-OpenSystemsInterconnection-ApplicationLayerStructure(ALS).ISO/IEC10646-1(1993),IT-UniversalMultiple-OctetCodedCharacterSet(UCS)-Part1:ArchitectureandBasicMultilingualPlane.JESC6226(1983),CodeoftheJapaneseGraphicCharacterSetforInformationInterchange.JapanInstituteforStandardization.参考文献资源ANSI:AmericanNationalStandardsInstitute,11W.42ndSt.,13thFloor,NewYork,NY10036.270DDN:AvailablefromtheDefenseDataNetworkInformationCenter,SRIInternational,333RavenswoodAve.,RoomEJ291,MenloPark,CA94025.Echelon:EchelonCorporation,4015MirandaAve.,PaloAlto,CA94304EIA:ElectronicsIndustriesAssociation,2001EyeSt.N.W.,Washington,D.C.2006.FIPS:NationalInstituteofStandardsandTechnology,Gaithersburg,ND20899.IEEE:TheInstituteofElectricalandElectronicsEngineers,Inc.,345E.47thSt.,NewYork,NY10017ISO:AvailablefromANSI.JIS:AvailablefromANSI.271附件A-协议实现一致性声明(规范)(本附件是标准的一部分,要求实现。)BACnet协议实现一致性声明生产商名称(VendorName):__________________________________________产品名称(ProductName):__________________________________________产品型号(ProductModelNumber):____________________________________产品描述所支持的BACnet一致性类别类别1□类别4□类别2□类别5□类别3□类别6□所支持的BACnet功能组时钟功能组□文件功能组□手提操作设备功能组□重新初始化功能组□个人计算机工作站功能组□虚拟操作员接口功能组□事件起始功能组□虚拟终端功能组□事件响应功能组□设备通信功能组□272COV事件起始功能组□时间主站功能组□COV事件响应功能组□所支持的BACnet标准应用服务应用服务起始请求执行请求确认报警服务□□有证实COV通告服务□□有证实事件通告服务□□获得报警摘要服务□□获得登记摘要服务□□预订COV服务□□无证实COV通告服务□□无证实事件通告服务□□基本读文件服务□□基本写文件服务□□添加列表元素服务□□删除列表元素服务□□创建对象服务□□删除对象服务□□读属性服务□□条件读属性服务□□读多个属性服务□□写属性服务□□写多个属性服务□□所支持的BACnet标准应用服务(续)273应用服务起始请求执行请求设备通信控制服务□□有证实专有传输服务□□无证实专有传输服务□□重新初始化设备服务□□有证实文本报文服务□□无证实文本报文服务□□时间同步服务□□Who-Has服务□□I-Have服务□□Who-Is服务□□I-Am服务□□VT开启服务□□VT关闭服务□□VT数据服务□□鉴别服务□□请求密钥服务□□所支持的标准对象类型274对象类型是否支持是否可动态是否可动态可选的可写的创建删除属性支持属性模拟输入对象□□□__________________模拟输出对象□□□__________________模拟值对象□□□__________________二进制输入对象□□□__________________二进制输出对象□□□__________________二进制值对象□□□__________________日期表对象□□□__________________命令对象□□□__________________设备对象YesN/AN/A__________________事件登记对象□□□__________________文件对象□□□__________________组对象□□□__________________环对象□□□__________________多态输入对象□□□__________________多态输出对象□□□__________________通告类对象□□□__________________程序对象□□□__________________时间表对象□□□__________________数据链路层选项□ISO8802-3,10BASE5□ARCNET,coaxstar□MS/TPmaster,baudrate(s):__________□ISO8802-3,10BASE2□ARCNET,coaxbus□MS/TPslave,baudrate(s):___________□ISO8802-3,10BASET□ARCNET,twistedpairstar□Point-To-Point,EIA232,baudrate(s):____275□ISO8802-3,Fiber□ARCNET,twistedpairstar□Point-To-Point,modem,baudrate(s):____□ARCNET,fiberstar□LonTalk,medium:_________________□其它所支持的字符集表明支持多种字符集并不意味着它们能被同时支持。□ANSIX3.4□IBMTM/MicrosoftTMDBCS□JISC6226□ISO10646(ICS-4)□ISO10646(UCS2)□ISO8859-1特殊功能分段请求支持□yes□no窗口尺寸______分段响应支持□yes□no窗口尺寸______路由器□描述支持的路由能力____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________属性值域的限定:附件B-规范BACnet设备的指南(资料)(本附件不是标准的一部分,仅仅作为资料使用)在第22.1节中所定义的一致性类别和在第22.2节中所定义的功能组是要为那些设计、规范以及运行包含有BACnet设备的楼宇自动控制系统的人们提供一个有用的工具。这种分类的方法实际上是两个相互冲突的目标的折衷。一个目标是通过限制被支持的标准BACnet对象和服务的不同的组合,来提高系统的互操作性。另一个目标是避免对BACnet设备生产商进行不必要的限制,这种限制可能使得他们生产的设备具有用来满足一致性要求但在实际使用中却从不使用的BACnet功能。如果要求所有的BACnet设备支持完全相同的标准对象类型和应用服务的组合,当然可以达到最大的互操作性。另一方面,如果生产商拥有完全的自由,就不可避免地导致在设备所支持的具体的对象类型和应用服务方面存在广泛的差异,这样设备之间就只能实现部分的互操作。这种互操作性将被限制在只对所有设备都支持的应用服务和对象类型。包含在一致性类别中的思想是组合那些完成特定功能所必需的BACnet协议部分。当为一个自动化系统设计276或者规范BACnet设备时,一个合适的方法是指明满足应用需要的一致性类别和所要求的功能组。只要设备处于相同的一致性类别之中并且支持相同的功能组,那么设备就可以对一个给定的功能进行互操作。如果设备不处于相同的一致性类别之中,那么设备只能在低级别的一致性类别中和设备均支持的共同的功能组中进行互操作。许多设计良好的系统都含有代表一致性类别和功能组的混合的设备。某个生产商可能想要制造的设备支持比某一个一致性类别(或功能组)有更多的功能,但是又不要达到高一级的一致性类别的要求。这可以在协议实现一致性声明(PICS)中确定,方法是将所支持的对象类型和应用服务的枚举值与设备所支持的一致性类别与功能组进行对比。对于系统设计者来说,下面这一点是可以保证的,只要两个设备都声明支持某个服务,并且这两个设备对于这个服务的起始和执行具有所要求的组合,那么这两台设备肯定可以对这个服务进行互操作。附件C-对象类型结构形式描述(资料)(本附件不是标准的一部分,仅仅作为资料使用)ANALOG-INPUT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,device-type[31]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,update-interval[118]UnsignedOPTIONAL,units[117]BACnetEngineeringUnits,min-pres-value[69]REALOPTIONAL,max-pres-value[65]REALOPTIONAL,resolution[106]REALOPTIONAL,cov-increment[22]REALOPTIONAL,277time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,high-limit[45]REALOPTIONAL,low-limit[59]REALOPTIONAL,deadband[25]REALOPTIONAL,limit-enable[52]BACnetLimitEnableOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}ANALOG-OUTPUT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,device-type[31]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,units[117]BACnetEngineeringUnits,min-pres-value[69]REALOPTIONAL,max-pres-value[65]REALOPTIONAL,resolution[106]REALOPTIONAL,priority-array[87]BACnetPriorityArray,relinquish-default[104]REAL,cov-increment[22]REALOPTIONAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,high-limit[45]REALOPTIONAL,low-limit[59]REALOPTIONAL,deadband[25]REALOPTIONAL,limit-enable[52]BACnetLimitEnableOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}278ANALOG-VALUE::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,units[117]BACnetEngineeringUnits,min-pres-value[69]REALOPTIONAL,max-pres-value[65]REALOPTIONAL,resolution[106]REALOPTIONAL,priority-array[87]BACnetPriorityArray,relinquish-default[104]REAL,cov-increment[22]REALOPTIONAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,high-limit[45]REALOPTIONAL,low-limit[59]REALOPTIONAL,deadband[25]REALOPTIONAL,limit-enable[52]BACnetLimitEnableOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}BINARY-INPUT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,device-type[31]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,279out-of-service[81]BOOLEAN,polarity[84]BACnetPolarity,inactive-text[46]CharacterStringOPTIONAL,active-text[4]CharacterStringOPTIONAL,change-of-state-time[16]BACnetDateTimeOPTIONAL,change-of-state-time[15]UnsignedOPTIONAL,time-of-state-count-reset[115]BACnetDateTimeOPTIONAL,elapsed-active-time[33]Unsigned32OPTIONAL,time-of-active-time-reset[114]BACnetDateTimeOPTIONAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,alarm-value[6]BACnetBinaryPVOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}BINARY-OUTPUT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,device-type[31]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,polarity[84]BACnetPolarity,inactive-text[46]CharacterStringOPTIONAL,active-text[4]CharacterStringOPTIONAL,change-of-state-time[16]BACnetDateTimeOPTIONAL,change-of-state-time[15]UnsignedOPTIONAL,time-of-state-count-reset[115]BACnetDateTimeOPTIONAL,elapsed-active-time[33]Unsigned32OPTIONAL,time-of-active-time-reset[114]BACnetDateTimeOPTIONAL,minimum-off-time[66]Unsigned32OPTIONAL,minimum-on-time[67]Unsigned32OPTIONAL,priority-array[87]BACnetPriorityArray,280relinquish-default[104]REAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,feedback-value[40]BACnetBinaryPVOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}BINARY-VALUE::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,inactive-text[46]CharacterStringOPTIONAL,active-text[4]CharacterStringOPTIONAL,change-of-state-time[16]BACnetDateTimeOPTIONAL,change-of-state-time[15]UnsignedOPTIONAL,time-of-state-count-reset[115]BACnetDateTimeOPTIONAL,elapsed-active-time[33]Unsigned32OPTIONAL,time-of-active-time-reset[114]BACnetDateTimeOPTIONAL,minimum-off-time[66]Unsigned32OPTIONAL,minimum-on-time[67]Unsigned32OPTIONAL,priority-array[87]BACnetPriorityArray,relinquish-default[104]REAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,alarm-value[6]BACnetBinaryPVOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}CALENDAR::=SEQUENCE{281object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,description[28]CharacterStingOPTIONAL,present-value[85]REAL,date-list[23]SEQUENCEOFBACnetCalendarEntry}COMMAND::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,description[28]CharacterStingOPTIONAL,present-value[85]REAL,in-process[47]BOOLEAN,all-writes-successful[9]BOOLEAN,action[2]SEQUENCEOFBACnetActionList,--accessedasaBACnetARRAYaction-text[3]SEQUENCEOFOFCharacterStringOPTIONAL,--作为一个BACnet数组被访问}DEVICE::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,system-status[112]BACnetDeviceStatus,vendor-name[121]CharacterString,vendor-identifier[120]Unsigned16,model-name[70]CharacterString,firmware-revision[44]CharacterString,application-software-version[12]CharacterString,location[58]CharacterStringOPTIONAL,description[28]CharacterStingOPTIONAL,protocol-version[98]Unsigned,protocol-conformance-class[95]Unsigned(1..6),protocol-services-supported[97]BACnetServicesSupported,protocol-object-types-supported[97]BACnetObjectTypesSupported,object-list[76]SEQUENCEOFBACnetObjectIdentifier,--作为一个BACnet数组被访问282max-APDU-length-supported[62]Unsigned,segmentation-supported[107]BACnetSegmentation,vt-classes-supported[122]SEQUENCEOFBACnetVTClassOPTIONAL,active-vt-sessions[5]SEQUENCEOFBACnetVTSessionOPTIONAL,local-time[57]TimeOPTIONAL,local-date[56]DateOPTIONAL,utc-offset[119]INTEGEROPTIONAL,daylight-savings-status[24]BOOLEANOPTIONAL,apdu-segment-timeout[10]Unsigned,apdu-timeout[11]Unsigned,number-of-APDU-reteies[73]Unsigned,list-of-APDU-retries[55]SEQUENCEOFBACnetSessionKeyOPTIONAL,time-synchronization-recipients[116]SEQUENCEOFBACnetRecipientOPTIONAL,--对于时间主站是必需的max-master[64]Unsigned(1..127)OPTIONAL,--对于MS/TP主站是必需的,参见12.9节max-info-frames[63]UnsignedOPTIONAL,--对于MS/TP主站是必需的,参见12.9节device-address-binding[30]SEQUENCEOFBACnetAddressBinding}EVENT-ENROLLMENT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,description[28]CharacterStingOPTIONAL,event-type[37]BACnetEventType,notify-type[72]BACnetNotifyType,event-parameters[83]BACnetEventParameter,object-property-reference[78]BACnetObjectPropertyReference,event-state[36]BACnetEventState,event-enable[35]BACnetEventTransitionBits,acked-transitions[0]BACnetEventTransitionBits,notification-class[17]UnsignedOPTIONAL,recipient[101]BACnetRecipientOPTIONAL,process-identifier[89]UnsignedOPTIONAL,priority[86]UnsignedOPTIONAL,issue-confirmed-notifications[51]BOOLEANOPTIONAL}283FILE::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,description[28]CharacterStingOPTIONAL,file-type[43]CharacterString,file-size[42]Unsigned,modification-date[71]BACnetDateTime,archive[13]BOLLEAN,read-only[99]BOLLEAN,file-access-method[41]BACnetFileAccessMethod}GROUP::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,description[28]CharacterStingOPTIONAL,list-of-group-members[53]SEQUENCEOFReadAccessSpecification,present-value[85]SEQUENCEOFReadAccessResult}LOOP::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,update-interval[118]UnsignedOPTIONAL,output-units[82]BACnetEngineeringUnits,manipulated-variable-reference[60]BACnetObjectPropertyReference,controlled-variable-reference[19]BACnetObjectPropertyReference,controlled-variable-value[21]REAL,controlled-variable-units[20]BACnetEngineeringUnits,284setpoint-reference[109]BACnetSetpointReference,setpoint[108]REAL,action[2]BACnetAction,proportional-constant[93]REALOPTIONAL,proportional-constant-units[94]BACnetEngineeringUnitsOPTIONAL,integral-constant[49]REALOPTIONAL,integral-constant-units[50]BACnetEngineeringUnitsOPTIONAL,derivative-constant[26]REALOPTIONAL,derivative-constant-units[27]BACnetEngineeringUnitsOPTIONAL,bias[14]REALOPTIONAL,maximum-output[61]REALOPTIONAL,minimum-output[68]REALOPTIONAL,priority-for-writing[88]Unsigned(1..16),cov-increment[22]REALOPTIONAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,error-limit[34]UnsignedOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}MULTI-STATE-INPUT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,device-type[31]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,number-of-states[74]Unsigned,state-text[110]SEQUENCEOFCharacterStringOPTIONAL,--作为一个BACnet数组被访问time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,alarm-values[7]SEQUENCEOFUnsignedOPTIONAL,285fault-values[39]SEQUENCEOFUnsignedOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}MULTI-STATE-OUTPUT::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,device-type[31]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,event-state[36]BACnetEventState,reliability[103]BACnetReliabilityOPTIONAL,out-of-service[81]BOOLEAN,number-of-states[74]Unsigned,state-text[110]SEQUENCEOFCharacterStringOPTIONAL,--作为一个BACnet数组被访问priority-array[87]BACnetPriorityArray,relinquish-default[104]REAL,time-delay[113]UnsignedOPTIONAL,notification-class[17]UnsignedOPTIONAL,feedback-value[40]BACnetBinaryPVOPTIONAL,event-enable[35]BACnetTransitionBitsOPTIONAL,acked-transitions[0]BACnetTransitionBitsOPTIONAL,notify-type[72]BACnetNotifyTypeOPTIONAL}NOTIFICATION-CLASS::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,notification-class[17]UnsignedOPTIONAL,priority[86]UnsignedOPTIONAL,ack-required[1]BACnetEventTransitionBits,286recipient-list[102]SEQUENCEOFBACnetDestination}PROGRAM::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,program-state[92]BACnetProgramState,program-change[90]BACnetProgramRequest,reason-for-halt[100]BACnetProgramErrorOPTIONAL,description-of-halt[29]CharacterStringOPTIONAL,program-location[91]CharacterStringOPTIONAL,description[28]CharacterStingOPTIONAL,instance-of[48]CharacterStingOPTIONAL,status-flags[111]BACnetStatusFlags,reliability[103]BACnetRwliabilityOPTIONAL,out-of-service[81]BOOLEAN}SCHEDULE::=SEQUENCE{object-identifier[75]BACnetObjectIdentifier,object-name[77]CharacterString,object-type[79]BACnetObjectType,present-value[85]REAL,description[28]CharacterStingOPTIONAL,effective-period[32]BACnetDateRange,weekly-schedule[123]SEQUENCESIZE(7)OFBACnetDailyScheduleOPTIONAL,--作为一个BACnet数组被访问exception-schedule[38]SEQUENCEOFBACnetSpecialEventOPTIONAL,list-of-object-property-references[54]SEQUENCEOFBACnetObjectPropertyReference,priority-for-writing[88]Unsigned(1..16)}287附件D-标准对象类型例程(资料)(本附件不是标准的一部分,仅仅作为资料使用)本附件提供11节所定义的BACnet标准对象类型的例程。D.1模拟输入对象例程下面是用于空调控制器中的混合空气温度模拟输入对象的例程。对象支持属性值改变报告和内部报告。Property:Object_Identifier=(AnalogInput,Instance1)Property:Object_Name=“1AH1MAT”Property:Object_Type=ANALOG_INPUTProperty:Present_Value=58.1Property:Description=“MixedAirTemperature”Property:Device_Type=“1000OHMRTD”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Update_Interval=10Property:Units=DEGREES-FAHRENHEITProperty:Min_Pres_Value=-50.0Property:Max_Pres_Value=250.0Property:Resolution=0.1//分辨率??Property:COV_Increment=0.2Property:Time_Delay=10Property:Notification_class=3Property:High_Limit=60.0Property:Low_Limit=55.0Property:Deadband=1.0Property:Limit_Enable={TRUE,TURE}Property:Event_Enable={TRUE,FALSE,TRUE}288Property:Acked_Transitions={TRUE,TRUE,TRUE}Property:Notify_Type=EVENTD.2模拟输出对象例程下面是用于空调控制器中风门模拟输出对象的例程。对象即不支持属性值改变报告,也不支持内部报告。Property:Object_Identifier=(AnalogOutput,Instance1)Property:Object_Name=“1AH1DMPR”Property:Object_Type=ANALOG_OUTPUTProperty:Present_Value=75.0Property:Description=“DamperActuator”Property:Device_Type=“3-8PSIActuator”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Units=PERCENTProperty:Min_Pres_Value=0.0Property:Max_Pres_Value=100.0Property:Resolution=0.1Property:Priority_Array={NULL,NULL,NULL,NULL,75.0…NULL}Property:Relinquish_Default=50.0D.3模拟值对象例程下面是用于热函计算的模拟值对象的例程。对象即不支持属性值改变报告,也不支持内部报告。Property:Object_Identifier=(AnalogValue,Instance1)Property:Object_Name=“1AH1ENTH”Property:Object_Type=ANALOG_VALUEProperty:Present_Value=38.1Property:Description=“Enthalpy”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Units=BTU-PER-POUND-DRY-AIRD.4二进制输入对象例程例1:典型二进制输入对象。289在本例中,二进制输入与一个常开静态高压开关相连。超出开关的静态压力极限,开关便会关闭。实际输入的活动状态表明开关关闭。对象支持属性值改变报告和内部报告。Property:Object_Identifier=(BinaryInput,Instance1)Property:Object_Name=“HighPressSwitch”Property:Object_Type=BINARY_INPUTProperty:Present_Value=ACTIVEProperty:Description=“PenthouseSupplyHighStatic”Property:Device_Type=“ABCPressureSwitch”Property:Status_Flag={TRUE,FALSE,FALSE,FALSE}Property:Event_State=OFFNORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Polarity=NORMALProperty:Inactive_Text=“StaticPressureOK”Property:Active_Text=“HighPressureAlarm”Property:Change_of_State_Time=(23-MAR-1995,19:01:34.0)Property:Change_of_State_Count=134Property:Time_of_State_Count_Reset=(1-JAN-1995,00:00:00.0)Property:Elapsed_Active_Time=401Property:Time_of_Active_Time_Reset=(1-JAN-1995,00:00:00.0)Property:Time_Delay=10Property:Notification_class=3Property:Alarm_Value=ACTIVEProperty:Event_Enable={TRUE,FALSE,TRUE}Property:Acked_Transitions={FALSE,TRUE,TRUE}Property:Notify_Type=ALARM例2:脱离服务的二进制输入对象。在这第二个例程中,上例中的控制系统发现了有断路发生。输入脱离服务。Property:Object_Identifier=(BinaryInput,Instance1)Property:Object_Name=“HighPressSwitch”Property:Object_Type=BINARY_INPUTProperty:Present_Value=INACTIVEProperty:Description=“PenthouseSupplyHighStatic”Property:Device_Type=“ABCPressureSwitch”Property:Status_Flag={FALSE,TRUE,FALSE,TRUE}Property:Event_State=NORMALProperty:Reliability=OPEN_LOOPProperty:Out_of_Service=TRUE290Property:Polarity=NORMALProperty:Inactive_Text=“StaticPressureOK”Property:Active_Text=“HighPressureAlarm”Property:Change_of_State_Time=(23-MAR-1995,19:01:34.0)Property:Change_of_State_Count=135Property:Time_of_State_Count_Reset=(1-JAN-1995,00:00:00.0)Property:Elapsed_Active_Time=451Property:Time_of_Active_Time_Reset=(1-JAN-1995,00:00:00.0)Property:Time_Delay=10Property:Notification_class=3Property:Alarm_Value=ACTIVEProperty:Event_Enable={TRUE,FALSE,TRUE}Property:Acked_Transitions={TRUE,TRUE,TRUE}Property:Notify_Type=ALARMD.5二进制输出对象例程例1:典型二进制输出对象。在本例中,一个风扇由一个和常闭继电器相连的二进制输出控制。继电器不工作时,风扇将保持运行。二进制输出对象的非活动状态经极性属性反转,驱动继电器关闭风扇。注意:本例中优先值数组属性包含全空,因此释放缺省属性确定当前值属性。对象不支持内部报告。Property:Object_Identifier=(BinaryOutput,Instance1)Property:Object_Name=“Floor3ExhaustFan”Property:Object_Type=BINARY_OUTPUTProperty:Present_Value=INACTIVEProperty:Description=“Thirdfloorbathroomexhaustfan”Property:Device_Type=“ABC100Relay”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Polarity=REVERSEProperty:Inactive_Text=“Fanisturnedoff”Property:Active_Text=“Fanisrunning”Property:Change_of_State_Time=(23-MAR-1995,19:01:34.0)Property:Change_of_State_Count=47Property:Time_of_State_Count_Reset=(1-JAN-1995,00:00:00.0)Property:Elapsed_Active_Time=650Property:Time_of_Active_Time_Reset=(1-JAN-1995,00:00:00.0)Property:Minimum_Off_Time=100291Property:Minimum_On_Time=10Property:Priority_Array={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}Property:Relinquish_Default=INACTIVE例2:被管制的二进制输出对象。在这第二个例程中,风扇被发现是不可运行的。因为风扇在修复前是不能运行的,所以操作员管制了控制系统,以保持风扇处于非活动状态。Property:Object_Identifier=(BinaryOutput,Instance1)Property:Object_Name=“Floor3ExhaustFan”Property:Object_Type=BINARY_OUTPUTProperty:Present_Value=INACTIVEProperty:Description=“Thirdfloorbathroomexhaustfan”Property:Device_Type=“ABC100Relay”Property:Status_Flag={FALSE,TRUE,TRUE,FALSE}Property:Event_State=NORMALProperty:Reliability=OPEN_LOOPProperty:Out_of_Service=FALSEProperty:Polarity=REVERSEProperty:Inactive_Text=“Fanisturnedoff”Property:Active_Text=“Fanisrunning”Property:Change_of_State_Time=(23-MAR-1995,19:01:34.0)Property:Change_of_State_Count=134Property:Time_of_State_Count_Reset=(1-JAN-1995,00:00:00.0)Property:Elapsed_Active_Time=401Property:Time_of_Active_Time_Reset=(1-JAN-1995,00:00:00.0)Property:Minimum_Off_Time=100Property:Minimum_On_Time=10Property:Priority_Array={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}Property:Relinquish_Default=INACTIVED.6二进制值对象例程292在本例中,二进制值是一种允许排气扇由操作员决定是否使能的机制。风扇控制逻辑利用这个值决定如果其它条件符合时风扇是否可以运行。例如,如果火灾警报发生或系统关闭,风扇可以不关闭。对象不支持内部报告。Property:Object_Identifier=(BinaryValue,Instance1)Property:Object_Name=“ExhaustFanEnable”Property:Object_Type=BINARY_VALUEProperty:Present_Value=ACTIVEProperty:Description=“ExhaustFanOperatorEnable”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Inactive_Text=“EnabledbyOperator”Property:Active_Text=“FanNotEnabledbyOperator”Property:Change_of_State_Time=(23-MAR-1995,19:01:34.0)Property:Change_of_State_Count=134Property:Time_of_State_Count_Reset=(1-JAN-1995,00:00:00.0)Property:Elapsed_Active_Time=401Property:Time_of_Active_Time_Reset=(1-JAN-1995,00:00:00.0)Property:Minimum_Off_Time=0Property:Minimum_On_Time=0Property:Priority_Array={NULL…NULL,ACTIVE}Property:Relinquish_Default=INACTIVED.7日期表对象例程下面是为学校指定假日的日历对象的例程。Property:Object_Identifier=(Calendar,Instance1)Property:Object_Name=“HOLIDAYS”Property:Object_Type=CALENDARProperty:Description=“1995SchoolDistrictHolidays”Property:Present_Value=TRUEProperty:DateList=((19-FEB-1995),(28-MAY-1995),((24-DEC-1995)-(4-JAN-1996)))这是一个称为“假日”的日历。假日定于2月19日的总统日,5月28日的阵亡将士纪念日和12月24日至次年1月4日的圣诞节假期。在这些日子中日历的当前值为真。其余的日子中当前值为假。当然,真正的校历在日期列表中会有更多的内容,这里为了简便起见只用了三条。293D.8命令对象例程例1:有人和无人区在本例中,办公楼的一个特殊区域有两个温度设置点:一个对应于无人时的操作,另一个对应于有人时的操作。在无人时期区域照明管制强行关闭照明。设置命令对象的当前值为1选择无人模式,选2则为有人模式。假定对象:Object_IdentifierObject_NameObject_TypeX’00800005’ZONE43ANALOG_VALUEX’01000003’LIGHTING43BINARY_OUTPUTProperty:Object_Identifier=(Command,Instance1)Property:Object_Name=“ZONE43CONTROL”Property:Object_Type=COMMANDProperty:Description=“FourthFloor,WestWingOfficeSuite”Property:Present_Value=1Property:In_Process=FALSEProperty:All_Writes_Successful=TRUEProperty:Action={((,(AnalogValue,Instance5),Present_Value,,65.0,,TRUE,TRUE),(,(BinaryOutput,Instance3),Present_Value,,INACTIVE,8,1,TRUE,TRUE)),((,(AnalogValue,Instance5),Present_Value,,72.0,,TRUE,TRUE),(,(BinaryOutput,Instance3),Present_Value,,ACTIVE,8,2,TRUE,TRUE))}Property:Action_Text={“Unoccupied”,“Occupied”}例2:有人和无人区本例在前一个例程的基础上增加了在包含命令对象的设备与控制电梯子系统的其它设备之间进行通信。当区域设置成为无人模式时,大楼该层的电梯服务锁住。在本例中,电梯子系统在BACnet设备“DDC4”中。假定对象:Object_IdentifierObject_NameObject_TypeX’00800005’ZONE43ANALOG_VALUEX’01000003’LIGHTING43BINARY_OUTPUTX’02000001’DDC4DEVICEX’01400001’FL4BINARY_VALUE294Property:Object_Identifier=(Command,Instance1)Property:Object_Name=“ZONE43CONTROL”Property:Object_Type=COMMANDProperty:Description=“FourthFloor,WestWingOfficeSuite”Property:Present_Value=2Property:In_Process=FALSEProperty:All_Writes_Successful=TRUEProperty:Action={((,(AnalogValue,Instance5),Present_Value,,65.0,8,TRUE,TRUE),(,(BinaryOutput,Instance3),Present_Value,,INACTIVE,8,1,TRUE,TRUE)),((Device,Instance1),(BinaryValue,Instance1),Present_Value,,INACTIVE,8,1,TRUE,TRUE)),((,(AnalogValue,Instance5),Present_Value,,72.0,8,2,TRUE,TRUE),(,(BinaryOutput,Instance3),Present_Value,,ACTIVE,8,,TRUE,TRUE)),((Device,Instance1),(BinaryValue,Instance1),Present_Value,,ACTIVE,8,,TRUE,TRUE))}Property:Action_Text={“Unoccupied”,“Occupied”}D.9设备对象例程例1:“复杂的”BACnet设备。Property:Object_Identifier=(Device,Instance1)Property:Object_Name=“AC1SystemController”Property:Object_Type=DEVICEProperty:System_Status=OPERATIONALProperty:Vendor_Name=“ABCControls”Property:Vendor_Identifier=1001Property:Model_Name=“1000Plus”Property:Firmware_Revision=“1.2”Property:Application_Software_Version=“V4.0–April12,1989”Property:Location=“BasementMechanicalRoom”295Property:Description=“AC1Controller”Property:Protocol_Version=1Property:Protocol_Conformance_Class=6Property:Protocol_Service_Supported=B’11111111111111111111111111111111111’Property:Protocol_Object_Type_Supported=B’111111111111111111’Property:Object_List=((AnalogInput,Instance1),(AnalogInput,Instance2),…)Property:Max_APDU_Length_Accepted=400Property:Segmentation_Supported=SEGMENTED_BOTHProperty:VT_Classes_Supported=(DEFAULT-TERMINAL,VT100)Property:Active_VT_Sessions=((29,5,1,X’0000C0B3EF13’),(23,8,2,x’05’))Property:Local_Time=“12:34:56.78”Property:Local_Date=“29-SEP-1989”Property:UTC_Offset=6.0Property:Daylight_Savings_Status=FALSEProperty:APDU_Segment_Timeout=2,000Property:APDU_Timeout=60,000Property:Number_of_APDU_Retries=3Property:List_Of_Session_Keys=((X’3799246237984589’,1,3),(X’4446214686489744’,1,5))Property:Time_Synchronization_Recipient=(Device,Instance18)Property:Device_Address_Binding=(((Device,Instance1),1,1),(Device,Instance12),1,23),(Device,Instance40),2,X’02608C41A606’),…)例2:“简单的”BACnet设备Property:Object_Identifier=(Device,Instance2)Property:Object_Name=“Room101VAVController”Property:Object_Type=DEVICEProperty:System_Status=DOWNLOAD_REQUIREDProperty:Vendor_Name=“XYZControls”Property:Vendor_Identifier=1001Property:Model_Name=“VAV1000”Property:Firmware_Revision=“1.0”Property:Application_Software_Version=“2-1-88”296Property:Protocol_Version=1Property:Protocol_Conformance_Class=2Property:Protocol_Service_Supported=B’11110100000010010000100000111100011’Property:Protocol_Object_Type_Supported=B’110110110100010001’Property:Object_List=((AnalogInput,Instance1),(AnalogInput,Instance2),(AnalogOutput,Instance1),(BinaryInput,Instance1),(BinaryOutput,Instance1),(Device,Instance9))Property:Max_APDU_Length_Accepted=50Property:Segmentation_Supported=NO_SEGMENTATIONProperty:APDU_Segment_Timeout=2,000Property:APDU_Timeout=60,000Property:Number_of_APDU_Retries=3Property:Max_Master=85Property:Max_Info_Frames=3Property:Device_Address_Binding=(((Device,Instance1),1,1),(Device,Instance12),1,23))D.10事件登记对象例程在下面的例程中,假定了模拟输入对象。ANALOG_INPUTProperty:Object_Identifier=(AnalogInput,Instance2)Property:Object_Name=“Zone1_Temp”Property:Object_Type=ANALOG_INPUTProperty:Present_Value=86.0Property:Description=“ReceptionistLobbyTemp”Property:Device_Type=“PT3KRTD”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Update_Interval=5Property:Units=DEGREES-FAHRENHEITProperty:Min_Pres_Value=55.0Property:Max_Pres_Value=95.0297Property:Resolution=0.1例1:偏离范围事件类型。这是一个偏离范围事件类型的例程。从正常到高阈值的状态转换没有被确认。接收设备的管理将使用通告类对象完成。EVENT_ENROLLMENTProperty:Object_Identifier=(EventEnrollment,Instance1)Property:Object_Name=“Zone1_Alarm”Property:Object_Type=EVENT_ENROLLMENTProperty:Description=“Zone1_Alarm”Property:Event_Type=OUT_OF_RANGEProperty:Notify_Type=ALARMProperty:Event_Parameters=(30,65.0,85.0,0.25)Property:Object_Property_Reference=((AnalogInput,Instance2),Present_Value)Property:Event_State=HIGH_LIMITProperty:Event_Enable=(TRUE,TRUE,TRUE)Property:Acked_Transitions=(FALSE,TRUE,TRUE)Property:Notification_Class=1例2:值改变事件类型。这是一个值改变事件类型的例程。接收设备的管理将使用事件登记对象的可选属性替代通告类对象完成。EVENT_ENROLLMENTProperty:Object_Identifier=(EventEnrollment,Instance2)Property:Object_Name=“Zone1TempCOV”Property:Object_Type=EVENT_ENROLLMENTProperty:Description=“Zone1TemperatureCOV”Property:Event_Type=CHANGE_OF_VALUEProperty:Notify_Type=EVENTProperty:Event_Parameters=(5,0.25)Property:Object_Property_Reference=((AnalogInput,Instance2),Present_Value)Property:Event_State=NORMALProperty:Event_Enable=(TRUE,FALSE,FALSE)Property:Acked_Transitions=(TRUE,TRUE,TRUE)Property:Recipient=(Device,Instance33)Property:Process_Identifier=4298Property:Priority=87Property:Issue_Comfirmed_Notification=TRUE例3:比特位串改变事件类型。本例说明了比特位串改变事件的使用。EVENT_ENROLLMENTProperty:Object_Identifier=(EventEnrollment,Instance3)Property:Object_Name=“Zone1Rel”Property:Object_Type=EVENT_ENROLLMENTProperty:Description=“Reliabilityalarmforzone1temperature”Property:Event_Type=CHANGE_OF_BITSTRINGProperty:Notify_Type=ALARMProperty:Event_Parameters=(30,B’0111’,(B’0100’,B’0010’,B’0001’,B’0110’,B’0101’,B’0011’))Property:Object_Property_Reference=((AnalogInput,Instance2),Status_Flags)Property:Event_State=NORMALProperty:Event_Enable=(TRUE,TRUE,FALSE)Property:Acked_Transitions=(TRUE,TRUE,TRUE)Property:Notification_Class=3D.11文件对象例程文件对象保存趋向信息:Property:Object_Identifier=(File,Instance7)Property:Object_Name=“TREND_AI1”Property:Object_Type=FILEProperty:Description=“TrendofAI1”Property:File_Type=“TREND”Property:File_Size=45Property:Modification_Date=(1-NOV-1995,08:30:49.0)Property:Archive=FALSEProperty:Read_Only=FALSEProperty:File_Access_Method=RECORD_ACCESSD.12组对象例程下面是在楼宇的一部分用作参考温度的组对象的例程。299Property:Object_Identifier=(Group,Instance1)Property:Object_Name=“ZONE1_TEMPS”Property:Object_Type=GROUPProperty:Description=“Zone1TemperatureGroup”Property:List_of_Group_Menbers=(((AnalogInput,Instance8),(present_Value,Reliability,Description)),((AnalogInput,Instance9),(present_Value,Reliability,Description)),((AnalogInput,Instance10),(present_Value,Reliability,Description)),((AnalogInput,Instance11),(present_Value,Reliability,Description)),((AnalogInput,Instance12),(present_Value,Reliability,Description)))Property:Present_Value=(((AnalogInput,Instance8),Present_Value,69.7,Reliability,NO_FAULT_DETECTED,Description,“Room1”),((AnalogInput,Instance9),Present_Value,71.2,Reliability,NO_FAULT_DETECTED,Description,“Room2”),((AnalogInput,Instance10),Present_Value,-50.0,Reliability,NO_FAULT_DETECTED,Description,“Room3”),((AnalogInput,Instance11),Present_Value,69.7,Reliability,NO_FAULT_DETECTED,Description,“Room4”),((AnalogInput,Instance12),Present_Value,73.3,Reliability,NO_FAULT_DETECTED,Description,“Room5”),D.13环对象例程下面是用于空调控制器中的提供空气温度控制的环对象的例程。代表算法是如下的定位PI算法。Output={Proportional_Constant[Error+(Integral_Constant“IntegraloftheError”)]}+BiasWhere:Error=(Process_Variable_Value–Setpoint)and“IntegraloftheError”hasunitsof℉-min300假定对象:Object_IdentifierObject_NameObject_TypeX’00400005’AHU_VALUEANALOG_OUTPUTX’00000003’AHU_SATANALOG_OUTPUTX’00000007’RESET_OATANALOG_VALUE这个对象支持COV报告。Property:Object_Identifier=(Loop,Instance1)Property:Object_Name=“AHU_SAT_LOOP”Property:Object_Type=LOOPProperty:Present_Value=8.3Property:Description=“Supplyairtemp.PIcontrol”Property:Status_Flag={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Update_Interval=1Property:Output_Units=POUNDS-FORCE-PER-SQUARE-INCHProperty:Manipulated_Variable_Reference=((AnalogOutput,Instance5),Present_Value)Property:Controlled_Variable_Reference=((AnalogInput,Instance3),Present_Value)Property:Controlled_Variable_Value=56.1Property:Controlled_Variable_Units=DEGREES-FAHRENHEITProperty:Setpoint_Reference=((AnalogValue,Instance7),Present_Value)Property:Setpoint=57.0Property:Action=DIRECTProperty:Proportional_Constant=0.5Property:Proportional_Constant_Units=PSI-PER-DEGREE-FAHRENHEITProperty:Integral_Constant=0.1Property:Integral_Constant_Units=PER-MINUTEProperty:Derivative_Constant=0.0Property:Derivative_Constant_Units=NO-UNITSProperty:Bias=9.0Property:Maximum_Output=15.0Property:Minimum_Output=3.0Property:Priority_For_Writing=10Property:COV_Increment=0.2Property:Time_Delay=3Property:Notification_Class=1301Property:Error_Limit=5.0Property:Event_Enable={TRUE,TRUE,TRUE}Property:Acked_Transitions={TRUE,TRUE,TRUE}Property:Notify_Type=ALARMD.14多态输入对象例程例1:双速风扇在本例中输入#1同与低速启动器联系的“aux”连接,输入#2同与高速启动器联系的“aux”连接。如果低速启动器为“关”,那么高速启动器将禁止。下表显示了两个输入与当前值之间的联系。用于确定和建立当前值的实际逻辑由生产商自行确定。这个对象支持内部报告。Present_ValueLow-SpeedStarterHigh-SpeedStarter1OFF(inactive)OFF(inactive)2ON(active)OFF(inactive)3ON(active)ON(active)TableB-1Property:Object_Identifier=(Multi-stateInput,Instance1)Property:Object_Name=“Fan1_Input”Property:Object_Type=MULTISTATE_INPUTProperty:Present_Value=2Property:Description=“2-speedFan#1”Property:Status_Flags={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Number_of_States=3Property:State_Text=(“Off”,“On_Low”,“On_High”)Property:Time_Delay=3Property:Notification_Class=4Property:Alarm_Values=3Property:Fault_Values=2Property:Event_Enable={TRUE,TRUE,TRUE}Property:Acked_Transitions={TRUE,TRUE,TRUE}Property:Notify_Type=EVENT例2:Hand-off-auto开关。在本例中three-positionhand-off-auto开关的状态作为二进制输入被监视着。如果第一个输入是有效302的,则当前值被设为1(手动);如果第二个输入是有效的,当前值则设为2(关);如果第三个输入是有效的,则当前值为3(自动)。对象不支持内部报告。Property:Object_Identifier=(Multi-stateInput,Instance2)Property:Object_Name=“H-O-A”Property:Object_Type=MULTISTATE_INPUTProperty:Present_Value=1Property:Description=“Hand-Off-Auto1”Property:Device_Type=“ZZZswitch”Property:Status_Flags={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Number_of_States=3Property:State_Text=(“Hand”,“Off”,“Auto”)D.15多态输出对象例程例1:双速风扇。在本例中输出#1同低速启动器的线圈连接,输出#2同高速启动器的线圈”连接。如果低速启动器为“关”,那么高速启动器将禁止。下表显示了两个输出与当前值之间的联系。用于确定和建立当前值的实际逻辑由生产商自行确定。这个对象支持内部报告。Present_ValueLow-SpeedStarterHigh-SpeedStarter1OFF(inactive)OFF(inactive)2ON(active)OFF(inactive)3ON(active)ON(active)TableB-2Property:Object_Identifier=(Multi-stateOutput,Instance1)Property:Object_Name=“Fan1_Output”Property:Object_Type=MULTISTATE_OUTPUTProperty:Present_Value=2Property:Description=“2-speedFan#1”Property:Device_Type=“ABCFanModelA-6”Property:Status_Flags={FALSE,FALSE,FALSE,FALSE}Property:Event_State=OFFNORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Number_of_States=3303Property:State_Text={“Off”,“On_Low”,“On_High”}Property:Priority_Array={NULL,NULL…2…NULL}Property:Relinquish_Default=1Property:Time_Delay=3Property:Notification_Class=4Property:Feedback_Value=3Property:Event_Enable={TRUE,TRUE,TRUE}Property:Acked_Transitions={TRUE,TRUE,TRUE}Property:Notify_Type=EVENT例2:Three-position开关。在本例中three-position开关的状态作为二进制输出被控制着。如果当前值为1,则第一个输出是活动的。如果当前值为2,则第二个输出是活动的。如果当前值为3,则第三个输出是活动的。这个对象不支持内部报告。Property:Object_Identifier=(Multi-stateOutput,Instance2)Property:Object_Name=“3-POS-SW”Property:Object_Type=MULTISTATE_OUTPUTProperty:Present_Value=1Property:Description=“3POSITIONSWITCH#1”Property:Status_Flags={FALSE,FALSE,FALSE,FALSE}Property:Event_State=NORMALProperty:Reliability=NO_FAULT_DETECTEDProperty:Out_of_Service=FALSEProperty:Number_of_States=3Property:State_Text={“Position_1”,“Position_2”,“Position_3”}Property:Priority_Array={NULL…NULL}Property:Relinquish_Default=1D.16通告类对象例程下面是用于包含一个与时间有关的接收列表的关键性系统警报的通告类对象的例程。Property:Object_Identifier=(NotificationClass,Instance1)Property:Object_Name=“Alarms1”Property:Object_Type=NOTIFICATION_CLASSProperty:Description=“CriticalSystemAlarms”Property:Notification_Class=1Property:Priority=(3,10,10)Property:Ack_Required=(TRUE,TRUE,TURE)304Property:Recipient_List=(((Monday,Tuesday,Wednesday,Thursday,Friday),6:00,20:00,(Device,Instance12),21,TRUE,(TRUE,TRUE,TRUE)),((Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday),0:00,6:00,(Device,Instance18),5,TRUE,(TRUE,TRUE,FALSE)),((Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday),20:00,24:00,(Device,Instance18),5,TRUE,(TRUE,TRUE,FALSE)))D.17程序对象例程下面的部分将提供几个应用程序,这些程序使用程序对象作为它们网络可见的活动表现形式以及程序特定参数形式。例程中的生产商指定属性纯粹用于说明的目的,并不是本标准的要求。特别地,在每个例程中利用助记名说明属性标识符的使用。这些属性的实际实现将使用每个生产商自定的数值代码,来代表标准中没有定义的属性。例1:平均程序。在本例中,应用程序使用三个属性Value1,Value2,Value3作为输入,并且得出如公式表达的三输入平均的输出:Average=(Value1+Value2+Value3)/3.程序对象已经通过增加四个生产商自定义的属性Value1,Value2,Value3和Average进行了扩展。Property:Object_Identifier=(Program,Instance1)Property:Object_Name=“SomeAverage”Property:Object_Type=PROGRAMProperty:Program_State=RUNNINGProperty:Program_Change=READYProperty:Reason_For_Halt=NORMALProperty:Description_Of_Halt=“Normal”Property:Program_Location=“Line2”Property:Description=“AverageofSomethings”Property:Instance_Of=“ThreeWayAverager”Property:Status_Flags={FALSE,FALSE,FALSE,FALSE}Property:Reliability=NO_FAULT_DETECTEDProperty:Out_Of_Service=FALSE305Property:Value1=10Property:Value2=22Property:Value3=28Property:Average=20注:上面带星号“”的属性被称为生产商自定义属性。它们在这里纯粹用于说明的目的,不是本标准的要求。例2:最大流量程序。在本例中,应用程序使用三个属性Ref1,Ref2,Ref3作为BACnet属性引用属性,这是用于指向作为输入和得到如公式表达的三输入最大值输出的其它三个对象属性的:Max=Maximum_Of(Ref1,Ref2,Ref3).程序对象已经通过增加四个生产商自定义的属性Ref1,Ref2,Ref3和Max进行了扩展。Property:Object_Identifier=(Program,Instance2)Property:Object_Name=“MaxFlow”Property:Object_Type=PROGRAMProperty:Program_State=RUNNINGProperty:Program_Change=READYProperty:Reason_For_Halt=NORMALProperty:Description_Of_Halt=“Normal”Property:Program_Location=“Line5”Property:Description=“MaximumofthreeFlows”Property:Instance_Of=“Max3Refs”Property:Status_Flags={FALSE,FALSE,FALSE,FALSE}Property:Reliability=NO_FAULT_DETECTEDProperty:Out_Of_Service=FALSEProperty:Ref1=((AnalogInput,Instance272),Present_Value)Property:Ref2=((AnalogInput,Instance273),Present_Value)Property:Ref3=((AnalogInput,Instance274),Present_Value)Property:Max=45.6注:上面带星号“”的属性被称为生产商自定义属性。它们在这里纯粹用于说明的目的,不是本标准的要求。D.18时间表对象例程下面是用于在学年中控制教室的时间表对象的例程。在本例中,假定定义一个不同的时间表对象用于年历中剩余的部分。时间表的引用属性是一个二进制输出对象的当前值属性,这个二进制输出对象控制为208房间提供空调的房顶单元。306Property:Object_Identifier=(Schedule,Instance2)Property:Object_Name=“Rm208Sched”Property:Object_Type=SCHEDULEProperty:Present_Value=ACTIVEProperty:Description=“Room208Schedule”Property:Effective_Period=((5-SEP-1995)-(10-JUN-1996))Property:Weekly_Schedule={((8:00,ACTIVE),(17:00,INACTIVE)),((8:00,ACTIVE)),((8:00,ACTIVE),(17:00,INACTIVE)),((8:00,ACTIVE),(17:00,INACTIVE),(19:00,ACTIVE),(23:30,INACTIVE)),((8:00,ACTIVE),(17:00,INACTIVE),((00:00,INACTIVE)),((10:00,ACTIVE),(17:00,INACTIVE))}Property:Exception_Schedule={((23-NOV-1995),(0:00,INACTIVE),10),((HOLIDAYS,(0:00,INACTIVE),11),((5-MAR-1996)-(7-MAR-1996),((9:00,ACTIVE),(14:00,INACTIVE)),6)}Property:List_Of_Object_Property_References=((BinaryOutput,Instance9),Present_Value)Property:Priority_For_Writing=15在一般情况下,星期一、星期三和星期五为房间提供空调的房顶部分在上午8点激活,在下午5点关闭。一般星期二房顶部分在上午8点激活,另外不被时间表影响。一般星期四房顶部分在上午8点激活,在下午5点关闭,在下午7点再次激活,在夜晚11:30关闭。1995年11月23日,星期五,星期五一般时间表被例外时间表(Exception_Schedule)列表中的第一条特殊事件(SPECIALEVENT)覆盖,房顶部分将整天关闭。1996年2月19日,星期一,根据D.7中所述的假日(HOLIDAYS)日历,星期一一般时间表被例外时间表列表中的第二条特殊事件覆盖。因为1996年2月19日,总统日,是在假日对象的日期列表中。房顶部分将整天关闭。1996年3月5日到1996年3月7日,因为教师协商会的原因,一般时间表被第三条特殊事件覆盖。在这三天中,房顶部分将在上午9点激活,在下午2点关闭。307附件E-BACnet应用服务的例程(资料)(本附件不是标准的一部分,仅仅作为资料使用)本附件提供13-17节所定义的应用服务的使用例程。在这些例程中,属性名称使用混合大小写字母表示,具有字符串数据类型的属性值封装在双引号中,枚举类型的值使用全大写字母表示。例程中不包含参数的编码,只有参数的未编码的符号值。例程中的编码见附件F。E.1报警和事件服务E.1.1确认报警服务例程参见E.1.3的与有证实事件通告服务协同的确认报警服务和E.1.8的与无证实事件通告服务协同的确认报警服务。E.1.2有证实COV通告服务例程下面的例程说明了被监视的模拟输入对象当前值改变的通告。Service=ConfirmedCOVNotification‘SubscriberProcessIdentifier’=18‘InitiatingDeviceIdentifier’=(Device,Instance4)‘MonitoredObjectIdentifier’=(AnalogInput,Instance10)‘TimeRemaining’=0308‘ListofValues’=((Present_Value,65.0),(Status_Flags,(FALSE,FALSE,FALSE,FALSE,)))E.1.3有证实事件通告服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance2)Zone1_TempANALOG_INPUT考虑一个名为“Zone1_Temp”的支持内部事件报告的模拟输入对象,假定在区域一中温度刚升至超过高阈值,导致报警进入活动状态,在确认转换属性中的进入异常比特位被清除。进一步假定没有与之相联系的报文文本。设备将发出一个带有如下参数的有证实事件通告服务请求原语:Service=ConfirmedEventNotification‘ProcessIdentifier’=1‘InitiatingDeviceIdentifier’=(Device,Instance4)‘EventObjectIdentifier’=(AnalogInput,Instance2)‘TimeStamp’=16‘NotificationClass’=4‘Priority’=100‘EventType’=OUT_OF_RANGE‘NotifyType’=ALARM‘AckRequired’=TRUE‘FromState’=NORMAL‘ToState’=HIGH_LIMIT‘EventValues’=((Exceeding_Value,80.1),(Status_Flags,(TRUE,FALSE,FALSE,FALSE)),(Deadband,1.0),(Exceeded_Limit,80.0))这个PDU将被发送到每一个由与此模拟输入对象相关联的通告类对象指定的设备。假定PDU正确收到,作为报文已经收到的证实,将从每一个接收者返回一个‘Result(+)’证实原语。因为‘要求确认’参数值为TRUE,这将被认为操作员已经注意和确认了警报。在这之后,将收到确认报警指示原语。原语参数如下:Service=AcknowledgeAlarm‘AcknowledgingProcessIdentifier’=1‘EventObjectIdentifier’=(AnalogInput,Instance2)‘EventStateAcknowledged’=HIGH_LIMIT‘TimeStamp’=16‘AcknowledgmentSource’=“MDL”‘TimeOfAcknowledment’=(21-Jun-1992,13:03:41.9)本地BACnet设备将会查找相应的模拟输入对象实例,设置确认转换属性中的进入异常比特位,发出309‘Result(+)’响应原语。注意在本例中‘时间戳’参数为一顺序号,其值同有证实事件通告一起发送。E.1.4获得报警摘要服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance2)Zone1_TempANALOG_INPUT(AnalogInput,Instance3)Zone2_TempANALOG_INPUT一台BACnet设备在试图从另一台BACnet设备获取活动报警列表时,将发出如下服务请求:Service=GetAlarmSummary这个请求的典型响应将是不包含参数的‘Result(+)’,指示没有活动的报警;或者是传送如下活动报警列表的‘Result(+)’。‘ListofAlarmSummaries’=(((AnalogInput,Instance2),HIGH_LIMIT,B‘011’),((AnalogInput,Instance3),LOW_LIMIT,B‘111’))注意“Zone2_Temp”中的低阈值已经确认,但“Zone1_Temp”中的高阈值没有确认。E.1.5获得登记摘要服务例程例1:获取所有没有确认的报警的摘要。Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance2)Zone1_TempANALOG_INPUT(EventEnrollmentInstance6)CW_Flow_AlarEVENT_ENROLLMENTService=GetEnrollmentSummary‘AcknowledgmentFilter’=NOT-ACKED这个请求的典型响应将是不包含参数的‘Result(+)’,指示没有未确认的报警;或者是传送如下活动报警列表的‘Result(+)’。‘ListofEnrollmentSummaries’=(((AnalogInput,Instance2),OUT_OF_RANGE,HIGH_LIMIT,100,4),((EventEnrollment,Instance6),CHANGE_OF_STATE,NORMAL,50,2))例2:获取关于某一具体设备预定的优先级在6-10之间的所有事件登记的摘要。310Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance2)Zone1_TempANALOG_INPUT(AnalogInput,Instance3)Zone2_TempANALOG_INPUT(AnalogInput,Instance4)Zone3_TempANALOG_INPUT(EventEnrollmentInstance6)CW_Temp_AlarmEVENT_ENROLLMENT(Device,Instance17)Console1DEVICEService=GetEnrollmentSummary‘AcknowledgmentFilter’=ALL‘EnrollmentFilter’=((Device,Instance17),9)‘PriorityFilter’=(6,10)这个请求的典型响应将是不包含参数的‘Result(+)’,指示没有符合特定要求的事件登记;或者是传送如下符合要求的事件登记对象列表的‘Result(+)’。‘ListofEnrollmentSummaries’=(((AnalogInput,Instance2),OUT_OF_RANGE,NORMAL,8,4),((AnalogInput,Instance3),OUT_OF_RANGE,NORMAL,8,4),((AnalogInput,Instance4),OUT_OF_RANGE,NORMAL,8,4),((EventEnrollment,Instance7),FLOATING_LIMIT,NORMAL,3,8))E.1.6预订COV服务例程本例说明了利用预订COV服务从一个模拟输入对象不确定地预订COV通告。Service=SubscribeCOV‘SubscriberProcessIdentifier’=18‘MonitoredObjectIdentifier’=(AnalogInput,Instance10)‘IssueConfirmedNotifications’=TRUE‘Lifetime’=0E.1.7无证实COV通告服务例程下面的例程说明了被监视的模拟输入对象当前值改变的通告。Service=UnconfirmedCOVNotification‘SubscriberProcessIdentifier’=18‘InitiatingDeviceIdentifier’=(Device,Instance4)‘MonitoredObjectIdentifier’=(AnalogInput,Instance10)‘TimeRemaining’=0‘ListofValues’=((Present_Value,65.0),(Status_Flags,(FALSE,FALSE,FALSE,FALSE,)))311E.1.8无证实事件通告服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance2)Zone1_TempANALOG_INPUT考虑一个名为“Zone1_Temp”的支持内部事件报告的模拟输入对象。假定在区域一中温度刚升至超过高阈值,导致报警进入活动状态,在确认转换属性中的进入异常比特位被清除。进一步假定没有与之相关联的报文文本。设备将发出一个带有如下参数的无证实事件通告服务请求原语:Service=UnconfirmedCOVNotification‘ProcessIdentifier’=1‘InitiatingDeviceIdentifier’=(Device,Instance9)‘EventObjectIdentifier’=(AnalogInput,Instance2)‘TimeStamp’=16‘NotificationClass’=4‘Priority’=100‘EventType’=OUT_OF_RANGE‘NotifyType’=ALARM‘AckRequired’=TRUE‘FromState’=NORMAL‘ToState’=HIGH_LIMIT‘EventValues’=((Present_Value,80.1),(Status_Flags,(TRUE,FALSE,FALSE,FALSE)),(Deadband,1.0),(High_Limit,80.0))这个PDU将根据与这个模拟输入对象相关联的通告类对象的接收者列表属性值被发送到一个特定接收者、本地广播、远程广播、或者全局广播。因为‘要求确认’参数值为TRUE,这将被认为操作员已经注意和确认了警报。在这之后,将收到确认报警指示原语。原语参数如下:Service=AcknowledgeAlarm‘AcknowledgingProcessIdentifier’=1‘EventObjectIdentifier’=(AnalogInput,Instance2)‘EventStateAcknowledged’=HIGH_LIMIT‘TimeStamp’=16‘AcknowledgmentSource’=“MDL”‘TimeOfAcknowledment’=(21-Jun-1992,13:03:41.9)本地BACnet设备将会查找相应的模拟输入对象实例,设置确认转换属性中的进入异常比特位,发出‘Result(+)’响应原语。注意在本例中‘时间戳’参数为一顺序号,其值同无证实事件通告一起发送。312E.2文件访问服务下面的例程说明了文件的典型使用。文件的实际格式和内容由生产商根据应用自行定义。E.2.1基本读文件服务例程例1:从文件中读数据。Assumedobjects:ObjectIdentifierObjectNameObjectType(File,Instance1)ChillerDataFILEService=AtomicReadFile‘FileIdentifier’=(File,Instance1)‘StreamAccess’:‘FileStartPosition’=0‘RequestedOctetCount’=27‘Result(+)’参数为:‘EndOfFile’=FALSE‘StreamAccess’:‘FileStartPosition’=0‘FileData’=“Chiller01On-Time=4.3Hours”例2:从文件中读记录。Assumedobjects:ObjectIdentifierObjectNameObjectType(File,Instance2)ChillerTrendLogFILEService=AtomicReadFile‘FileIdentifier’=(File,Instance2)‘StreamAccess’:‘FileStartPosition’=14‘RequestedRecordCount’=3‘Result(+)’参数为:‘EndOfFile’=TRUE‘StreamAccess’:‘FileStartRecord’=14‘RequestedRecordCount’=2313‘FileRecordData’=((12:00,45.6),(12:15,44.8))注意在本例中并不是所有的请求的数据都返回。E.2.2基本写文件服务例程例1:向文件中写数据。Assumedobjects:ObjectIdentifierObjectNameObjectType(File,Instance1)ChillerDataFILEService=AtomicWriteFile‘FileIdentifier’=(File,Instance1)‘StreamAccess’:‘FileStartPosition’=30‘FileData’=“Chiller01On-Time=4.3Hours”‘Result(+)’参数为:‘StreamAccess’:‘FileStartPosition’=30例2:向文件中追加两个记录。Assumedobjects:ObjectIdentifierObjectNameObjectType(File,Instance2)ChillerTrendLogFILEService=AtomicWriteFile‘FileIdentifier’=(File,Instance2)‘RecordAccess’:‘FileStartRecord’=-1‘RecordCount’=2‘FileRecordData’=((12:00,45.6),(12:15,44.8))‘Result(+)’参数为:‘RecordAccess’:‘FileStartRecord’=14314E.3对象访问服务E.3.1添加列表元素服务例程例1:向组对象增加成员。Assumedobjects:ObjectIdentifierObjectNameObjectType(Group,Instance3)AHU1_GRAPHGROUP(AnalogInput,Instance9)AHU1_SA_TEMPANALOG_INPUT(AnalogInput,Instance10)AHU1_RA_TEMPANALOG_INPUT(AnalogInput,Instance11)AHU1_OAD_POSANALOG_INPUT(AnalogInput,Instance12)AHU1_SA_PRESSANALOG_INPUT(AnalogInput,Instance13)AHU1_CW_VALVEANALOG_INPUT(AnalogInput,Instance14)OA_TEMPANALOG_INPUT(AnalogInput,Instance15)OA_HUMIDANALOG_INPUT考虑包含用于图形显示的如下组对象的BACnet设备。Property:Object_Identifier=(Group,Instance3)Property:Object_Name=“AHU1_GRAPH”Property:Object_Type=GROUPProperty:Description=“PointsforAHU1graphic”Property:List_Of_Group_Members=(((AnalogInputInstance9),(Present_Value,Reliability)),((AnalogInputInstance10),(Present_Value,Reliability)),((AnalogInputInstance11),(Present_Value,Reliability)),((AnalogInputInstance12),(Present_Value,Reliability,Description)),((AnalogInputInstance13),(Present_Value,Reliability,Description)),((AnalogInputInstance14),(Present_Value)))Property:Present_Value=(65.2,NO_FAULT_DETECTED,72.4,NO_FAULT_DETECTED,99,NO_FAULT_DETECTED,“Inchesofwater”,32,NO_FAULT_DETECTED,“%open”,68.3)系统操作员决定升级AHU1中的控制软件来使用热函节约装置回路。于是,操作员想向“AHU1_GRAPH”增加一个湿度读数。添加列表元素服务原语带有如下参数:Service=AddListElement315‘ObjectIdentifier’=(Group,Instance3)‘PropertyIdentifier’=List_Of_Group_Members‘ListofElements’=((AnalogInput,Instance15),(Present_Value,Reliability))假定服务请求成功,发出‘Result(+)’服务原语,对象“AHU1_GRAPH”现在具有如下属性:Property:Object_Identifier=(Group,Instance3)Property:Object_Name=“AHU1_GRAPH”Property:Object_Type=GROUPProperty:Description=“PointsforAHU1graphic”Property:List_Of_Group_Members=(((AnalogInputInstance9),(Present_Value,Reliability)),((AnalogInputInstance10),(Present_Value,Reliability)),((AnalogInputInstance11),(Present_Value,Reliability)),((AnalogInputInstance12),(Present_Value,Reliability,Description)),((AnalogInputInstance13),(Present_Value,Reliability,Description)),((AnalogInputInstance14),(Present_Value)),((AnalogInputInstance15),(Present_Value,Reliability)))Property:Present_Value=(65.2,NO_FAULT_DETECTED,72.4,NO_FAULT_DETECTED,99,NO_FAULT_DETECTED,“Inchesofwater”,32,NO_FAULT_DETECTED,“%open”,68.3,42.1,NO_FAULT_DETECTED)注:在本例中,新增加的元素在列表的末端。这是符合逻辑的放法,因为列表必须被遍历以决定“新”的元素是否已经存在。本标准不要求一定要在末端增加新的列表元素。E.3.2删除列表元素服务例程例1:从组中删除成员。Assumedobjects:ObjectIdentifierObjectNameObjectType(Group,Instance3)AHU1_GRAPHGROUP(AnalogInput,Instance9)AHU1_SA_TEMPANALOG_INPUT(AnalogInput,Instance10)AHU1_RA_TEMPANALOG_INPUT316(AnalogInput,Instance11)AHU1_OAD_POSANALOG_INPUT(AnalogInput,Instance12)AHU1_SA_PRESSANALOG_INPUT(AnalogInput,Instance13)AHU1_CW_VALVEANALOG_INPUT(AnalogInput,Instance14)OA_TEMPANALOG_INPUT这是使用删除列表元素服务来改变已存在的组对象的例程。假定组对象“AHU1_GRAPH”如下定义:Property:Object_Identifier=(Group,Instance3)Property:Object_Name=“AHU1_GRAPH”Property:Object_Type=GROUPProperty:List_Of_Group_Members=(((AnalogInputInstance9),(Present_Value,Reliability)),((AnalogInputInstance10),(Present_Value,Reliability)),((AnalogInputInstance11),(Present_Value,Reliability)),((AnalogInputInstance12),(Present_Value,Reliability,Description)),((AnalogInputInstance13),(Present_Value,Reliability,Description)),((AnalogInputInstance14),(Present_Value)))Property:Present_Value=(65.2,NO_FAULT_DETECTED,72.4,NO_FAULT_DETECTED,99.0,NO_FAULT_DETECTED,0.67,NO_FAULT_DETECTED,“Inchesofwater”,32.0,NO_FAULT_DETECTED,“%open”,68.3)系统操作员正在升级图形显示,决定组中描述属性实际上不使用,希望将它们删除。虽然描述是属性列表元素,但由于它嵌套在组成员列表中,所以它不能被本服务删除。如下所示需要两步过程。下面的服务请求被发出:Service=RemoveListElement‘ObjectIdentifier’=(Group,Instance3)‘PropertyIdentifier’=List_Of_Elements‘ListofElements’=(((AnalogInput,Instance12),(Present_Value,Reliability,Description)),((AnalogInput,Instance13),(Present_Value,Reliability,Description)))服务请求成功,在这点对象“AHU1_GRAPH”状态为:Property:Object_Identifier=(Group,Instance3)Property:Object_Name=“AHU1_GRAPH”317Property:Object_Type=GROUPProperty:List_Of_Group_Members=(((AnalogInputInstance9),(Present_Value,Reliability)),((AnalogInputInstance10),(Present_Value,Reliability)),((AnalogInputInstance11),(Present_Value,Reliability)),((AnalogInputInstance14),(Present_Value)))Property:Present_Value=(65.2,NO_FAULT_DETECTED,72.4,NO_FAULT_DETECTED,99.0,NO_FAULT_DETECTED,68.3)添加列表元素服务现在用来替代已经删除但仍需要用来作图形显示的组成员。下面的服务请求被发出:Service=AddListElement‘ObjectIdentifier’=(Group,Instance3)‘PropertyIdentifier’=“List_Of_Group_Members”‘ListofElements’=(((AnalogInput,Instance12),(Present_Value,Reliability)),((AnalogInput,Instance13),(Present_Value,Reliability)))服务请求成功,现在“AHU1_GRAPH”为预想的格式:Property:Object_Identifier=(Group,Instance3)Property:Object_Name=“AHU1_GRAPH”Property:Object_Type=GROUPProperty:List_Of_Group_Members=(((AnalogInputInstance9),(Present_Value,Reliability)),((AnalogInputInstance10),(Present_Value,Reliability)),((AnalogInputInstance11),(Present_Value,Reliability)),((AnalogInputInstance14),(Present_Value)))((AnalogInputInstance12),(Present_Value,Reliability)),((AnalogInputInstance13),(Present_Value,Reliability)))Property:Present_Value=(65.2,NO_FAULT_DETECTED,72.4,NO_FAULT_DETECTED,99.0,NO_FAULT_DETECTED,68.3,0.67,NO_FAULT_DETECTED,32.0,NO_FAULT_DETECTED)E.3.3创建对象服务例程这是一个使用创建对象服务来创建一个用于趋向记录的文件对象。Service=CreateObject318‘ObjectIdentifier’=FILE‘ListofInitialValues’=((Object_Name,“Trend1”),(File_Access_Method,RECORD_ACCESS))假定创建对象服务请求正确收到,而且设备有创建文件对象的能力,则发出传送新创建的对象的对象标识符的‘Result(+)’服务原语。‘Object_Identifier’=(File,Instance13)注意在本例中,只有新建对象的文件类型属性和文件访问方法属性作为对象创建时的参数进行初始化。新建对象的其它属性将包含生产商提供的缺省值。如果这些缺省值不可接受,那么属性的初始值可以是包含在创建对象服务的‘初始值列表’参数中的值。或者,作为另一种选择,对象的任意可写属性可以在对象创建以后利用写属性服务或者写多个属性服务请求进行初始化和写操作。E.3.4删除对象服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(Group,Instance6)ZONE1_TEMPSGROUP(Group,Instance7)NotDeletableGROUP考虑一包含两个组对象“ZONE1_TEMPS”和“NotDeletable”的BACnet设备。对象“NotDeletable”在配置时被创建和保护,不能被此协议服务删除。例1:对象的成功删除。下面的服务请求被发出:Service=DeleteObject‘ObjectIdentifier’=(Group,Instance6)对象被删除,且服务方发送“Result(+)”响应原语。例2:删除组对象的不成功尝试。下面的服务请求被发出:Service=DeleteObject‘ObjectIdentifier’=(Group,Instance7)对象被保护,不能被此协议服务删除。服务方发出如下响应原语。319‘Result(-)’:‘ErrorType’=(SERVICES,OBJECT_NOT_DELETABLE)E.3.5读属性服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance5)SPACE_TEMPANALOG_INPUT我们希望读一名为“SPACE_TEMP”的模拟输入的当前值。Service=ReadProperty‘ObjectIdentifier’=(AnalogInput,Instance5)‘PropertyIdentifier’=Present_Value假定目标机器能够根据此ID和请求的属性寻找对象,则结果为:‘ObjectIdentifier’=(AnalogInput,Instance5)‘PropertyIdentifier’=Present_Value‘Value’=72.3结果表明“SPACE_TEMP”的当前值为72.3。E.3.6条件读属性服务例程例1:用于获取所有二进制输入对象的对象标识符的参数。Assumedobjects:ObjectIdentifierObjectNameObjectType(BinaryInput,Instance1)AC1StatusBINARY_INPUT(BinaryInput,Instance2)AC2StatusBINARY_INPUT(BinaryInput,Instance3)AC1FreezestatBINARY_INPUT(BinaryInput,Instance4)AC2FreezestatBINARY_INPUT假设一位用户希望找出一台BACnet设备中所有二进制输入对象的对象标识符。Service=ReadPropertyConditional‘ObjectSelectionCriteria’:‘SelectionLogic’=AND(notethateitherANDorORmaybeusedherebecausethereisonlyoneselectioncriterion)‘ListofSelectionCriteria’=(Object_Type,=,BINARY_INPUT)320这将产生在‘Result(+)’原语中传送的该BACnet设备中所有二进制输入对象的一个列表。‘ListofReadAccessResults’=((BinaryInput,Instance1),(BinaryInput,Instance2),(BinaryInput,Instance3),(BinaryInput,Instance4))在恰当的选择标准下,条件读属性服务可用于返回与公共属性值相联系的任意对象组的对象标识符,而不管属性是否为对象类型,当前值,可靠性,状态或者一些其它属性。例2:用于模拟输入对象的条件读的参数。Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance1)Room101SpaceTempANALOG_INPUT(AnalogInput,Instance2)AC1HWSTempANALOG_INPUT(AnalogInput,Instance3)AC1HWRTempANALOG_INPUT假设我们希望读出当前值大于100.0的所有模拟输入对象的当前值属性。Service=ReadPropertyConditionalService‘ObjectSelectionCriteria’:‘SelectionLogic’=AND‘ListofSelectionCriteria’=((Object_Type,=,ANALOG_INPUT),(Present_Value,>,100.0))这可导致如下列表:‘ListofReadAccessResults’=(((AnalogInput,Instance1),Present_Value,102.3),((AnalogInput,Instance2),Present_Value,180.7),((AnalogInput,Instance3),Present_Value,142.1))例3:用于查找不可靠的或脱离服务的对象的参数。Assumedobjects:ObjectIdentifierObjectNameObjectType(BinaryInput,Instance1)AC1StatusBINARY_INPUT(AnalogInput,Instance2)AC1DischargeTempANALOG_INPUT下面的参数可用来查找所有可靠性属性不为NO_FAULT_DETECTED或者脱离服务属性为TRUE的对象。Service=ReadPropertyConditionalService‘ObjectSelectionCriteria’:321‘SelectionLogic’=OR‘ListofSelectionCriteria’=((Reliability,≠,NO_FAULT_DETECTED),(Out_Of_Service,=,TRUE))‘ListofPropertyIdentifiers’=(Present_Value,Reliability,Out_Of_Service)典型结果可能如下:‘ListofReadAccessResults’=(((BinaryInput,Instance1),Present_Value,ACTIVE,Reliability,NO_FAULT_DETECTED,Out_Of_Service,TRUE)),((AnalogInput,Instance2),Present_Value,250.0,Reliability,UNRELIABLE_OTHER,Out_Of_Service,FALSE)))例4:Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance4)AC1SupplyTempANALOG_INPUT(AnalogInput,Instance7)CWP1PressureANALOG_INPUT(AnalogInput,Instance8)Chiller1FreonPressureANALOG_INPUT(AnalogInput,Instance10)AC2SupplyTempANALOG_INPUT(AnalogInput,Instance12)AC3SupplyTempANALOG_INPUT下面的参数可用来查找所有对象名称与包含通配符“”或“?”的比较相符的对象的标识符。Service=ReadPropertyConditionalService‘ObjectSelectionCriteria’:‘SelectionLogic’=OR‘ListofSelectionCriteria’=((Object_Name,=,“CPressure”),(Object_Name,=,“AC?SupplyTemp”))‘ListofPropertyIdentifiers’=(Object_Name)典型结果可能如下:‘ListofReadAccessResults’=(((AnalogInput,Instance4),“AC1SupplyTemp”),((AnalogInput,Instance7),“CWP1Pressure”),((AnalogInput,Instance8),“Chiller1FreonPressure”),((AnalogInput,Instance10),“AC2SupplyTemp”),((AnalogInput,Instance12),“AC3SupplyTemp”),322E.3.7读多个属性服务例程例1:用于读单一对象中多个属性的参数。Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance16)SPACE_TEMPANALOG_INPUT我们希望读一名为“SPACE_TEMP”的模拟点的当前值和可靠性。Service=ReadPropertyMultiple‘ListofReadAccessSpecifications’=((AnalogInput,Instance16),((Present_Value,Reliability))假定目标机器能够利用此标识符和请求的属性寻找对象,结果将为:‘ListofReadAccessSpecifications’=((AnalogInput,Instance16),((Present_Value,72.3),(Reliability,NO_FAULT_DETECTED)))结果表明“SPACE_TEMP”的当前值为72.3,而且只要是被能确定的,即为可靠的。例2:用于读若干个对象的属性的参数。Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance33)CW_STEMPANALOG_INPUT(AnalogInput,Instance34)CW_RTEMPANALOG_INPUT(AnalogInput,Instance35)CW_FLOWANALOG_INPUT假设我们希望访问在同一冷却水系列中属性组合在名为“CW_STEMP”,“CW_RTEMP”,和“CW_FLOW”的对象中的三个模拟输入的当前值。Service=ReadPropertyMultiple‘ListofReadAccessSpecifications’=(((AnalogInput,Instance33),((Present_Value)),((AnalogInput,Instance50),((Present_Value)),((AnalogInput,Instance35),((Present_Value)))假定三个请求的值中成功访问两个:323‘ListofReadAccessResults’=(((AnalogInput,Instance33),(Present_Value,42.3)),((AnalogInput,Instance33),(Present_Value,‘PropertyAccessError’=(OBJECT,UNKNOWN_OBJECT))),((AnalogInput,Instance35),(Present_Value,435.7)))结果表明供应温度访问成功,值为42.3,流量为435.7。但是返回温度当前值访问失败。请求中与此相关的错误类型为错误类型对象,错误代码为未知的对象。这是因为对象标识符错误,可能是由于操作员错误的操作。E.3.8写属性服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance1)HW_SetpointANALOG_INPUT我们希望修改一个对象名为“HW_Setpoint”的模拟值对象的当前值。Service=WriteProperty‘ObjectIdentifier’=(AnalogValue,Instance1)‘PropertyIdentifier’=Present_Value‘PropertyValue’=180.0假定目标机器能够利用特定的对象标识符寻找对象,并修改当前值属性,那么结果将是发出一不带参数的‘Result(+)’原语。此确认将在一不带参数的简单确认PDU中传送给服务请求方。E.3.9写多个属性服务例程Assumedobjects:ObjectIdentifierObjectNameObjectType(AnalogInput,Instance5)Room1TempSetpointANALOG_INPUT(AnalogInput,Instance6)Room2TempSetpointANALOG_INPUT(AnalogInput,Instance7)Room3TempSetpointANALOG_INPUT我们希望修改用于三个空间温度环控制的三个不同的模拟变量对象的当前值。Service=WritePropertyMultiple‘ListofReadAccessSpecifications’=(((AnalogInput,Instance5),((Present_Value,67.0)),((AnalogInput,Instance6),((Present_Value,67.0)),((AnalogInput,Instance7),((Present_Value,72.0)))324假定响应方BACnet用户能够寻找三个对象中的每一个,那么结果将是这些属性中先前的值分别被提供的值替换,并且将发出一不带附加参数的‘Result(+)’原语。这个确认在一个不带参数的简单确认PDU中传送给服务请求方。E.4远程设备管理服务E.4.1设备通信控制服务例程当在一个BACnet网络中处理问题时,有必要对来自某一特殊设备的通信交换停止几分钟。通过如下的设备通信控制服务完成这个任务。Service=DeviceCommunicationControl‘TimeDuration’=5‘Enable/Disable’=DISABLE‘Password’=“#egbdf!”E.4.2有证实专有传输服务例程这是一个利用BACnet有证实服务的典型专有服务请求。Service=ComfirmedPrivateTransfer‘VendorID’=25‘ServiceNumber’=8‘ServiceParameters’=(72.4,X‘1649’)假定服务成功执行,但不需向请求方BACnet用户返回结果,那么将返回一个传送如下信息的‘Result(+)’原语。‘VendorID’=25‘ServiceNumber’=8‘ResultBlock’=NILE.4.3无证实专有传输服务例程这是一个利用BACnet无证实服务的典型专有服务请求。Service=UncomfirmedPrivateTransfer‘VendorID’=18‘ServiceNumber’=12‘ServiceParameters’=(72.4,X‘1649’)325因为这是无证实服务,所以无响应。E.4.4重新初始化设备服务例程本例说明了重新初始化设备服务的使用,用于为在服务中需要密码的设备请求热启动。Service=ReinitializeDevice‘ReinitializeStateofDevice’=WARMSTART‘Password’=“AbCdEfGh”如果密码验证成功,那么将返回一个‘Result(+)’原语,然后设备将重新初始化。否则,将返回一个‘Result(-)’原语。E.4.5有证实文本报文服务例程本例说明了有证实文本报文服务的使用。Service=ComfirmedTextMessage‘TextMessageSourceDevice’=(Device,Instance5)‘MessagePriority’=NORMAL‘Message’=“P.M.requiredforPUMP347”如果有证实文本报文请求成功收到,那么将返回一个‘Result(+)’原语,否则,将返回一个‘Result(-)’原语。E.4.6无证实文本报文服务例程本例说明了无证实文本报文服务的使用。Service=UncomfirmedTextMessage‘TextMessageSourceDevice’=(Device,Instance5)‘MessagePriority’=NORMAL‘Message’=“P.M.requiredforPUMP347”E.4.7时间同步服务例程下面是一个时间同步服务的参数使用的例程。Service=TimeSynchronization‘Time’:326‘Date’=17-Nov-92‘Time’=22:45:30.7此请求将通告所有的远程设备当前时间是1992年11月17日晚上10:45:30.7。远程设别将使用此信息更新它们的内部时钟以使所有的设备同步。E.4.8Who-Has和I-Have服务例程下面是用于I-Have与I-Have服务的参数使用的例程。例1:寻找包含已知对象名称的对象的设备。考虑试图寻找对象名为“OATemp”的对象。Service=Who-Has‘ObjectName’=“OATemp”假定这里只有一台有上诉对象的设备,那么将收到下面的I-Have服务指示。Service=I-Have‘DeviceIdentifier’=(Device,Instance8)‘ObjectIdentifier’=(AnalogInput,Instance3)‘ObjectName’=“OATemp”例2:寻找包含已知对象标识符的对象的设备。考虑试图寻找对象标识符为(AnalogInput,Instance3)的对象。Service=I-Have‘ObjectIdentifier’=(AnalogInput,Instance3)假定这里只有一台有上诉对象的设备,那么将收到下面的“我有”服务指示。Service=I-Have‘DeviceIdentifier’=(Device,Instance8)‘ObjectIdentifier’=(AnalogInput,Instance3)‘ObjectName’=“OATemp”E.4.9Who-Is和I-Am服务例程下面是用于Who-Is与I-Am服务的参数使用的例程。例1:建立一台设备的网络地址。327我们希望确定另一台BACnet设备的网络地址,但只知道该设备的设备标识符。Service=Who-Is‘Who-IsDeviceIdentifier’=(Device,Instance3)假定在网络上有这样一台设备,那么一会儿后它将使用I-Am服务进行响应:Service=I-Am‘I-AmDeviceIdentifier’=(Device,Instance3)‘MaxAPDULengthAccepted’=1024‘SegmentationSupported’=NO_SEGMENTATION‘VendorIdentifier’=99MAC层同网络层源网络SNET与源地址SADR结合的源地址提供所有的同设备(Device,Instance3)通信所需要的地址信息。例2:找出几乎所有的网络设备。假设我们希望确定当前在本地网络上有哪些设备。Service=Who-IsService网络上的每一台设备均作回答,导致若干个I-Am服务请求。Service=I-Am‘I-AmDeviceIdentifier’=(Device,Instance1)‘MaxAPDULengthAccepted’=480‘SegmentationSupported’=SEGMENTED_TRANSMIT‘VendorIdentifier’=99Service=I-Am‘I-AmDeviceIdentifier’=(Device,Instance2)‘MaxAPDULengthAccepted’=206‘SegmentationSupported’=SEGMENTED_RECEIVE‘VendorIdentifier’=33Service=I-Am‘I-AmDeviceIdentifier’=(Device,Instance3)‘MaxAPDULengthAccepted’=1024328‘SegmentationSupported’=NO_SEGMENTATION‘VendorIdentifier’=99Service=I-Am‘I-AmDeviceIdentifier’=(Device,Instance4)‘MaxAPDULengthAccepted’=128‘SegmentationSupported’=SEGMENTED_BOTH‘VendorIdentifier’=66通过在网络层头部中包含全局网络地址(X‘FFFF’),这个过程可以扩展用来找出BACnet互联网上几乎所有的设备。E.5虚拟终端服务下面是用于VT开启,VT-数据与VT关闭服务的参数使用的例程。为了易读,有些例程中包含嵌套的控制字符,如回车。这些字符将在大括号内显示,如“{cr}{lf}text”。同缺省终端建立通话:我们希望创建一个同另一台BACnet设备中的缺省终端类型的操作员接口的VT会话。Service=VT-Open‘VT-class’=ANSI_X3.64‘LocalVTSessionIdentifier’=5假定目标机器能够创建新的VT会话,那么‘Result(+)’响应为:‘RemoteVTSessionIdentifier’=29结果显示目标设备已经接受了请求并创建了一个新的会话。现在会话建立了,远程设备上的操作员接口程序通过发送VT数据请求提示我们开始。Service=VT-Data‘VT-sessionIdentifier’=5‘VT-newData’=“{cr}{lf}EnterUserName:”‘VT-dataFlag’=0我们的操作员接口显示队列是空的,所以能够接收所有进来的字符。因此我们的VT用户发出‘Result(+)’:‘AllNewDataAccepted’=TRUE329最后,我们的操作员输入他(她)的名字响应提示,这将发出VT数据请求:Service=VT-Data‘VT-sessionIdentifier’=29‘VT-newData’=“FRED{cr}”‘VT-dataFlag’=0同样地,远程操作员接口接收字符,响应‘Result(+)’:‘AllNewDataAccepted’=TRUE然后远程操作员接口回应输入的字符,发出另一指示:Service=VT-Data‘VT-sessionIdentifier’=5‘VT-newData’=“FRED{cr}{lf}EnterPassword”‘VT-dataFlag’=1我们的操作员显示队列是空的,所有能够接收所有进来的字符。因此我们的虚拟终端用户发出‘Result(+)’:‘AllNewDataAccepted’=TRUE出于某种原因,FRED决定取消这些虚拟终端对话,并通告操作员接口程序。接口程序发出虚拟终端关闭请求:Service=VT-Close‘ListofRemoteVTSessionIdentifiers’=(29)E.6安全服务本例显示了通过密钥服务器发送会话密钥给两台设备A和B的请求密钥服务和认证服务的使用。此过程在24.2.1节中详细述论。加密部分用斜体字表示。设备A直接向密钥服务器发出使用其私有密钥PKA加密的请求密钥请求,开始此过程。假定BACnet有证实请求PDU的‘InvokeID’为5:Service=RequestKey‘RequestingDeviceIdentifier’=(Device,Instance1)‘RequestingDeviceAddress’=(2,X‘11’)330‘RemoteDeviceIdentifier’=(Device,Instance2)‘RemoteDeviceAddress’=(2,X‘22’)为了验证请求是否是由设备A发出的,密钥服务器发出包括‘期待的调用ID’参数值为5的认证服务请求。Service=Authenticate‘PseudoRandomNumber’=X‘12345678’‘ExpectedInvokeID’=15注意认证服务请求同样也是在传输前使用设备A的私有密钥加密了的,该密钥为存储于密钥服务器中的一个拷贝。因为事实上是设备A发出的请求密钥服务请求,所有认证服务请求能够被设备A利用某私有密钥PKA解密。而且‘期待的调用ID’参数值与先前请求密钥请求中的‘InvokeID’相符。因此正如24.5.2节中所描述的,设备A使用‘伪随机数’产生‘修改的随机数’参数组成的认证确认的复杂确认。‘Authenticate-ACK’=X‘93B5D7F1’然后密钥服务器产生一个会话密钥,使用各设备各自的PK加密,将其写入所有使用添加列表元素服务的设备A和设备B中设备对象的会话密钥列表属性中。每个设备在执行添加列表元素服务请求与发出确认之前都必须执行上述的认证过程。最后,如果所有的认证均完成,那么密钥服务器向设备A发出一个简单确认PDU,表示最初的请求密钥服务已经成功完成。331附件F-APDU编码例程(资料)(本附件不是标准的一部分,仅仅作为资料使用)本附件说明BACnet编码准则的应用,给出附件E中例程的编码的APDU。F.1报警和事件服务编码例程F.1.1例E.1.1编码——确认报警服务例E.1.1编码包含于F.1.3和F.1.8。F.1.2例E.1.2编码——有证实COV通告服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘0F’InvokeID=15X‘01’ServiceChoice=1(ConfirmedCOVNotification-Request)X‘09’SDContextTag0(SubscriberProcessIdentifier,L=1)X‘12’SubscriberProcessIdentifier=18X‘1C’SDContextTag1(InitiatingDeviceIdentifier,L=4)X‘02000004’Device,Instance4X‘2C’SDContextTag2(MonitoredObjectIdentifier,L=4)X‘0000000A’AnalogInput,InstanceNumber=10X‘’39’SDContextTag3(TimeRemaining,L=1)X‘00’TimeRemaining=0X‘4E’PDOpeningTag4(ListOfValues)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)332X‘2E’PDOpeningTag2(Value)X‘44’ApplicationTag4(Real,L=4)X‘42820000’65.0X‘2F’PDClosingTag2(Value)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘6F’111(STATUS_FLAGS)X‘2E’PDOpeningTag2(Value)X‘82’ApplicationTag8(BitString,L=2)X‘0400’0,0,0,0(FALSE,FALSE,FALSE,FALSE)X‘2F’PDClosingTag2(Value)X‘4F’PDClosingTag4(ListOfValues)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘0F’InvokeID=15X‘01’ServiceACKChoise=1(ConfirmedCOVNotification)F.1.3例E.1.3编码——有证实事件通告服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘10’InvokeID=16X‘02’ServiceChoice=2(ConfirmedEventNotification-Request)X‘09’SDContextTag0(ProcessIdentifier,L=1)X‘01’ProcessIdentifier=1X‘1C’SDContextTag1(InitiatingDeviceIdentifier,L=4)X‘02000004’Device,Instance4X‘2C’SDContextTag2(EventObjectIdentifier,L=4)X‘00000002’AnalogInput,InstanceNumber=2X‘3E’PDOpeningTag3(TimeStamp)X‘19’SDContextTag1(SequenceNumber,L=1)X‘10’16X‘3F’PDClosingTag3(TimeStamp)X‘49’SDContextTag4(NotificationClass,L=1)X‘04’4X‘59’SDContextTag5(Priority,L=1)X‘64’100333X‘69’SDContextTag6(EventType,L=1)X‘05’5(OUT_OF_RANGE)X‘89’SDContextTag8(NotifyType,L=1)X‘00’0(ALARM)X‘99’SDContextTag9(AckedRequired,L=1)X‘01’TRUEX‘A9’SDContextTag10(FromState,L=1)X‘00’0(NORMAL)X‘B9’SDContextTag11(ToState,L=1)X‘03’3(HIGH_LIMIT)X‘CE’PDOpeningTag12(EventValues)X‘5E’PDOpeningTag5(BACnetNotificationParameters,Choice5=OUT_OF_RANGE)X‘0C’SDContextTag0(ExceedingValue,L=4)X‘42A03333’80.1X‘1A’SDContextTag1(StatusFlags,L=2)X‘0480’1,0,0,0(TRUE,FALSE,FALSE,FALSE)X‘2C’SDContextTag2(Deadband,L=4)X‘3F800000’1.0X‘3C’SDContextTag3(ExceedLimit,L=4)X‘42A00000’80.0X‘5F’PDClosingTag5(BACnetNotificationParameters)X‘CF’PDClosingTag12(EventValues)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘10’InvokeID=16X‘02’ServiceACKChoise=2(ConfirmedEventNotification)将来,可以产生如下的确认报警请求:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘07’InvokeID=7X‘00’ServiceChoice=0(AcknowledgeAlarm-Request)X‘09’SDContextTag0(AcknowledgingProcessIdentifier,L=1)X‘01’AcknowledgingProcessIdentifier=1334X‘1C’SDContextTag1(EventObjectIdentifier,L=4)X‘00000002’AnalogInput,InstanceNumber=2X‘29’SDContextTag2(EventStateIdentifier,L=1)X‘03’3(HIGH_LIMIT)X‘3E’PDOpeningTag3(TimeStamp)X‘19’SDContextTag1(SequenceNumber,L=1)X‘10’16X‘3F’PDClosingTag3(TimeStamp)X‘4C’SDContextTag4(AcknowledgmentSource,L=4)X‘00’ANSIX3.4EncodingX‘4D444C’“MDL”X‘5E’PDOpeningTag5(TimeOfAcknowledgment)X‘2E’PDOpeningTag2(DateTime)X‘A4’ApplicationTag10(Date,L=4)X‘5C0615FF’June21,1992X‘B4’ApplicationTag11(Time,L=4)X‘0D032909’13:03:41.9X‘2F’PDClosingTag2(DateTime)X‘5F’PDClosingTag5(TimeOfAcknowledgment)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘07’InvokeID=7X‘00’ServiceACKChoise=0(AcknowledgeAlarm)F.1.4例E.1.4编码——获得报警摘要服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘01’InvokeID=1X‘03’ServiceChoice=3(GetAlarmSummary-Request)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘01’InvokeID=1X‘03’ServiceACKChoise=3(GetAlarmSummary-ACK)335X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000002’AnalogInput,InstanceNumber=2X‘91’ApplicationTag9(Enumerated,L=1)(AlarmState)X‘03’3(HIGH_LIMIT)X‘82’ApplicationTag8(BitString,L=2)(AcknowledgedTransitions)X‘0560’0,1,1(FALSE,TRUE,TRUE)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000003’AnalogInput,InstanceNumber=3X‘91’ApplicationTag9(Enumerated,L=1)(AlarmState)X‘04’3(LOW_LIMIT)X‘82’ApplicationTag8(BitString,L=2)(AcknowledgedTransitions)X‘05E0’1,1,1(TRUE,TRUE,TRUE)F.1.5例E.1.5编码——获得登记摘要服务例1:请求编码X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘01’InvokeID=1X‘04’ServiceChoice=4(GetEnrollmentSummary-Request)X‘09’SDContextTag0(AcknowledgmentFilter,L=1)X‘02’2(NOT_ACKED)假定服务进程执行正确,那么将返回一个包含答复的复杂确认:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘01’InvokeID=1X‘04’ServiceACKChoise=4(GetEnrollmentSummary-ACK)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000002’AnalogInput,InstanceNumber=2X‘91’ApplicationTag9(Enumerated,L=1)(EventType)X‘05’5(OUT_OF_RANGE)X‘91’ApplicationTag9(Enumerated,L=1)(EventState)X‘03’3(HIGH_LIMIT)X‘21’ApplicationTag2(UnsignedInteger,L=1)(Priority)X‘64’100X‘21’ApplicationTag2(UnsignedInteger,L=1)(NotificationClass)336X‘04’4X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘02400006’EventEnrollment,InstanceNumber=6X‘91’ApplicationTag9(Enumerated,L=1)(EventType)X‘01’1(CHANGE_OF_STATE)X‘91’ApplicationTag9(Enumerated,L=1)(EventState)X‘00’0(NORMAL)X‘21’ApplicationTag2(UnsignedInteger,L=1)(Priority)X‘32’50X‘21’ApplicationTag2(UnsignedInteger,L=1)(NotificationClass)X‘02’2例2:请求编码X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘02’InvokeID=2X‘04’ServiceChoice=4(GetEnrollmentSummary-Request)X‘09’SDContextTag0(AcknowledgmentFilter,L=1)X‘00’0(ALL)X‘1E’PDOpeningTag1(EnrollmentFilter)X‘0E’PDOpeningTag0(Recipient)X‘0C’SDContextTag0(Device,L=4)X‘02000011’Device,InstanceNumber=17X‘0F’PDClosingTag0(Recipient)X‘19’SDContextTag1(ProcessIdentifier)X‘09’9X‘1F’PDClosingTag1(EnrollmentFilter)X‘4E’PDOpeningTag4(PriorityFilter)X‘09’SDContextTag0(MinPriority,L=1)X‘06’6X‘19’SDContextTag1(MaxPriority,L=1)X‘0A’10X‘4F’PDClosingTag4(PriorityFilter)假定服务进程执行正确,那么将返回一个包含答复的复杂确认:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)337X‘02’InvokeID=2X‘04’ServiceACKChoise=4(GetEnrollmentSummary-ACK)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000002’AnalogInput,InstanceNumber=2X‘91’ApplicationTag9(Enumerated,L=1)(EventType)X‘05’5(OUT_OF_RANGE)X‘91’ApplicationTag9(Enumerated,L=1)(EventState)X‘00’0(NORMAL)X‘21’ApplicationTag2(UnsignedInteger,L=1)(Priority)X‘08’8X‘21’ApplicationTag2(UnsignedInteger,L=1)(NotificationClass)X‘04’4X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000003’AnalogInput,InstanceNumber=3X‘91’ApplicationTag9(Enumerated,L=1)(EventType)X‘05’5(OUT_OF_RANGE)X‘91’ApplicationTag9(Enumerated,L=1)(EventState)X‘00’0(NORMAL)X‘21’ApplicationTag2(UnsignedInteger,L=1)(Priority)X‘08’8X‘21’ApplicationTag2(UnsignedInteger,L=1)(NotificationClass)X‘02’2X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000004’AnalogInput,InstanceNumber=4X‘91’ApplicationTag9(Enumerated,L=1)(EventType)X‘05’5(OUT_OF_RANGE)X‘91’ApplicationTag9(Enumerated,L=1)(EventState)X‘00’0(NORMAL)X‘21’ApplicationTag2(UnsignedInteger,L=1)(Priority)X‘08’8X‘21’ApplicationTag2(UnsignedInteger,L=1)(NotificationClass)X‘02’2X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘02400007’EvenEnrollment,InstanceNumber=7X‘91’ApplicationTag9(Enumerated,L=1)(EventType)X‘04’4(FLOATING_LIMIT)X‘91’ApplicationTag9(Enumerated,L=1)(EventState)X‘00’0(NORMAL)X‘21’ApplicationTag2(UnsignedInteger,L=1)(Priority)338X‘03’3X‘21’ApplicationTag2(UnsignedInteger,L=1)(NotificationClass)X‘08’8F.1.6例E.1.6编码——预订COV服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘0F’InvokeID=15X‘05’ServiceChoice=5(SubscribeCOV-Request)X‘09’SDContextTag0(SubscriberProcessIdentifier,L=1)X‘12’18X‘1C’SDContextTag1(MonitoredObjectIdentifier,L=4)X‘0000000A’AnalogInput,InstanceNumber=10X‘29’SDContextTag2(IssueConfirmedNotifications,L=1)X‘01’1(TRUE)X‘39’SDContextTag3(Lifetime,L=1)X‘00’0假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘0F’InvokeID=15X‘05’ServiceACKChoise=5(SubscribeCOV)F.1.7例E.1.7编码——无证实COV通告服务X‘10’PDUType=1(BACnet-Unconfirmed-Request-PDU)X‘02’ServiceChoise=2(UnconfirmedCOVNotification-Request)X‘09’SDContextTag0(SubscriberProcessIdentifier,L=1)X‘12’18X‘1C’SDContextTag1(InitiatingDeviceIdentifier,L=4)X‘02000004’Device,InstanceNumber=4X‘2C’SDContextTag2(MonitoredObjectIdentifier,L=4)X‘0000000A’AnalogInput,InstanceNumber=10X‘39’SDContextTag3(TimeRemaining,L=1)X‘00’0X‘4E’PDOpeningTag4(ListOfValues)339X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘2E’PDOpeningTag2(Value)X‘44’ApplicationTag4(Real,L=4)X‘42820000’65.0X‘2F’PDClosingTag2(Value)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘6F’111(STATUS_FLAGS)X‘2E’PDOpeningTag2(Value)X‘82’ApplicationTag8(BitString,L=2)X‘0400’0,0,0,0(FALSE,FALSE,FALSE,FALSE)X‘2F’PDClosingTag2(Value)X‘4F’PDClosingTag4(ListOfValues)F.1.8例E.1.8编码——无证实事件通告服务X‘10’PDUType=1(BACnet-Unconfirmed-Request-PDU)X‘03’ServiceChoice=3(UnconfirmedEventNotification-Request)X‘09’SDContextTag0(ProcessIdentifier,L=1)X‘01’1X‘1C’SDContextTag1(InitiatingDeviceIdentifier,L=4)X‘02000009’Device,Instance9X‘2C’SDContextTag2(EventObjectIdentifier,L=4)X‘00000002’AnalogInput,InstanceNumber=2X‘3E’PDOpeningTag3(TimeStamp)X‘19’SDContextTag1(SequenceNumber,L=1)X‘10’16X‘3F’PDClosingTag3(TimeStamp)X‘49’SDContextTag4(NotificationClass,L=1)X‘04’4X‘59’SDContextTag5(Priority,L=1)X‘64’100X‘69’SDContextTag6(EventType,L=1)X‘05’5(OUT_OF_RANGE)X‘89’SDContextTag8(NotifyType,L=1)X‘00’0(ALARM)X‘99’SDContextTag9(AckedRequired,L=1)X‘01’TRUEX‘A9’SDContextTag10(FromState,L=1)340X‘00’0(NORMAL)X‘B9’SDContextTag11(ToState,L=1)X‘03’3(HIGH_LIMIT)X‘CE’PDOpeningTag12(EventValues)X‘5E’PDOpeningTag5(BACnetNotificationParameters,Choice5=OUT_OF_RANGE)X‘0C’SDContextTag0(ExceedingValue,L=4)X‘42A03333’80.1X‘1A’SDContextTag1(StatusFlags,L=2)X‘0480’1,0,0,0(TRUE,FALSE,FALSE,FALSE)X‘2C’SDContextTag2(Deadband,L=4)X‘3F800000’1.0X‘3C’SDContextTag3(ExceedLimit,L=4)X‘42A00000’80.0X‘5F’PDClosingTag5(BACnetNotificationParameters)X‘CF’PDClosingTag12(EventValues)将来,可以产生如下的确认报警请求:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘07’InvokeID=7X‘00’ServiceChoice=0(AcknowledgeAlarm-Request)X‘09’SDContextTag0(AcknowledgingProcessIdentifier,L=1)X‘01’AcknowledgingProcessIdentifier=1X‘1C’SDContextTag1(EventObjectIdentifier,L=4)X‘00000002’AnalogInput,InstanceNumber=2X‘29’SDContextTag2(EventStateIdentifier,L=1)X‘03’3(HIGH_LIMIT)X‘3E’PDOpeningTag3(TimeStamp)X‘19’SDContextTag1(SequenceNumber,L=1)X‘10’16X‘3F’PDClosingTag3(TimeStamp)X‘4C’SDContextTag4(AcknowledgmentSource,L=4)X‘00’ANSIX3.4EncodingX‘4D444C’“MDL”X‘5E’PDOpeningTag5(TimeOfAcknowledgment)X‘2E’PDOpeningTag2(DateTime)341X‘A4’ApplicationTag10(Date,L=4)X‘5C0615FF’June21,1992X‘B4’ApplicationTag11(Time,L=4)X‘0D032909’13:03:41.9X‘2F’PDClosingTag2(DateTime)X‘5F’PDClosingTag5(TimeOfAcknowledgment)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘07’InvokeID=7X‘00’ServiceACKChoise=0(AcknowledgeAlarm)F.2文件访问服务编码例程F.2.1例E.2.1编码——基本读文件服务例1:从文件中读数据X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘00’InvokeID=0X‘06’ServiceChoice=6(AtomicReadFile-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(FileIdentifier)X‘02800001’File,InstanceNumber=1X‘0E’PDOpeningTag0(StreamAccess)X‘31’ApplicationTag3(SignedInteger,L=1)(FileStartPosition)X‘00’0X‘21’PDOpeningTag0(Unsigned,L=1)(RequestedOctetCount)X‘1B’27X‘0F’PDClosingTag0(StreamAccess)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘00’InvokeID=0342X‘06’ServiceChoice=6(AtomicReadFile-Request)X‘10’ApplicationTag1(Boolean,0(FALSE))(EndOfFile)X‘0E’PDOpeningTag0(StreamAccess)X‘31’ApplicationTag3(SignedInteger,L=1)(FileStartPosition)X‘00’0X‘65’ApplicationTag6(OctetString,L>4)X‘1B’ExtendedLength=27X‘4368696C6C65723031204F6E2D54696D653D342E3320486F757273’“Chiller01On-Time=4.3Hours”X‘0F’PDClosingTag0(StreamAccess)例2:从文件中读记录X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘12’InvokeID=18X‘06’ServiceChoice=6(AtomicReadFile-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(FileIdentifier)X‘02800002’File,InstanceNumber=2X‘1E’PDOpeningTag1(RecordAccess)X‘31’ApplicationTag3(SignedInteger,L=1)(FileStartRecord)X‘0E’14X‘21’ApplicationTag2(SignedInteger,L=1)(FileStartCount)X‘03’3X‘1F’PDClosingTag1(RecordAccess)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘12’InvokeID=18X‘06’ServiceChoice=6(AtomicReadFile-ACK)X‘11’ApplicationTag1(Boolean,1(TRUE))(EndOfFile)X‘1E’PDOpeningTag1(RecordAccess)X‘31’ApplicationTag3(SignedInteger,L=1)(FileStartRecord)X‘0E’14343X‘21’ApplicationTag2(Unsigned,L=1)(ReturnedRecordCount)X‘02’2X‘65’ApplicationTag6(OctetString,L>4)(FileRecordData)X‘0A’ExtendedLength=10X‘31323A30302C34352E36’“12:00,45.6”X‘65’ApplicationTag6(OctetString,L>4)(FileRecordData)X‘0A’ExtendedLength=10X‘31323A31352C34342E38’“12:15,44.8”X‘1F’PDClosingTag1(RecordAccess)F.2.2例E.2.2编码——基本写文件服务例1:向文件中写数。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘55’InvokeID=85X‘07’ServiceChoice=7(AtomicWriteFile-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(FileIdentifier)X‘02800001’File,InstanceNumber=1X‘0E’PDOpeningTag0(StreamAccess)X‘31’ApplicationTag3(SignedInteger,L=1)(FileStartPosition)X‘1E’30X‘65’ApplicationTag6(OctetString,L>4)(FileData)X‘1B’ExtendedLength=27X‘4368696C6C65723031204F6E2D54696D653D342E3320486F757273’“12:15,44.8”X‘0F’PDClosingTag0(RecordAccess)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘55’InvokeID=85X‘07’ServiceChoice=7(AtomicWriteFile-ACK)X‘09’SDContextTag0(FileStartPosition,L=1)X‘1E’30344例2:向文件中追加两个记录X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccessed=206octetsX‘55’InvokeID=85X‘07’ServiceChoice=7(AtomicWriteFile-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(FileIdentifier)X‘02800002’File,InstanceNumber=2X‘1E’PDOpeningTag1(RecordAccess)X‘31’ApplicationTag3(SignedInteger,L=1)(FileStartRecord)X‘FF’-1(AppendtoEndofFile)X‘21’ApplicationTag2(UnsignedInteger,L=1)(RecordCount)X‘02’2X‘65’ApplicationTag6(OctetString,L>4)(FileRecordData)X‘0A’ExtendedLength=10X‘31323A30302C34352E36’“12:00,45.6”X‘65’ApplicationTag6(OctetString,L>4)(FileRecordData)X‘0A’ExtendedLength=10X‘31323A31352C34342E38’“12:15,44.8”X‘1F’PDClosingTag1(RecordAccess)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘55’InvokeID=85X‘07’ServiceACKChoice=7(AtomicWriteFile-ACK)X‘19’SDContextTag1(FileStartPosition,L=1)X‘0E’14F.3对象访问服务编码例程F.3.1例E.3.1编码——添加列表元素服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccepted=206octetsX‘01’InvokeID=1345X‘08’ServiceChoice=8(AddListElement-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘02C00003’Group,InstanceNumber=3X‘19’SDContextTag1(PropertyIdentifier,L=1)X‘35’53(LIST_OF_GROUP_MEMBERS)X‘3E’PDOpeningTag3(ListOfElements)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘0000000F’85(PRESENT_VALUE)X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘1F’PDOpeningTag1(ListOfPropertyReferences)X‘3F’PDClosingTag3(ListOfElements)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘01’InvokeID=1X‘08’ServiceACKChoice=8(AddListElement)F.3.2例F.3.2编码——删除列表元素服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccepted=206octetsX‘34’InvokeID=52X‘09’ServiceChoice=9(RemoveListElement-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘02C00003’Group,InstanceNumber=3X‘19’SDContextTag1(PropertyIdentifier,L=1)X‘35’53(LIST_OF_GROUP_MEMBERS)X‘3E’PDOpeningTag3(ListOfElements)X‘0C’SDContextTag0(ObjectIdentifier,L=4)346X‘0000000C’AnalogInput,InstanceNumber=12X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘1C’28(DESCRIPTION)X‘1F’PDOpeningTag1(ListOfPropertyReferences)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘0000000D’AnalogInput,InstanceNumber=13X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘1C’28(DESCRIPTION)X‘1F’PDClosingTag1(ListOfPropertyReferences)X‘3F’PDClosingTag3(ListOfElements)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘34’InvokeID=52X‘09’ServiceACKChoice=9(AddListElement)本例的第二部分重新插入上面删除的三个元素中的两个:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘02’MaximumAPDUSizeAccepted=206octetsX‘35’InvokeID=53X‘08’ServiceChoice=8(AddListElement-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘02C00003’Group,InstanceNumber=3X‘19’SDContextTag1(PropertyIdentifier,L=1)X‘35’53(LIST_OF_GROUP_MEMBERS)347X‘3E’PDOpeningTag3(ListOfElements)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘0000000C’AnalogInput,InstanceNumber=12X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘1F’PDOpeningTag1(ListOfPropertyReferences)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘0000000D’AnalogInput,InstanceNumber=13X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘1F’PDClosingTag1(ListOfPropertyReferences)X‘3F’PDClosingTag3(ListOfElements)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘35’InvokeID=53X‘08’ServiceACKChoice=8(AddListElement)F.3.3例F.3.3编码——创建对象服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘56’InvokeID=86X‘0A’ServiceChoice=10(CreateObject-Request)X‘0E’PDOpeningTag0(ObjectSpecifier)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘0A’10(FileObject)X‘0F’PDClosingTag0(ObjectSpecifier)X‘1E’PDOpeningTag1(ListOfInitialValues)348X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘2E’PDOpeningTag2(Value)X‘75’ApplicationTag7(CharacterString,L>4)X‘08’ExtendedLength=8X‘00’ANSIX3.4EncodingX‘5472656E642031’“Trend1”X‘2F’PDClosingTag2(Value)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘29’41(FILE_ACCESS_METHOD)X‘2E’PDOpeningTag2(Value)X‘91’ApplicationTag9(Enumerated,L=1)X‘00’0(RECORD_ACCESS)X‘2F’PDClosingTag2(Value)X‘1F’PDOpeningTag1(ListOfInitialValues)假定服务进程执行正确,那么将返回一个传送新建对象标识符的确认:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘56’InvokeID=86X‘0A’ServiceACKChoice=10(CreateObject-ACK)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)X‘0280000D’File,InstanceNumber=13F.3.4例F.3.4编码——删除对象服务例1:成功删除对象X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘57’InvokeID=87X‘0B’ServiceChoice=11(DeleteObject-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)X‘02C00006’Group,InstanceNumber=6假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)349X‘57’InvokeID=87X‘0B’ServiceACKChoice=11(DeleteObject)例2:删除对象的不成功尝试。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘58’InvokeID=88X‘0B’ServiceChoice=11(DeleteObject-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)X‘02C00007’Group,InstanceNumber=7在本例中,假定对象被保护,不能被此协议服务删除。服务方将发出如下响应:X‘50’PDUType=5(BACnet-Error-PDU)X‘58’OriginalInvokeID=88X‘0B’ErrorChoice=11(DeleteObject)X‘91’ApplicationTag9(Enumerated,L=1)(ErrorClass)X‘01’1(OBJECT)X‘91’ApplicationTag9(Enumerated,L=1)(ErrorCode)X‘17’23(OBJECT_DELETION_NOT_PERMITTED)F.3.5例F.3.5编码——读属性服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘00’MaximumAPDUSizeAccepted=50octetsX‘01’InvokeID=1X‘0C’ServiceChoice=12(ReadProperty-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000005’AnalogInput,InstanceNumber=5X‘19’SDContextTag1(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)此请求产生如下结果:350X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘01’InvokeID=1X‘0C’ServiceACKChoice=12(ReadProperty-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000005’AnalogInput,InstanceNumber=5X‘19’SDContextTag1(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘3E’PDOpeningTag3(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘4290999A’72.3X‘3F’PDClosingTag3(PropertyValue)F.3.6例F.3.6编码——条件读属性服务例1:获取所有数字输入对象的对象标识符。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘51’InvokeID=81X‘0D’ServiceChoice=13(ReadPropertyConditionalRequest)X‘0E’PDOpeningTag0(ObjectSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘00’0(AND)X‘1E’PDOpeningTag1(ListOfSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘4F’79(OBJECT_TYPE)X‘29’SDContextTag2(RelationSpecifier)X‘00’0(EQUAL)X‘3E’PDOpeningTag3(ComparisonValue)X‘91’ApplicationTag9(Enumerated,L=1)(ObjectType)X‘03’3(BINARY_INPUT)X‘3F’PDClosingTag3(ComparisonValue)X‘1F’PDClosingTag1(ListOfSelectionCriteria)X‘0F’PDClosingTag0(ObjectSelectionCriteria)351此请求产生如下结果:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘51’InvokeID=81X‘0D’ServiceACKChoice=13(ReadPropertyConditional-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00C00001’BinaryInput,InstanceNumber=1X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00C00002’BinaryInput,InstanceNumber=2X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00C00003’BinaryInput,InstanceNumber=3X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00C00004’BinaryInput,InstanceNumber=4例2:模拟输入的条件读X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘52’InvokeID=82X‘0D’ServiceChoice=13(ReadPropertyConditionalRequest)X‘0E’PDOpeningTag0(ObjectSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘00’Enumeration0(AND)X‘1E’PDOpeningTag1(ListOfSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘4F’79(OBJECT_TYPE)X‘29’SDContextTag2(RelationSpecifier)X‘00’0(EQUAL)X‘3E’PDOpeningTag3(ComparisonValue)X‘91’ApplicationTag9(Enumerated,L=1)(ObjectType)X‘00’0(ANALOG_INPUT)352X‘3F’PDClosingTag3(ComparisonValue)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘29’SDContextTag2(RelationSpecifier)X‘03’3(GREATER_THAN)X‘3E’PDOpeningTag3(ComparisonValue)X‘44’ApplicationTag4(Real,L=4)X‘42C80000’100.0X‘3F’PDClosingTag3(ComparisonValue)X‘1F’PDClosingTag1(ListOfSelectionCriteria)X‘0F’PDClosingTag0(ObjectSelectionCriteria)此请求产生如下结果:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘52’InvokeID=82X‘0D’ServiceACKChoice=13(ReadPropertyConditional-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000001’AnalogInput,InstanceNumber=1X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(PropertyValue)X‘42CC999A’102.3X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDOpeningTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000002’AnalogInput,InstanceNumber=2X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(PropertyValue)X‘4334B333’180.7X‘4F’PDClosingTag4(PropertyValue)353X‘1F’PDOpeningTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000003’AnalogInput,InstanceNumber=3X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(PropertyValue)X‘430E199A’142.1X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDOpeningTag1(ListOfResults)例3:查找不可靠的或脱离服务的对象。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘53’InvokeID=83X‘0D’ServiceChoice=13(ReadPropertyConditionalRequest)X‘0E’PDOpeningTag0(ObjectSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘01’1(OR)X‘1E’PDOpeningTag1(ListOfSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘67’103(RELIABILITY)X‘29’SDContextTag2(RelationSpecifier)X‘01’1(NOT_EQUAL)X‘3E’PDOpeningTag3(ComparisonValue)X‘91’ApplicationTag9(Enumerated,L=1)X‘00’0(ANALOG_INPUT)X‘3F’PDClosingTag3(ComparisonValue)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘51’81(OUT_OF_SERVICE)X‘29’SDContextTag2(RelationSpecifier)X‘00’0(EQUAL)X‘3E’PDOpeningTag3(ComparisonValue)354X‘11’ApplicationTag1(Boolean,1(TRUE))X‘3F’PDClosingTag3(ComparisonValue)X‘1F’PDClosingTag1(ListOfSelectionCriteria)X‘0F’PDClosingTag0(ObjectSelectionCriteria)X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘51’81(OUT_OF_SERVICE)X‘1F’PDClosingTag1(ObjectPropertyReferences)假定服务进程执行正确,那么将返回一个包含请求值的复杂确认:X‘30’PDUType=3(BACnet-ConfirmedACK-PDU,SEG=0,MOR=0)X‘53’InvokeID=83X‘0D’ServiceACKChoice=13(ReadPropertyConditional-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00C00001’BinaryInput,InstanceNumber=1X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘91’ApplicationTag9(Enumerated,L=1)X‘01’1(ACTIVE)X‘4F’PDClosingTag4(PropertyValue)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘67’103(RELIABILTY)X‘4E’PDOpeningTag4(PropertyValue)X‘91’ApplicationTag9(Enumerated,L=1)X‘00’0(NO_FAULT_DETECTED)X‘4F’PDClosingTag4(PropertyValue)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘51’81(OUT_OF_SERVICE)355X‘4E’PDOpeningTag4(PropertyValue)X‘11’ApplicationTag1(TRUE)X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDOpeningTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000002’AnalogInput,InstanceNumber=2X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘437A0000’250.0X‘4F’PDClosingTag4(PropertyValue)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘4E’PDOpeningTag4(PropertyValue)X‘91’ApplicationTag9(Enumerated,L=1)X‘07’7(UNRELIABLE_OTHER)X‘4F’PDClosingTag4(PropertyValue)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘51’81(OUT_OF_SERVICE)X‘4E’PDOpeningTag4(PropertyValue)X‘10’ApplicationTag1(Boolean,0(FALSE))X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDOpeningTag1(ListOfResults)例4:寻找所有Object_Names与比较值“CPressure”和“AC?SupplyTemp”相符的对象的标识符。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘54’InvokeID=84X‘0D’ServiceChoice=13(ReadPropertyConditionalRequest)X‘0E’PDOpeningTag0(ObjectSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)356X‘01’1(OR)X‘1E’PDOpeningTag1(ListOfSelectionCriteria)X‘09’SDContextTag0(SelectionLogic,L=1)X‘4D’77(OBJECT_NAME)X‘29’SDContextTag2(RelationSpecifier)X‘00’0(EQUAL)X‘3E’PDOpeningTag3(ComparisonValue)X‘7D’ApplicationTag7(CharacterString,L>4)X‘0C’ExtendedLength=12X‘00’ANSIX3.4EncodingX‘432A205073657373757265’“CPressure”X‘3F’PDClosingTag3(ComparisonValue)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘29’SDContextTag2(RelationSpecifier)X‘00’0(EQUAL)X‘3E’PDOpeningTag3(ComparisonValue)X‘7D’ApplicationTag7(CharacterString,L>4)X‘10’ExtendedLength=16X‘00’ANSIX3.4EncodingX‘41433F20537570706C792054656D70’“AC?SupplyTemp”X‘3F’PDClosingTag3(ComparisonValue)X‘1F’PDClosingTag1(ListOfSelectionCriteria)X‘0F’PDClosingTag0(ObjectSelectionCriteria)X‘1E’PDOpeningTag1(ListOfPropertyReferences)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘1F’PDClosingTag1(ListOfPropertyReferences)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘54’InvokeID=84X‘0D’ServiceACKChoice=13(ReadPropertyConditional-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)357X‘00000004’AnalogInput,InstanceNumber=4X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘4E’PDOpeningTag4(PropertyValue)X‘75’ApplicationTag7(CharacterString,L>4)X‘10’ExtendedLength=16X‘00’ANSIX3.4EncodingX‘41433120537570706C792054656D70’“AC1SupplyTemp”X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000007’AnalogInput,InstanceNumber=7X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘4E’PDOpeningTag4(PropertyValue)X‘75’ApplicationTag7(CharacterString,L>4)X‘0E’ExtendedLength=14X‘00’ANSIX3.4EncodingX‘43575031205072657373757265’“CWP1Pressure”X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000008’AnalogInput,InstanceNumber=8X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘4E’PDOpeningTag4(PropertyValue)X‘75’ApplicationTag7(CharacterString,L>4)X‘19’ExtendedLength=25X‘00’ANSIX3.4EncodingX‘4368696C6C65722031204672656F6E205072657373757265’“Chiller1FreonPressure”X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)358X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘0000000A’AnalogInput,InstanceNumber=10X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘4E’PDOpeningTag4(PropertyValue)X‘75’ApplicationTag7(CharacterString,L>4)X‘10’ExtendedLength=16X‘00’ANSIX3.4EncodingX‘41433220537570706C792054656D70’“AC2SupplyTemp”X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘0000000C’AnalogInput,InstanceNumber=12X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘4D’77(OBJECT_NAME)X‘4E’PDOpeningTag4(PropertyValue)X‘75’ApplicationTag7(CharacterString,L>4)X‘10’ExtendedLength=16X‘00’ANSIX3.4EncodingX‘41433220537570706C792054656D70’“AC3SupplyTemp”X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)F.3.7例F.3.7编码——读多个属性服务例1:读单一对象中的多个属性。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘F1’InvokeID=241X‘0E’ServiceChoice=14(ReadPropertyMulitiple-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000010’AnalogInput,InstanceNumber=16X‘1E’PDOpeningTag1(ListOfPropertyReference)359X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘1F’PDClosingTag1(ListOfPropertyReference)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘F1’InvokeID=241X‘0E’ServiceACKChoice=14(ReadPropertyMultiple-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000010’AnalogInput,InstanceNumber=16X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘4290999’72.3X‘4F’PDClosingTag4(PropertyValue)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘67’103(RELIABILITY)X‘4E’PDOpeningTag4(PropertyValue)X‘91’ApplicationTag9(Enumerated,L=1)X‘00’0(NO_FAULT_DETECTED)X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)例2:读若干个对象的属性。X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘02’InvokeID=2X‘0E’ServiceChoice=14(ReadPropertyMulitiple-Request)360X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000021’AnalogInput,InstanceNumber=33X‘1E’PDOpeningTag1(ListOfPropertyReference)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘1F’PDClosingTag1(ListOfPropertyReference)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000032’AnalogInput,InstanceNumber=50X‘1E’PDOpeningTag1(ListOfPropertyReference)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘1F’PDClosingTag1(ListOfPropertyReference)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000023’AnalogInput,InstanceNumber=35X‘1E’PDOpeningTag1(ListOfPropertyReference)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘1F’PDClosingTag1(ListOfPropertyReference)假定服务进程执行正确,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘02’InvokeID=2X‘0E’ServiceACKChoice=14(ReadPropertyMultiple-ACK)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000021’AnalogInput,InstanceNumber=33X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘42293333’42.3X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)361X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000032’AnalogInput,InstanceNumber=50X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘5E’PDOpeningTag5(PropertyAccessError)X‘91’ApplicationTag9(Enumerated,L=1)(ErrorClass)X‘01’1(OBJECT)X‘91’ApplicationTag9(Enumerated,L=1)(ErrorClass)X‘1F’31(UNKNOWN_OBJECT)X‘5F’PDClosingTag5(PropertyAccessError)X‘1F’PDClosingTag1(ListOfResults)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00000023’AnalogInput,InstanceNumber=35X‘1E’PDOpeningTag1(ListOfResults)X‘29’SDContextTag2(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘4E’PDOpeningTag4(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘43D9D99A’435.7X‘4F’PDClosingTag4(PropertyValue)X‘1F’PDClosingTag1(ListOfResults)F.3.8例F.3.8编码——写属性服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘59’InvokeID=89X‘0F’ServiceChoice=15(WriteProperty-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00800001’AnalogInput,InstanceNumber=1X‘19’SDContextTag1(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘3E’PDOpeningTag3(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘43340000’PropertyValue=180.0362X‘3F’PDClosingTag3(PropertyValue)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘59’InvokeID=89X‘0F’ServiceACKChoice=15(WriteProperty)F.3.9例F.3.9编码——写多个属性服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘01’InvokeID=1X‘10’ServiceChoice=16(WritePropertyMulitiple-Request)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00800005’AnalogInput,InstanceNumber=5X‘1E’PDOpeningTag1(ListOfProperties)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘1E’PDOpeningTag1(ListOfProperties)X‘44’ApplicationTag4(Real,L=4)X‘42860000’67.0X‘2F’PDClosingTag2(PropertyValue)X‘1F’PDClosingTag1(ListOfProperties)X‘0C’SDContextTag0(ObjectIdentifier,L=4)X‘00800006’AnalogInput,InstanceNumber=6X‘1E’PDOpeningTag1(ListOfResults)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘2E’PDOpeningTag2(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘42860000’67.0X‘2F’PDClosingTag2(PropertyValue)X‘1F’PDClosingTag1(ListOfProperties)X‘0C’SDContextTag0(ObjectIdentifier,L=4)363X‘00800007’AnalogInput,InstanceNumber=7X‘1E’PDOpeningTag1(ListOfResults)X‘09’SDContextTag0(PropertyIdentifier,L=1)X‘55’85(PRESENT_VALUE)X‘2E’PDOpeningTag2(PropertyValue)X‘44’ApplicationTag4(Real,L=4)X‘42900000’72.0X‘2F’PDClosingTag2(PropertyValue)X‘1F’PDClosingTag1(ListOfProperties)假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘01’InvokeID=1X‘10’ServiceACKChoice=16(WritePropertyMultiple)F.4远程设备管理服务编码例程F.4.1例F.4.1编码——设备通信控制服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘05’InvokeID=5X‘11’ServiceChoice=17(DeviceCommunicationControl-Request)X‘09’SDContextTag0(TimeDuration,L=1)X‘05’5X‘19’SDContextTag1(Enable-Disable,L=1)X‘01’1(DISABLE)X‘2D’SDContendedTag2(Password,L>4)X‘08’ExtendedLength=8X‘00’ANSIX3.4EncodingX‘23656762646621’“#egbdf!”假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘05’InvokeID=5X‘11’SimpleACKChoice=17(DeviceCommunicationControl)364F.4.2例F.4.2编码——有证实专有传输服务X‘00’PDUType=0((BACnet-Confirmed-Request-PDU)SEG=0,MOR=0,SA=0)X‘04’MaximumAPDUSizeAccepted=1024octetsX‘55’InvokeID=85X‘12’ServiceChoice=18(ConfirmedPrivateTransfer)X‘09’SDContextTag0(VendorID,L=1)X‘19’25(XYZControlsCompanyLimited)X‘19’SDContextTag1(ServiceNumber,L=1)X‘08’8(XYZProprietaryService#8)X‘2E’PDOpeningTag2(ServiceParameters)X‘44’ApplicationTag4(Real,L=4)X‘4290CCCD’72.4X‘62’ApplicationTag6(OctetString,L=2)X‘1649’X‘1649’X‘2F’PDClosingTag2(ServiceParameters)假定服务成功执行,但不需要返回请求方BACnet用户结果,那么将使用BACnet复杂应答PDU返回一‘Result(+)’原语。X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘55’InvokeID=85X‘12’ServiceChoice=18(ConfirmedPrivateTransfer-ACK)X‘09’SDContextTag0(VendorID,L=1)X‘19’25X‘19’SDContextTag1(ServiceNumber,L=1)X‘08’8F.4.3例F.4.3编码——无证实专有传输服务X‘10’PDUType=1(BACnet-Unconfirmed-Request-PDU)X‘04’ServiceChoice=4(UnconfirmedPrivateTransfer-Request)X‘09’SDContextTag0(VendorID,L=1)365X‘19’25X‘19’SDContextTag1(ServiceNumber,L=1)X‘08’8X‘2E’PDOpeningTag2(ServiceParameters)X‘44’ApplicationTag4(Real,L=4)X‘4290CCCD’72.4X‘62’ApplicationTag6(OctetString,L=2)X‘1649’X‘1649’X‘2F’PDClosingTag2(ServiceParameters)F4.4例F.4.4编码——重新初始化设备服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘02’InvokeID=2X‘14’ServiceChoice=20(ReinitializeDevice-Request)X‘09’SDContextTag0(ReinitializedStateOfDevice,L=1)X‘01’1(WARMSTART)X‘1D’SDContextTag1(Password,L>4)X‘09’ExtendedLength=9X‘00’ANSIX3.4EncodingX‘4162436445664768’“AbCdEfGh”假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘02’InvokeID=2X‘14’ServiceACKChoice=20(ReinitializeDevice)F.4.5例F.4.5编码——有证实文本报文服务X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘03’InvokeID=3X‘13’ServiceChoice=19(ConfirmedTextMessage-Request)366X‘0C’SDContextTag0(TextMessageSourceDevice,L=4)X‘02000005’Device,InstanceNumber=5X‘29’SDContextTag2(MessagePriority,L=1)X‘00’0(NORMAL)X‘3D’SDContextTag3(Message,L>4)X‘18’ExtendedLength=24X‘00’ANSIX3.4EncodingX‘504D20726571756972656420666F722050554D50333437’“PMrequiredforPUMP347”假定服务进程执行正确,那么将返回一个简单确认:X‘20’PDUType=2(BACnetSimpleACK-PDU)X‘03’InvokeID=3X‘13’ServiceChoice=19(ConfirmedTextMessage)F.4.6例F.4.6编码——无证实文本报文服务X‘10’PDUType=1(BACnet-Unconfirmed-Request-PDU)X‘05’ServiceChoice=5(UnconfirmedPrivateTransfer-Request)X‘0C’SDContextTag0(TextMessageSourceDevice,L=4)X‘02000005’Device,InstanceNumber=5X‘29’SDContextTag2(MessagePriority,L=1)X‘00’0(NORMAL)X‘3D’SDContextTag3(Message,L>4)X‘18’ExtendedLength=24X‘00’ANSIX3.4EncodingX‘504D20726571756972656420666F722050554D50333437’“PMrequiredforPUMP347”注意此报文不需要响应,因其是无证实型的。F.4.7例F.4.7编码——时间同步服务X‘10’PDUType=1(BACnet-Unconfirmed-Request-PDU)X‘06’ServiceChoice=6(TimeSynchronization-Request)X‘A4’ApplicationTag10(Date,L=4)X‘5C0B11FF’November17,1992(DayofWeekUnspecified)X‘B4’ApplicationTag11(Time,L=4)367X‘162D1E46’22:45:30.70F.4.8例F.4.8编码——Who-Has和I-Have服务例1:寻找包含已知对象名的对象的设备。X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘07’ServiceChoice=7(Who-Has-Request)X‘3D’SDContextTag3(ObjectName,L>4)X‘07’ExtendedLength=7X‘00’ANSIX3.4EncodingX‘4F4154656D70’“OATemp”假定只有一台设备有上述对象,那么将收到下面的I-Have服务指示。X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘01’ServiceChoice=1(I-Have-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(DeviceIdentifier)X‘02000008’Device,InstanceNumber=8X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(DeviceIdentifier)X‘00000003’AnalogInput,InstanceNumber=3X‘75’ApplicationTag7(CharacterString,L>4)(ObjectName)X‘07’ExtendedLength=7X‘00’ANSIX3.4EncodingX‘4F4154656D70’“OATemp”例2:寻找包含已知对象标识符的对象的设备。X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘07’ServiceChoice=7(Who-Has-Request)X‘2C’SDContextTag2(ObjectIdentifier,L=4)X‘00000003’AnalogInput,InstanceNumber=3368假定只有一台设备有上述对象,那么将收到下面的I-Have服务指示。X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘01’ServiceChoice=1(I-Have-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(DeviceIdentifier)X‘02000008’Device,InstanceNumber=8X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(DeviceIdentifier)X‘00000003’AnalogInput,InstanceNumber=3X‘75’ApplicationTag7(CharacterString,L>4)(ObjectName)X‘07’ExtendedLength=7X‘00’ANSIX3.4EncodingX‘4F4154656D70’“OATemp”F.4.9例F.4.9编码——Who-Is和I-Am服务例1:建立一台已知设备对象标识符如实例号的设备的网络地址。X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘08’ServiceChoice=8(Who-Is-Request)X‘09’SDContextTag0(DeviceInstanceRangeLowLimit,L=1)X‘03’3X‘19’SDContextTag1(DeviceInstanceRangeHighLimit,L=1)X‘03’3假定在网络上有这样一台设备,那么一会儿后它将使用I-Am服务进行响应:X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘00’ServiceChoice=0(I-Am-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(I-AmDeviceIdentifier)X‘02000008’Device,InstanceNumber=8X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(ObjectIdentifier)X‘00000003’AnalogInput,InstanceNumber=3X‘75’ApplicationTag7(CharacterString,L>4)(ObjectName)X‘07’ExtendedLength=7X‘00’ANSIX3.4EncodingX‘4F4154656D70’“OATemp”369例2:找出几乎所有的网络设备。X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘08’ServiceChoice=8(Who-Is-Request)网络上的每一台设备均使用I-Am服务进行响应:X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘00’ServiceChoice=0(I-Am-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(I-AmDeviceIdentifier)X‘02000001’Device,InstanceNumber=1X‘22’ApplicationTag2(UnsignedInteger,L=2)(MaxAPDULengthAccepted)X‘01E0’480X‘91’ApplicationTag9(Enumerated,L=1)(SegmentationSupported)X‘01’1(SEGMENTED_TRANSMIT)X‘21’ApplicationTag2(UnsignedInteger,L=1)(vendorID)X‘63’99X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘00’ServiceChoice=0(I-Am-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(I-AmDeviceIdentifier)X‘02000002’Device,InstanceNumber=2X‘21’ApplicationTag2(UnsignedInteger,L=1)(MaxAPDULengthAccepted)X‘CE’206X‘91’ApplicationTag9(Enumerated,L=1)(SegmentationSupported)X‘02’2(SEGMENTED_RECEIVE)X‘21’ApplicationTag2(UnsignedInteger,L=1)(vendorID)X‘21’33X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘00’ServiceChoice=0(I-Am-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(I-AmDeviceIdentifier)X‘02000003’Device,InstanceNumber=3X‘22’ApplicationTag2(UnsignedInteger,L=2)(MaxAPDULengthAccepted)370X‘0400’1024X‘91’ApplicationTag9(Enumerated,L=1)(SegmentationSupported)X‘03’3(NO_SEGMENTATION)X‘21’ApplicationTag2(UnsignedInteger,L=1)(vendorID)X‘63’99X‘10’PDUType=1(Unconfirmed-Service-Request-PDU)X‘00’ServiceChoice=0(I-Am-Request)X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(I-AmDeviceIdentifier)X‘02000004’Device,InstanceNumber=4X‘21’ApplicationTag2(UnsignedInteger,L=1)(MaxAPDULengthAccepted)X‘80’128X‘91’ApplicationTag9(Enumerated,L=1)(SegmentationSupported)X‘00’0(SEGMENTED_BOTH)X‘21’ApplicationTag2(UnsignedInteger,L=1)(vendorID)X‘42’66F.5例F.5编码——虚拟终端服务建立虚拟终端会话(VT-Session):X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘50’InvokeID=80X‘15’ServiceChoice=21(VT-Open-Request)X‘91’ApplicationTag9(Enumerated,L=1)(VTClass)X‘01’1(ANSI_X3.64)X‘21’ApplicationTag2(UnsignedInteger,L=1)(LocalVTSessionIdentifier)X‘05’5假定目标设备能够创建新的虚拟终端会话,那么将返回复杂响应:X‘30’PDUType=3(BACnet-ComplexACK-PDU,SEG=0,MOR=0X‘50’InvokeID=80X‘15’ServiceChoice=21(VT-Open-ACK)371X‘21’ApplicationTag2(UnsignedInteger,L=1)(RemoteVTSessionIdentifier)X‘1D’29终端开始(Sign-on)。目标设备发送提示:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘51’InvokeID=81X‘17’ServiceChoice=23(VT-Data-Request)X‘21’ApplicationTag2(UnsignedInteger,L=1)(VTSessionIdentifier)X‘05’5X‘65’ApplicationTag6(OctetString,L>1)(VTNewData)X‘12’ExtendedLength=18X‘0D0A456E7465722055736572204E616D653A’“{cr}{lf}EnterUserName:”X‘21’ApplicationTag2(UnsignedInteger,L=1)(VTDataFlag)X‘00’0假定操作员接口设备正确接受数据,那么将返回一个复杂确认:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘51’InvokeID=81X‘17’ServiceChoice=23(VT-Data-ACK)X‘09’SDContextTag0(AllNewDataAccepted,L=1)X‘01’1(TRUE)输入用户名:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘52’InvokeID=82X‘17’ServiceChoice=23(VT-Data-Request)X‘21’ApplicationTag2(UnsignedInteger,L=1)(VTSessionIdentifier)X‘1D’29X‘65’ApplicationTag6(OctetString,L>4)(VTNewData)X‘05’ExtendedLength=5372X‘465245440D’“FRED{cr}”X‘21’ApplicationTag2(UnsignedInteger,L=1)(VTDataFlag)X‘00’0目标设备响应:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘52’InvokeID=82X‘17’ServiceChoice=23(VT-Data-ACK)X‘09’SDContextTag0(AllNewDataAccepted,L=1)X‘01’1(TRUE)输入密码:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘53’InvokeID=83X‘17’ServiceChoice=23(VT-Data-Request)X‘21’ApplicationTag2(UnsignedInteger,L=1)(VTSessionIdentifier)X‘05’5X‘65’ApplicationTag6(OctetString,L>4)(VTNewData)X‘15’ExtendedLength=21X‘465245440D0A456E7465722050617373776F72643A’“FRED{cr}{lf}EnterPassword”X‘21’ApplicationTag2(UnsignedInteger,L=1)(VTDataFlag)X‘01’1目标设备响应:X‘30’PDUType=3(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0)X‘53’InvokeID=83X‘17’ServiceChoice=23(VT-Data-ACK)X‘09’SDContextTag0(AllNewDataAccepted,L=1)X‘01’1(TRUE)终端关闭(Sign-off):373X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘01’MaximumAPDUSizeAccepted=128octetsX‘54’InvokeID=84X‘16’ServiceChoice=22(VT-Close-Request)X‘21’ApplicationTag2(UnsignedInteger,L=1)(ListOfRemoteVTSessionIdentifier)X‘1D’29响应:X‘20’PDUType=2(BACnet-SimpleACK-PDU)X‘54’InvokeID=84X‘16’ServiceACKChoice=23(VT-Close)F.6例F.6编码——安全服务设备A向密钥服务器发送请求密钥服务请求:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘05’MaximumAPDUSizeAccepted=1470octetsX‘0F’InvokeID=15X‘19’ServiceChoice=25(RequestKey-Request)注意APDU中从此处到结束的所有字节均加密。X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(RequestingDeviceIdentifier)X‘02000001’Device,InstanceNumber=1X‘22’ApplicationTag2(UnsignedInteger,L=2)(NetworkNumber)X‘0002’2X‘61’ApplicationTag6(OctetString,L=1)(MACAddress)X‘11’17X‘C4’ApplicationTag12(ObjectIdentifier,L=4)(RemoteDeviceIdentifier)X‘02000002’Device,InstanceNumber=2X‘22’ApplicationTag2(UnsignedInteger,L=2)(NetworkNumber)X‘0002’2X‘61’ApplicationTag6(OctetString,L=1)(MACAddress)X‘22’34374密钥服务器查询验证请求密钥请求:X‘00’PDUType=0(BACnet-Confirmed-Request-PDU,SEG=0,MOR=0,SA=0)X‘05’MaximumAPDUSizeAccepted=1470octetsX‘01’InvokeID=1X‘18’ServiceChoice=24(Authenticate-Request)注意APDU中从此处到结束的所有字节均加密。X‘0C’SDContextTag0(PseudoRandomNumber,L=4)X‘12345678’305,419,896X‘19’SDContextTag1(ExpectedInvokeID,L=1)X‘0F’15请求密钥服务请求的始发者用复杂确认响应验证请求:X‘30’PDUType=2(BACnet-ComplexACK-PDU,SEG=0,MOR=0)X‘01’InvokeID=01X‘18’ServiceChoice=24(Authenticate-ACK)注意APDU中从此处到结束的所有字节均加密。X‘24’ApplicationTag2(UnsignedInteger,L=4)(ModifiedRandomNumber)X‘93B5D7F1’2,478,168,049375XORXORZ-7Z-1InputOutput图G-1.硬件报头CRC生成器附件G-循环冗余校验(CRC)计算(资料)(本附件不是标准的一部分,仅仅作为资料使用)由于历史的原因,CRC生成器一般采用带有异或反馈的移位寄存器实现。这是一种廉价的用硬件使用串行比特流加工CRC信息的方法。因为商用的通用异步收发报机(UART)不提供CRC的硬件实现,所以那些在第9节和第10节描述的基于UART的协议必须用软件的方法实现这些运算。这可以模拟带有异或反馈的移位寄存器的工作形式一位一位地计算来实现,也可以用一种更有效的算法将字节作为一个整体计算实现。本附件给出使用这种方式来计算CRC。下面举出的算法用作例子,并不限制生产商关于CRC计算的实现。G.1报头CRC计算我们从如图G-1所示的硬件CRC生成器的框图开始。其中所使用的多项式为:X8+X7+1硬件实现是在一个串行比特流上完成的,但我们的计算必须在整个字节上完成。为此,我们参照八位比特376数据的电路实现。CRC移位寄存器的输入端初始化为X0,输出端初始化为X7,输入数据从D0到D7(低位先行,如同UART的发送和接收)。下面的每一块中,每一位(项)按照纵向异或运算。输入寄存器内容------------------------------------------------------D0X0X1X2X3X4X5X6X7------------------------------------------------------D1X0X1X2X3X4X5X6D0D0X7X7------------------------------------------------------D2X0X1X2X3X4X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------D3X0X1X2X3X4D2D1D0D2X5X6X7X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------D4X0X1X2X3D3D2D1D0X4X5X6X7X4D2D1D0D2X5X6X7X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------D5X0X1X2D4D3D2D1D0D4X3X4X5X6X7X3D3D2D1D0D3X4X5X6X7X4377D2D1D0D2X5X6X7X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------D6X0X1D5D4D3D2D1D0D5X2X3X4X5X6X7X2D4D3D2D1D0D4X3X4X5X6X7X3D3D2D1D0D3X4X5X6X7X4D2D1D0D2X5X6X7X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------D7X0D6D5D4D3D2D1D0D6X1X2X3X4X5X6X7X1D5D4D3D2D1D0D5X2X3X4X5X6X7X2D4D3D2D1D0D4X3X4X5X6X7X3D3D2D1D0D3X4X5X6X7X4D2D1D0D2X5X6X7X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------D0X7378D7D6D5D4D3D2D1D7X0X1X2X3X4X5X6X0D6D5D4D3D2D1D0D6X1X2X3X4X5X6X7X1D5D4D3D2D1D0D5X2X3X4X5X6X7X2D4D3D2D1D0D4X3X4X5X6X7X3D3D2D1D0D3X4X5X6X7X4D2D1D0D2X5X6X7X5D1D0D1X6X7X6D0D0X7X7------------------------------------------------------上述最后一块是一字节数据通过CRC生成器移位的结果。所以一个字节可以通过执行指定的异或操作处理成CRC。为了简化需要的移位操作,我们定义X0为并行字节的最高位,X7为最低位。因为大多数处理器的字节表示与此相反,所以我们重新命名以符合标准处理器的比特命名法。令C7=X0,C6=X1,等等。则上面表单中最后的结果变为:------------------------------------------------------X0X1X2X3X4X5X6X7------------------------------------------------------C7C6C5C4C3C2C1C0------------------------------------------------------D0C0D7D6D5D4D3D2D1D7C7C6C5C4C3C2C1C7D6D5D4D3D2D1D0D6C6C5C4C3C2C1C0C6D5D4D3D2D1D0D5C5C4C3C2C1C0C5D4D3D2D1D0D4C4C3C2C1C0C4D3D2D1D0D3C3C2C1C0C3D2D1D0D2379C2C1C0C2D1D0D1C1C0C1D0D0C0C0------------------------------------------------------或者,纵向重新排列使得运算最小化(因为异或是可交换的),并规定任何项与其自身异或应被排除:------------------------------------------------------D7D6D5D4D3D2D1D7C7C6C5C4C3C2C1C7D6D5D4D3D2D1D0D6C6C5C4C3C2C1C0C6D5D4D3D2D1D0D5C5C4C3C2C1C0C5D4D3D2D1D0D4C4C3C2C1C0C4D3D2D1D0D3C3C2C1C0C3D2D1D0D2C2C1C0C2D1D0D1C1C0C1D0D0C0C0------------------------------------------------------在运算中,CRC生成器的C7-C0都初始化为1。在发送过程中,帧类型、目的地址、源地址和长度在发送前都将经过计算。最后的CRC寄存器的值的补码将作为结果发送。在接收端,帧类型、目的地址、源地址、长度和接收到的CRC字节将经过计算。如果所有字节都正确收到,那么接收方CRC寄存器最后的值将是X’55’。作为一个应用举例,考虑一个从节点X’05’到节点X’10’的令牌帧。如下:DescriptionValueCRCRegisterAfterOctetisProcessedPreamble1,notincludedinCRCX‘55’Preamble2,notincludedinCRCX‘FF’frametype=TOKENX‘00’X‘55’destinationaddressX‘10’X‘C2’sourceaddressX‘05’X‘BC’datalengthMSB=0X‘00’X‘95’datalengthLSB=0X‘00’X‘73’onescomplementisX‘8C’HeaderCRCX‘8C’X‘55’finalresultatreceiver380因此,发送方将对五个字节X’00’、X’10’、X’05’、X’00’和X’00’计算CRC,结果为X’73’。其补码为X’8C’,这将追加在帧的后面。接收方将对六个字节X’00’、X’10’、X’05’、X’00’、X’00’和X’8C’计算CRC,结果为X’55’,这表示正确接收到帧。G.1.1用C语言实现报头CRC算法举例本小节提供了一个用C语言实现报头CRC算法的例子。输入是将被处理的和累加CRC的字节。函数返回值就是更新后的CRC值。为了最小化移位运算,我们使用了非循环的比特左移。另外,第8位将同最低位字节异或。期望的结果:C7C6C5C4C3C2C1C0C6C5C4C3C2C1C0C7C5C4C3C2C1C0C6C4C3C2C1C0C5C3C2C1C0C4C2C1C0C3C1C0C2C0C1移16位字:C7C6C5C4C3C2C1vC7C6C5C4C3C2C1C0v<<1C7C6C5C4C3C2C1C0v<<2C7C6C5C4C3C2C1C0v<<3C7C6C5C4C3C2C1C0v<<4C7C6C5C4C3C2C1C0v<<5C7C6C5C4C3C2C1C0v<<6C7C6C5C4C3C2C1C0v<<7/Accumulate“dataValue”intotheCRCincrcValue./ReturnvalueisupdatedCRC//Assumesthat“unsignedchar”isequivalenttooneoctet./Assumesthat“unsignedint”is16bits./the^operatormeansexclusiveOR.unsignedcharCalcHeaderCRC(unsignedchardataValue,unsignedcharcrcValue){Unsignedintcrc;381crc=crcValue^dataValue;/XORC7..C0withD7..D0/Exclusiveorthetermsinthetable(topdown)crc=crc^(crc<<1)^(crc<<2)^(crc<<3)^(crc<<4)^(crc<<5)^(crc<<6)^(crc<<7);/Combinebitsshiftedoutlefthandendreturn(crc&oxfe)^((crc>>8)&1);}G.1.2用汇编语言实现报头CRC算法举例本小节提供了一个用68HC11(一种精简指令集的八位处理器)汇编语言实现报头CRC算法的例子。程序使用变量CRCLO累加CRC。T1是一个临时存储变量。大多数指令对累加器A或B进行操作。HEADERCRC:;ACCUMULATETHEOCTET(0,X)INTOTHEDATACRCLDAB0,X;FETCHDATAOCTET(INDEXEDOPERATION)EORBCRCLO;D7-D0EXCLUSIVEORC7-C0STABCRCLO;SAVERESULTCLRA;CLEARREGISTERAASLD;SHIFT(A,B)LEFTASA16BITVALUE;A=(-------7)B=(6543210-)EORBCRCLOASLD;A=(------76)B=(543210--);(-------7)B=(6543210-)EORBCRCLOASLD;A=(-----765)B=(43210---);A=(------76)B=(543210--);(-------7)B=(6543210-)EORBCRCLOASLD;A=(----7654)B=(3210----);A=(-----765)B=(43210---);A=(------76)B=(543210--);(-------7)B=(6543210-)EORBCRCLOASLD;A=(---76543)B=(210-----);A=(----7654)B=(3210----);A=(-----765)B=(43210---)382;A=(------76)B=(543210--);(-------7)B=(6543210-)EORBCRCLOASLD;A=(--765432)B=(10------);A=(---76543)B=(210-----);A=(----7654)B=(3210----);A=(-----765)B=(43210---);A=(------76)B=(543210--);(-------7)B=(6543210-)EORBCRCLOASLD;A=(-7654321)B=(0-------);A=(--765432)B=(10------);A=(---76543)B=(210-----);A=(----7654)B=(3210----);A=(-----765)B=(43210---);A=(------76)B=(543210--);(-------7)B=(6543210-)EORBCRCLOANDB#0FEH;CLEARLSBOFBOTTOMHALFANDB#01H;CLEARALLBUTLSBOFHIGHHALFSTAAT1;A=(-------1)B=(0-------);(-------2)B=(10------);(-------3)B=(210-----);(-------4)B=(3210----);(-------5)B=(43210---);(-------6)B=(543210--);(-------7)B=(6543210-);(--------)B=(7654321-)EORBT1;COMBINELSBOFHIGHHALFSTABCRCLORTSG.1.3报头CRC算法的其它实现报头CRC算法也可以有其它的实现方法。可以看出,新的CRC值是先前的CRC值和数据值的异或函数。因此,我们可以利用先前的CRC与数据的异或值作为索引,使用一个有256项的查找表单来快速求出新的CRC值。表单的内容可以用G.1.1或G.1.2中介绍的方法计算。383G.2数据CRC的计算我们从如图G-2所示的硬件CRC生成器的框图开始。其中所使用的多项式为CRC-CCITT:X16+X12+X5+1硬件实现是在一串行比特流上完成的,但我们的计算必须在整个字节上完成。为此,我们参照八位比特数据的电路实现。CRC移位寄存器的输入端初始化为X0,输出端初始化为X15,输入数据从D0到D7(低位先行,如同UART的发送和接收)。下面的每一块中,项纵向异或。输入寄存器内容-------------------------------------------------------------------------------------------------------D0X0X1X2X3X4X5X6X7X8X9X10X11X12X13X14X15-------------------------------------------------------------------------------------------------------D1X0X1X2X3X4X5X6X7X8X9X10X11X12X13X14D0D0D0X15X15X15-------------------------------------------------------------------------------------------------------D2X0X1X2X3X4X5X6X7X8X9X10X11X12X13D1D0D1D0D1D0X14X15X14X15X14X15图G-2硬件数据CRC生成器384-------------------------------------------------------------------------------------------------------D3X0X1X2X3X4X5X6X7X8X9X10X11X12D2D1D0D2D1D0D2D1D0X13X14X15X13X14X15X13X14X15-------------------------------------------------------------------------------------------------------D4X0X1X2X3X4X5X6X7X8X9X10X11D3D2D1D0D3D2D1D0D3D2D1D0X12X13X14X15X12X13X14X15X12X13X14X15-------------------------------------------------------------------------------------------------------D5X0X1X2X3X4X5X6X7X8X9X10D3D2D1D0D3D2D1D0D3D2D1X12X13X14X15X12X13X14X15X12X13X14D4D4D4X11X11X11D0D0D0X15X15X15-------------------------------------------------------------------------------------------------------D6X0X1X2X3X4X5X6X7X8X9D3D2D1D0D3D2D1D0D3D2X12X13X14X15X12X13X14X15X12X13D5D4D5D4D5D4X10X11X10X11X10X11D1D0D1D0D1D0X14X15X14X15X14X15-------------------------------------------------------------------------------------------------------D7X0X1X2X3X4X5X6X7X8D3D2D1D0D3D2D1D0D3X12X13X14X15X12X13X14X15X12D6D5D4D6D5D4D6D5D4X9X10X11X9X10X11X9X10X11385D2D1D0D2D1D0D2D1D0X13X14X15X13X14X15X13X14X15-------------------------------------------------------------------------------------------------------X0X1X2X3X4X5X6X7D3D2D1D0D3D2D1D0X12X13X14X15X12X13X14X15D7D6D5D4D7D6D5D4D7D6D5D4X8X9X10X11X8X9X10X11X8X9X10X11D3D2D1D0D3D2D1D0D3D2D1D0X12X13X14X15X12X13X14X15X12X13X14X15-------------------------------------------------------------------------------------------------------上述最后一块是一字节数据通过CRC生成器移位的结果。所以一个字节可以通过执行指定的异或操作处理成CRC。为了简化需要的移位操作,我们定义X0为并行字节的最高位,X15为最低位。因为大多数处理器的字节表示与此相反,所以我们重新命名以符合标准处理器的比特命名法。令C15=X0,C14=X1,等等。则上面表单中最后的结果变为:-------------------------------------------------------------------------------------------------------X0X1X2X3X4X5X6X7X8X9X10X11X12X13X14X15---------------------------------------------------+--------------------------------------------------C15C14C13C12C11C10C9C8C7C6C5C4C3C2C1C0---------------------------------------------------+--------------------------------------------------C15C14C13C12C11C10C9C8D3D2D1D0D3D2D1D0C3C2C1C0C3C2C1C0D7D6D5D4D7D6D5D4D7D6D5D4C7C6C5C4C7C6C5C4C7C6C5C4D3D2D1D0D3D2D1D0D3D2D1D0C3C2C1C0C3C2C1C0C3C2C1C0---------------------------------------------------+--------------------------------------------------386或者,纵向重新排列以最小化运算(因为异或是可交换的):---------------------------------------------------+--------------------------------------------------C15C14C13C12C11C10C9C8D7D6D5D4D3D2D1D0C7C6C5C4C3C2C1C0D7D6D5D4D3D2D1D0C7C6C5C4C3C2C1C0D3D2D1D0D7D6D5D4C3C2C1C0C7C6C5C4D3D2D1D0C3C2C1C0D3D2D1D0C3C2C1C0---------------------------------------------------+--------------------------------------------------在运算中,CRC生成器的C15-C0都初始化为1。在发送过程中,数据在发送前都将经过计算。最后的CRC寄存器的值的补码将作为结果以低位字节(C7-C0)优先的顺序发送。在接收端,所有的数据包括接收到的CRC字节将经过计算。如果所有字节都正确收到,那么接收方CRC寄存器最后的值将是X’F0B8’。1111000010111000\uf0df------------F--------\uf0e0\uf0df---------0--------\uf0e0\uf0df---------B-------\uf0e0\uf0df---------8----------\uf0e0作为一个应用举例,考虑一串数据X’01’、X’22’和X’30’。DescriptionValueCRCRegisterAfterOctetisProcessedX‘FFFF’(initialvalue)framedataoctetX‘01’X‘1E0E’seconddataoctetX‘22’X‘EB70’thirddataoctetX‘30’X‘42EF’onescomplementisX‘BD10’CRC1(leastsignificantoctet)X‘10’X‘0F3A’CRC2(mostsignificantoctet)X‘BD’X‘F0B8’finalresultatreceiver因此,发送方将对三个字节X’01’、X’22’和X’30’计算CRC,结果为X’42EF’。其补码为X’BD10’,这将按照低位先行即X’10’、X’BD’的顺序追加在帧的后面。387接收方将对五个字节X’01’、X’22’、X’30’、X’10’和X’BD’计算CRC,结果为X’F0B8’,这表示正确接收到帧。G.2.1用C语言实现数据CRC算法举例本小节提供了一个用C语言实现数据CRC算法的例子。输入是将被处理的和累加CRC的字节。函数返回值就是更新后的CRC值。/Accumulate“dataValue”intotheCRCincrcValue./ReturnvalueisupdatedCRC//Assumesthat“unsignedchar”isequivalenttooneoctet./Assumesthat“unsignedint”is16bits./the^operatormeansexclusiveOR.unsignedcharCalcDataCRC(unsignedchardataValue,unsignedcharcrcValue){UnsignedintcrcLow;crcLow=(crcValue&0xff)^dataValue;/XORC7..C0withD7..D0/Exclusiveorthetermsinthetable(topdown)return(crcValue>>8)^(crcLow<<8)^(crcLow<<3)^(crcLow<<12)^(crcLow<<4)^(crcValue&0xff)^((crcValue&0xff)<<7);}G.2.2用汇编语言实现数据CRC算法举例本小节提供了一个用68HC11(一种精简指令集的八位处理器)汇编语言实现数据CRC算法的例子。程序使用变量CRCLO和CRCHI累加CRC。T1和T2是临时存储变量。大多数指令对累加器A或B进行操作。DATACRC:;ACCUMULATETHEOCTET(0,X)INTOTHEDATACRCLDAA0,X;FETCHDATAOCTET(INDEXEDOPERATION)EORACRCLO;D7-D0EXCLUSIVEORC7-C0STAACRCLO;SAVERESULTCLRB;CLEARREGISTERBLSRA;SHIFTARIGHT,0INTOMSB,LSBINTOCARRYRORB;ROTATEBRIGHT,CARRYINTOMSBLSRARORBLSRARORB388LSRARORB;A=(----7654)B=(3210----);EORBCRCLOANDA#0FH;MASKOFFALLBUTLS4BITS;A=(----7654)B=(3210----);(----3210);STAAT1;SAVETEMPRESULT(NOTUSEDEXCEPTASTEMP)STABT2LSRA;SHIFTRIGHT1BITRORB;A=(-----765)B=(43210---);(-----321)(0-------);EORACRCLO;COMBINEPARTALTERMSEORAT2EORBCRCHI;C8-C15EORBT1;A=(-----765)B=(43210---);(-----321)(0-------);(76543210)(15141312111098);(3210----)(----7654);(----3210);STAACRCHI;SAVERESULTSTABCRCLORTSG.2.3数据CRC算法的其它实现数据CRC算法也可以有其它的实现方法。可以看出,新的CRC值是由两项异或得出的。一项是先前CRC值的高位字节。另一项是先前CRC值的低位字节和数据值的异或函数。因此,我们可以利用先前CRC值的低位字节与数据的异或值作为索引,使用一个有256项的查找表单来快速求出第二项的值。然后与先前CRC值的高位字节作异或运算以求出新的CRC值。表单的内容可以用G.2.1或G.2.2中介绍的方法计算。389附件H-组合BACnet网络与NON-BACnet网络(规范)(本附件是标准的一部分,要求实现。)H.1将Non-BACnet网络映射给BACnet路由器BACnet路由器除了可以提供互联多个BACnet网络的方法之外,也可以用来为Non-BACnet网络提供网关功能。Non-BACnet网络在报文结构,处理过程和介质访问控制技术的使用方面与本标准包含的内容是不同的。使用扩展路由表概念实现将Non-BACnet网络映射给BACnet路由器,其方法是使用BACnetNPCI寻址Non-BACnet设备。为此,每个Non-BACnet网络分配一个唯一的双字节网络编号,该Non-BACnet网络上的每台设备由一个MAC地址代表,而这个MAC地址可能与该设备在外部网络的实际MAC地址字节一致,也可能不一致。因为从定义上说,与Non-BACnet网络上的设备通信并没有标准化,所以这样的路由器网关如何进行从BACnet端口到Non-BACnet端口的报文的解释、翻译以及传送操作的过程超出了本标准的范围。H.2在单各个物理设备中的多个“虚拟”BACnet设备一个BACnet设备定义为拥有一个BACnet设备对象、使用本标准规范的过程进行通信的设备。然而,在有些实例中,有必要用多个BACnet设备来模拟一个物理的楼宇自动控制设备的动作。这种设备被称为“虚拟BACnet设备”。实现的方法是将这个物理设备配置成为一个或者多个“虚拟网络”的路由器。也就是说,每个虚拟BACnet设备与一个唯一的目标网络(DNET)和目标地址(NADR)对相关联,这也是唯一的BACnet地址。实际的物理设备所执行的功能与一个路由器的功能相同,这个路由器的作用是在下列两个网络之间进行路由,一个网络是虚拟BACnet设备之间传送报文的网络,另一个网络是具有与分配给这些虚拟BACnet设备的网络编号相同网络编号的实际BACnet网络。H.3BACnet与IP路由本节规范BACnet报文使用由美国国防部(DoD)高级计划研究局(DARPA)研制的协议进行传输的过程。这些协议统称为因特网协议族。本附件规范的方法包括BACnetLSDU的封装与解封装,以及将这些报文通过IP路由器进行传输的技术,这种技术称之为“隧道技术”。虽然本附件规范的技术称为BACnet/Internet协议分组组装/分解器,但是关键功能可以直接内建到BACnet节点设备之中。H.3.1BACnet/Internet协议分组组装/分解器(B/IPPAD)B/IPPAD是一种设备,其中实现了本标准第6节规范的BACnet网络层功能和因特网的UDP协议功能及IP协议功能。当B/IPPAD从本地网络接收到一个BACnet分组时,检查报文的NPCI域,看是否含有一个DNET网络编号。如果有一个网络编号,B/IPPAD查询一个内部表单,这个表单的表目是网络编号与在BACnet互联网上的所有的B/IPPAD的IP地址、以及在本地网上表示IP数据报下一跳的IP路由器的IP地址的映射。如果搜寻到一个合适的表目,则B/IPPAD把BACnet报文的LSDU部分封装进UDP分组中,这里,LSDU成为UDP分组的数据部分,参见图H-1。UDP的源端口和目标端口号都设置为X’BAC0’。然后B/IPPAD将这个UDP封装进入一个IP数据报并且发送给本地的IP路由器。这个IP数据报的源地址是B/IPPAD自己的IP地址,目标地址是包含的BACnet报文的DNET对应的那个B/IPPAD的IP地址。如果包含的BACnet报文中的DNET是一个全局广播地址,那么B/IPPAD将向表单中的所有B/IPPAD传输这个BACnetLSPU。B/IPPADs之间的分组的传输遵循IP协议标390准的规范。当B/IPPAD从一个IP路由器接收到一个IP数据报时,查找关于UDP端口X’BAC0’的进程,这个进程使用6.3节所定义的过程把UDP数据报的数据部分转换为BACnet报文,然后在本地网络上传输。H.3.2实现注解图H-1表示在8802-3局域网上的实现配置。使用包含在LLC头部的LSAP可以将BACnet分组与IP分组及其它协议分组区分开。IP分组使用的LSAP标号为X’06’,而BACnet网络层分组使用的LSAP标号为X’82’。在图中所表示的实例中,每个分组在网络上实际出现了两次,一次是作为BACnet报文,另一次是作为IP报文。B/IPPAD也构造成为同时完成BACnet组装/分解功能和IP分组的IP路由功能。这样的设备就是B/IPPAD/Router。参见图H-2。关于DoD协议的进一步内容,请查阅25节列出的DDNProtocolHandbook。H.4BACnet与IPX路由本节规范BACnet报文使用由Novell公司研制的互联网数据报协议,即IPX协议,传输的过程。这个协议层是基于施乐网络系统(XNS)协议中使用分组交换协议(PEP)的一个子集。本附件规范的方法包括BACnetLSDU的封装和解封装,以及它们通过使用IPX路由器的功能在IPX互联网络上的传输,这种技术称为“IPX隧道技术”。虽然本附件规范的技术称为BACnet/Internet协议分组组装/分解器,但是关键功能可以直接内建到BACnet节点设备之中。391H.4.1BACnet/IPX协议分组组装/分解器(B/IPXPAD)B/IPXPAD是一种设备,其中实现了本标准第6节规范的BACnet网络层功能和IPX网络层功能。当B/IPXPAD从本地网络接收到一个BACnet包时,检查报文的NPCI域,看是否含有一个DNET网络编号。如果有一个网络编号,B/IPXPAD查询一个内部表单,这个表单的表目是网络编号与IPX网络编号、MAC地址的映射。IPX网络编号与MAC地址一起表示所有的在BACnet互联网中的远程B/IPXPAD。如果搜寻到一个合适的表目,则B/IPXPAD把BACnet报文的LSDU部分封装进一个IPX隧道分组中(参见图H-3)。这里,IPX隧道分组的目标网络编号和MAC层地址是对应的B/IPXPAD的目标网络编号和MAC层地址,目标套接字编号设置成为BACnetIPX套接字编号X’87C1’。然后,B/IPXPAD把这个隧道分组封装进入一个IPX数据报,并发送给本地的IPX路由器。这个IPX数据报具有发送方B/IPXPAD自己的IPX网络编号、MAC层地址和BACnetIPX套接字编号作为源地址。如果BACnet报文中的DNET为全局广播地址,那么B/IPXPAD向表单中的所有B/IPXPAD传输这个BACnetLSPU。B/IPXPAD之间分组的传输遵循IPX路由标准规范的过程。当B/IPXPAD使用BACnet套接字接收到一个IPX数据报时,利用6.3节中所定义的过程把BACnetIPX隧道分组的数据部分转换为BACnet报文在本地网络上传输。392H.4.2实现注解图H-1表示在8802-3局域网上的实现配置。使用包含在LLC头部的LSAP可以将BACnet分组与IPX分组及其它协议分组区分开。IPX分组使用的LSAP标号为X’E0’,而BACnet网络层分组使用的LSAP标号为X’82’。在图中所表示的实例中,每个分组在网络上实际出现了两次,一次是作为BACnet报文,另一次是作为IPX报文。B/IPXPAD也构造成为同时完成BACnet组装/分解功能和IP分组的IPX路由功能。这样的设备就是B/IPXPAD/Router。参见图H-2。参考文献NetWare®SystemInterfaceTechnicalOverviewAddison-WesleyPublishingCompany,ReadingMassachusettsISDN0-201-57027-0393附件I-具有活动最小值和非活动最小值的可命令属性(本附件不是标准的一部分,仅仅作为资料使用)394本附件是具有活动最小值和非活动最小值的可命令属性的应用举例。假设有一个二进制输出对象,其活动最小值属性为600秒(10分钟),非活动最小值属性为1200秒(20分钟),极性属性为正向。对象的优先值数组属性均为空,由释放缺省属性决定的当前值属性为非活动(off),此状态已经几个小时了。参见图I-1(a)。在图I-1(b)中,优先级为9的当前值设定为活动(on)。请求服务器的内部逻辑将把其写入优先值数组中的表目9。因为当前值为off已经超过了20分钟,所以状态将立即改变。因此,当前值的值将为活动,而状态改变时间属性也将设置为相应的控制时间。因为当前值的状态已经改变,所以最小活动和非活动时间维持实体将把新状态活动写入优先值数组中的表目6,以执行最小时间。随后的进入优先值数组的优先级低于6的当前值将不会起作用,这是因为目前状态活动的优先级为6。如图I-1(c)所示,优先级为7的当前值的非活动值将进入优先值数组,但不会起作用。优先级高于6的当前值将进入优先值数组,并可能引起状态的改变,这是因为其优先级更高的缘故。这是为紧急事件和火灾控制考虑的。在图I-1(e)中,当最小活动时间耗尽时即10分钟后,设备中的最小活动和最小非活动时间维持实体将发出优先级6的释放(NULL)。然后将检查优先值数组中剩下的表目以决定新的当前值。如果没有状态的变化,那么就不会有进一步的动作发生。在这个例子中,如果没有优先级高于9的非活动请求,就是这种情况。在这个例子中,有一个优先级为7的非活动状态。因此,如图I-1(f),当最小活动时间耗尽时,优先级为6的活动释放,优先级为7的值将接管控制。当前值改变状态进入非活动。象以前一样,因为当前值的状态发生了改变,所以最小活动和最小非活动时间维持实体将把新状态非活动写入优先值数组中的表目6,以执行最小时间。注意优先级高于6的状态的写入将不受最小活动和最小非活动时间的限制,如果这种写入引起了状态的改变,那么服务器仍将把新值写入优先值数组中的表目6。因此,如果在最小时间内高优先级的请求被释放了,那么在最小时间耗尽前,任何低优先级的请求将不会引起状态的改变。395ASHRAE关于开发工作对环境影响的政策声明ASHRAE关注其成员的开发工作对室内室外环境的影响。ASHRAE的成员将尽力尽责地努力降低开发的系统和396部件对室内和室外环境可能造成的任何有害影响,同时将系统提供的对环境的有益影响最大地发挥出来。ASHRAE的短期目标是保证标准范围内的系统和部件对于室内室外环境的影响不超过由它和其它负责机构建立的标准所规定的程度。ASHRAE的进一步的目标是继续通过其标准委员会和下属的技术委员会组织制定出更新的恰当的标准,采纳、推荐和促进那些由其它负责机构开发的新的和修正的标准。在本标准中,相应的章节将会包含更新的标准和设计考虑,这些将作为系统的修订版本发布。ASHRAE将引导进行环境信息的研究和宣传,也将从其它相关的负责组织中挑选和传播相关的信息,作为更新标准的指南。对设备和系统进行设计和选择的影响将被考虑到系统的正面和负面功效的范围。有害材料的处理也将被考虑进来。ASHRAE主要关注设备在ASHRAE要求的运行空间范围内对环境的影响。然而,能源的选择和由能源与能量传输而可能带来的环境影响也将在必要的情况下加以考虑。关于能源选择的推荐将由其成员进行。397",)


  • 编号:1700665907
  • 分类:合同模板
  • 软件: wps,office word
  • 大小:397页
  • 格式:docx
  • 风格:商务
  • PPT页数:1035322 KB
  • 标签:

广告位推荐

相关合同模板更多>