Dazu ist es schwer mit C/C++ ein Debugging an einer laufenden Maschine zu bewerkstelligen.
Das ist an sich kein Problem von C++:
Beim Debugging einer S7 (für mich nicht das Maß aller Dinge, aber ein Beispiel, das alle kennen) kannst du die Registerinhalte nach jedem Schritt (Verknüpfung, Rechnung) ansehen. Das Programm läuft mit unverminderter Geschwindigkeit und du kriegst nicht jeden Zyklus mit. Mit einem Debugger arbeitest du gewöhnlich mit Einzelschritten oder Breakpoints. Das ist so, weil es bei "normalen" PC-Programmen nichts ausmacht, wenn die Ausführung beliebig verlangsamt wird. Aber natürlich ließe sich ein Laufzeitsystem konstruieren, daß genau dasselbe tut wie eine SPS: Einen vom Benutzer hochgeladenen (kompilierten) Block (quasi den OB1) zyklisch abarbeiten, im dem gerade beobachteten Abschnitt die Registerinhalte sammeln und diese an einen angepaßten Debugger ausgeben.
Auch die Änderbarkeit von Code zur Laufzeit ohne Programmunterbrechung läßt sich machen: Genauso wie in einer S7 muß der Aufruf von Code-Blöcken über eine Liste von Adressen (Funktionszeiger in C/C++) erfolgen. Nachdem der neue Block im freien Speicher abgelegt wurde, ohne den alten zu überschreiben wird vor Beginn des nächsten Zyklus die Adresse des alten Blocks durch die vom neuen ersetzt.
Nun zur Programmierung eines PC als Soft-SPS: C++ scheint mir nicht die richtige Sprache. Die typischen C++ Anwendungen generieren Objekte zur Laufzeit. Auch wenn man Teile des Prozesses/Feldes durch Objekte abbilden möchte, kann ich keine Notwendigkeit erkennen, solche Objekte zur Laufzeit zu generieren oder zu entfernen. Damit ist die Speicherverwaltung und der Konstruktor/Destruktor-Mechanismus überflüssig. Mehrfachvererbung verwendet kaum ein C++-Programmierer. Vererbung an sich läßt sich auch in C, ohne ++, mit Structs und Funktionszeigern realisieren. C (auch ohne ++) macht auf mich immer einen leicht kryptischen Eindruck, da man mit kurzen Folgen von Sonderzeichen allerlei nette Effekte bewirken kann.
Ich halte Pascal für leichter lesbar (wichtig, da Steuerungen eigentlich immer von anderen Personen als dem Programmierer gewartet werden müssen) und so finde ich es folgerichtig, daß SCL ziemlich "Pascal-artig" ist.
Für binäre Verknüpfungen ist keine der üblichen Hochsprachen so richtig gut geeignet.
Meine Vorstellung wäre, Compiler zur Verfügung zu stellen für:
KOP, FUP -> AWL
AWL->Maschinencode
SCL->Maschinencode
SCL-> AWL
Und als Hochsprache eine Art abgespecktes JAVA (ohne new), nachfolgend AVA genannt:
AVA->Maschinencode
AVA-> AWL
Der Sinn, den über den Zwischenschritt AWL gehen zu können oder nicht, liegt darin, daß mit AWL-Zwischenschritt der Code auch für nicht Hochsprachenkundige (notfalls) nachvollziehbar bleibt, während ohne AWL-Zwischenschritt optimaler (schneller, kurzer) Maschinencode erzeugt wird.