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
Schnellstart 1:

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.

Schnellstart 2:

Sie können auch mehrere Dateien gleichzeitig durch Multi-Select konvertieren.
Die konvertierten Dateien werden standardmäßig auf dem XAE System im Ordner <TwinCATpath>\Functions\TF38xx-Machine-Learning\ConvertToolFiles abgelegt.

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.

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.

Schnellstart 3:

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…
Schnellstart 4:

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.

Schnellstart 5:

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.

Schnellstart 6: