Einfache und komplexe Datentypen in C++ mit PLCnext Engineer meistern
Hallo zusammen,
In diesem Blogbeitrag erkunden wir einfache und komplexe Datentypen in C++ und PLCnext Engineer. Zwei Teile: einfache und komplexe Übung.
Voraussetzung: Erfahrung mit C++ und PLCnext Engineer.
Benötigte Tools
- AXC F 2152, Firmware 2021.0.3
- PLCnext Engineer 2021.0.2
- Visual Studio 2019 Community 16.9.4 (oder Eclipse – Tutorials verlinkt)
PLCnext Engineer auf der Website erhältlich.
Einfache Übung
Kleine Applikation: Prüfen, ob die richtige Zahl vom PLC gesendet wird. Neues C++-Projekt anlegen. Header-Datei ([Projektname].hpp) öffnen – [name]component.hpp nicht verwenden. Ports definieren (nur für einfache Datentypen):
//#port
//#attributes(Input)
//#name(InputTest)
int64 InputTest = 0;
//#port
//#attributes(Output)
//#name(OutputTest)
int64 OutputTest = 0;
Im .cpp-File Logik implementieren (If oder Switch):
void PLMProjectReadInputProgram::Execute() {
if (InputTest == 1) { OutputTest = 15; }
if (InputTest == 2) { OutputTest = 150; }
if (InputTest == 3) { OutputTest = 1500; }
if (InputTest == 4) { OutputTest = 15000; }
}
C++-Projekt zur Library bauen (Build-Button). Unklar? Tutorials oben prüfen.

In PLCnext Engineer: Hauptprogramm unter Components → Programming → Local → Variables. Name, Datentyp (muss C++ entsprechen – Zuordnungstabelle hier) und Usage (lokal oder extern) wählen.

Library einbinden: Library aus bin-Ordner des C++-Projekts nach C:\Users\Public\Documents\PLCnext Engineer\Libraries kopieren. In PLCnext Engineer: Components → Libraries → Rechtsklick → Add user library → Library wählen.

Programm zu Tasks hinzufügen: Links im Plant-Bereich Doppelklick auf PLCnext → Tasks and Events → neues Programm nach MainInstance hinzufügen (Typ wählen oder aus Components ziehen).

Im Port list-Tab (neben Tasks and Events) Variablen verbinden: OUT vom PLC an IN des C++-Programms (und umgekehrt). Funktioniert nicht? Datentypen prüfen.

Dummy-Wert setzen: Hauptprogramm → Code → Variable auf numerischen Wert setzen (hier: 1).

Projekt auf PLC deployen → Response sollte 15 sein (Port List prüfen).
Komplexe Übung
Applikation sendet Array von Structs hin und her. Neues C++-Projekt, Header ([Projektname].hpp). Struct für Auto definieren:
public: // typedefs
struct StrCar {
StaticString<80> sbrand;
int16 iHorsepower;
int16 iYear;
boolean xInsured;
};
WICHTIG: Namen und Typen in C++ und PLCnext Engineer müssen identisch sein! Datentypen hier.
Ports als Listen von StrCar definieren:
//#port
//#attributes(Input)
//#name(CarIn)
StrCar CarToC[2];
//#port
//#attributes(Output)
//#name(CarOut)
StrCar CarFromC[2];
Im .cpp-File Werte von Auto 1 und 2 ändern:
// Erstes Listenelement = zweites Auto vom PLC
CarFromC[0].sbrand = CarToC[1].sbrand;
CarFromC[0].iHorsepower = CarToC[1].iHorsepower;
CarFromC[0].iYear = CarToC[1].iYear;
CarFromC[0].xInsured = CarToC[1].xInsured;
// Zweites Element mit Dummy-Werten (erstes Auto vom PLC)
CarFromC[1].sbrand = CarToC[0].sbrand;
CarFromC[1].iHorsepower = CarToC[0].iHorsepower;
CarFromC[1].iYear = CarToC[0].iYear;
CarFromC[1].xInsured = CarToC[0].xInsured;
Library bauen (Build).

In PLCnext Engineer eigenen Datentyp anlegen: Datatypes-Datei (Pfad siehe Screenshot).

Struct StrCar anlegen:
TYPE
StrCar:
STRUCT
sBrand: STRING;
iHorsepower: INT;
iYear: INT;
xInsured: BOOL;
END_STRUCT
END_TYPE
WICHTIG: Namen und Typen müssen mit C++ übereinstimmen!
Array carList desselben Typs in derselben Datei:
TYPE
carList: ARRAY[0..1] OF StrCar;
END_TYPE
Variable mit Typ carList anlegen: Components → Programming → Programs → Variables → benutzerdefinierten Typ wählen.

Library einbinden (wie oben: bin → Libraries-Ordner → Add user library).

Programm zu Tasks hinzufügen (wie oben).

Im Port list-Tab Variablen verbinden. Nicht klappen? Datentypen und Variablennamen prüfen.

Dummy-Werte für Autos setzen (Datentypen beachten):
CarToC[0].sBrand := 'Audi';
CarToC[0].iHorsepower := 200;
CarToC[0].iYear := 2020;
CarToC[0].xInsured := TRUE;
CarToC[1].sBrand := 'Mazda';
CarToC[1].iHorsepower := 120;
CarToC[1].iYear := 2001;
CarToC[1].xInsured := FALSE;
Nach Deployment sollte die ausgehende Liste in der eingehenden vertauscht sein (Port List prüfen).
Industrietechnik
- Cloud-Horizonte erweitern: Neue Zonen, Container und Multicloud-Strategien
- Fortgeschrittene Analyse von DC-Reaktivkreisen mit nicht-null Anfangsbedingungen
- C# Grundlagen: Eingabe und Ausgabe Essentials
- C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
- C++ Structures vs. Classes: Praktischer Leitfaden für Embedded-Entwickler
- C++ Datum & Zeit: Umfassender Leitfaden
- Digitales Verfassen von Verfahren: Einfach, effizient und zuverlässig
- Sicheren Remote-gRPC-Zugriff mit grpcurl auf PLCnext-Geräten
- PLCnext Konsolenanwendung mit C# entwickeln: Einsteigerleitfaden
- APT-Paketmanager auf PLCnext Linux installieren: Schritt-für-Schritt-Anleitung