APP下载

DEVS++程序库及应用

2018-12-12燕美玲张学军

电气自动化 2018年6期
关键词:端口原子耦合

燕美玲,张学军

(1.国网大同市新荣区供电公司,山西 大同 037000;2.山西大学 动力工程系,山西 太原 030013)

0 引 言

近年来,随着系统仿真理论和技术的深入研究、系统仿真为分析、研究复杂系统问题提供了有效的解决方法。离散事件系统仿真是系统仿真的研究内容之一。离散事件系统状态迁移发生在随机性、离散的时间点上,内部转换机制较为复杂,难以用微分、差分方程等常规的数学方法来描述[1]。1976年Bernard Zeigler教授提出离散事件系统规范(Discrete Event System Specification,DEVS)[2],为离散事件系统仿真建模提供了层次化、模块化和形式化的机制。

DEVS规范就是从面向对象(Object-Oriented)的角度出发依据系统理论描述了离散事件系统[3]。通过建立系统完备的模型框架,保证了模型的规范性、重用性和仿真互操作能力[4]。DEVS++是实现DEVS机制的开源程序库[5],采用面向对象的C++开发语言提供了模型的基类,设计了仿真引擎,通过继承、派生的方式实例化具体的模型,便于对任意的离散事件系统进行建模,为系统建模提供最基本的、标准的框架。

本文介绍了DEVS的建模思想以及DEVS++程序库。在此基础上,以智能变电站过程层网络数据链路层发送适配器模型[6-8]实现为例,说明了DEVS++仿真程序的应用。最后通过仿真试验验证了模型的正确性。

1 DEVS规范

DEVS是离散事件系统通用的形式化描述,有两种模型,包括原子模型和耦合模型[9]。

1.1 Atomic

原子模型封装了不可进一步分解的元件的动态行为。原子模型被定义为一个七元组:

M=

式中:X是外部输入事件集,通过输入端口接受外部事件;Y是输出事件集,通过输出端口发出事件;S是系统状态集;s0是系统初始状态(s0∈S);tα是时间推进函数,该函数用来确定一个状态的生命周期,状态寿命是一个非负实数,取值范围为[0,∞);δx是内部转移函数,定义了输入X如何改变系统的状态;δy是外部转移函数,当一个状态的生命周期到达时,调用该函数,产生输出并进行状态转移。

1.2 Coupled

耦合是原子或其他耦合的容器,封装了元件及它们之间的连接关系,描述了系统层次化的结构。耦合模型被定义为:

CM=

式中:X是外部输入事件集;Y是输出事件集;D是耦合模型组成成员的名字集;{Mi}是基本模型成员集,Mi是原子模型也可以是耦合模型(iD);EIC是外部输入耦合,描述耦合外部输入与耦合各元件间的耦合关系;ITC是内部耦合,描述的是耦合元件的输出与其他耦合元件之间的耦合关系。EOC是外部输出耦合。DEVS模型根据当前的状态和转换函数处理输入事件,驱动产生输出事件。

2 DEVS++程序库

基于DEVS规范开发的,采用C++语言实现的DEVS++程序库提供了Atomic和Coupled模型的基类,并设计了仿真引擎。用户从Atomic和Coupled基类继承并实现相关虚函数,实例化系统的原子或耦合模型,通过层次化建模的思想构建待建系统的模型,并载入仿真引擎中实现仿真试验。

2.1 事件、端口、值(PortValue、Port、Value)

图1给出DEVS++程序库中类的结构及关系,

图1 DEVS++中的类

如图1所示,port是端口的基类,派生自Named抽象类,同时又派生出Input Port和Output Port两个具体类,分别实例化输入端口和输出端口,该两个具体类又是Devs的成员,实现了原子和耦合的输入、输出功能。Port基类中包含ToP和FormP数组成员,存放与其他端口的耦合关系,其中ToP存放该端口的前接端口表,FormP保存该端口后接的端口表。Value是值的基类,值指事件所包含的内容。bValue和tmValue派生自Value基类,其中bValue是模板类,为多种数据类型提供接口,tmValue创建带有时间戳的实例,方便提取与值相关的时间。在DEVS++定义中,将事件看成是端口和值组成的二元组,PortValue类封装了事件,各模型元件通过端口接收和输出事件。

2.2 Devs基类

图2 Devs类中时间函数关系

