
✦ Niagara 中的驱动基本都是以点为单位进行数据同步的,可以与远程设备通讯的点叫作“代理点”(Proxy Point)。(参考:Point的故事还没有结束 —— Point Extension)
✦ 驱动的作用就是帮助代理点完成与远程设备的数据同步。每个代理点下面有一个驱动扩展(ProxyExt),这个扩展的作用就是根据各种协议规定的服务或命令去实现数据同步方式。因此,每个驱动下代理点扩展代码层面是完全不同的。
✦ BACnet Proxy Extension 是通过 ReadProperty / WriteProperty / SubscribeCOV 等服务来获取数据。
本文着重介绍 BACnetProxyExt 中的几个属性:
图1 BACnet 代理点属性列表
Tuning Policy 属性,通过下拉列表选择一个适合当前代理点的同步策略。这个策略主要描述通过什么样的方式去读写远程设备上的点。比如,是用轮询还是 COV,轮询频率多快,如何避免过多的读写请求,如何在长时间没有请求的情况下,保证数据及时更新,设备重启或者重新上线后,是不是有些数据要立即同步,而不是等待下一个轮询周期等等……。至于这些“适当”的策略是在哪里配置的,根据什么原则配置的,每个具体参数是何含义等后文会详细说明。
对于只读点来说,Read Value 就是当前值,Write Value 可忽略。
对于可写点来说,Read Value 就是反馈值,Write Value 是写命令中的目标数值。
[Read Status],用来表示读取状态。可以是 Polled, COV 或者 Unsubscribed。
如果读取成功的话会显示:Polled 或者 COV,表示通过哪种方式读取的数据。设备掉线时会显示 Unsubscribed (“未被关注”)。
[Write Status],用来表示写入状态。只读点显示:readonly,如图1中所示;可写点会显示:writable 或 ok。ok 表示上次的写操作成功了;如果失败了,会显示相应的错误信息。比如你将一个远程设备的只读点,映射到了本地的一个可写点的话,对本地代理点的写操作,会由驱动程序发送给远程设备,远程设备无法执行此操作,代理点上会显示:Write Access Denied (拒绝写入)。
数据同步策略 Tuning Policy 详解
代理点扩展配置中需要选择数据同步策略,这个策略是在每个驱动网络下,数据同步策略集合(Tuning Policies)中定义的。究竟定义几个策略,需要根据协议本身的特点以及具体应用中不同设备的实际数据同步需求来决定。
拿 Modbus 协议来说,如果通过该协议连接到 JACE 的设备包括 IO 模块和电表。显然,对这两类设备轮询的频率应该是有很大区别的。相应地就可以定义两个策略:FastPoll(快速轮询) 和 SlowPoll(慢速轮询)。
再拿 BACnet 协议来说,通常会用到 BACnet MS/TP 和 BACnet IP,它们链路层的差别造成了基础参数的不同,比如,数据带宽。因此也就要求轮询的速率有所不同;还有 BACnet 是支持 COV 的,那么 COV 和轮询两种方式也要做相应区分。这样在 MS/TP 的网络下,策略可能包括:NormalPoll (正常轮询)和 COV;在 IP 网络下,策略包括:FastPoll (快速轮询)和 COV。

图2 轮询频率的选择
[Min Write Time] “写操作最小间隔”。对于可写点,限定两次写操作之间最小的时间间隔。意义:防止本地数据变化过快,触发“写风暴”,尤其是在类似 COV 机制下。有了这个时间限定之后,无论本地数据变化多快,此段时间内都不会产生多个写操作。换句话说,是人为地限定了发出写操作的窗口。每个窗口周期内,最多只允许发出一次写操作。由“防迷路图1”可见,在启用之前,产生了22个写操作;而启用之后只有4个写操作。
注意:如果时间窗口内数值没有发生变化,该窗口内就是0个写操作。

防迷路图1
[Max Write Time] “写操作最大时间间隔(写操作同步周期)”,下文简称 Tmax。对于可写点,在某段(足够长的时间后)即使数值没有变化,也要从本地触发一次写操作,将本地点的数值同步到远程点。这里面有两个关键条件:
1.数值没有变化;
2.未变化的状态持续了一定时间。
意义:
这个参数存在的意义是为了保证在双方设备没有心跳交换的情况下,如果从设备掉电重启,而从设备本身又不具备数据的掉电保持功能。那么从设备重启之后,会丢失之前的数据。而这一切的发生,主设备可能并不知情。那么此时,主设备中一直未变的数值和重启之后从设备中的数值,二者并不一致;并且这种不一致的状态会一直持续下去,直到主设备中数值发生了变化(产生新的写操作)后,才能重新同步。
有了 Tmax 后,这种不一致的状态就有了明确的限定。因为 Tmax 约定的是一个最大的时间窗口,如果这个窗口内,没有”常规“的写操作,那就强制产生一次。换句话说,两次写操作最长的时间间隔就是 Tmax。

