2.4.1  Cykliczny odczyt wartości bieżących zmiennych procesowych

 

Częstym przypadkiem jest konieczność cyklicznego odczytu i przetwarzania wartości zmiennej procesowej. W tego typu przypadkach można wykorzystać mechanizm okresowego wywołania wybranej funkcji.

Poniższy przykładowy skrypt zapisuje  do pliku tekstowego wartości bieżące dwóch zmiennych. Zapis realizowany jest co 15 minut.

C#

using System;
using
 System.Windows.Forms;
using
 Askom.AsixEvo.Scripting;
using
 System.IO;
 

public
 class CurrValuesReport : IScript
{
   IApplication application;
   IVariable v1, v2;
 
   
public bool Initialize(string[] aParameters, IApplication aApplication)
   {
      application = aApplication;
      v1 = aApplication.GetVariable(aParameters[0], 
true);
      v2 = aApplication.GetVariable(aParameters[1], 
true);
      aApplication.RegisterTimeEvent(Report15Min, 
TimeSpan.FromMinutes(15),

                                     TimeSpan.FromMinutes(0));
      return false;
   }
 
   public void FinalizeScript()
   {

   }
 
   void Report15Min()
   {
      StreamWriter writer = new StreamWriter(
         Path.Combine(application.ApplicationWorkingDirectory, "logs\\reports.txt"), true,
         System.Text.ASCIIEncoding.GetEncoding(1250));
      String msg = String.Format("{0},{1},{2}",
         DateTime.Now, v1.VariableState.IsGood ? v1.VariableState.Value : "?",
                       v2.VariableState.IsGood ? v2.VariableState.Value : "?");
      writer.WriteLine(msg);
      writer.Close();
   }
}

 

 

VB

Imports System
Imports
 System.Windows.Forms
Imports
 Askom.AsixEvo.Scripting
Imports
 System.IO
 

Public
 Class CurrentValuesReportVB
    
Implements IScript
 
    
Dim application As IApplication
    
Dim v1, v2 As IVariable
    
Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

                               IApplication) As Boolean Implements IScript.Initialize
 
        application = aApplication
        v1 = aApplication.GetVariable(aParameters(0), True)
        v2 = aApplication.GetVariable(aParameters(1), True)
        application.RegisterTimeEvent(Report15Min, TimeSpan.FromMinutes(15), _

                                      TimeSpan.FromMinutes(0))
        Return False
 
    End Function
 
    Public Sub FinalizeScript() Implements IScript.FinalizeScript
 
    End Sub
 
    Sub Report15Min()
 
        Dim writer As StreamWriter
        writer = New StreamWriter( _
           Path.Combine(application.ApplicationWorkingDirectory, "logs\\reports.txt"), True, _
           System.Text.ASCIIEncoding.GetEncoding(1250))
        Dim msg, v1v, v2v As String
        If v1.VariableState.IsGood Then v1v = v1.VariableState.Value Else v1v = "?"
        If v2.VariableState.IsGood Then v2v = v2.VariableState.Value Else v2v = "?"
        msg = String.Format("{0},{1},{2}", DateTime.Now, v1v, v2v)
        writer.WriteLine(msg)
        writer.Close()
 

    End Sub
 

End
 Class

 

 

W funkcji Initialize tworzone są dwa obiekty IVariable, które będą służyły do odczytu wartości zmiennych. Istotne jest ustawienie drugiego  parametru funkcji GetVariable na  True. Powoduje to włączenia odświeżania zmiennej procesowej – brak odświeżania mógłby spowodować, że w momencie pobrania wartości zmiennej w funkcji okresowej, wartość ta byłaby nieaktualna.

Funkcja RegisterTimeEvent rejestruje funkcję okresową Report15Min. Funkcja będzie wykonywana co 15 minut, w minucie 0, 15, 30 i 45.

Funkcja Initialize zwraca wartość False, co powoduje kontynuację pracy skryptu.

Wewnątrz funkcji Report15Min wykonywany jest zapis danych do pliku – wartości zmiennych są pobierane w standardowy sposób, za pośrednictwem właściwości VariableState.