Schnellstart
Modell konvertieren (optional)
Eine ML-Beschreibungsdatei (KerasMLPExample_cos.XML) liegt bereits im ZIP des Schnellstart Beispiels. Diese Datei kann direkt für die Einbindung in TwinCAT verwendet werden oder optional in ein Binärformat (BML) konvertiert werden.
Im Folgenden wird exemplarisch gezeigt, wie eine Beschreibungsdatei konvertiert wird. Dasselbe Vorgehen gilt auch für den üblicheren Fall, dass eine ONNX-Datei konvertiert werden soll.
- Der Machine Learning Model Manager ist geöffnet.
Menüleiste: (Extensions)* > TwinCAT > Machine Learning > Machine Learning Model Manager
* Nur bei Visual Studio 2019
- 1. Nutzen Sie das Convert tool.
- 2. Klicken Sie auf Select file und wählen Sie die Datei KerasMLPExample_cos.XML.
- 3. Wählen Sie im Drop-Down-Menü Convert to *.bml
- 4. Klicken Sie auf Convert files.
- Das entsprechende BML erscheint unter <TwinCATpath>\Functions\TF38xx-Machine-Learning\ConvertToolFiles
Den Default-Pfad zum Ablegen konvertierter ML-Beschreibungsdateien können Sie im Machine Learning Model Manager mit Select Target Path verändern. Die Änderung ist persistent. |
Sie können auch mehrere Dateien gleichzeitig durch Multi-Select konvertieren. |
Einbindung in TwinCAT über die SPS API
Nachfolgend wird beschrieben, wie Sie die ML-Beschreibungsdatei in TwinCAT laden und zyklisch ausführen. Dazu wird zunächst auf die SPS API eingegangen.
- Erstellen Sie zunächst ein TwinCAT Projekt und legen Sie ein SPS Projekt an
- Fügen Sie die SPS Bibliothek Tc3_MLL unter dem Knoten References hinzu
In der Deklaration erstellen Sie bitte eine Instanz des FB_MllPrediction. In diesem einfachen Fall enthält die Beschreibungsdatei ein MLP mit einem Eingang und einem Ausgang vom Typ FP32, entsprechend werden Variablen für Input und Output als REAL angelegt. Eine allgemeingültigere Möglichkeit zur Handhabung der Ein- und Ausgänge finden Sie in den Beispielen zur PLC API.
Außerdem erstellen Sie eine String-Variable, welche den Dateinamen inkl. Pfad zur ML-Beschreibungsdatei beinhaltet (Pfad auf dem Zielsystem). Kopieren Sie die entsprechende Datei an diesen Ort auf dem Zielsystem (FTP, RDP, Shared Folder, …).
Weiterführende Informationen zu diesem Schritt finden Sie hier.
Hinweis | |
Pfad der Beschreibungsdatei auf dem Zielsystem Achten Sie auf die Einstellungen des File Writer und der Schreibrechte auf dem Zielsystem. |
PROGRAM MAIN
VAR
fbPredict : FB_MllPrediction; // ML Interface
nInputDim, nOutputDim : UDINT := 1;
fDataIn, fDataOut : REAL;
sModelName : T_MaxString := 'C:/TwinCAT/3.1/Boot/ML_Boot/KerasMLPExample_cos.xml';
hrErrorCode : HRESULT;
bLoadModel : BOOL;
nState : INT := 0;
END_VAR
Im Implementationsteil erstellen Sie beispielsweise einen Zustandsautomaten, welcher es Ihnen ermöglicht, zwischen dem Idle state, Config state, Predict state und Error state zu wechseln.
Im ersten Zustand warten Sie zunächst auf den Befehl zum Laden einer Beschreibungsdatei. Anschließend wird die Configure-Methode des fbPredict
Funktionsbausteines so lange aufgerufen bis ein TRUE
zurückgeliefert wird. Dieses steht einen Zyklus lang an und bedeutet, dass die Konfiguration abgeschlossen ist. Es wird dann geprüft, ob ein Fehler aufgetreten ist. Wenn kein Fehler aufgetreten ist, wird zum nächsten Zustand, dem Predict state, geschaltet. Der Zustandsautomat verbleibt im Predict state solange kein Fehler auftritt oder ein (neues) Modell geladen werden soll.
CASE nState OF
0: // idle state
IF bLoadModel THEN
bLoadModel := FALSE;
nState := 10;
END_IF
10: // Config state
fbPredict.stPredictionParameter.MlModelFilepath := sModelName; // provide model path and name
IF fbPredict.Configure() THEN // load model
IF fbPredict.bError THEN
nState := 999;
hrErrorCode := fbPredict.hrErrorCode;
ELSE // no error -> proceed to predict state
nState := 20;
END_IF
END_IF
20: // Predict state
fbPredict.Predict(
pDataInp := ADR(fDataIn),
nDataInpDim := nInputDim,
fmtDataInpType := ETcMllDataType.E_MLLDT_FP32_REAL,
pDataOut := ADR(fDataOut),
nDataOutDim := nOutputDim,
fmtDataOutType := ETcMllDataType.E_MLLDT_FP32_REAL,
nEngineId := 0,
nConcurrencyId := 0);
IF fbPredict.bError THEN // error handling
nState := 999;
hrErrorCode := fbPredict.hrErrorCode;
ELSIF bLoadModel THEN // load (updated) model
bLoadModel := FALSE;
nState := 10;
END_IF;
999: // Error state
// add error handling here
END_CASE
Im Predict state wird die Predict-Methode des fbPredict
verwendet. Diese führt das geladene Modell aus. Der Methode werden die Eingangsgrößen über die ersten drei Parameter der Methode mitgeteilt – Pointer auf eine SPS-Variable, Anzahl der Eingänge und zugehöriger Datentyp. Selbiges ist für die Ausgangsgrößen anzugeben (Parameter 4 bis 6). Die nEngineId
und nConcurrencyId
werden in diesem einfachen Beispiel nicht benötigt und immer mit dem Wert Null übergeben. Details zu diesen Parametern finden Sie in den Beispielen Ausführliches Beispiel und Paralleler, nicht-blockierender, Zugriff auf ein Inferenzmodul.
Bevor Sie das Projekt auf einem Target aktivieren, müssen Sie im Projektbaum unter System>License im Tab Manage Licenses die TF3810 Lizenz manuell anwählen, da Sie ein Mehrlagiges Perzeptron (MLP) laden möchten.
Sie können nun die Konfiguration aktivieren. Loggen Sie sich in die SPS ein und starten Sie das Programm. Indem Sie nun die bLoadModel
Variable im Online View auf TRUE
setzen wird das Modell geladen und beginnt mit der Prädiktion Sie können die Eingabevariable fDataIn
manipulieren und sich die Ergebnisse in der Ausgabe fDataOut
ansehen. Das geladene Mehrlagiges Perzeptron bildet näherungsweise eine Cosinusfunktion im Eingangsbereich von [-pi, pi] auf den Wertebereich [-1,1] ab. Außerhalb des Bereichs [-pi,pi] divergiert die Funktion zunehmend von der Cosinusfunktion.
Das oben beschriebene Beispiel können Sie hier herunterladen.
Einbeziehung eines Modelles mittels TcCOM-Objekt
In diesem Abschnitt wird die Ausführung von Modellen des Maschinellen Lernens mittels eines vorbereiteten TcCOM-Objektes behandelt. Eine ausführliche Beschreibung dazu finden Sie hier. Diese Schnittstelle bietet eine einfache und übersichtliche Möglichkeit, Modelle zu laden, in Echtzeit auszuführen und mittels des Prozessabbilds entsprechende Verknüpfungen in die eigene Applikation zu erzeugen.
Vorbereitetes TcCOM-Objekt TcMachineLearningModelCycal erzeugen
- 1. Selektieren Sie dazu den Knoten TcCOM Objects mit der rechten Maustaste und wählen Sie Add New Item…
Unter Tasks eine neue TwinCAT Task erzeugen und der neu erzeugten Instanz des TcMachineLearningModelCycal diesen Task-Kontext zuweisen
- 2. Gehen Sie dazu auf den Reiter Context des erzeugten Objekts.
- 3. Wählen Sie im Drop-Down-Menü Ihre erzeugte Task aus.
- Die Instanz des TcMachineLearningModelCycal verfügt über einen Reiter ML model configuration. Hier können Sie die Beschreibungsdatei des ML Algorithmus (XML oder BML) laden und bekommen im Anschluss daran verfügbare Datentypen für Ein- und Ausgänge des selektierten Modells angezeigt.
- Die Datei muss sich nicht auf dem Zielsystem befinden. Es kann vom Entwicklungssystem aus selektiert werden und wird dann beim Aktivieren der Konfiguration auf das Zielsystem überspielt.
- Es wird zwischen präferierten und unterstützen Datentypen unterschieden. Der Unterschied ist lediglich, dass zur Laufzeit eine Konvertierung des Datentyps erfolgt, sollte ein nicht präferierter ausgewählt werden.
Dies kann bei Verwendung nicht-präferierter Datentypen zu minimalen Performance-Einbußen führen. - Automatisch werden die Datentypen für Ein- und Ausgänge zunächst auf den präferierten Datentypen gesetzt. Durch einen Klick auf Generate IO wird das Prozessabbild des selektierten Modells erstellt. Entsprechend erhalten Sie durch das Laden der KerasMLPExample_cos.xml ein Prozessabbild mit einem Input vom Typ REAL und ein Output vom Typ REAL.
Projekt auf Target aktivieren
- 1. Bevor Sie das Projekt auf einem Target aktivieren, müssen Sie im Projektbaum unter System>License im Tab Manage Licenses die TF3810 Lizenz manuell anwählen, da Sie ein Mehrlagiges Perzeptron laden möchten.
- 2. Aktivieren Sie die Konfiguration.
- Sie können nun das Modell durch händisches Schreiben auf dem Input testen.