Beispiel

Dieses Beispiel bietet eine Einführung in die Handhabung der Funktionsbausteine, welche mit der TcPlcMDP Bibliothek zur Verfügung stehen.

Dieses Beispiel widmet sich dem Ziel, den Zustand der Compact Flash Karte im Embedded-PC zu ermitteln.

Dies kann über einen Parameter im MDP-Model herausgefunden werden. Die Abfrage anderen Parameters findet analog zu diesem Beispiel statt.

So kann dieses Beispiel auch als Anleitung gesehen werden, um einen beliebigen MDP-Parameter aus einem MDP-Modul abzufragen.

Falls Sie das Beispiel an einem PC durchgehen möchten, welcher keine Silicon Compact Flash Karte als Speicher nutzt, können Sie anstatt dessen beispielsweise die CPU-Auslastung abfragen. Dazu führen Sie dieses Beispiel auf gleiche Weise aus und passen nur wenige Stellen entsprechend an. Nötige Werte dazu finden Sie in der allgemeinen Modulbeschreibung zum MDP Modul CPU.

Übersicht

Folgende Schritte werden nun durchgeführt:

1. Installation der PLC Bibliothek

2. Programmstruktur

3. Dynamische Modul ID ermitteln

4. Abfrage des MDP Parameters

5. Test

1. Installation der PLC Bibliothek

Starten Sie TwinCAT PLC Control.

Mit 'Datei > Neu' legen Sie ein neues PLC/SPS Projekt an.

Wählen Sie Ihre Zielplattform PC und CX (x86) oder CX (ARM).

Ihre erste POU ist ein Programm namens MAIN und in der Programmiersprache ST (Strukturierter Text).

Öffnen Sie den Karteireiter Ressourcen und den Bibliotheksverwalter.

Fügen Sie wie im Bild unten dargestellt mit 'Einfügen > Weitere Bibliothek' die Bibliothek TcMDP.lib ein.

Beispiel 1:

Jetzt stehen Ihnen alle SPS-Bausteine der TwinCAT PLC MDP Bibliothek zur Verfügung. Alle weiteren implizit benötigten Bibliotheken wurden automatisch mit der TcMDP.lib eingebunden.

2. Programmstruktur

Der Zustand der Compact Flash Karte wird von einem Parameter im MDP repräsentiert. Um diesen einzelnen Parameter abzufragen, muss die dynamische Modul ID des Moduls bekannt sein, in dem sich der Parameter befindet.

Mit dem Funktionsbaustein FB_MDP_ScanModules muss diese dynamische Modul ID ermittelt werden.

Daraufhin kann mit dem Funktionsbaustein FB_MDP_Read der Parameter abgefragt werden.

Erzeugen Sie für diesen Ablauf im MAIN Programm eine Zustandsmaschine.

Beispiel 2:

3. Dynamische Modul ID ermitteln

Fügen Sie den MDP Funktionsbaustein FB_MDP_ScanModules ein (F2 drücken).

Beispiel 3:

Im Zustand 1 starten Sie den Funktionsbaustein, indem Sie am Eingang bExecute TRUE definieren.
Bei nModuleType wird der Enumerationswert eMDP_ModT_SiliconDrive angegeben, welcher Zugriff auf Informationen von Compact Flash Karten erlaubt. Weitere Informationen zu diesem Modul: allgemeine Informationen zum MDP Modul SiliconDrive
Den Eingang iModIdx müssen Sie nicht belegen. Sie rufen so automatisch das erste gefundene Modul des gewählten Modultypen auf (default: iModIdx := 0).
Ebenso müssen Sie den Eingang tTimeout nicht belegen, sondern können mit dem Default (DEFAULT_ADS_TIMEOUT) arbeiten.

1: (* Scan for module *)
    FB_MDP_ScanModules(
        bExecute:= TRUE,
        nModuleType:= eMDP_ModT_SiliconDrive,
        iModIdx:= ,
        tTimeout:= ,

        bBusy=> ,
        bError=> ,
        nErrID=> ,
        nDynModuleId=> ,
        iModuleTypeCount=> ,
        iModuleCount=>
    );

