H-Datei und C-Datei für Funktionsbausteine mit VAR_IN_OUT aktualisieren

Dieser Artikel ist nur dann für Sie relevant, wenn Sie C-Funktionsbausteine mit →Ein-/Ausgangsvariablen (= VAR_IN_OUT-Variablen) in einer logi.CAD 3 < Version 3.1.0 erstellt haben! Wenn Sie solche C-Funktionsbausteine erstellt haben, müssen Sie Abschnitte innerhalb der entsprechenden H-Datei und/oder der C-Datei wie im Folgenden beschrieben aktualisieren.

Dieser Artikel ist nicht relevant, wenn:

  • Ihre C-Funktionsbausteine keine Ein-/Ausgangsvariablen enthalten.

  • Sie nur C-Funktionen erstellt haben.

  • Sie C-Funktionsbausteine mit Ein-/Ausgangsvariablen in logi.CAD 3- Version 3.1.0 (oder später) erstellt haben.

Grund für die Aktualisierung

Die Aktualisierung ist erforderlich, da sich der Code, der für die Ein-/Ausgangsvariablen (= VAR_IN_OUT-Variablen) innerhalb eines Funktionsbausteins nötig ist, in der Version 3.1.0 geändert hat. Im Gegensatz dazu: Der C-Code für die Ein-/Ausgangsvariablen innerhalb einer Funktion hat sich nicht geändert.

Ohne die aktualisierten H-/C-Dateien kann eine Anwendung, die diese Funktionsbausteine verwendet, in logi.CAD 3-Version 3.1.0 (oder später) nicht erstellt werden. Stattdessen werden wahrscheinlich Compilerfehler auftreten.

Bevor Sie mit der Aktualisierung der Dateien beginnen, sollten Sie eine Sicherungskopie der Dateien erstellen. Falls Sie versehentlich Code in den Dateien löschen, können Sie zu Ihrem ursprünglichen Code zurückkehren.

Die erforderlichen Änderungen in Kürze
  • Betreffend die H-Datei: Der Code für VAR_IN_OUT-Variablen wird so generiert, wie er für VAR_INPUT-Variablen mit REF_TO generiert wird.
    Das bedeutet, dass VAR_IN_OUT-Variablen als Pointer innerhalb der Instanzdatenstruktur des Funktionsbausteins angeführt werden (wie VAR_INPUT-Variablen mit REF_TO). In früheren Versionen mussten sie direkt mit dem Aufruf übergeben werden.

  • Betreffend die C-Datei: Wenn Sie eine VAR_IN_OUT-Variable verwenden, schreiben Sie *(LC_this->LC_VD_in-out-variable) anstatt von: (*LC_VD_in-out-variable)

Wenn Sie mehr Informationen benötigen, veranschaulichen die folgenden Beispiele die erforderlichen Änderungen im Detail:

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Wenn Sie noch unsicher sind, wie Sie Ihre H- und C-Dateien aktualisieren müssen, empfiehlt logi.cals, ein ST-Objekt mit einem neuen Namen zu erstellen, das die erforderliche Schnittstelle enthält (wie unter "Details: Vendor-Baustein erstellen" beschrieben). Beim Speichern dieses ST-Objekts, das die Ein-/Ausgangsvariablen enthält, erzeugt logi.CAD 3 die H-/C-Datei mit den erforderlichen Implementierungs-Stubs. Ersetzen Sie dann den Code in Ihren bestehenden H-/C-Dateien durch den automatisch generierten Code.

Beispiel für das Aktualisieren der H-Datei

Die folgende Schnittstelle deklariert einen Funktionsbaustein mit einer Ein-/Ausgangsvariable vom Datentyp INT.

Beispiel für eine Schnittstelle
{CustomImplementation}
FUNCTION_BLOCK MyFB_IO1
{ ImplementationProperties (functionHasCFile; ) }
VAR_IN_OUT
IO1 : INT;
END_VAR
VAR_OUTPUT
OUT1 : INT;
END_VAR
END_FUNCTION_BLOCK

Die folgenden Zeilen sind in der H-Datei erforderlich, damit logi.CAD 3 die Anwendung in Version 3.1.0 (oder höher) erstellen kann. Die Zeilen /* ... */ sind lediglich Kommentare, die zur Erläuterung der Struktur hinzugefügt wurden.
images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Beachten Sie, dass die Reihenfolge der Variablen in der H-Datei für Vendor-Bausteine anders ist als die Reihenfolge der Variablen in der H-Datei für ST-/FBS-Objekte. Die erforderliche Reihenfolge für Variablen in einem Vendor-Funktionsbausteins ist: VAR_INPUTVAR_IN_OUTENOVAR_OUTPUTVAR – Hilfsvariablen, die für den Benutzer nicht sichtbar sind Die Reihenfolge kann relevant werden, wenn eine Anwendung mit Hilfe des Ressourcenmanagers aktualisiert (= neu geladen) wird.

