2.4  Odczyt wartości bieżących zmiennych procesowych

 

Odczyt wartości bieżących zmiennych możliwy jest dwoma metodami. Pierwsza z nich to użycie metody GetVariableValue lub ReadVariables interfejsu IApplication. Druga metoda to odczyt za pomocą obiektów interfejsu IVariable. Obiekt IVariable dla wybranej zmiennej można uzyskać za pośrednictwem funkcji GetVariable interfejsu IApplication.

Metoda GertVariableValue powinna być wykorzystywana tylko w najprostszych skryptach, w których wartość zmiennej jest odczytywana jednokrotnie. W innych przypadkach należy stosować metodę z obiektem IVariable ze względu na jej większą wydajność.

Metoda ReadVariables jest podobna do GetVariableValue. Pozwala ona odczyt wielu zmiennych jednocześnie I jest z reguły bardziej efektywna niż wielokrotne wywołanie SetVariableValue.

Przykład pokazuje najprostszy przypadek, w którym bieżąca wartość zmiennej jest jednokrotnie zapisywana do logu komunikatów.

 

C#

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

public
 class CurrValues : IScript
{
   
public bool Initialize(string[] aParameters, IApplication aApplication)
   {
      VariableState v = aApplication.GetVariableValue(aParameters[0], 
false);
      
if (v == null)

         aApplication.ReportMessage(EvoMessageType.Error,
                        string.Format("Zmienna {0} nie jest zdefiniowana", aParameters[0]));        else
      {
         if (v.IsGood)
         {
            aApplication.ReportMessage(EvoMessageType.Error,
               string.Format("Wartość zmiennej {0}, Stempel czasu: {1}",
                                 v.Value, v.TimeStamp));
         }
         else
            aApplication.ReportMessage(EvoMessageType.Error,
               string.Format("Niepoprawny status wartości {0} ", v.Status));
       }
 
      return true;
   }
 
   public void FinalizeScript()
   {
   }

 

VB

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

Public
 Class CurrValuesVB
    
Implements IScript
 
    
Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

        IApplication) As Boolean Implements IScript.Initialize
 
        Dim v As VariableState
        v = aApplication.GetVariableValue(aParameters(0), False)
        If v Is Nothing Then
            aApplication.ReportMessage(EvoMessageType.Error, _
                     String.Format("Zmienna {0} nie jest zdefiniowana", aParameters(0)))
        Else
            If (v.IsGood) Then
                aApplication.ReportMessage(EvoMessageType.Error, _
                          String.Format("Wartość zmiennej {0}, Stempel czasu: {1}", _
                          v.Value, v.TimeStamp))
            Else
                 aApplication.ReportMessage(EvoMessageType.Error, _
                 String.Format("Niepoprawny status wartości {0} ", v.Status))
            End If
        End If
 
        Return True
 
    End Function
 
    Public Sub FinalizeScript() Implements IScript.FinalizeScript
 
    End Sub
 
End
 Class

 

 

Pierwszy wariant skryptu używa zalecaną w tym przypadku  funkcję GetVariableValue. Po uzyskaniu poprawnego obiektu VariableState  dla zmiennej o nazwie przekazanej w parametrach wywołania, wartość zmiennej jest zapisywana do logu. Aktualna wartość, status i stempel czasu jest dostępna poprzez właściwości obiektu VariableState. Należy zwrócić uwagę na sposób weryfikacji poprawności zmiennej poprzez wywołanie metody IsGood.

 

C#

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

public
 class CurrValues : IScript
{
   
public bool Initialize(string[] aParameters, IApplication aApplication)
   {
      IVariable v = aApplication.GetVariable(aParameters[0], 
false);
      
if (v == null)

         aApplication.ReportMessage(EvoMessageType.Error,
                        string.Format("Zmienna {0} nie jest zdefiniowana", aParameters[0]));        else
      {
         if (v.VariableState.IsGood)
         {
            aApplication.ReportMessage(EvoMessageType.Error,
               string.Format("Wartość zmiennej {0}, Stempel czasu: {1}",
                                 v.VariableState.Value, v.VariableState.TimeStamp));
         }
         else
            aApplication.ReportMessage(EvoMessageType.Error,
               string.Format("Niepoprawny status wartości {0} ", v.VariableState.Status));
 
         v.Dispose();
      }
 
      return true;
   }
 
