1. 抽象层次
自己理解,这个是61850的精华所在。在文档中多次提到“面向对象”的概念,在61850的配置文件xml文件中也可以看到对象的概念,可以清楚的看出所抽象出来的对象的之间的关系。
一个SCL文件,最顶层有三个节点,Communication、IED、DataTypeTemplates。这个IED与模板比较容易理解,在61850里面为了适应以后通信层的变化,把通信层单独抽象出来,在61850中也用到了不同层次通信,有的基于以太网ip,有的基于链路层。这也提醒自己,在写程序的时候,通信层是否需要抽象出来?一般来说是没有必要的,除非考虑什么恶心的串口通信。
IED节点下有两个节点Servies与AccessPoint。IED设备对外不是提供具体的“子设备关系”,而是一组服务Services,一个ied设备可以看成提供特定服务器的服务器。通过这些服务,可以知道是否可以建立连接,都有什么设备,对设备进行读写,查询日志等操作,从抽象的角度来讲,已经不能再抽象了。抽象出了服务,以后即时协议换了,服务仍然没有变,面向对象的各种组建关系没有变,只是换下协议就ok了。目前ip层上支持的是mms协议,这个玩意比较复杂,网上有老外的开源库。
在IED设备的AP里面才有子设备的影子,AP与Communication有关系,AP下有Server节点,这一层目前了解只规定了连接超时时间,没有其他作用。Server下面就是“设备”了。分为逻辑设备LDevice,逻辑节点LNode,数据对象DO,数据属性DA。DO是对功能的抽象,LN是对一组相关功能的抽象,LD自然是对设备的抽象了,很多情况下,LD对应一个具体的大设备例如一组蓄电池。一般来说原子DO,也就是没有子DO的DO有唯一一个关键的值。这个也是从配置文件中看出来的,但标准并没这么说。
2. LN0实例中包含数据集DataSet、报告控制块ReportControl、日志控制块LogControl。
一般来说DataSet与一个ReportControl对应,一分为遥信和遥测两个DataSet,一般遥信为缓冲的报告控制块,遥测的为非缓冲的报告控制块。日志控制块就是历史数据。这里DataSet中有一定的顺序,如果在报告控制块中设置的上报没有各级对象索引,那么上报一个在dataSet中的offset或者说index,也就是只告诉是第几个数据,和数据的值,不告诉索引信息为了节省带宽。这也是协议设计的一个常用技巧。在104规约中,组召唤上报的有的连offset或者index都没有,全是一个挨着一个的数据,但是前提是接收方知道数据的顺序,而且是设备值连续上报不能跳过设备。61850中至少带一个offset或index,这样可以不必连续上报,在非总召唤下可以节省带宽。
另外对于缓冲的报告控制块,缓冲的目的是为了保留一定的历史数据,防止在网络异常的情况下重要信息丢失。这是一种保障数据完整性的方案,在通常的设计中往往是在应用保证的,例如重要的告警,上报后需要接受方发送一个收到告警的消息的确认,否则会周期发送这个告警。
3. 报告控制块中有RptEnabled 节点 max 字段
这个字段限制了连接ied设备的连接的数目,由于ied设备的数据设备可能比较大(几千甚至上万),对于连接的个数有一定限制。有的ied设备只允许十几个客户端连接(能够满足需求即可)。限制的方法可以参考,假如max字段为10,正常情况会给每个client分配一个1到10内的enableIndex,一个client用自己的这个enableIndex连接,各个用户互不干扰。并不是正常的建立一个连接分配一个连接句柄,句柄号递增,当句柄个数为10的时候就停止连接的方式。分配固定的“连接句柄”对于连接数目不大的情况下非常容易排查错误。
4 设置使能的时候首先控制块是非使能状态,否则设置会失败。但是总召唤的时候,也是设置参数进去,这个时候必须使得控制块处于非使能状态,相反需要在使能状态(不是必须),因为如果每次总召唤都先设置成非使能,那么可能被别的用户占用到这个控制块,在设置总召唤的时候会失败。 同理,我觉得设置任何除了使能标志以外的标志位或值,都应该在使能状态。可以理解为设置使能标志位为建立连接,而后的设置就是在连接中发送消息,只不过是通过另一种方式表达而已。减少接口。
5 一般来说,di的值都是带时间的,而ai的值是不带的,而且di是缓存的,ai是没有缓存的。两者是有一定关系的,缓存的值,如果不带时间,那么缓存值得意义就不是很大了,不仅要知道以前都是什么值,也要知道都是什么时候产生的值。