有限状态机在IEC 60870-5-103通信规约中的应用
2022-03-23迟海龙袁平路邓鹏程
迟海龙,袁平路,邓鹏程,周 文
(1.中国水利水电科学研究院自动化所,北京 100038;2.五凌电力有限公司,湖南 长沙 410029)
0 引言
传输规约IEC 60870-5-103(以下简称103规约)继电保护设备信息交换标准是在IEC 60870-5系列标准的基础上,对物理层、链路层、应用层、用户进程作了大量的具体的规定和定义。其目的是为了保障变电站或厂站中不同继电保护设备(或间隔单元)和控制系统之间能够顺利地互换信息。标准内容可参考我国等同采用的DL/T-667[1]电力行业标准。标准描述了2种方法:①基于严格规定的应用服务数据单元(ASDUx,其中字母x为数据编号,以下同)和标准化报文的传输应用过程、方法;②通用分类服务法。本文只针对前者的通信方法进行讨论。
103规约实现的模型源于开放互联的ISO-OSI的7层参考模型。该规约实现主要涉及其中的物理层、链路层和应用层。本文主要针对规约的链路层内部及对外接口部分进行讨论。本文开展的IEC 103通信主站侧规约开发工作借鉴了国内其他学者和科研机构在有限状态机(finite state machine,FSM)[2-4]的研究成果,取得了较好的效果。
1 IEC 60870-5-103规约概述
1.1 硬件接口环境参数
本文所设定的硬件接口为RS-232或者RS-485,采用的传输模式为一对多的非平衡传输模式。同一时刻内只有一个从站使用通信链路。主站需要将每个从站的通信状态信息记录到本地的状态信息库中,以便作出正确的回应。
1.2 103规约链路通信过程描述
103规约链路层采用FT1.2帧格式[5]。传输过程可分为数据采集(上行)和命令(下行)2个方向。通信过程中,主站和从站之间通过若干个请求/确认或者指示/响应服务原语[6]进行数据交换,以达到两端数据一致。
1.2.1 初始化过程
103规约开始工作后,主站顺次轮询各从站的用户数据。如果从站产生数据,通过置位要求访问位(access demand,ACD)标志位[5],并上送数据帧请求主站查询数据。初始化中也要进行超时重传、时间同步和设备信息采集等工作。
1.2.2 数据采集过程
装置初始化后,主站周期性地顺次召唤每个间隔单元召唤2级用户数据。具体过程可参考文献[5]、文献[6]。
1.2.3 命令控制过程
命令传输过程有2种:①选择和执行命令;②直接命令。详细的过程参见文献[6] 。由于控制系统对命令的时效性要求较高,所以本文后续重点讨论FSM对命令中断处理的过程。
1.2.4 异常超时处理过程
基于状态的程序中必须要考虑中间过渡态的超时返回问题。如果中间态在通信过程中出现扰动而产生异常,可能使中间态无法复位到起始或者接收的最终状态。所以在所有中间的过渡状态上,必须加上超时返回处理过程。当系统处于中间过程而长时间收不到返回的消息时:系统要么进行超时重传工作,再次发送数据请求;要么定时将系统状态强制到系统的起始状态或接收状态,以便系统重新复位设备重建链路等工作。
2 有限状态机模型FSM在链路层中的应用
2.1 FSM模型及状态树定义
FSM[7]是一个五元组,即M=(S,δ,Σ,s,A)。其中:S为有限的状态集合,代表系统的各个状态集合;δ为从S×Σ到S的状态转移函数;Σ为各个通信事件;s为初始状态,s∈S,可表示为二维表格形式;A为消息处理槽函数集合。
状态树即状态搜索树,由状态节点和边构成:节点代表每个状态;边为每个状态之间的从属关系。按照SCXML[8]规范,状态树中状态可以分为顶层状态(树根节点)、原子状态(不可分状态,树叶节点)和组合状态(中间层节点)。定义原子状态是一个没有子状态的状态。复合状态由原子状态、复合态或它们的组合构成。边可分为父子关系边、历史状态、初始状态边等信息。
FSM状态转移图和状态树关系的关系如下:转移图表示状态间的动态过渡关系;状态树则强调状态间的从属,关系便于状态过渡前的状态的搜索和定位。
2.2 状态树的搜索
搜索分为上行搜索和下行搜索。定义:上行搜索为每次选择的节点距离根节点递减方向为上行搜索;反之,为下行搜索。上行搜索主要沿着父属性递归,搜索以到达根节点为终止;下行主要根据业务不同选择子节点、历史节点属性递进,搜索以到达叶子节点为终止。详细的搜索算法及算例参见4.2节。
2.3 分层级的状态设计(S集合)
状态树设计可以自顶向下分层级设计。先设计顶层状态然后定义状态的细节的个子状态。按照1.2节,状态树定义如表1所示。
表1 状态树定义Tab.1 State tree definition
2.4 事件集合(Σ集合)
事件作为状态机的输入,是状态机正常运转的的激励和策动源。状态机的事件集合部分主要内容参见表2。
表2 事件集合Tab.2 Events collection
2.5 状态转移表(δ集合)
状态转移函数可以表示行列分别为|S|×|Σ|的二维表格,具体可以反映为由<当前状态 ,事件 ,跳转状态 ,动作>构成的四元组的集合。其代表当前状态下遇到某个事件应该转移到跳转状态并执行响应操作。状态转移可分为有条件转移和无条件转移。无条件转移就是当遇到任何事件都会跳转的到跳转状态。当状态搜索树遇到有无条件转移的节点时,会立即转移到该节点的下一状态。
2.6 槽函数集合
槽函数集合A是FSM对事件的响应,是FSM执行规约过程的最终体现,也是FSM重要组成部分。槽函数集合如表3所示。
表3 槽函数集合Tab.3 Slot fuction collection
3 FSM状态转移图
3.1 总状态转移图
FSM顶层工作状态如图1所示。
图1 FSM顶层工作状态图Fig.1 FSM top-level working state diagram
图1可分为正常工作态、异常处理态及设备初始化状态这3个部分。
初始化状态负责对对侧设备的链路召唤、复位传输以及同步时钟等工作。正常工作态是在主从站设备通道建立后,负责遥测遥信量的周期召唤、总召唤和命令传输等工作。命令传输有着比周期召唤更高的优先级,所以单独分组。异常处理态负责在设备请求应答超时或者链路中断等异常情况下进行恢复通信的工作。
3.2 正常工作态
系统初始化后就进入正常工作态。此状态主要负责遥测遥信采集和命令的传输。遥测遥信采集过程的正常工作态如图2所示。
图2 正常工作态示意图Fig.3 Normal working state diagram
正态工作态由子状态s21~s23构成。s21为起始状态和稳定态,其他状态均为请求过程中的过渡状态。过渡状态中均有定时器负责超时后的状态复位到稳定态的工作。系统每次转移到稳定态s21后都会向控制端发送系统就绪的消息,以便其处理后续通信工作。
4 基于FSM的规约实现
4.1 IEC 103规约框架
IEC 103规约主要由负责作业调度的主控模块、FSM模块和接口消息处理模块这3个部分组成。主控模块主要负责系统上电后自检复位以及正常扫查召唤的常规性工作。此模块也通过消息方式和状态机进行互动,在向状态机发送管理指令的同时,接收FSM反馈的异常或者工作就绪的状态信息。FSM模块是规约的具体执行者,按照之前讨论的方式对各种通信的报文指令作出正确的判断及响应,并不断地将自己的工作状态向作业调度端进行汇报。接口消息处理模块作为单独的作业任务,主要监视通信串口发过来的信息,将发来的信息进行分类判断后翻译成FSM能够识别的消息和数据,并转发给FSM。
4.2 自定义FSM框架的实现
FSM的实现已有很多成熟的商业软件框架,比如文献[3]、文献[9] 采用的Qt自带的状态机[10],以及文献[11]采用的JAVA中Spring的状态机。本文系统由于运行在ARM嵌入式处理器上,对运行的环境和空间要求比较严格,所以采用C语言自定义开发框架。
FSM的构造如2.1节定义所述。状态机为一组状态的集合,FSM在确定的时刻里就是某一确定的状态元素的体现。框架采用了2.1节中定义的状态树结构作为记录状态的数据库,便于状态节点的管理和搜索。其中,复合状态具有历史状态和初始状态属性,可方便状态组中断操作中返回中断前的某个具体状态。定义复合状态是为了方便状态集合的分组管理,减少状态成组迁移的过渡边的个数。首先,状态结构是一个树形结构,所以每个节点具有父子节点属性,并通过方法addChildState()来增加子节点同时也将子节点的父节点指针属性指向该节点。新的状态结构体可以通过方法createState()产生。其次,状态具有过渡边集合属性,该属性是一个集合可由数组或者链表给出。状态可以通过方法addTransition()来增加图的过渡边,过渡边是一个由<事件,目标状态,槽函数>构成的结构体 。所有的状态构成了FSM的状态S集合(节点集合)所有状态的过渡集合最终构成FSM的转移δ集合,即状态转移表(状态图边集合)。每个状态在转入时都会启动超时定时器,并在定时器时间到达后向状态机发送一个超时事件来触发状态的异常超时处理过程。超时处理可以使状态机无论在哪个状态都能最终返回设备就绪状态,以免FSM陷入某个状态中死锁。FSM按照正常流程或者异常超时流程返回到s21后发送“处理完毕事件”通知总调度模块进行后续设备的轮询。
状态树结构及状态转移如图3所示。
图3 状态树结构及状态转移示意图Fig.3 State tree structure and state transfer diagram
程序初始阶段先创建s1~s4及s21~s23等状态,之后在通过方法addChildState(sFSM,s1)…addChildState(sFSM,s4)(括号中前者代表父节点,后者代表子节点)使sFSM成为具有子状态s1~s4的复合状态。同样让s2成为具有s21至s23的复合状态。至此就构造成了如图3所示的状态树。接下来通过诸如addTransition(s21,<Σ1,s22)的方法来增加每个节点的过渡边信息。括号中:第一个元素为过渡边始发状态;第二元素尖括号中依次为事件、目标状态和对应槽函数。不断重复该过程,直至将状态机的所有过渡边和状态点添加完成。
至此,整个FSM状态转移图和状态节点树的构造工作完毕。以上构造的是对应一个子站的状态图。由于需要和多个子站轮流通信,上述过程还需重复多次以构建状态组数组。每个状态组都与一个设备对应。最后,定义FSM框架为顶级根节点,依次遍历数组中每个成员的sFSM。
4.3 FSM运行及状态树搜索
FSM的运行其实就是按事件条件在状态树上找到下一步应切换的状态和所需要的执行函数,并不断状态转移过程。stateMachine的fsmRun()方法就是一个状态轮询处理函数。开始运行时,stateMachine通过setInitial()方法指定某个状态为初始运行状态(active state);当一个事件到达后,调用getTransition()方法来遍历状态树找到下一步的状态的过程。按照状态的种类和状态迁移的方向,可将状态转移分为原子状态的上行搜索及复合状态的上、下行搜索。
①原子状态搜索。
原子状态遇到事件到达时,先上行搜索是否有父状态(复合状态)存在。如果存在,则递归地搜索父(复合)状态节点的过渡信息,一旦找到则立即执行父节点后续转移操作;否则,在本状态内搜索对应事件及操作并进行跳转处理。
②复合状态的搜索。
上行搜索时,首先将转入的子状态写入history属性中作压栈操作,然后在本状态内搜索对应事件并相应跳转对应状态。如果没有对应事件,则再次按照原子状态操作作上行搜索操作。复合状态的下行搜索操作首先检查history指定子状态。如果子状态还是复合状态,则继续转入history对应状态直至返回到最初的原子状态,并执行该原子状态后续的事件响应操作。定义历史状态historyState为复合状态的伪装态。这是以某个复合状态为父节点的状态。它具有getHistoryState()方法,以向下遍历父状态history属性的方式找到最终的中断转移前的原子状态并返回。
状态搜索算法流程如图4所示。
图4 状态树搜索算法流程图Fig.4 Flowchart of sate tree search algorithm
4.4 状态过程验证算例分析
测试算例为起始状态为s1,输入事件序列为[Σ4,Σ1,Σ21,Σ4,Σ22,Σ21]时的状态变化情况。为了简化说明s2内部的状态转化,简化图如图3(b)所示。运行时,状态转移情况和函数调用的测试算例如表4所示。其中,状态转移序列代表整个转移过程所经历的状态节点路径,最后一个状态也为下一状态的起始状态。这里讨论中断事件Σ4到达的情况,如表4中第四行所示。此时状态正处于s22状态节点上。由图3(a)可知,s22为原子节点,此时首先上行查找父节点s2并置s2的属性history为s22,如图3(a)中1号箭头所示。然后在s2的transitions查找对应事件。由于从图3(a)可知,没有对应事件转移信息,所以s2再次向上跳转父节sFSM,并在其transitions搜索对应事件。从图3(a)可以看到,在这里可以找到事件Σ4过渡信息并跳转至s4,即图3(a)中2号、3号箭头所示。s4执行完后返回节点是sFSM的历史状态且是无条件转移,故通过getHistoryState()方法反向回退至最初的s22状态,即图3(a)中4号、5号、6号箭头所示。从而完成了中断至s4并返回起点的整个操作。整个状态转移过程s4,s2h(s22)(括号中s22为s2h伪状态具体内容)。搜索过程路径如表中第4列所示。由此可见本次状态搜索和转移达到了预期的目的。同样地,超时异常也是一个类似命令中断的操作过程,只不过返回的路径不同于去程,是从s3到s1再到s21。从以上过程可以看出,引入复合节点s2和sFSM后,s21等子状态无需在每个状态中增加对s4中断转移信息,仅对sFSM增添一个转移信息就可使s1到s3及s21到s23所有状态的转移处理,从而大大减少了状态过渡边的数量。
表4 测试算例Tab.4 Test example
4.5 FSM提高任务响应优化方案
103通信系统中,子站需要按照分时顺序交替地使用通信链路。从站上各个设备的优先级都是相同的,并且通过周期性应答轮询的方式报告本地设备的参数信息。主控站也是按照预设的顺序和步骤周期轮询子站,如果遇到子站有数据请求则相应地发出召唤数据。为了缩小单站长时间占用昂贵的通信资源,多环节通信处理过程可以拆分成多次进行。因此,设备的初始化阶段和数据采集阶段可以分两步进行。第一个周期只负责将从站设备从初始状态召唤至设备就位状态s21。此时,FSM的状态数据库(状态树)会为每个子站保留最近一次的工作状态,并作为下一周期工作的依据。工作在s2状态下的扫查工作可以放到第二个周期内进行。按照工作场景的要求,命令处理有一定的实效性需要优先安排传输。这里需采用4.2节中阐述的中断状态处理方式。该方式FSM无论处于哪个状态都会中断当前工作,并在保存当前状态然后跳转到中断状态处理工作。待中断过程执行完毕后,FSM重新找到历史状态信息并继续之前的工作。这样既可以保障已有工作场景不受破坏,又可以保证高优先级的工作得以及时处理。
5 结论
本文在IEC 103规约通信控制器系统开发中,引入FSM及状态树来管理通信状态,方便了状态的搜索和历史状态信息的管理、加强了代码结构化、扩展性。本文设计了状态搜索树及算法来扩展FSM的行为表达,使原有按照过渡表单次跳转方式转变为按照状态类型和实际业务连续多次的定位和跳转方式,让FSM的行为表达变得更加丰富和精确且满足SCXML的规范,为后面业务优化工作奠定基础。业务优化中改过去周期发送为中断的命令处理方式可以使实时控制命令响应时延控制在200 ms以内。本文FSM框架具有自身轻量化、环境低依赖等特点,可以很方便地应用于IEC 104等其他相关规约的嵌入式通信开发中。用于其他通信规约时,只需修改业务状态流程图代码及处理槽函数即可,从而让业务代码和底层代码分离便于复用。目前,设备已应用的场景为抽水蓄能电站现地控制通信,现场性能符合预期。