EWO - Grundlagen und Entwicklung
Was ist ein EWO?
Ein EWO (External Widget Object) ist ein Grafikobjekt (ein Widget), das in ein WinCC OA Panel eingebettet werden kann.
Es ist in C++ mit dem plattformneutralen Qt Grafik-Toolkit implementiert, siehe http://www.qt.io/developers/. Ein EWO kann im Allgemeinen alles enthalten und darstellen, was auch Qt in einem QWidget-Objekt erlaubt, und wird dynamisch in eine WinCC OA-Benutzeroberfläche geladen (es wird als Plugin in einer Library/DLL kompiliert). Ein EWO enthält Eigenschaften, die im Eigenschaftenfenster (Attribut-Editor) des Grafikeditors geändert werden können.
Auf ein EWO kann über CTRL-Skripte zugegriffen werden. Ein EWO kann CTRL-Skripte durch Senden von entsprechenden Signalen auslösen.
Folgende Datentypen können zusätzlich zu den nicht-dynamischen Datentypen zwischen EWO und WinCC OA Scripts ausgetauscht werden:
- alle WinCC OA dyn_* Datentypen
- alle Datentypen aus QList<QVariant>
QVariant::Size -> dyn_int mit Breite und Höhe
QVariant::Polygon -> dyn_dyn_int mit jeweils einem dyn_int als x-, y-Koordinaten
QVariant::BitArray -> bis 32 bit -> bit32; 33 bis 64 bit -> bit64
QVariant::Pen -> string
QVariant::Brush -> string
QVariant::Map -> mapping
Wenn ein QBrush ein Pixmap beinhaltet, kann dieses nicht zu einem String konvertiert werden. Das bedeutet, dass das Lesen eines Pixmaps aus einem EWO nur eingeschränkt möglich ist. Das Schreiben aus einem WinCC OA Script ins EWO ist jedoch möglich.
Vorhandene EWOs, die mit einer neuen WinCC OA Version verwendet werden sollen, müssen neu kompiliert werden.
Aufgrund Änderungen in WinCC OA ist es nötig, das Schema der Klassen-Forward Deklarationen für die Qt libs von "class Qsting;" auf "QT_FORWARD_DECLARE_CLASS(QString)" anzupassen, wenn ein Linking zwischen EWO und der eigenen Qt Library durchgeführt wird (betrifft nur Linux). Folgendes Shellscript kann für die Anpassungen benutzt werden:
#!/bin/sh
find $1 -type f -name \*hxx -o -name \*.h | xargs sed -i -e 's/^\(class *\)\(Q.*\);/QT_FORWARD_DECLARE_CLASS\(\2\)/'
Als Parameter muss das Startverzeichnis des EWO SourceCodes angegeben werden.
Die Notation "QT_FORWARD_DECLARE_CLASS(xxx)" kann auf sämtlichen Betriebssystemen verwendet werden, ist unter Linux aber zwingend erforderlich.
Wie implementiere ich ein EWO?
QWidget virtual QWidget *widget() const = 0
beinhaltet. Als nächstes muss diese kompiliert und verwendet werden.Für detaillierte Informationen zu allen möglichen Methoden, siehe Kommentare in
der Datei BaseExternWidget.hxx unter
<wincc_oa_path>/api/include/EWO.
Ein Beispiel finden Sie nach dem Ausführen des Tools api/newEWO (cmd für Windows, sh für Linux). Dies erzeugt ein kompilierbares EWO mit Beispielcode.
Zu beachten ist, dass die Umgebungsvariable API_ROOT
mit dem
Pfad zum /api
Ordner des Installationsverzeichnisses gesetzt
ist. Füllen Sie überall im Code, der mit //TODO
gekennzeichnet
ist, eine sinnvolle Implementierung ein und kompilieren Sie das EWO. Auch wenn
Sie keine Änderungen durchführen, ist es bereits ein kompilierbares und
lauffähiges EWO mit zwei Schaltflächen und einigen Signalen/Methoden.
Bitte beachten Sie die Anforderungen für die API Entwicklung wenn Sie eigene Komponenten erstellen.
Wie konfiguriere ich meine Qt-Bibliothek (Library/DLL)
Da Sie eine Qt-Entwicklungslizenz benötigen, um ein EWO zu implementieren, muss sichergestellt werden, dass das Setup dieser Installation mit der Qt-Bibliothek von WinCC OA übereinstimmt. Ansonsten kann das kompilierte EWO nicht geladen werden.
Die aktuell in der WinCC OA Version verwendete Qt-Version kann innerhalb des GEDI abgerufen werden (siehe Über Qt).
Wie installiere ich ein EWO?
Ein EWO ist eine allgemeinverfügbare Library/DLL (unter <wincc_oa_path>/bin), welche plattformabhängig in das Verzeichnis <proj_path>/bin/widgets kopiert werden muss. Jedes EWO muss die Dateiendung .ewo besitzen (z.B. MyWidget.ewo). Alternativ kann die EWO-Datei in eines der folgenden Unterverzeichnisse gespeichert werden. Diese enthalten EWOs, die für eine bestimmte Plattform kompiliert sind:
<proj_path>/bin/widgets/windows
<proj_path>/bin/widgets/windows-64
<proj_path>/bin/widgets/linux
<proj_path>/bin/widgets/linux-64
Wie füge ich ein EWO einem Panel hinzu
Klicken Sie auf das EWO-Symbol in der Symbolleiste, auf das entsprechende Element in der EWO Toolbar (oder über das GEDI-Menü "Objekte") und wählen Sie die .ewo-Datei aus, die Sie verwenden möchten. Zeichnen Sie einen rechteckigen Bereich auf dem Panel, um die Größe des EWOs zu definieren. Verwenden Sie es auf die gleiche Weise wie Standard-Widgets (die speziellen Events und Eigenschaften werden auf der Registerkarte "Erweitert" im Attribut-Editor angezeigt).
Während des Engineerings kann mit einem Doppelklick auf das EWO im Panel sein Initialize-Skript geöffnet werden.
Wie bekomme ich einen speziellen Editor für die Einstellungen meines EWOs
Einige komplexe Widgets in WinCC OA haben getrennte Editor-Panels (Dialoge) für die Einstellungen z.B. der Trend oder die Kaskade usw.. Das gleiche kann auch für ein EWO implementiert werden. Erstellen Sie ein Skript unter <proj_path>/scripts/gedi/<EWOName>_ewo.ctl (z.B. MyWidget_ewo.ctl), welches dann ein Panel öffnet und auf das EWO zugreift.
EWO Entwicklung
paintEvent()
Wenn ein EWO im paintEvent() selbst den Font skaliert, sollte ein Property im EWO Widget wie folgt erzeugt werden, damit ein Ändern des Fonts durch das UI beim Zoomen verhindert wird, was zu doppeltem Skalieren führt:
Q_PROPERTY(bool avoidFontTransform READ getAvoidFontTransform DESIGNABLE false SCRIPTABLE false)
bool getAvoidFontTransform() const { return true; }
inGedi()
Erlaubt es, die Anzeige eines EWOs im GEDI anders darzustellen, um so z.B. für das AttentionEffect.ewo eine besser Sichtbarkeit innerhalb des Editors zu ermöglichen.
Q_PROPERTY(bool inGedi READ isInGedi WRITE setInGedi DESIGNABLE false SCRIPTABLE false)
bool isInGedi() const { return inGedi; }
Drop Event
Um Drag & Drop in einem EWO zu verwenden, kann ein Event Handler für das EWO implementiert werden. Um die entsprechende Event Behandlung hinzuzufügen, muss für das EWO selbst (Nicht das QWidget welches innerhalb des EWOs verwendet wird) der EWO Konstruktor um folgenden Befehl erweitert werden:
setProperty("-droppedEvent", QLatin1String("main(string information, int dragType)"));
Die Argumente der main Funktion hängen von den Argumenten ab, welche als Werte innerhalb des entsprechenden Signals übergeben werden. Das bedeutet, dass abhängig von diesem Signal auch eigene Argumente implementiert werden können.
Das Interface wird für das Drop Skript innerhalb des GEDIs verwendet (als Teil des Eigenschaften Editors).