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.
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.
- No Monitoring: Die Werte sind im Online-View nicht sichtbar.
- Cyclic Update: Die Werte der Properties werden zyklisch aktualisiert und angezeigt.
Im eingeloggten Zustand in der SPS wird dadurch zusätzlicher Code ausgeführt. - Execution Update: Die Werte der Properties werden nur dann im Online-View aktualisiert, wenn im Ausführungscode getter-/setter-Methoden für die Properties aufgerufen werden. Dieses führt schnell zu Irritationen und ist nur in seltenen Fällen relevant.
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.
- 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.
|
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.
|
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);
Der Quellcode zur oben gezeigten Grafik ist verfügbar in MATLAB® über das Command Window
|
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;
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.