Beispiel für aktualisierte H-Datei
#include <LC3CGBase.h>
 
/* type definition */
typedef struct _LC_TD_FunctionBlock_MYFB_IO1
{
LC_TD_INT (*LC_VD_IO1); /* NEW: pointer to VAR_IN_OUT variable */
LC_TD_BOOL LC_VD_ENO;
LC_TD_INT LC_VD_OUT1;
} LCCG_StructAttrib LC_TD_FunctionBlock_MYFB_IO1;
 
/* ColdBoot Initialization macro */
#define LC_INIT_FunctionBlock_MYFB_IO1(p) \
{ \
LC_INIT_PTR(&((p)->LC_VD_IO1)); \ /* NEW: initialization of pointer to VAR_IN_OUT variable */
LC_INIT_INT(&((p)->LC_VD_OUT1)); \
}
 
/* WarmBoot Initialization Macro */
#define LC_WINIT_FunctionBlock_MYFB_IO1(p,RF) \
{ \
LC_WINIT_PTR(&((p)->LC_VD_IO1),RF); \ /* NEW: initialization of pointer to VAR_IN_OUT variable */
LC_WINIT_INT(&((p)->LC_VD_OUT1),RF); \
}
 
/* implementation - Observe that the following line must be changed as well: The part 'LC_TD_INT (*LC_VD_IO1), ' is not needed here because of the new line in the type definition. */
void lcfu___MYFB_IO1(LC_TD_FunctionBlock_MYFB_IO1* LC_this, struct _lcoplck_epdb_1_impl* pEPDB);

Hier der Inhalt der H-Datei, der in logi.CAD 3-Versionen < 3.1.0 benötigt wird:

Beispiel für vorherige H-Datei
#include <LC3CGBase.h>
 
/* type definition */
typedef struct _LC_TD_FunctionBlock_MYFB_IO1
{
LC_TD_BOOL LC_VD_ENO;
LC_TD_INT LC_VD_OUT1;
} LCCG_StructAttrib LC_TD_FunctionBlock_MYFB_IO1;
/* ColdBoot Initialization Macro */
#define LC_INIT_FunctionBlock_MYFB_IO1(p) \
{ \
LC_INIT_INT(&((p)->LC_VD_OUT1)); \
}
 
/* WarmBoot Initialization Macro */
#define LC_WINIT_FunctionBlock_MYFB_IO1(p,RF) \
{ \
LC_WINIT_INT(&((p)->LC_VD_OUT1),RF); \
}
 
/* Implementation */
void lcfu___MYFB_IO1(LC_TD_FunctionBlock_MYFB_IO1* LC_this, LC_TD_INT (*LC_VD_IO1), struct _lcoplck_epdb_1_impl* pEPDB);

Beispiel für das Aktualisieren der C-Datei beim Aufruf des Vendor-Funktionsbausteins

Die Anwendung ruft den angegebenen Vendor-Funktionsbaustein MyFB_IO1 auf.

Beispiel für eine Schnittstelle
PROGRAM Test1
VAR
iMyFB_IO1 : MyFB_IO1;
Var1 : BOOL := TRUE;
Var2 : INT := 22;
Var3 : INT := 33;
Out1a, Out2a : INT;
Out1b, Out2b : INT;
END_VAR
iMyFB_IO1(EN:=TRUE, IO1:=Var2, IO1 => Out1a, OUT1 => Out1b);
iMyFB_IO1(EN:=Var1, IO1:=Var3, IO1 => Out2a, OUT1 => Out2b);
END_PROGRAM

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg logi.CAD 3 erstellt automatisch die C-Datei für Test1.
Falls Sie solche Funktionsbausteine in Ihrer C-Datei aufrufen müssen, sind die folgenden Zeilen in der C-Datei in logi.CAD 3-Version 3.1.0 (oder später) erforderlich, da die Pointer-Variablen vor dem Aufruf in der Instanzdatenstruktur zugewiesen werden müssen.

