事件驱动机制-在SCADA报警系统中的应用

软件开发的开放封闭原则告诉我们 对于扩展是开放的,对于修改是封闭的。而事件驱动就是在保持了事件和核心逻辑的稳定性和不被修改的前提下,通过定义不同的响应从而达到了对扩展的开放。

SCADA 报警事件中常见的有事故跳闸,变化次数越限,遥测越限, 遥信变位, 遥控,遥调,人工置数/ 激活/ 封锁,标志牌操作,旁路/ 对端替代,启动追忆,设备状态变化,通道状态变化,保护事件信息等。事件驱动就是在保持事件及其逻辑关系不变的情况下,根据需要定义事件的响应的机制。使用事件驱动机制 提高系统的响应速度,增强系统的开放性能。


1 、驱动定义

事件报警池是一个循环队列共享内存空间,使用共享内存的原因是模块化和跨进程考虑,减少进程模块的耦合程度。

// 事件处理器定义

typedef int (*EVENTHANDLER_CALLBACKPROC)(int EventCode, void *arg);

   

// 注册事件处理器

int RegisterEventProc(EVENTHANDLER_CALLBACKPROC RegEventProc, int EventCode, void *arg);

 

// 根据条件触发一个事件( 事件控制码,事件内容缓冲区,事件内容长度)

int PostEvent(int EventCode, void *EventBuffer, int EventBufferLen);

 

// 调度事件处理函数

Int DispatchEventEntry(int EventCode, void *lpEventEntry);

    一个事件处理器,可以绑定多个事件处理函数,也就是说可以注册多个处理函数。全局的事件控制代码要唯一,否则会产生控制代码相等冲突问题,影响生成事件正确地处理。

2 、循环机制

事件处理器,我们可以把它看成是进程模块中生成的一条处理线程,或看着是一台运转的消息泵。事件处理器在时刻监视着系统报警的每个举动,并分析系统的动作与哪一个处理函数程序相关。相反,处理程序也在时时等待着事件的到来,一旦发现它的事件队列中有未处理的信息,就获取并分析该事件,并根据事件所包含的内容采取适当的动作来响应系统需求。事件处理器根据事件控制代码维护了自己相应的事件队列,它的任务就是不停地从特定的事件队列中获取事件、分析事件并处理事件,直到事件处理结束为止。这个过程的程序结构称为“事件循环”。

3 、事件产生

系统根据逻辑关系满足条件把生成事件发送到事件报警池队列中。事件队列是系统定义的一个循环队列共享内存块,用于系统相关报警事件的信息存储。每个事件处理器维护自己的事件队列,从中取出属于自己关心的事件,回调函数进行处理。一有空闲,事件处理器就搜索事件队列,并在事件队列中处理相关事务,即从队列中删除处理过事件信息。

4 、事件处理

事件处理器库模块(CEventHandler )是对事件处理器的封装,模块在处理事件时使用了“回调函数”的特殊函数。这个函数由事件处理器定义和注册,提供给事件处理器系统来调用的。这种调用通常在某一事件发生,如客户端控制操作时发生,或者在后台程序处理结果时发生。事件产生时会向事件报警池所能发送的事件很多,但是,对于事件处理器来说,只是其中的一部分有意义。

总之,事件驱动机制由于把响应作为应付变化的要素,同时保持了事件和逻辑关系的稳定性,从而为系统模块程序的维护与扩展打下了良好的基础。事件驱动处理机制,在许多大型实时处理系统应用非常广泛。因此,事件驱动机制是一种可重用和可扩展性比较强的机制。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值