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
}
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.
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().