2.9.3   Zgłaszanie alarmów

 

Skrypty mogą realizować pełną funkcjonalność strategii wykrywania alarmów. Przykład z tego rozdziału realizuje taką strategię. Jej działanie oparte jest na cyklicznym odczycie pliku tekstowego, w którym zapisywane są (przez zewnętrzny program kontrolujący stan systemu) tekstowe identyfikatory alarmów rozdzielone znakami średnika. Obecność identyfikatora w pliku oznacza, że alarm jest aktywny. Zadaniem skryptu jest przekazanie informacji z pliku do systemu alarmów aplikacji. Wstępnym krokiem, który należy wykonać jest zdefiniowanie strategii alarmowej typu „Zewnętrzna” oraz definicji alarmów należących do tej strategii. W definicji każdego z alarmów, w atrybucie „Parametry wykrywania”, należy podać identyfikator, który w pliku tekstowym będzie odpowiadał temu alarmowi.

Przykładowy skrypt w momencie uruchomienia wymaga podania trzech parametrów: nazwy pliku tekstowego, nazwy domeny alarmowej oraz nazwy strategii, na konto której skrypt będzie działał. Uruchomienie skryptu należy zlecić w terminarzu aplikacji przy pomocy akcji Script. Akcję należy uruchamiać w trybie „Jednokrotnie przy starcie aplikacji”.

C#

using System;

using System.IO;

using System.Windows.Forms;

using Askom.AsixEvo.Scripting;

using System.Collections.Generic;

 

public class AlarmStrat : IScript

{

    IApplication application;

    string alarmStateFile;

    string domain;

    string strategy;

    List<IAlarm> myAlarms = new List<IAlarm>();

 

    public bool Initialize(string[] aParameters, IApplication aApplication)

    {

        application = aApplication;

        alarmStateFile = aParameters[0];

        domain = aParameters[1];

        strategy = aParameters[2];

 

        foreach (string name in application.GetDefinedAlarms(domain))

        {

            IAlarm ia = application.GetAlarm(domain, name);

            if (ia.Definition.Strategy == strategy)

                myAlarms.Add(ia);

        }

        aApplication.RegisterTimeEvent(StrategyFun, TimeSpan.FromSeconds(10),

                                       TimeSpan.FromSeconds(0));

 

        return false;

    }

 

    public void FinalizeScript()

    {

    }

 

    char[] separator = { ';' };

 

    void StrategyFun()

    {

        if (application.GetAlarmDomainStationMode(domain)!=AlarmStationMode.ActiveController)

            return;

 

        try

        {

            StreamReader file = new StreamReader(alarmStateFile,System.Text.Encoding.Default);

            List<string> content = new List<string>(file.ReadToEnd().Split(separator));

            foreach (IAlarm alarm in myAlarms)

            {

                bool isOn = content.IndexOf(alarm.Definition.DetectionParameters) != -1;

                if (isOn)

                {

                    if (!alarm.AlarmState.IsActive || alarm.AlarmState.IsFinished)

                    {

                        alarm.Raise();

                    }

                }

                else

                {

                    if (alarm.AlarmState.IsActive && !alarm.AlarmState.IsFinished)

                    {

                        alarm.Cancel();

                    }

                }

            }

            file.Close();

        }

        catch (Exception e)

        {

            application.ReportMessage(EvoMessageType.Info, "Error in AlarmStrat: "+e.Message);

        }

    }

}  

 

VB

Imports System

Imports System.IO

Imports System.Windows.Forms

Imports System.Collections.Generic

Imports Askom.AsixEvo.Scripting

 

Public Class AlarmStratVb

    Implements IScript

 

    Dim application As IApplication

    Dim alarmStateFile As String

    Dim domain As String

    Dim strategy As String

    Dim myAlarms As List(Of IAlarm) = New List(Of IAlarm)

 

    Public Function Initialize(ByVal aParameters() As StringByVal aApplication _

                               As IApplication) As Boolean Implements IScript.Initialize

 

        application = aApplication

        alarmStateFile = aParameters(0)

        domain = aParameters(1)

        strategy = aParameters(2)

        Dim ia As IAlarm

 

        For Each name As String In application.GetDefinedAlarms(domain)

 

            ia = application.GetAlarm(domain, name)

            If (ia.Definition.Strategy = strategy) Then

                myAlarms.Add(ia)

            End If

 

        Next name

 

        aApplication.RegisterTimeEvent(AddressOf StrategyFun, TimeSpan.FromSeconds(10),_

                                       TimeSpan.FromSeconds(0))

        Return False

 

    End Function

 

    Public Sub FinalizeScript() Implements IScript.FinalizeScript

    End Sub

 

    Dim separator() As Char = {";"}

 

    Public Sub StrategyFun()

 

        If application.GetAlarmDomainStationMode(domain) <> _

                                                     AlarmStationMode.ActiveController Then

            Return

        End If

 

        Try

            Dim file As StreamReader = New StreamReader(alarmStateFile, _

                                                        System.Text.Encoding.Default)

            Dim content As List(Of String) = New List(Of String) _

                                                        (file.ReadToEnd().Split(separator))

            For Each alarm As IAlarm In myAlarms

 

                Dim isOn As Boolean = _

                              Not content.IndexOf(alarm.Definition.DetectionParameters) = -1

                If isOn Then

                    If (Not alarm.AlarmState.IsActive) Or alarm.AlarmState.IsFinished Then

                        alarm.Raise()

                    End If

                Else

                    If alarm.AlarmState.IsActive And (Not alarm.AlarmState.IsFinished) Then

                        alarm.Cancel()

                    End If

                End If

            Next alarm

            file.Close()

 

        Catch e As Exception

            application.ReportMessage(EvoMessageType.Info, "Error in AlarmStrat: "+e.Message)

        End Try

 

    End Sub

 

End Class 

 

W funkcji Initialize tworzona jest lista wszystkich alarmów należących do wskazanej parametrami domeny i strategii alarmowej. Funkcja GetDefinedAlarms zwraca wszystkie alarmy domeny. Następnie dla każdego alarmu domeny pobierana jest referencja do interfejsu IAlarm, a poprzez nią sprawdzane jest, czy alarm należy do właściwej strategii. Po odczycie danych konfiguracyjnych rejestrowana jest funkcja StrategyFun – będzie ona wykonywana co 10 sekund.

Funkcja  StrategyFun sprawdza na początku tryb pracy domeny. Alarmy są wykrywane tylko wtedy, gdy stanowisko jest kontrolerem aktywnym domeny. Następnie odczytywany jest plik tekstowy i parsowana lista identyfikatorów. Dla każdego alarmu strategii określany jest  aktualny stan alarmu wg danych odczytanych z pliku oraz status w aplikacji. W przypadku wykrycia niezgodności alarm jest zgłaszany przy pomocy metody Raise lub wygaszany metodą Cancel. Obie metody pozwalają potencjalnie na zgłoszenie dodatkowych danych związanych ze zdarzeniem. Dane te byłyby zapisane w logu alarmów. Możliwe jest też jawne podanie czasu zdarzenia – w przykładowym skrypcie czas zdarzenia jest identyczny z czasem wykonania funkcji Raise lub  Cancel.

Wykrywanie aktualnego stanu alarmu wykonywane jest zgodnie z opisem podanym w przykładzie dotyczącym odczytu stanu alarmów.