Anwenden des TcCOM-Wrapper-FB

Es gibt zwei Wege, ein TcCOM-Objekt aus der SPS aufzurufen:

1. Referenzieren einer statischen Objekt-Instanz
2. Dynamisches Instanziieren eines Objekts aus der SPS
Für beide Wege wird der TcCOM-Wrapper-Funktionsblock aus der generierten SPS-Bibliothek verwendet.

Konfiguration des TcCOM-Wrapper-Funktionsblocks in Simulink®

Navigieren Sie zu: Configuration Parameters > Code Generation > TC TcCom Wrapper. Aktivieren Sie hier die Checkbox TcCom Wrapper FB. In der Standardkonfiguration ist die Checkbox nicht gesetzt. Über die Checkbox TcCom Wrapper FB properties können Sie konfigurieren, ob die Modellparameter am Funktionsblock als Properties erstellt werden sollen.

Anwenden des TcCOM-Wrapper-FB 1:

Im configuration level “advanced” kann auch das Monitoring-Attribut der Properties präzisiert werden. Im Standardfall ist „No Monitoring“ eingestellt, d. h. es wird kein Attribut gesetzt.

Einstellung in Simulink®

Attribut am Property

ExecutionUpdate

{attribute 'monitoring' := 'variable'}

CyclicUpdate

{attribute 'monitoring' := 'call'}

Monitoring Attribute beeinflussen die Sichtbarkeit der Attribut-Werte im Online-View, d. h. wenn man sich in die SPS eingeloggt hat und die aktuellen Werte der Properties am FB beobachten möchte.

Für weitere Details siehe auch SPS-Bibliothek erzeugen und installieren bzw. Create the TcCOM-Wrapper-FB.

Instanz des TcCOM-Wrapper-Funktionsblock erzeugen

1. Erstellen Sie ein SPS-Projekt.
2. Fügen Sie die gewünschte Bibliothek unter References hinzu.
Anwenden des TcCOM-Wrapper-FB 2:
Sie erhalten unter Pous/TcCOM Wrapper einen Funktionsblock, den Sie in der SPS instanziieren können. Darüber hinaus werden notwendige Datentypen im Ordner Duts angelegt.

Variante 1: Referenzieren einer statischen Modul-Instanz

Der Funktionsblock kann genutzt werden, um auf vorher im XAE, z. B. unter System > TcCOM Objects angelegte Modulinstanzen, zuzugreifen. Für diesen statischen Fall muss die Objekt-ID der entsprechenden Modulinstanz bei der Deklaration der Funktionsblock-Instanz übergeben werden.

Anwenden des TcCOM-Wrapper-FB 3:
  • Die Instanz des TcCOM-Objekts und die aufrufende SPS müssen in derselben Task laufen.
  • Auf der Instanz des TcCOM-Objekts ist darauf zu achten, dass unter Parameter (Init) der Eintrag ModuleCaller auf Module steht und nicht auf CyclicTask.
  • Der benötigte Speicher für das TcCOM wird in diesem Fall aus dem non paged pool des Systems bezogen.

Deklaration

