Datenkonsistenz für Multicore-Betrieb sichern
Das IEC-Programm der Visualisierung, Visu_Prg läuft standardmäßig in einer eigenen Task VISU_TASK. Die Visualisierung zeigt in der Regel Daten aus der Hauptapplikation an. Die Daten der Hauptapplikation werden in einer anderen Task verarbeitet. Aus diesem Grund ist Datenkonsistenz ein wichtiges Thema, wenn die Applikation auf einer Multicore-Steuerung eingesetzt wird.
Wichtig zu wissen ist, dass es bei den Datentypen STRING und WSTRING, sowie für strukturierte Daten keine atomare, also zeitlich unteilbare, Zuweisung gibt. Bei der Übergabe eines Datums dieser Typen darf das Datum nicht verändert werden. Wenn das Datum jedoch von einer anderen Task als der VISU_TASK verändert wird, kann es kurzzeitig falsch dargestellt werden.
Sehen Sie im Folgenden, wo Sie beim Erstellen einer CODESYS Visualisierung explizit darauf achten sollten, dass beim Einsatz auf einem Multicore-System die Datenkonsistenz gewährleistet bleibt.
Info
Beachten Sie grundsätzlich die allgemeinen Hinweise in der CODESYS-Hilfe zum Thema Multicore-Betrieb.
Lesen von IEC-Daten in einem Visualisierungszyklus
Wenn die Darstellung eines Visualisierungselements von mehreren Variablen abhängt, dann ist die Zuweisung dieser Variablen nicht zykluskonsistent. Bewegt man beispielsweise ein Element mit Hilfe zweier IEC-Variablen in x- und y-Richtung, kann es vorkommen, dass sich das Visualisierungselement in einem Zyklus nur in x-Richtung bewegt und die Bewegung in die y-Richtung erst im nächsten Zyklus erfolgt.
Das gleiche gilt für Daten, die von mehreren Visualisierungselementen verwendet werden.
Beispiel: Element 1 liest die Zustandsvariable invisible und aktualisiert seinen Zustand. Eine andere Task (als die VISU_TASK) ändert die zugehörige IEC-Variable.Element 2 liest die Zustandsvariable invisible und aktualisiert seinen Zustand. Folge: Die Elemente haben für eine kurzen Moment einen unterschiedlichen Zustand.Dieses Verhalten kann bei allen Animationsvariablen auftreten.
Visualisierungswechsel |
Beachten Sie die oben beschriebene Problematik bei der Verwendung von String-Datentypen. |
Befehl ausführen |
Beachten Sie die oben beschriebene Problematik bei der Verwendung von String-Datentypen. |
Framevisualisierung umschalten |
Beachten Sie die oben beschriebene Problematik bei der Verwendung von String-Datentypen. |
Variable schreiben |
Wie für das Lesen gilt auch für das Schreiben auf STRING/WSTRING Variablen, dass keine atomaren Zuweisungen möglich sind. |
ST-Code ausführen |
Achten Sie auch beim Erstellen des ST-Codes darauf, dass die Datenkonsistenz nicht gefährdet wird. |
Schnittstellenvariablen einer Visualisierung
Wird über VAR_INPUT eine Struktur übergeben, so ist die Datenkonsistenz nicht gewährleistet. Verwenden Sie strukturierte Daten über VAR_IN_OUT, oder verwenden Sie eine Schnittstelle mittels VAR_INPUT.
Benutzerverwaltung der Visualisierung
Wenn die Benutzerverwaltung über die öffentlichen Schnittstellen (Bibliothek VisuUserMgmt.library) aufgerufen wird, so muss dies immer aus der VISU_TASK heraus erfolgen.
Visualisierungselement Polygon
Das Visualisierungselement Polygon hat die Eigenschaft Dynamische Punkte. Hier können Sie ein Array von Punkten konfigurieren. Beachten Sie, dass das Lesen des gesamten Arrays nicht atomar erfolgt.
Bei allen Eigenschaften, die mit Variablen des Datentyps STRING konfiguriert werden, gibt es keine atomare Zuweisung. Beispiel: Die Steuervariable für die URL beim Visualisierungselement WebBrowser.
VisuUtils.library |
FbOpenDialogExtended.CallOpenDialog verwendet SysMemCpy. Führen Sie eine Umkonfiguration der jeweiligen Instanz nicht während xBusy == TRUE aus. |
IECStringUtils.library |
Verwenden Sie den Funktionsbaustein VisuFbAnalyzeDateTimeFormatString nicht mit gleichem Puffer aus mehreren Tasks. |
StringUtils.library |
Achtung, bei Verwendung von DateFormatter.Format finden Strukturzugriffe statt. |
IECStringUtils.library |
Achtung, bei Verwendung von VisuFbAnalyzeDateTimeFormatString.GetMonth finden Stringzugriffe statt. |
Die Parameterübergabe bei Dialogen ist wie die bei komplexen Datentypen zu betrachten. Beim Öffnen eines Dialogs wird eine Kopie aller zu übergebenden Parameter erstellt.
Ausnahme: VAR_IN_OUT-Parameter, die mit {attribute 'VAR_IN_OUT_AS_POINTER'} versehen sind. Wenn dieses Attribut vergeben wird, dann wird keine Kopie erzeugt und der Dialog arbeitet auf dem Originalobjekt.