Nein, der Hersteller hat hier keine echten Beispiele. Das liegt daran, dass es sich hier um eine "ganz normale" ANSI-C-Implementierung handelt. Der Hersteller hat hier eigentlich sehr wenig beigetragen. Ein sehr schönes C-Tutorial findet ihr hier:
C-How-to in Deutsch
Hier einige wichtige Grundkonzepte für die C-Makros im Kinco HMI:
1. Die Makros funktionieren ein bisschen wie ein SPS-Programm
Das bedeutet, es werden erst die Variablen gelesen (unter dem Makro in der Variablenliste angelegt).
Dann werden sie verarbeitet und ihnen Werte im C-Programm zugewiesen. Dann werden sie wieder an den Prozess rausgeschrieben. Bitte macht nicht den Fehler und denkt, das C-Programm ist eine Ablaufsteuerung wie in einer Hochsprache, wo ihr einfach auf Dinge warten könnt und Programme Schritt für Schritt abarbeitet. Das geht meistens schief.
2. Die Kinco-Funktionen sind eigentlich meist unnötig
Die einzige echte Erweiterung des Standard-C durch Kinco sind vier spezielle Befehle:
- ReadLocal("LW", 200, 2, (void*)buf, 0);
- WriteLocal("LW", 202, 2, (void*)buf, 0);
- ReadData(param, int PLC no, int address, int nRegs, void *buf);
- WriteData(param, int PLC no, int address, int nRegs, void *buf);
Viele Kunden versuchen diese Befehle zu nutzen, auch weil sie beim Erstellen eines Makros als Beispiel da stehen. Aber diese Befehle braucht ihr meist überhaupt nicht. Sie sind dafür das, um innerhalb des Makros direkt auf den Speicher im HMI oder der SPS zuzugreifen. Oft reicht es aber, die Variablen direkt unten in der Liste aufzunehmen. Das hat in etwa die gleiche Funktion. Die speziellen Lese- und Schreibbefehle braucht ihr wirklich nur für sehr spezielle parametrierte Zugriffe innerhalb des Makros.
3. Die Makrofunktion ist im Handbuch beschrieben
Im Handbuch findet ihr die wichtigsten Informationen zu Makros in Kapitel 9. Hier ist beschrieben, wie sie genau funktionieren.
4. Datentypen, Datentypen, Datentypen
Eine der größten Herausforderungen in C sind die verschiedenen Datentypen. Hier hat Kinco die C-Datentypen behalten. Das hat den Vorteil, dass jeder Standard-C-Kurs hier funktioniert und ihr mit Datentypen wie Int, Char etc. arbeiten könnt. Allerdings ist das etwas verwirrent, weil die Datentypen in SPS und auch im HMI anders beschrieben sind. Ein Word sind dort 16 Bit, in C ist ein Word also 16 Bit der Typ "short". Ein Int ist ein DWord (Double Word) mit 32 Bit. C ist auch sehr streng mit Zuweisungen zwischen Datentypen. Ihr müsst also die richtigen Typen wählen oder sie konvertieren, um keine unerwarteten Probleme oder Fehler zu bekommen.
Übersicht der Zahlentypen in C
5. Die wichtigsten Funktionen
Eigentlich beschränken sich die wichtigsten Funktionen in C hierauf:
- Zuweisungen
Es ist nicht immer ganz einfach, Variablen und Daten in C richtig zuzuweisen. Die richtigen Datentypen sind wichtig.
Doku zu Zuweisungen und Operatoren
- Verzweigungen
Verzweigungen sind vor allem "Wenn-Dann" Anweisungen mit IF und damit sehr wichtig. Zwei Fehler, die ich dabei häufig mache:
- Ein Vergleich, also die Abfrage, ob Zahl A = Zahl B ist, nutzt doppelte Gleichheitszeichen ==. Also IF (A==4) ... Wenn ihr, so wie ich manchmal aus Versehen, im Vergleich nur EIN GLEICHHEITSZEICHEN nutzt, ist es eine Zuweisung im Vergleich und verhält sich komplett anders. Bei IF (A = 4), wird A der Wert 4 zugewiesen und der Ausdruck ist WAHR, weil die Operation erfolgreich war. Darauf bin ich als C-Gelegenheitsprogrammierer schon oft reingefallen.
- Wenn ihr einen Wert in der Liste der Variablen als nur "Schreiben" setzt, wird immer ein Wert zugewiesen. Auch wenn ihr im Programm nichts zuweist, bekommt die Variable einen neuen Wert. Und da der aktuelle Wert nicht gelesen wird, ist der Wert dann 0 oder False, je nachdem, was es für eine Variable ist.
Doku zu Verzweigungen
- Schleifen
Schleifen sind wichtig, um zum Beispiel ein Array (also eine Liste von Variablen mit Index) durchzugehen. Es gibt verschiedene Schleifen in C, ich benutze häufig die For-Schleife, da sie am berechenbarsten ist. Denkt dran, wenn ihr eine While-Anweisung oder ähnliches nutzt und auf irgendwas wartet, bricht das Makro eventuell mit einem Timeout ab. Es ist wie gesagt eher für eine zyklische Abarbeitung gedacht, nicht als Hintergrundprogramm, das auf irgendwas warten kann.
Doku zu Schleifen