   public void FinalizeScript()
   {
   }

 

VB

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

Public
 Class CurrValuesVB
    
Implements IScript
 
    
Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

        IApplication) As Boolean Implements IScript.Initialize
 
        Dim v As IVariable
        v = aApplication.GetVariable(aParameters(0), False)
        If v Is Nothing Then
            aApplication.ReportMessage(EvoMessageType.Error, _
                     String.Format("Zmienna {0} nie jest zdefiniowana", aParameters(0)))
        Else
            If (v.VariableState.IsGood) Then
                aApplication.ReportMessage(EvoMessageType.Error, _
                          String.Format("Wartość zmiennej {0}, Stempel czasu: {1}", _
                          v.VariableState.Value, v.VariableState.TimeStamp))
            Else
                 aApplication.ReportMessage(EvoMessageType.Error, _
                 String.Format("Niepoprawny status wartości {0} ", v.VariableState.Status))
            End If
            v.Dispose()
        End If
 
        Return True
 
    End Function
 
    Public Sub FinalizeScript() Implements IScript.FinalizeScript
 
    End Sub
 
End
 Class

 

 

W drugim wariancie, dla celów porównawczych użyty jest obiekt klasy IVariable. Po uzyskaniu poprawnego obiektu IVariable  dla zmiennej o nazwie przekazanej w parametrach wywołania, wartość zmiennej jest zapisywana do logu. Aktualna wartość, status i stempel czasu jest dostępna poprzez właściwość VariableState obiektu zmiennej. Należy zwrócić uwagę na sposób weryfikacji poprawności zmiennej poprzez wywołanie metody IsGood. Po wykonaniu zapisu informacji do logu, obiekt zmiennej jest zwalniany poprzez wywołnie metody Dispose.

Wartość zmiennej uzyskana w poprzednich przykładach pochodzi z ostatniego planowego odświeżenia zmiennej. Przy rzadko odświeżanych zmiennych może być ona nieaktualna. Jeżeli skrypt wymaga działania na jak najbardziej aktualnej wartości, należy ustawić drugi parametr funkcji GetVariableValue na true lub użyć funkcję Read interfejsu IVariable.

C#

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

public
 class CurrValuesRead : IScript
{
   
public bool Initialize(string[] aParameters, IApplication aApplication)
   {
      IVariable v = aApplication.GetVariable(aParameters[0], 
false);
      
if (v == null)
      {
         aApplication.ReportMessage(EvoMessageType.Error,
            
string.Format("Zmienna {0} nie jest zdefiniowana", aParameters[0]));
      }
      
else
      {
         VariableState vValue = v.Read();
         
if (vValue.IsGood)
         {
            aApplication.ReportMessage(EvoMessageType.Error,
               
string.Format("Wartość zmiennej {0}, Stempel czasu: {1}",
               vValue.Value, vValue.TimeStamp));
         }
         
else
            aApplication.ReportMessage(EvoMessageType.Error,
               
string.Format("Niepoprawny status wartości {0} ", vValue.Status));
 
         v.Dispose();
      }
       
return true;
   }
 
   
public void FinalizeScript()
   {
   }

 

VB

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

Public
 Class CurrValuesReadVB
    
Implements IScript
 
    
Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

        IApplication) As Boolean Implements IScript.Initialize
 
        Dim v As IVariable
        v = aApplication.GetVariable(aParameters(0), False)
        If v Is Nothing Then
            aApplication.ReportMessage(EvoMessageType.Error, _
                  String.Format("Zmienna {0} nie jest zdefiniowana", aParameters(0)))
        Else
            Dim vValue As VariableState
            vValue = v.Read()
            If (vValue.IsGood) Then
                aApplication.ReportMessage(EvoMessageType.Error, _
                       String.Format("Wartość zmiennej {0}, Stempel czasu: {1}", _
                       vValue.Value, vValue.TimeStamp))
            Else
                aApplication.ReportMessage(EvoMessageType.Error, _
                       String.Format("Niepoprawny status wartości {0} ", vValue.Status))
            End If
            v.Dispose()
        End If
 
        Return True
 
    End Function
 
    Public Sub FinalizeScript() Implements IScript.FinalizeScript
 
    End Sub
 
End
 Class

 

 

Należy jednak pamiętać o tym, że intensywne wykorzystywanie forsowanego odczytu wartości zmiennej może mocno obciążyć łącze komunikacyjne i pogorszyć działanie całej aplikacji.