防迷路图2
特别需要注意的是:
对于有双控源的点位,两个主设备是平级的关系,谁后发出命令,会覆盖掉之前的状态,比如,双控开关。这样的设计,往往都是应用于“一次性事件触发控制动作”的场景,恰恰不需要控制源重复发出控制命令。这时候,如果启用了 Max Write Time,可能会造成意想不到的结果。
Min Write Time 是怕写得过多而启用的;
Max Write Time 是怕写得过少而启用的。
[Write On Start] 站点启动后,是否直接(不考虑值是否变化)产生一次写操作。
意义:
对于某些特别关注的点,希望在站点启动后第一时间即刻产生一次写操作进行数据同步。对于“一般”的点,不要启用此操作。尤其是当很多点,比如上千个点都采用这样的策略,那么站点启动之后,会有非常多的写操作请求要发出,这可能会导致消息队列过载或溢出。
[Write On Up] 从设备自“掉线”状态恢复为“在线”状态后,主设备是否直接产生一次写操作。
意义:
与 Write On Start 类似,也是为了在设备上线后,尽快进行数据同步。
[Write On Enable] 从设备被启用(开启数据同步)后,主设备是否立即产生一次写操作。
Write On Start/Up/Enable 三个配置都是基于事件触发的,而由此引发的结果,可能是几个,也可能是非常多的写操作。而因此,有可能引发意想不到的结果。如果对站点上有多少个代理点引用当前策略的不是很清楚,不要轻易启用这些配置项。
在没有这些特殊需要的场合,应禁用这些特性,以避免不必要的数据通讯,浪费运行资源和通讯带宽。在使用的时候,一定要将特殊需求作为单独的策略(Policy)进行定义,将其应用于有特殊需求的代理点。
[Stale Time] 数据有效期。Stale 这个词并不是太常用,但是比较简洁。其实它的意思是 out of sync,也就是滞后的,未能及时同步的意思。在这个设定时间内,如果没有成功完成数据同步的话,就认为数据“过期”了,本地数据有可能与远程设备上的数据不一致了。
注意:
这里的不一致,是"有可能",不是"一定"。因为这段时间内,远程数据也可能一直保持不变。
#“32岁的亨利就坐在那里,深情的目光望过去都是自己22岁的影子”……

假定轮询周期是10分钟,有效期是15分钟。
[00:00] 第一次轮询,当前值2.1;过期计时启动;
[10:00] 第二次轮询,当前值4.3;过期计时到了10min,随即清零;
[20:00](由于某种原因,如设备掉线)第三次轮询没有产生,当前值仍为4.3;过期计时器为 10 min;
[25:00] 当前值仍为4.3;到达过期计时设定时间,数据状态变为 Stale。

防迷路图3
注意:
容易产生误解的是,过期计时是从每次轮询成功后开始(重新)计时的,也就是 00:00 和 10:00 时刻;而不是轮询停止后(20:00时刻)开始的。因此 Stale 状态出现在 25:00,而不是 35:00。
Stale Time 是针对轮询策略使用的,不要将其应用于 COV。
配置这个时间的时候,要考虑轮询周期的设置,这个有效期必须要(远)大于轮询周期,推荐配置为轮询周期的3-5倍。
[Poll Frequency] 轮询频率。有三种选择:Fast(快速),Normal(普通),Slow(慢速)。这三个是相对的概念,确切的定义是在每种协议的 Poll Service 下面(参考图2)。而对于一种协议可能支持多种链路层接口,每种链路层下都会有一个 Poll Service,里面可以配置每种轮询速率具体的时间。这三种时间是分别定义的,而且系统并没有限制三个数值之间的大小关系。也就是说,如果你愿意的话,可以将 Fast 设为 1分钟,而 Slow 设为 20秒。
[Use Cov] 启用 COV。如果远程设备支持 DS-COV-B, 那么 Niagara 站点可以通过 COV 的方式与其进行数据同步。如果远程设备接受了订阅请求,Niagara 站点中,代理点的 Read Status 属性中显示 "COV";如果订阅失败的话(远程设备不支持 COV,或者拒绝了 COV 请求),Niagara 驱动会自动采用轮询的方式去同步数据,相应地,Read Status 属性会显示 “Polled(轮询)”。Niagara 数据同步的设计思想是:默认使用轮询,个别情况启用 COV,如果 COV 订阅失败还是使用默认的轮询方式。因为并非所有协议都支持 COV,即使对于 BACnet 设备,也并非所有设备都支持 COV。
[Use Confirmed Cov] 启用需要应答的 COV。与上面类似,只是当 Niagara 站点收到远程站点的 COV 通报后,会回复“收到”通知远程设备。
[Use Subscription Lifetime] COV 订阅持续时间。如果此参数为0,则表示永久订阅。但实际上,远程设备作为 COV 的服务端,不一定支持永久订阅。Niagara 为了保证兼容性,采用了一个小 trick,实现方式是:每半天重新订阅一次,订阅持续时间是24小时。如果用户对此参数设置了一个小于5分钟的时间,系统会自动将其调整为5分钟。也就是说,Niagara 实际能发出的最小订阅持续时间是5分钟。为了保证不间断的订阅,Niagara 会每2.5分钟重新发出一次有效持续时间为5分钟的订阅。这是为了避免 Niagara 站点发出过多的订阅请求。


