Alarmierung mit rapidMDN

In den meisten Fällen wird der MyDatalogMUC verwendet, um mit an den Universaleingängen angeschlossenen Sensoren Werte zu messen. Das Skript kontrolliert, ob die gemessenen Werte einen Grenzwert über- oder unterschreiten. Ist dies der Fall, wird am Server ein Alarm ausgelöst.

Die einfachste Möglichkeit so eine Alarmierung zu realisieren sieht folgendermaßen aus:

#include <mdlMUC>

forward public Mdn_CtrlFinish();

public Mdn_CtrlFinish()
{
  new Float:value;

  /* simplest form of alarm */
  Mdn_GetCh(MDN_CH_UI1, value);
  if(value > 10.0)
     Mdn_SetAlarm(MDN_CH_UI1, MDN_FLG_ALARM, value, 10.0);
  else if(value < 5.0)
     Mdn_SetAlarm(MDN_CH_UI1, MDN_FLG_ALARM|MDN_FLG_UNDERFLOW, value, 5.0);
  else
     Mdn_SetAlarm(MDN_CH_UI1, 0, value);
}

Mit Mdn_GetCh(MDN_CH_UI1, value) wird der Wert des Kanals eingelesen. Mit einer einfachen If-Abfrage wird nun überprüft, ob der Messwert über, unter oder in einem bestimmten Bereich liegt. Mit der Funktion Mdn_SetAlarm() können dann entsprechend verschiedene Alarme gesetzt bzw. zurückgesetzt werden. Die übergebenen Attribute geben an, auf welchem Kanal der Alarm ausgegeben werden soll (1. Attribut), um welche Art von Alarm es sich handelt (2. Attribut), den Messwert, der den Alarm verursacht hat (3. Attribut), sowie den Schwellwert, der über- bzw. unterschritten wurde (4. Attribut, optional). Diese Angaben scheinen am Server bei der jeweiligen Messstelle auf. Dadurch kann der Auslöser des Alarms rasch und einfach ermittelt werden.

Diese Methode hat aber einen gravierenden Nachteil: Liegt ein Alarm an, so wird dieser bei jedem Messzyklus erneut gesetzt, was zu unnötigem Verbrauch an Datenvolumen führt. Daher ist es sinnvoll, im Skript zu überprüfen, ob der jeweilige Alarm bereits gesetzt/zurückgesetzt wurde. Dies geschieht am einfachsten, indem in jedem Messzyklus das zutreffende Alarmflag in einer Variable gespeichert wird (oldalarm). Beim nächsten Durchlauf wird überprüft, ob das aktuelle Alarmflag (alarm) dieser Variablen entspricht (der Alarm ist bereits gesetzt, es gibt also nichts zu tun), oder ob es sich geändert hat (der Alarm wird gesetzt/zurückgesetzt und das Alarmflag gespeichert).

#include <mdlMUC>

forward public Mdn_CtrlFinish();

static oldalarm;

public Mdn_CtrlFinish()
{
  new Float:value;
  new alarm;

  /* edge sensitive alarm */
  Mdn_GetCh(MDN_CH_UI2, value);
  if(value > 10.0) alarm = MDN_FLG_ALARM;
  else alarm = 0;

  if((oldalarm ^ alarm) & alarm) //EXOR: equal = 0, unequal = 1
  {
    /* alarm is set */
    print("Alarm set on UI2\r\n");
    Mdn_SetAlarm(MDN_CH_UI2, alarm, value, 10.0);
    Mdn_SetTrigger(MDN_TRG_TXSTART);
  }
  else if((oldalarm ^ alarm) & oldalarm)
  {
    /* alarm is cleared */
    print("Alarm cleared on UI2\r\n");
    Mdn_SetAlarm(MDN_CH_UI2, 0, value);
    Mdn_SetTrigger(MDN_TRG_TXSTART);
  }

  /* save alarm for next time */
  oldalarm = alarm;
}

Es sind folgende Konstanten für die Alarmierung (im Beispielskript Variable Alarm) vordefiniert:

const
{
MDN_FLG_WARNING = 0b00000001,     // Warnung
MDN_FLG_ALARM = 0b00000010,       // Alarm
MDN_FLG_FAULTLOW = 0b00000100,    // Technischer Fehler niedriger Priorität
MDN_FLG_FAULTHIGH = 0b00001000,   // Technischer Fehler hoher Priorität
MDN_FLG_UNDERFLOW = 0b10000000,   // Unterschreitung der Alarmschwelle
};

Wird ein Alarm aufgrund einer Unterschreitung ausgelöst, so muss zusätzlich zum Alarm noch MDN_FLG_UNDERFLOW gesetzt werden (siehe 1. Beispiel), damit dies am Server richtig angezeigt wird. Wird das Underflow-Flag nicht gesetzt, wird eine Überschreitung angenommen.

Änlich wie ein Alarm kann auch ein Trigger gesetzt werden. Je nach gesetztem Trigger-Flag wird bei Über-, Unterschreitung eines Schwellwertes eine bestimmte Aktion ausgeführt. Untenstehende Codezeile löst eine Online-Verbindung aus, sobald der Messwert (value) den Wert 10.0 überschreitet. Diese bleibt solange aufrecht, bis der Messwert wieder unter 10.0 fällt.

/* as long as UI3 above 10.0, device should be in online mode */
Mdn_GetCh(MDN_CH_UI3, value);
if(value > 10.0) Mdn_SetTrigger(MDN_TRG_CONTINOUS);

Folgende Trigger-Flags sind vordefiniert:

const
{
// Gerätespezifisch
MDN_TRG_INTERN1 = 0b0000000000010000,
// Gerätespezifisch
MDN_TRG_INTERN2 = 0b0000000000100000,
// Gerätespezifisch
MDN_TRG_INTERN3 = 0b0000000001000000,
// Gerätespezifisch
MDN_TRG_INTERN4 = 0b0000000010000000,
// Schnelle Aufzeichnung anfordern
MDN_TRG_RECQUICK = 0b0000000100000000,
// Langsame Aufzeichnung anfordern
MDN_TRG_RECSLOW = 0b0000001000000000,
// Starte Aufzeichnung der aktuellen Messung
MDN_TRG_RECORD_ON = 0b0000100000000000,
// Verhindere Aufzeichnung der aktuellen Messung
MDN_TRG_RECORD_OFF = 0b0001000000000000,
// Fordere eine einzelne Verbindung mit dem Server an
MDN_TRG_TXSTART = 0b0010000000000000,
// Fordere eine Online Verbindung mit dem Server an
MDN_TRG_CONTINOUS = 0b1000000000000000,
};

 

Katharina

Als Mitglied des Microtronics Support Teams kennt Katharina Ihre Fragen zum Thema Programmierung ganz genau. Im Microtronics Blog bringt die Wirtschaftsinformatikerin regelmäßig spannende und hilfreiche Programmierbeispiele. Nachmachen ausdrücklich erlaubt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.