Im Zustand 2 rufen Sie diesen Funktionsbaustein zyklisch mit dem Eingang bExecute FALSE auf. Der Funktionsbaustein wird so lange in diesem Zustand aufgerufen, wie er nicht mit der Bearbeitung der Abfrage beschäftigt ist.
Sobald der Ausgang bBusy FALSE ist, kann in den nächsten Zustand übergegangen werden.

Ihr Programm sollte nun folgendermaßen aussehen:

Beispiel 4:

4. Abfrage des MDP Parameters

Der MDP Parameter den Sie abfragen möchten ist befindet sich in einer bestimmten Tabelle.
Diese wiederum befindet sich in einem bestimmten Modul, welches einer Area angehört.
Diese Werte entnehmen Sie der MDP Beschreibung:

Beispiel 5:

Ausschnitt aus den allgemeinen Informationen zum MDP Modul SiliconDrive.

Zur Abfrage eines MDP Elementes deklarieren Sie eine Instanz des Funktionsbausteines FB_MDP_Read.
Ebenso deklarieren Sie eine Variable iDriveUsage, wobei es sich um eine Unsigned16 Variable handelt.

    fbReadMDP       : FB_MDP_Read;
    iDriveUsage     : UINT;

Die ermittelten Werte für den gesuchten MDP Parameter übergeben Sie dem Funktionsbaustein. Dazu wählen Sie die Eingangsvariable stMDP_DynAddr vom Typ ST_MDP_Addr des Funktionsbausteines und weisen die Werte zu.

3: (* Request MDP Element *)
    fbReadMDP.stMDP_DynAddr.nArea       := eMDP_Area_ConfigArea;
    fbReadMDP.stMDP_DynAddr.nModuleId   := fbScanMDP.nDynModuleId;
    fbReadMDP.stMDP_DynAddr.nTableId    := 1;
    fbReadMDP.stMDP_DynAddr.nSubIdx     := 2;

Im Zustand 3 rufen Sie des Weiteren den Funktionsbaustein auf und starten ihn, indem Sie am Eingang bExecute TRUE anlegen.
Den Eingang stMDP_DynAddr haben Sie bereits explizit zugewiesen.
Als Datenpuffer geben Sie bei pDstBuf und cbDstBufLen die Adresse und die Länge Ihrer Variablen iDriveUsage an.
Wie bei obigem Funktionsbaustein müssen Sie den Eingang tTimeout nicht belegen, sondern können mit dem Default (DEFAULT_ADS_TIMEOUT) arbeiten.

Der Programmteil sollte nun folgendermaßen aussehen:

Beispiel 6:

5. Test

Kompilieren Sie das erstellte PLC-Programm.
Stellen Sie sicher, dass sich TwinCAT auf dem gewünschten System im Run Modus befindet.
Führen Sie von TwinCAT PLC Control aus einem Login auf dem gewünschten Run-Time System durch. Starten Sie das SPS-Programm.

Durch die Initialisierung von bStartRequest mit TRUE (siehe 2.Programmstruktur) werden alle Zustände der Zustandsmaschine zum Programmstart sofort einmalig ausgeführt.
In Ihrer Variablen iDriveUsage ist nun bei fehlerfreier Ausführung der abgefragte Wert abgelegt. Dieser Wert gibt in diesem Beispiel an, zu welchem Anteil in % die Compact Flash Karte bereits die statistisch mögliche Anzahl von Schreibzyklen vollzogen hat und ist somit eine sinnvolle Information bzgl. der Lebensdauer Ihrer CF-Karte.
Falls Sie dieses Beispiel durchgeführt haben mit dem Ziel die CPU-Auslastung abzufragen, befindet sich nun in Ihrer Variablen die Auslastung der CPU in %.

Um die komplette Abfrage erneut zu starten, setzen Sie Ihre Variable bStartRequest erneut auf TRUE (beispielsweise per Online Write).

Dieses Beispiel kann auch als allgemeine Anleitung dienen. Auf analoge Weise lässt sich jeder MDP Parameter aus einem MDP Modul abfragen.

Zum Speichern dieses Beispielprogramms hier klicken:
TcPlcMDP_Sample.zip.

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v2.11.0 Build >= 1541

PC oder CX (x86, ARM)

TcMDP.Lib