Devs虚基类包含了Atomic和Coupled相同的特点,输入、输出事件端口,相同的时间特性,如当前时间、消逝时间和剩余时间等。除上节提到的Input Port和Output Port外,Devs基类还提供了对端口进行操作的函数AddIP、GetIP、RemoveIP、PrintAllIPs,输出端口类似;与时间相关的时间函数,如图2所示,便于用户访问时间。成员变量t_Last、t_Next保存模型中上一事件和下一最早事件发生的时间;以及纯虚函数when_receive_init、when_receive_star、when_receive_x,为实现原子和耦合模型具体的初始化函数、内部和外部转移函数提供接口。

其中,tr=ts-te=tn-tc、ts=tn-tl、te=tc-tl。tl是上一事件发生的时间;tc是仿真当前时间;tn是下一事件发生的时间;ts是当前状态的生命周期;tr是当前状态剩余的时间;te是当前状态消逝的时间。

2.3 Atomic和Coupled基类

Atomic虚基类派生自Devs,含有新增加的纯虚函数tau、init、delta_x、delta_y。tau函数返回当前状态寿命值,init、delta_x、delta_y函数分别在重载的虚函数when_receive_init、when_receive_x、when_receive_star中调用,分别实现初始化、外部转移和内部转移。

Coupled可直接实例化,也可作为基类。具体实现重载虚函数when_receive_init、when_receive_star、when_receive_x,并增加了新的虚函数when_receive_y。其中,when_receive_x定义了外部输到达,激发该输入耦合的元件,并找出下一最早发生事件的时间及模型;when_receive_y定义产生输出事件,并发生状态转移。Coupled基类还提供了对子模型操作的一系列函数AddModel、RemoveModel、GetModel,以及管理子模型间耦合关系的函数AddCP、RemoveCP。

Atomic和Coupled基类中新增加的纯虚函数通过派生类重载具体实现。

2.4 rv类和SRTEngine类

DEVS++提供了随机变量基类rv,含有四个随机分布函数,分别是均匀分布,三角形分布,指数分布,正态分布。根据实际系统的需求来生成随机的数字。随机数发生器每次采用不同的种子,保证各随机变量相互独立。

图3 DEVS++仿真循环流程

DEVS++设计了仿真引擎类SRTEngine。实例化时,其构造函数创建一个独立的仿真线程。单个模型载入仿真引擎,通过循环的线程来实现仿真运行。其流程如图3所示。

基于DEVS++的二次开发,继承Atomic模型需具体实现虚函数(init、tau、delta_x和delta_y),继承Coupled模型,连接耦合端口,构建系统模型。仿真时钟的推进、状态转换函数的调用和输入输出的耦合都在DEVS++完成,用户不必关心。

3 仿真实例

图4 仿真实例示意图

电力通信系统是典型的离散事件系统。以智能变电站通信网络为例,建立基于DEVS++的过程层网络模型[10-12]。如图4所示,该实例包含两个合并单元、一个保护测控IED、一个交换机和三条物理信道通过以太网实现通信。本文以交换机为例介绍依据DEVS++建模框架搭建元件模型的过程。

3.1 网络建模