Beispiel für aktualisierte C-Datei (Auszug)
/* Programs */
void lcpu___TEST1(LC_TD_Program_TEST1* LC_this, struct _lcoplck_epdb_1_impl* pEPDB)
{
{
if ((LC_this->LC_VD_IMYFB_IO1.LC_VD_ENO = LC_EL_true) != LC_EL_false)
{
LC_this->LC_VD_IMYFB_IO1.LC_VD_IO1 = &LC_this->LC_VD_VAR2; // NEW LINE
lcfu___MYFB_IO1(&(LC_this->LC_VD_IMYFB_IO1), pEPDB); // CHANGED LINE
LC_this->LC_VD_OUT1A = LC_this->LC_VD_VAR2;
LC_this->LC_VD_OUT1B = LC_this->LC_VD_IMYFB_IO1.LC_VD_OUT1;
}
}
{
if ((LC_this->LC_VD_IMYFB_IO1.LC_VD_ENO = LC_this->LC_VD_VAR1) != LC_EL_false)
{
LC_this->LC_VD_IMYFB_IO1.LC_VD_IO1 = &LC_this->LC_VD_VAR3; // NEW LINE
lcfu___MYFB_IO1(&(LC_this->LC_VD_IMYFB_IO1), pEPDB); // CHANGED LINE
LC_this->LC_VD_OUT2A = LC_this->LC_VD_VAR3;
LC_this->LC_VD_OUT2B = LC_this->LC_VD_IMYFB_IO1.LC_VD_OUT1;
}
}
}

Hier der Inhalt der C-Datei, der in logi.CAD 3-Versionen < 3.1.0 benötigt wird:

Beispiel für vorherige C-Datei (Auszug)
/* Programs */
void lcpu___TEST1(LC_TD_Program_TEST1* LC_this, struct _lcoplck_epdb_1_impl* pEPDB)
{
{
if ((LC_this->LC_VD_IMYFB_IO1.LC_VD_ENO = LC_EL_true) != LC_EL_false)
{
lcfu___MYFB_IO1(&(LC_this->LC_VD_IMYFB_IO1), &LC_this->LC_VD_VAR2, pEPDB);
LC_this->LC_VD_OUT1A = LC_this->LC_VD_VAR2;
LC_this->LC_VD_OUT1B = LC_this->LC_VD_IMYFB_IO1.LC_VD_OUT1;
}
}
{
if ((LC_this->LC_VD_IMYFB_IO1.LC_VD_ENO = LC_this->LC_VD_VAR1) != LC_EL_false)
{
lcfu___MYFB_IO1(&(LC_this->LC_VD_IMYFB_IO1), &LC_this->LC_VD_VAR3, pEPDB);
LC_this->LC_VD_OUT2A = LC_this->LC_VD_VAR3;
LC_this->LC_VD_OUT2B = LC_this->LC_VD_IMYFB_IO1.LC_VD_OUT1;
}
}
}

Beispiel für das Aktualisieren der C-Datei bei der Zuweisung von Werten an die Ein-/Ausgangsvariablen

Die folgende Schnittstelle deklariert einen Funktionsbaustein mit 2 Ein-/Ausgangsvariablen vom Datentyp INT.

Beispiel für eine Schnittstelle
{CustomImplementation}
FUNCTION_BLOCK fb_inoutvars
{ ImplementationProperties (functionHasCFile; ) }
VAR_IN_OUT
IO1 : INT;
IO2 : INT;
END_VAR
VAR
Var1 : INT;
END_VAR
END_FUNCTION_BLOCK

Innerhalb eines ST-Objekts wären die folgenden Zuweisungen möglich (nicht jedoch innerhalb des ST-Objekts mit {CustomImplementation}):

Beispiel für geplanten ST-Code
IO1 := 2;
Var1 := IO2;

Falls Sie solche Zuweisungen in Ihrer C-Datei benötigen, sind die folgenden Zeilen in der C-Datei in logi.CAD 3-Version 3.1.0 (oder später) erforderlich.

Beispiel für aktualisierte C-Datei (Auszug)
*(LC_this->LC_VD_IO1) = (LC_TD_INT)2;
LC_this->LC_VD_VAR1 = *(LC_this->LC_VD_IO2);

Dies ist erforderlich, da die Ein-/Ausgangsvariablen jetzt Pointer innerhalb der LC_this-Struktur sind und entsprechend dereferenziert werden müssen.

Hier der Inhalt der C-Datei, der in logi.CAD 3-Versionen < 3.1.0 benötigt wird:

Beispiel für vorherige C-Datei (Auszug)
(*LC_VD_IO1) = (LC_TD_INT)2;
LC_this->LC_VD_VAR1 = *(LC_VD_IO2);