// link wrapper with a static instance 
InitStrStatic      : ST_FB_TempCtrl_TcCOM_InitStruct := (noid := 16#01010010);   // OID from object1 in System > TcCOM Objects
fbTempCtrStatic    : FB_TempCtrl_TcCOM_InitStruct(InitStrStatic);
Inputs             : ST_TempCtrl_U_T;      // data type defined in TempCtrl library
Outputs            : ST_TempCtrl_Y_T;

Ausführungs-Code

fbTempCtrStatic(stTempCtrl_U := Inputs, stTempCtrl_Y => Outputs);

Variante 2: Dynamisches Instanziieren und Referenzieren aus der SPS

Der Funktionsblock kann auch so genutzt werden, dass ein TcCOM-Objekt aus der SPS heraus erzeugt und mit dem Wrapper verknüpft wird.

Anwenden des TcCOM-Wrapper-FB 4:
  • Über die TaskOid der SPS Task muss angegeben werden, in welcher Echtzeit-Task der Wrapper aufgerufen wird.
  • Der ModuleCaller muss auch hier (über die Init Struktur) auf Module eingestellt werden.
  • Der benötigte Speicher für das TcCOM wird in diesem Fall aus dem Router Memory bezogen.

Deklaration

// dynamic instance: create TcCOM from PLC
InitStrDyn          : ST_FB_TempCtrl_TcCOM_InitStruct := (
                        nTaskOid      := 16#02010030,             // take TaskOID of PlcTask
                        eModuleCaller   := E_ModuleCaller.Module );      // set module caller to "call by module"
fbTempCtrDyn        : FB_TempCtrl_TcCOM_InitStruct(InitStrDyn);
OutputsDyn          : ST_TempCtrl_Y_T;

Ausführungs-Code

fbTempCtrDyn(stTempCtrl_U := Inputs, stTempCtrl_Y => OutputsDyn);
Anwenden des TcCOM-Wrapper-FB 5:

Der Quellcode zur oben gezeigten Grafik ist verfügbar in MATLAB® über das Command Window

TwinCAT.ModuleGenerator.Samples.Start("TcCOM Wrapper Function Blocks")

Arbeiten mit den Properties des TcCOM-Wrapper-FB

Properties am FB bieten eine einfache Möglichkeit, mit Modul-Parametern eines TcCOM zu interagieren, siehe auch Best Practice: Zugriff auf Daten des TcCOM.

Beispiel

Durch Setzen des Parameter: Initial Values unter Tc TcCom Interfaces werden die Modell-Parameter als Modul-Parameter angelegt (standardmäßig eingeschaltet). Erzeugen Sie nun den „TcCom Wrapper FB“ mit der Option „TcCom Wrapper FB properties“. Setzen Sie das property monitoring auf „CyclicUpdate“, um die Wert-Änderung des Property im Online-View direkt sehen zu können.

Dann können Sie beispielsweise wie folgt auf die Modul-Parameter zugreifen:

PROGRAM MAIN
VAR
   
   // dynamic instance: create TcCOM from PLC
   InitStrDyn : ST_FB_TempCtrl_TcCOM_InitStruct_InitStruct := (
                     nTaskOid:= 16#02010030,                    // take TaskOID of PlcTask
                     eModuleCaller:= E_ModuleCaller.Module );   // set module caller to "call by module"
   fbTempCtrDyn : FB_TempCtrl_TcCOM_InitStruct(InitStrDyn);
   
   Outputs    : ST_TempCtrl_Y_T;   // output
   Inputs     : ST_TempCtrl_U_T;   // input
   Parameters : ST_P_TempCtrl_T;      // parameter

   bChange: BOOL;
END_VAR
fbTempCtrDyn(stTempCtrl_U := Inputs, stTempCtrl_Y => OutputsDyn);

IF bChange THEN
   Parameters.Kp := 10;
   fbTempCtrDyn.stTempCtrl_P := Parameters;
END_IF

Arbeiten mit dem ADI Interface

WARNUNG

Uneingeschränkter Lese- und Schreibzugriff

Über das ITc_ADI Interface bekommen Sie einen Pointer auf den Speicherbereich einer DataArea. Entsprechend können Sie dort uneingeschränkt lesen und schreiben.

Im Folgenden ist ein Beispiel dargestellt, wie man lesend auf die DataArea des BlockIO zugreifen kann:

stInitTemp : ST_Funktionsblock_SimpleTempCtrl_TcCOM_InitStruct := (nOid := 16#01010010);
FunktionsblockTempCtr  : Funktionsblock_SimpleTempCtrl_TcCOM_InitStruct(stInitTemp);   
stTempCtr_BlockIO  : ST_B_SimpleTempCtrl_T;
pStTempCtr_BlockIO : POINTER TO ST_B_SimpleTempCtrl_T;
hr : HRESULT;
(* read data are via ADI Interface *)
// get a pointer to Data Area
hr := FunktionsblockTempCtr.ipADI.GetImagePtr(size := SIZEOF(stTempCtr_BlockIO), offs := 0, adi_x := 2, ppData := ADR(pStTempCtr_BlockIO));
IF hr = 0 THEN
   // copy data to a local variable
   MEMCPY(ADR(stTempCtr_BlockIO), pStTempCtr_BlockIO, SIZEOF(stTempCtr_BlockIO));
   // always release the pointer!
   FunktionsblockTempCtr.ipADI.ReleaseImagePtr(pData := pStTempCtr_BlockIO);
END_IF;
Anwenden des TcCOM-Wrapper-FB 6:

Der Methode GetImagePtr werden unter anderem adi_x und offs übergeben. Diese bestimmen die DataArea an sich, in diesem Fall DataArea Nummer 2 (SimpleTempCtrl_B), und den Datenbereich in der Area, der gelesen/geschrieben werden soll, in diesem Fall ohne Offset und die gesamte Größe der DataArea (also die gesamte DataArea).

Beim Schreiben sind im obigen Beispiel entsprechend beim MEMCPY die Quelle und das Ziel zu tauschen.

Für weitere Hinweise zur Interaktion mit dem TcCOM beachten Sie Best Practice: Zugriff auf Daten des TcCOM.