交换机用接口发送器(TSwitch-Sender)、接口接收器(TSwitch-Receive)和交换单元((TSwitch-Sever)三种原子耦合来建模。以TSwitch-Sender原子为例,详细介绍DEVS++在建模中的应用。

图5 TSwitch-Sender模型结构图

图5为TSwitch-Sender原子示意图,由Atomic模型派生而来,含两个输入端口、一个输出端口,Frame_in接收数据帧,Carrie_in接收物理层输入的载波信号。TSwitch-Sender原子应含有一个缓冲区(Buffer)来存放待发送的数据。

定义变量:SenderPhase为TSwitch-Sender当前状态,PhysicalPhase为物理层的状态,Jam为拥堵信号,AppFrame为正在发送的帧指针,CarrieFrame为侦听端口上输入的帧指针,CollisionCount记录冲突次数。

图6 Init函数流程图

图7 Frame_in端口输入流程图

虚函数tau、init、delta_x、delta_y具体实现。tau返回各状态的寿命,TSwitch-Sender处于空闲状态(Idling),寿命为∞;帧发送前侦听通道的状态(Sensing),信道忙时立即返回,寿命为0,信道空闲时,再持续监听1个帧间隙(固定为96 bit的传输时间)寿命为0.000 96 ms;发送帧状态(Sending),寿命为数据包的长度与网络带宽的比值;帧成功发送后的复位状态(Resting),持续1个帧间隙;发送冲突干扰信号的状态(SendingJam),Jam是48 bit的冲突信号可瞬时发送,寿命为0;发送Jam后等待状态(AfterJam),持续1个时隙(固定为512 bit的传输时间),使Jam信号被全部节点接收;冲突发生后等待重传的状态(Backoff),该状态根据退避规则随机退避一定时间[13]。

Init函数用于实现模型初始化,流程如图6所示。

外部输入X到达触发delta_x,若X来自于Frame_in端口,流程如图7所示。

X来自Carrie_in端口,则分两种情况,X可能是Jam信号或数据帧,具体流程如图8所示。

图8 Carrie_in端口输入流程图

状态寿命结束时出发delta_y。TSwitch-Sender发生状态转移并伴随输出事件。若TSwitch-Sender处于Sensing状态,调用delta_y时流程如图9所示;处于Sending状态时,发送帧尾,转移到复位状态后,若Buffer空闲,转为Idling,反之转为Sensing状态继续侦听;处于SendingJam状态时,产生Jam信号发送到其他节点后转移到AfterJam,按随机退避规则随机退避一定的时间,退避时间到达,再侦听Buffer状态,与前类似。

图9 Sensing状态时调用delta_y

以上介绍TSwitch-Sender模型中虚函数的具体实现,同理构建TSwitch_Receive和TSwitch_Sever原子模型,Switch耦合模型即可搭建。

依据DEVS++建模框架,依次构建合并单元、物理信道、保护测控装置的模型,不再赘述。系统模型派生自耦合模型,通过Coupled提供的AddModel函数可添加以上网络中的耦合模型,通过AddCP建立耦合间的关联关系,将网络模型载入仿真引擎即可实现仿真运行。

3.2 仿真结果

仿真参数设置,合并单元每隔0.25 ms采样一次,SV报文长度156 Bytes,数字信号在光纤上传输的速度为2×108m/s,网络半径100 m,通信带宽按照100 Mbit/s建模,仿真时长设为1 000 ms。表1和表2分别统计在交换总线通信方式下、仿真运行期间内的总流量和SV报文相关参数。

表1 总流量统计

表2 SV报文统计

由表1统计冲突次数为0,网络仿真过程中没有发生冲突,即没有Jam数据帧产生。网络总流量为9.981 5×106Mbit,全部被接受。表2统计得出,仿真期间内共产生SV报文总数7 998个,总流量可计算得7 998×156 bytes×8=9.981 5×106Mbit,与统计结果相同。仿真过程没有发生冲突,最小时延考虑数据处理过程中没有排队,理论上延时可分如下三个阶段计算:

(1)帧到达交换机之前的传输过程:发送帧头前侦听网络状态时延为0.000 96 ms;经光纤传输产生传输时延为信道长度与传输速率之比5×10-4ms;发送帧尾时延为数据帧长度与网络带宽之比0.011 98 ms;帧尾经光纤传输时延为5×10-4ms。

(2)交换机内部交换帧产生时延为数据帧长度与交换速率的比值1.248×10-3ms。

(3)数据从交换机发出到达IED元件与第一个过程类似,最小延时为0.029 128 ms,与统计结果相同。

(4)若数据需在交换机缓冲器中排队等待,则产生额外延时,由统计结果得该网络的最大时延为0.043 528 ms。通过统计结果可分析SV报文的最大延时与最小延时及丢包率等参数,对比网络性能要求,方便用户进行测试。

4 结束语

DEVS++开源库提供了原子模型、耦合模型和仿真引擎的基类,将系统建模和仿真结合起来,通过继承、派生各类原子和耦合模型,具体实现系统功能,就能实现任意的离散事件系统建模和仿真。DEVS++提供基于软件开发的分层、模块化的机制,为离散事件系统建模提供了标准的、统一的框架,提高了仿真模型的重用性和可操作性,为用户集成模型或二次开发提供了非常大的便利。

对于信息物理融合的电力系统而言,DEVS++为实现智能电网的统一建模提供了可参考的标准,为信息系统的性能分析及研究提供了重要的手段。在离散事件系建模中,DEVS++具有广阔的应用前景。

猜你喜欢

端口原子耦合
非Lipschitz条件下超前带跳倒向耦合随机微分方程的Wong-Zakai逼近
原子究竟有多小?
原子可以结合吗?
带你认识原子
一种端口故障的解决方案
端口阻塞与优先级
基于“壳-固”耦合方法模拟焊接装配
基于CFD/CSD耦合的叶轮机叶片失速颤振计算
8端口IO-Link参考设计套件加快开发速度
卫星三端口DC-DC变换器技术综述