Handhabung von Datenpunkten

Um die Werte von Datenpunktelementen (DPE) in einem Script verarbeiten zu können, müssen diese zuerst aus dem Prozessabbild gelesen und auf eine lokale Variable übertragen werden. Berechnungen und Zuweisungen erfolgen dann mit den Variablen des Scripts. Diese müssen bei Bedarf auch wieder auf die Datenpunktelemente übertragen werden. Die wichtigsten Funktionen lauten

dpGet(string dpe, anytype val, ...) // Lesen von DPE

dpSet(string dpe, anytype val, ...) // Schreiben von DPE

Beide Befehle können mehrere Datenpunkte auf einmal auslesen und auf eine entsprechend Anzahl von Variablen übertragen. Es handelt sich um einmalige Zugriffe die genau für den Aufrufzeitpunkt entsprechende Antworten liefern.

main()
{
  float val1, val2;
  bool val3;
  string dpeXY;
  dpGet("Drive04.state.speed", val1); // Lesen des Wertes des Datenpunktelements auf Var. val1
  val1 = val2 + 20; 
  dpeXY = "Drive04.cmd.speed"; // Zuweisung der Zeichenkette eines DPE zu einer Variablen
  dpSet(dpeXY, val2); // Setzen des Datenpunktelements ;Drive04.cmd.speed; auf den Wert der Variablen val2
  dpGet("Drive04.state.speed", val1, // Aufruf mit mehreren DPEs
  "Drive05.cmd.setpoint", val2,
  "Drive06.state.on", val3);
  dpSet("Drive04.cmd.speed", val1, // Aufruf mit mehreren DPEs
  "Drive05.cmd.setpoint", val2,
  "Drive06.cmd.on", !val3); // ! Invertierung des Wertes
}

VORSICHT:

Selbstverständlich muss ein Datenpunktelement, auf welches per CONTROL zugegriffen werden soll, auch tatsächlich existieren. Dies gilt insbesondere für den Zugriff auf Konfigs/Attribute, da nicht alle Konfigs auf jedem Datenpunktelement vorhanden sind. Entsprechende Fehler werden erst zur Laufzeit ausgewertet und sind im Log Viewer bzw. Log-File entsprechend vermerkt.

Anmerkung:

Eine Zusammenfassung von mehreren Lese- bzw. Schreiboperationen zu einem einzigen Aufruf, wie im unteren Teil des obigen Beispiels gezeigt, ist stets empfehlenswert und begünstigt die Performance.

Folgendes kurze Script bei Clicked in einem Grafikobjekt ;Schaltfläche; (Button), würde den Betriebszustand "Handbetrieb" bei dem Ventil V03 unseres Beispiels wechseln. Bei jedem [MausklickLinks] ändert sich der Zustand des Handbetriebs-Befehls und über die Gerätesimulation auch der angezeigte Istwert.

main()
{
  bool manualMode;
  dpGet("V01.state.manual",manualMode);
  dpSet("V01.cmd.manua",!manualMode); // '!' invertiert den Setzwert
  }

Im Gegensatz zu den bisher verwendeten einmaligen Zugriffsfunktionen, fordern die meisten Anwendungen eine permanente Aktualisierung von Anzeigen und Auswertungen. Da WinCC OA völlig ereignisorientiert arbeitet, stehen auch hierfür entsprechende Funktionen zur Verfügung:

main()
{
  dpConnect(string callBackFunction,[bool noInit], string dpe [,...]);
}
callBackFunction(string dpe, anytype value,...)
{
  // ... Auszuführende Aktionen bei Wertänderung von 'dpe'
}

Obige Funktion dpConnect() registriert eine Anmeldung auf Wertänderungen des durch 'dpe' angegebenen Datenpunktelements beim Event-Manager. Sobald sich der Wert ändert, wird er an das entsprechende Control-Script zurückgeliefert und die angegebene Call-Back-Funktion wird aufgerufen. Folgendes Script bei Initialize auf einem Rechteck, ändert dessen Hintergrund-Farbe in Abhängigkeit vom Zustand des binären Datenpunktelements V03.state.manual unseres Beispiel-Projekts.

main()
{
  dpConnect("showStateCB", "V03.state.manual");
}
showStateC B(string dpe, bool man) // je angemeldetem DPE wird eine String-Variable für den Namen
{  //und ein passender Typ für den
  if (man) // Wert deklariert
    this.backCol = "yellow"; // Wenn 'man' == TRUE wird die Hintergrundfarbe gelb,
  else //  sonst
    this.backCol = "grey"; // grau gesetzt
}

Die Funktion dpConnect() kann gleichzeitig die Anmeldung für mehrere Datenpunktelemente, bzw. Attribute von Konfigs erledigen. Unerheblich welcher der Werte sich ändert, wird die Call-Back-Funktion ausgeführt. Bei der Deklaration der Call-Back-Funktion muss dann für jedes angemeldete Element ein Paar aus Datenpunktname und Wert-Variable als Übergabeparameter vorgesehen werden. Mehr dazu siehe Online-Hilfe auf der Seite dpConnect().