Eigenschaften für das Implementieren von Vendor-Bausteinen

Dieser Artikel enthält Anweisungen, die bei der Erstellung von Vendor-Bausteinen verwendet werden können – insbesondere die Anweisungen zur Erstellung der Schnittstelle des Vendor-Bausteins. Außerdem gibt es einige Beispiele, die einige der Möglichkeiten für die Schnittstelle illustrieren.

Information zum Vendor-Baustein

Die Schnittstelle eines Vendor-Bausteins (= Vendor-→Funktionsbaustein oder Vendor-→Funktion) wird in einem ST-Objekt erstellt, während die Implementierung eines Vendor-Bausteins in →C erstellt wird.
Üblicherweise wird ein Vendor-Baustein in einer eigenen Bibliothek bereitgestellt. Es ist aber möglich, einen Vendor-Baustein nur in dem Projekt zu verwenden, in dem der Vendor-Baustein erstellt wurde.

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/error.svg Einschränkungen: Die folgenden Variablen werden in der Schnittstelle eines Vendor-Bausteins nicht unterstützt:

  • →temporäre Variablen (VAR_TEMP...END)
    Falls temporäre Variablen ohne speicherndes Verhalten für einen Vendor-Baustein benötigt werden, werden diese am besten in der Implementierungsfunktionalität erstellt .

  • →externe Variablen (VAR_EXTERNAL...END)

Zusätzlich werden →Methoden nicht für die Implementierung eines Vendor-Bausteins unterstützt.

Bitte beachten Sie:

  • Dieser Artikel enthält eine Referenzdokumentation der Anweisungen, die für die Erstellung der Schnittstelle von Vendor-Bausteinen vorgesehen sind. Natürlich werden Sie auch andere Anweisungen verwenden müssen – zum Beispiel die Abschnitte VAR_INPUT ... END_VAR, VAR_OUTPUT ... END_VAR, VAR_IN_OUT ... END_VAR. Informationen zu diesen Möglichkeiten (oder zu anderen, hier nicht aufgeführten Anweisungen) finden Sie unter "Unterstützte ST-Syntax".

  • Die folgenden Dateien werden für die Implementierung benötigt:

    Datei

    Inhalt

    die H-Datei

    Datentyp für den Vendor-Baustein, Initialisierungsmakros (INIT, WINIT) und – falls keine C-Datei verwendet wird – die Implementierung (in der Regel durch ein Makro)
    Siehe "Die Struktur der benötigten H-Datei" für den grundlegenden Aufbau einer H-Datei.

    eine optionale C-Datei

    die Implementierung (falls die Implementierung nicht in der H-Datei realisiert ist)

    Alle C-Dateien werden beim Erstellen der Anwendung angehängt, so dass eine C-Datei zum Kompilieren verwendet wird. Daher können die einzelnen C-Dateien auch Auswirkungen auf andere C-Dateien haben. logi.cals empfiehlt, einen Define am Ende der C-Datei zurückzusetzen, falls der Define nur für eine C-Datei gültig ist.

    Die Tatsache, ob eine C-Datei verwendet wird, wird durch die Definition functionHasCFile innerhalb der Anweisung { ImplementationProperties ( ) } gesteuert. Siehe unten für weitere Informationen.

    optionale O-Dateien und/oder lib-Dateien

    Die Tatsache, ob Dateien für zusätzliche Objekte und/oder Bibliotheken verwendet werden, wird durch die Definitionen additionalObjects und additionalLibraries innerhalb der Anweisung { ImplementationProperties ( ) } gesteuert. Siehe unten für weitere Informationen.

    Die Erstellung des Inhalts der H-Datei und der C-Datei geht über den Rahmen dieses Artikels hinaus. Im Artikel "Details: Vendor-Baustein erstellen" finden Sie eine Anleitung zur Erstellung der Implementierungs-Stubs in der C-/H-Datei.

  • Die Anweisungen {...} werden in der IEC-Norm auch als →Pragma bezeichnet. Die folgenden Anweisungen können Ganzzahlliterale oder →Zeichenfolge-Literale in Pragmas enthalten. Zeichenfolge-Literale in Pragmas können sowohl in das doppelte Anführungszeichen " als auch in das einfache Anführungszeichen ' eingeschlossen werden. Der Einfachheit halber wird in diesem Artikel für die meisten Zeichenfolge-Literale in Pragmas das doppelte Anführungszeichen " verwendet.

Allgemeine Anweisungen

Sie müssen eine der folgenden Anweisungen als erste Zeile des ST-Objekts einfügen, das die Schnittstelle des gewünschten Vendor-Bausteins enthält.

Anweisung

Zweck

{CustomImplementation}

Diese Anweisung macht den Baustein zum Vendor-Baustein, der für eine Bibliothek verwendet werden soll.
images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Aufgrund dieser Anweisung bezeichnet logi.cals die Vendor-Bausteine in C-Code auch als CustomImpl-Bausteine in der Umgangssprache.

Diese Anweisung hat die folgenden Auswirkungen:

  • logi.CAD 3 legt keine C- und H-Datei im Unterordner src-gen an (wie es logi.CAD 3 automatisch machen würde). Stattdessen benötigt logi.CAD 3 die entsprechenden Dateien im Unterordner src-code (parallel zum ST-Objekt mit der Schnittstelle). Eine Anleitung finden Sie im Artikel "Details: Vendor-Baustein erstellen".

  • Falls Sie den Vendor-Baustein in einer Bibliothekskonfiguration angeben, werden die H- und C-Dateien standardmäßig automatisch in die Bibliothek integriert. Falls die Bibliothek mit dem Vendor-Baustein bereitgestellt wird, ist es nicht möglich, eine Bibliotheksvariante für den Vendor-Baustein zu erstellen.

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Falls Sie eine C-Datei verwenden wollen, geben Sie in der Anweisung { ImplementationProperties ( ) } zusätzlich die Definition functionHasCFile an. Weitere Informationen finden Sie weiter unten.

{CustomImplementation, CustomNameSpace := Name}

CustomNameSpace := Name ist ein optionaler Teil, mit dem Sie den Code für den Baustein besser identifizieren können

Beachten Sie: logi.cals empfiehlt die Verwendung der NAMESPACE ... END_NAMESPACE-Anweisungen für die Vendor-Baustein-Schnittstelle zu verwenden, um mögliche Konflikte mit anderen Bausteinen zu vermeiden. Siehe "Namespaces in ST" für Details zu diesen Anweisungen.
Falls Sie die NAMESPACE ... END_NAMESPACE-Anweisungen nicht verwenden wollen/können, fügen Sie am besten den Teil CustomNameSpace := Name hinzu. Damit ist es nicht möglich, Konflikte mit anderen Bausteinen zu vermeiden. Da aber der Name, der bei CustomNameSpace vergeben wird, in den Dateinamen der H-/C-Datei und in den H-/C-Code selbst einfliesst, ist es Ihnen möglich, den Code für den Vendor-Baustein besser zu identifizieren zu können.

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Der Name, der bei der optionalen Definition implementationName innerhalb der Anweisung { ImplementationProperties ( ) } vergeben wird (siehe unten für weitere Informationen), fliesst ebenfalls in den Dateinamen der H-/C-Datei ein.

Schnittstellen-Anweisungen

Geben Sie die Schnittstellen-Anweisungen an, um die Bausteinschnittstelle zu bestimmen (z. B. Hintergrundfarbe, Höhe/Breite).

Speichern Sie keine Änderungen, die Sie im Schnittstelleneditor durchgeführt haben.

Normalerweise verwenden Sie den Schnittstellen-Editor, um die Bausteinschnittstelle zu erstellen. Bei der Erstellung von Vendor-Bausteinen sollten Sie den Schnittstellen-Editor jedoch nur zur Überprüfung der Schnittstelle verwenden.
Falls Sie Änderungen im Schnittstellen-Editor speichern, kann es vorkommen, dass bereits vorhandene Anweisungen, die für den Vendor-Baustein benötigt werden, gelöscht/zerstört werden. Der Schnittstellen-Editor ist zur Zeit nicht in der Lage, alle Anweisungen für Vendor-Bausteine korrekt anzuzeigen/zu behandeln.

Syntax
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK name | FUNCTION name : data-type
USING Namespace_1; (* possible statement, if a namespace should be used *)
 
{ IO-name_1 { IO_definition_1, IO_definition_2, IO_definition_3 };
IO-name_2 { IO_definition_1, IO_definition_2, IO_definition_3 };
...
Interface_definition_1;
Interface_definition_2;
...
};
 
{ ImplementationProperties (...) };
VAR | VAR_INPUT | VAR_OUTPUT | VAR_IN_OUT | VAR_GLOBAL | VAR_EXTERNAL
...
END_VAR
END_FUNCTION_BLOCK | END_FUNCTION
END_NAMESPACE

Die Definitionen für EA { IO_definition_1, IO_definition_2, IO_definition_3 } werden auf die angegebene Variable des Vendor-Bausteins angewendet, z. B. IO-name_1. logi.CAD 3 unterstützt die Definitionen für EA für

In der folgenden Beschreibung wird der allgemeine Begriff "Variable" verwendet.

EA-Definition

Zweck

loc := "orientation"

bestimmt die Ausrichtung der angegebenen Variablen
Möglicher Wert für orientation: left, right, top oder bottom
Falls diese E/A-Definition fehlt, wird der Standardwert verwendet: left für Eingäng, right für Ausgänge
Beachten Sie:

  • Bei einer Ein-/Ausgangsvariable können Sie nur die Position ändern, aber nicht die Ausrichtung. Grund: Der Eingangsanschlusspunkt einer Ein-/Ausgangsvariablen darf nur auf der linken Bausteinkante positioniert werden, der Ausgangsanschlusspunkt wird automatisch auf der gegenüberliegenden Position der rechten Bausteinkante positioniert.

  • Es ist nicht möglich, die Position oder Ausrichtung eines Ergebniswerts der Funktion im Schnittstellen-Editor zu ändern.

index := #

bestimmt die Position der angegebenen Variablen
Möglicher Wert für #: ein ganzzahliger Wert, beginnend mit 0
Fehlt diese E/A-Definition, wird die nächste freie Position für die Position verwendet.

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Befindet sich die Variable außerhalb von height und width und fehlt die Definition expandableGUI, wird ein Aufruf des Bausteins, der in den FBS-Editor eingefügt wird, automatisch so vergrößert, dass der Aufruf alle Variablen enthält.

altName := "name"

bestimmt den alternativen Namen der angegebenen Variablen

Die Schnittstellen-Definitionen, z. B. Interface_definition_1, werden auf den Vendor-Baustein angewendet.

Schnittstellen-Definition

Zweck

height := #

bestimmt die Höhe des Bausteins, falls der Baustein in den FBS-Editor eingefügt wird
Möglicher Wert für #: ein ganzzahliger Wert – Falls keine Höhe angegeben wird, wird die Höhe des Bausteins automatisch berechnet.

width := #

bestimmt die Breite des Bausteins, falls der Baustein in den FBS-Editor eingefügt wird
Möglicher Wert für #: ein ganzzahliger Wert – Falls keine Breite angegeben wird, wird die Breite des Bausteins automatisch berechnet.

minHeight := #

bestimmt die Minimumhöhe des Bausteins – Nach dem Einfügen des Bausteins in den FBS-Editor kann der Baustein bis zu der angegebenen Minimumhöhe verkleinert werden.
Möglicher Wert für #: ein ganzzahliger Wert

maxHeight := #

bestimmt die Maximumhöhe des Bausteins – Nach dem Einfügen des Bausteins in den FBS-Editor kann der Baustein bis zu der angegebenen Maximumhöhe vergrößert werden.
Möglicher Wert für #: ein ganzzahliger Wert

minWidth := #

bestimmt die Minimumbreite des Bausteins – Nach dem Einfügen des Bausteins in den FBS-Editor kann der Baustein bis zu der angegebenen Minimumbreite verkleinert werden.
Möglicher Wert für #: ein ganzzahliger Wert

maxWidth := #

bestimmt die Maximumbreite des Bausteins – Nach dem Einfügen des Bausteins in den FBS-Editor kann der Baustein bis zu der angegebenen Maximumbreite vergrößert werden.
Möglicher Wert für #: ein ganzzahliger Wert

minInputs := #

bestimmt die Anzahl der Eingänge, die für die ordnungsgemäße Funktion des Vendor-Bausteins erforderlich sind
Möglicher Wert für #: ein ganzzahliger Wert

Eine Warnung wird ausgegeben, falls ein Bausteinaufruf in einen Editor eingefügt wird und im FBS-Editor zu wenig Eingänge des Bausteinaufrufs beschaltet sind oder im ST-Editor zu wenig Parameter für den Bausteinaufruf angegeben sind. Um die Warnung zu vermeiden, müssen Sie die erforderliche Anzahl von Eingängen oder zumindest den letzten Eingang beschalten oder angeben.
Im Falle von minInputs := 3 müssten Sie die ersten 3 Eingänge oder zumindest den 3. Eingang beschalten, um die Warnung zu vermeiden. Die Beschaltung des 3. Eingangs ist ausreichend, da logi.CAD 3 den nicht-beschaltete Eingängen der Standardausgangswert zuweist.

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Falls Sie diese Definition angeben, fügen Sie am besten die Definition expandableGUI auch ein. Die Definition expandable innerhalb der Anweisung { ImplementationProperties ( ) } könnte ebenfalls erforderlich sein (siehe unten für weitere Informationen).

fixedSize

bewirkt, dass der Baustein eine feste Größe hat
Falls ein Aufruf des Bausteins in einen FBS-Editor eingefügt wird, wird der Aufruf mit einer festen Größe (= die angegebene Höhe und Breite) eingefügt. Es ist nicht möglich, den Baustein zu verkleinern oder zu vergrößern.

In der Folge werden die Angaben für minHeight, maxHeight, minWidth und maxWidth ignoriert. Stattdessen werden nur die Angaben für height und width berücksichtigt.

hideIONames

verbirgt die Namen der Eingänge, Ausgänge, Ein-/Ausgänge und den Ergebniswert einer Funktion

hideOutputOfVarInOut

für Ein-/Ausgangsvariablen (= VAR_IN_OUT) angewendet, sodass Folgendes gilt:

logi.CAD 3 zeigt die Schnittstelle des Bausteins wie in logi.CAD/32 an. Das bedeutet, dass nur d er Eingangsanschlusspunkt der Ein-/Ausgangsvariablen in logi.CAD 3 angezeigt wird. Außerdem ist es möglich, dass andere Variablen auf der gegenüberliegenden Position des Eingangsanschlusspunkt angezeigt werden .
Siehe die Systemblöcke MOVE_2D_ARRAY und SEL_2D_ARRAY (in der Systembibliothek Standard bereitgestellt) für die Verwendung dieser Einstellung.

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Diese Einstellung wird automatisch übernommen, falls ein Baustein mit Ein-/Ausgangsvariablen von logi.CAD/32 nach logi.CAD 3 migriert wird. Der Schnittstellen-Editor bietet für diese Schnittstellenanweisung kein passendes GUI-Element.

altName := "name"

bestimmt den alternativen Namen für den Baustein

vNameAlignment := "value"

bestimmt die vertikale Ausrichtung des Bausteinnamens (oder des alternativen Namens für den Baustein)
Möglicher Wert für value:

  • top: Der Name wird am oberen Rand der Schnittstelle angezeigt, aber oberhalb des ersten möglichen Eingangs, Ausgangs, Ein-/Ausgangs oder .

  • baseline: Der Name wird am oberen Rand der Schnittstelle angezeigt, aber an der gleichen vertikalen Position wie der erste mögliche Eingang, Ausgang, Ein-/Ausgang oder EN/ENO (= auf der Grundlinie).

  • center: Der Name wird in der Mitte der Schnittstelle angezeigt.

  • bottom: Der Name wird am unteren Rand der Schnittstelle angezeigt.

Siehe die folgenden Beispiele für die Ausrichtung.
Fehlt diese Definition, wird der Standardwert center verwendet.

bgColor := "value"

bestimmt die Hintergrundfarbe des Bausteins
Möglicher Wert für value: ein Farben-Name laut https://www.w3schools.com/cssref/css_colors.asp

logi.cals empfiehlt, dass Sie und/oder Ihr Systemintegrator keine Gelb-Farbtöne bei der Gestaltung von FBS-Elementen verwenden, da " Gelb" für die Verfolgung von sicheren Signale beim Entwickeln von sicherheitsrelevanten Anwendungen verwendet wird. logi.CAD 3 prüft nicht, ob Farben bereits anderweitig verwendet werden. Die Verwendung von Gelb-Farbtönen durch Sie und/oder Ihren Systemintegrator könnte also zur Folge haben, dass "Gelb" dann auch eine nicht-sichere Logik kennzeichnet.

fgColor := "value"

bestimmt die Farbe des Bausteintextes; Mögliche Werte: siehe die Hintergrundfarbe des Bausteins

iofgColor := "value"

bestimmt die Farbe der Eingänge, Ausgänge, Ein-/Ausgänge und des Ergebniswertes einer Funktion; Mögliche Werte: siehe Hintergrundfarbe des Bausteins

expandableGUI

bestimmt, dass der Vendor-Baustein ein erweiterbarer Baustein ist, d.h. er kann um zusätzliche Ein-/Ausgänge erweitert werden ( falls der Baustein vergrößert wird)
Diese zusätzlichen Ein-/Ausgänge müssen sich auf einer Position zwischen der Minimumhöhe/-breite und der Maximumhöhe/-breite des Bausteins befinden. Ein eingefügter Aufruf wird nicht automatisch so vergrößert, dass alle Variablen angezeigt werden.

pageSize := "valuexvalue"

bestimmt die Seitengröße, falls die FBS-Logik im grafischen FBS-Editor angezeigt wird.
Diese Schnittstellen-Definition ist für die Schnittstelle der Vendor-Bausteine nicht relevant.

instanceName := {definitions};

bestimmt das Layout des Instanznamens für eine Funktionsbaustein-Instanz
Beispiel: instanceName := {visible, position := "manual", x := 0, y := 20, width := 300, height := 20, bgColor := "beige", fgColor := "black", border};
Mögliche Definitionen sind:

  • visible: bewirkt, dass der Instanzname angezeigt wird; Ohne dieser Definition wird der Instanzname nicht angezeigt.
    images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Die Anweisung instanceNameVisible wurde in logi.CAD 3-Versionen < 2.9.0 verwendet und wird nicht mehr unterstützt.

  • position: bestimmt, ob der angezeigte Instanzname oberhalb des oberen Bausteinrandes oder innerhalb der Schnittstelle angezeigt wird; Mögliche Werte:: top oder manual

  • x und y: bestimmt, wo der Instanzname innerhalb der Schnittstelle angezeigt wird (wird nur bei position := "manual"; ausgewertet); Mögliche Werte sind Ganzzahl-Werte. Ohne dieser Definitionen wird der Instanzname beginnend in der linken oberen Ecke angezeigt.

  • width und height: bestimmt die Breite und Höhe für den angezeigten Instanznamen (wird nur bei position := "manual"; ausgewertet); Mögliche Werte sind Ganzzahl-Werte. Ohne dieser Definitionen wird die Standardgröße verwendet.
    Falls der Platz nicht ausreicht, um den kompletten Instanznamen anzuzeigen, wird der Instanzname abgeschnitten.

  • bgColor: bestimmt die Hintergrundfarbe für den angezeigten Instanznamen; Mögliche Werte: siehe Hintergrundfarbe des Bausteins

  • fgColor: bestimmt die Textfarbe für den angezeigten Instanznamen; Mögliche Werte: siehe Hintergrundfarbe des Bausteins

  • border: bewirkt, dass der Instanzname mit einem Rahmen angezeigt wird; Ohne dieser Definition wird kein Rahmen angezeigt.

  • alignment: bestimmt die Ausrichtung des Instanznamens; Ohne dieser Definition wird der Instanzname so ausgerichtet, wie wenn der Wert centered angegeben wird.
    Mögliche Werte für alignment: top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center oder bottom-right

valueFields := {definitions};

fügt Wertfelder für Eingänge innerhalb der Schnittstelle hinzu und bestimmt das Layout dieser Wertfelder
Beispiel für 2 Wertfelder: valueFields := {{x := 60, y := 0, width := 160, height := 19, variable := "in1", initValue := "5"}, {x := 90, y := 20, width := 80, height := 39, variable := "in2", initValue := "10", fgColor := "black", border}};
Mögliche Definitionen sind:

  • x und y: bestimmt, wo das Wertfeld angezeigt wird; Mögliche Werte sind Ganzzahl-Werte.

  • width und height: bestimmt die Breite und Höhe für das Wertfeld; Mögliche Werte sind Ganzzahl-Werte.

  • variable: legt fest, für welchen Eingang das Wertfeld gültig ist; Mögliche Werte sind Ganzzahl-Werte.

  • initValue: bestimmt den Inhalt des Wertfelde; Mögliche Werte sind Literale gemäß dem Datentyp der jeweiligen Eingangs.

  • fgColor: entspricht der gleichlautenden Definition für den Instanznamen

  • border: entspricht der gleichlautenden Definition für den Instanznamen

  • alignment: entspricht der gleichlautenden Definition für den Instanznamen; Ohne dieser Definition wird der Text innerhalb des Wertfeldes so ausgerichtet, als ob der Wert centered-left angegeben ist.

commentFields := {definitions};

fügt Kommentarfelder innerhalb der Schnittstelle hinzu und bestimmt das Layout dieser Kommentarfelder
Beispiel für 2 Kommentarfelder: commentFields := {{x := 40, y := 110, width := 200, height := 19, text := "comment 1", fgColor := "black", bgColor := "beige", border}, {x := 110, y := 150, width := 190, height := 19, text := "comment 2"}};Mögliche Definitionen sind:

  • x und y: bestimmt, wo das Kommentarfeld angezeigt wird; Mögliche Werte sind Ganzzahl-Werte.

  • width und height: bestimmt die Breite und Höhe für das Kommentarfeld; Mögliche Werte sind Ganzzahl-Werte.

  • text: bestimmt den Inhalt des Kommentarfelds

  • fgColor: entspricht der gleichlautenden Definition für den Instanznamen

  • bgColor: entspricht der gleichlautenden Definition für den Instanznamen

  • border: entspricht der gleichlautenden Definition für den Instanznamen

  • alignment: entspricht der gleichlautenden Definition für den Instanznamen; Ohne dieser Definition wird der Text innerhalb des Kommentarfeldes so ausgerichtet, als ob der Wert centered-left angegeben ist.

Beispiele mit Schnittstellen-Anweisungen

Die Schnittstelle der folgenden Beispiele...

sieht so aus:

Beispiel
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK myFB_01
{
IN1 {altName := "I1"};
IN2 {index := 2, altName := "I2"};
IN3 {index := 3, altName := "I3"};
IN4 {index := 4, altName := "I4"};
OUT {index := 1, altName := "O"};
minInputs := 2;
altName := "TST";
vNameAlignment := "center";
height := 58;
width := 100;
minWidth := 70;
maxWidth := 150;
bgColor := "DodgerBlue";
expandableGUI;
}
 
VAR_INPUT
IN1 : BOOL;
IN2 : BOOL;
IN3 : BOOL;
IN4 : BOOL;
END_VAR
VAR_OUTPUT
OUT : BOOL;
END_VAR
END_FUNCTION_BLOCK
END_NAMESPACE

images/download/attachments/521700239/InterfaceFB-version-1-modificationdate-1684161009657-api-v2.png

Beachten Sie die Warnsymbole aufgrund von minInputs := 2;
Das Symbol verschwindet, wenn Sie die ersten 2 Eingänge oder zumindest den 2. Eingang anschließen.

Beispiel für die Anordnung top
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK myFB_T
{
altName := "TOP";
vNameAlignment := "top";
bgColor := "DarkBlue";
instanceName := {visible};
}
VAR_IN_OUT
IO1 : BOOL;
IO2 : BOOL;
IO3 : BOOL;
END_VAR
END_FUNCTION_BLOCK
END_NAMESPACE
Beispiel für die Anordnung
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK myFB_BL
{
altName := "BASELINE";
vNameAlignment := "baseline";
bgColor := "DarkBlue";
instanceName := {visible};
}
VAR_IN_OUT
IO1 : BOOL;
IO2 : BOOL;
IO3 : BOOL;
END_VAR
END_FUNCTION_BLOCK
END_NAMESPACE
Beispiel für die Anordnung
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK myFB_C
{
altName := "CENTER";
vNameAlignment := "center";
bgColor := "DarkBlue";
instanceName := {visible};
}
VAR_IN_OUT
IO1 : BOOL;
IO2 : BOOL;
IO3 : BOOL;
END_VAR
END_FUNCTION_BLOCK
END_NAMESPACE
Beispiel für die Anordnung
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK myFB_B
{
altName := "BOTTOM";
vNameAlignment := "bottom";
bgColor := "DarkBlue";
instanceName := {visible};
}
VAR_IN_OUT
IO1 : BOOL;
IO2 : BOOL;
IO3 : BOOL;
END_VAR
END_FUNCTION_BLOCK
END_NAMESPACE

images/download/attachments/521700239/InterfaceFB2-version-1-modificationdate-1684161009718-api-v2.png

Beachten Sie die Warnsymbole aufgrund der deklarierten Ein-/Ausgänge (= VAR_IN_OUT).
Das Symbol verschwindet, wenn Sie die Eingangsanschlusspunkte anschließen.

Anweisung 'ImplementationProperties' und dessen Definitionen

Die Anweisung { ImplementationProperties ( ) } ist ein Behälter für Definitionen zum Steuern der Codegenerierung für die Vendor-Bausteine sowohl innerhalb der Anwendung, in der der Vendor-Baustein erstellt wird, als auch innerhalb einer Bibliothek, in die der Vendor-Baustein integriert wird.

Syntax
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK name | FUNCTION name : data-type
USING Namespace_1; (* possible statement, if a namespace should be used *)
{ list of interface statements; }
 
{ ImplementationProperties (definition_1; definition_2; ...) };
 
VAR | VAR_INPUT | VAR_OUTPUT | VAR_IN_OUT | VAR_GLOBAL | VAR_EXTERNAL
...
END_VAR
END_FUNCTION_BLOCK | END_FUNCTION
END_NAMESPACE

Definition

Zweck

Definitionen, die sich auf die Struktur von Dateien auswirken

additionalLibraries and additionalObjects

bestimmt zusätzliche Objekte und/oder zusätzliche Bibliotheken, die integriert werden müssen, wenn die Anwendung für das Zielsystem erstellt wird

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Beachten Sie: Falls die Bibliothek mit dem Vendor-Baustein generiert wird, können Sie in der Bibliothekskonfiguration die folgenden Anweisungen angeben (siehe "Beispiel für die Bibliothekskonfiguration" unten):

  • SUPPORTED_PTKS zur Angabe der Plattform – Diese Anweisung muss angegeben werden.

  • COMMON_SOURCE zur Angabe des Speicherorts der zusätzlichen Objekte/Bibliotheken – Diese Anweisung ist optional.

Weitere Informationen finden Sie in einem der nachfolgenden Beispiele.

extraIncludes

bestimmt eine oder mehrere zusätzlich benötigte H-Files
Beachten Sie, dass Sie die Implementierung in der Basis-H-Datei selbst erweitern müssen, damit die Implementierung der zusätzlichen H-Dateien verwendet wird.

Standardmäßig müssen sich die zusätzlichen Dateien im Unterordner src-code des Projekts befinden. Wenn Sie den Speicherort der Dateien ändern wollen, geben Sie die Anweisung COMMON_SOURCE := Unterordner des Projekts; in der Bibliothekskonfiguration an (siehe "Beispiel für Bibliothekskonfiguration" unten). Im Falle von COMMON_SOURCE := MoreFiles;; sucht logi.CAD 3 im Pfad project/MoreFiles/src-code nach den zusätzlichen Dateien.

functionHasCFile

bestimmt, dass neben der H-Datei auch eine C-Datei verwendet werden soll

implementationName

bestimmt, dass ein anderer Bausteinnamen als Bestandteil des Dateinamens verwendet wird – sowohl für die H-Datei als auch für die C-Datei ( falls die Definition functionHasCFile ebenfalls angegeben ist)
Diese Definition ist insbesondere dann sinnvoll, falls mehrere identische Funktionen in derselben Datei implementiert werden sollen.

Definitionen, die sich auf den Inhalt der H-Datei auswirken ((type def-Struktur, Implementierung)

expandable

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Diese Definition ist für die korrekte Codegenerierung eines erweiterbaren Bausteins notwendig (siehe Schnittstellen-Definition expandableGUI).
Beachten Sie, dass Sie für jeden Eingang eine C-Funktion innerhalb der Implementierung erstellen müssen. name __x muss dem Funktionsnamen für jeden Eingang hinzugefügt werden, wobei Sie x durch die Nummer des Eingangs ersetzen müssen (siehe Beispiel unten). Es empfiehlt sich, die C-Funktionen mit der Eingangsnummer zu beginnen, die durch minInputs festgelegt ist.

Bei Vendor-Bausteinen reicht es aus, nur die Definition expandable zu verwenden (siehe die folgenden Beispiele). Besser ist es jedoch, sowohl die Definition expandable als auch die Schnittstellen-Definition expandableGUI zu verwenden.

passConcreteTypeParameter

bestimmt, dass das Argument TYPE als 1. Argument in der Implementierung innerhalb der H-Datei hinzugefügt wird
Diese Definition wird insbesondere dann benötigt, falls der Baustein ein gemappter Baustein ist (d.h. falls die Definitionen untypedCFunctionNameBlacklist und/oder untypedCFunctionNameWhitelist ebenfalls in der Schnittstelle verwendet werden).

untypedCFunctionNameWhitelist und untypedCFunctionNameBlacklist

mappt den Vendor-Baustein – Auswirkung: Eine Liste der konkreten Datentypen wird auf der Grundlage der angegebenen Werte erstellt. Für jeden dieser konkreten Datentypen muss __ANY anstelle des konkreten Datentyps innerhalb der Implementierung (z.B. in der H-Datei) verwendet werden. Siehe Artikel "Die Struktur der benötigten H-Datei" und/oder die folgenden Beispiele, falls Sie sich nicht sicher sind, welcher Teil der H-Datei die Implementierung ist.
Für alle anderen Datentypen (und ohne diese Definitionen) muss der Name des konkreten Datentyps (z. B. __BOOL) innerhalb der Implementierung verwendet werden.

untypedCFunctionNameWhitelist gibt die Datentypen an, für die die Definition angewendet werden soll, untypedCFunctionNameBlacklist gibt die Datentypen an, für die die Definition nicht angewendet werden soll. Es ist erlaubt, untypedCFunctionNameWhitelist ohne untypedCFunctionNameBlacklist zu verwenden, aber es ist nicht erlaubt, nur untypedCFunctionNameBlacklist zu verwenden.
Diese Definitionen sind nur sinnvoll, falls die Eingänge des Vendor-Bausteins auf der Grundlage eines allgemeinen Datentyps (z.B. ANY_MAGNITUDE oder ANY_BIT) deklariert werden.

Erlaubte Werte für beide Definitionen (als kommagetrennte Liste):

  • alle →allgemeinen Datentypen und alle elementaren Datentypen

  • Kurzform anstelle von bestimmten elementaren Datentypen
    T (statt TIME), LT (statt LTIME), DT (statt DATE_AND_TIME), LDT (statt LDATE_AND_TIME), D (statt DATE), LD (statt LDATE), TOD (statt TIME_OF_DAY), LTOD (statt LTOD)

  • Werte für komplexere Datentypen
    images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Kontaktieren Sie logi.cals für Informationen über den benötigten Inhalt der H-Datei, falls Ihr Vendor-Baustein komplexere Datentypen (z.B. Strukturen, Arrays, Referenzen) oder die elementaren Datentypen CHAR oder STRING unterstützen soll.

    • REF_TO allgemeiner Datentyp, z.B. REF_TO ANY_BIT
      Ein solcher Wert wird auf die Referenzen auf die entsprechenden elementaren Datentypen des angegebenen allgemeinen Datentyps angewendet.

    • REF_TO allgemeiner Datentyp, z.B. REF_TO INT
      Ein solcher Wert wird auf die Referenzen auf die angegebenen elementaren Datentypen angewendet.

    • ARRAY
      Dieser Wert wird auf alle Arrays mit nur einer Dimension angewendet. images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/error.svg Arrays mit mehr Dimensionen werden für Vendor-Bausteine nicht unterstützt.

    • REF_TO ARRAY
      Dieser Wert wird nur auf Referenzen auf Arrays mit einer Dimension angewendet.

    • ARRAY_OF_STRUCT
      Dieser Wert wird auf alle Arrays von Strukturen sowie für Verweise auf Arrays von Strukturen angewendet.

useUntypedTypeStructure

bestimmt, dass der konkrete Datentyp nicht dem Namen der typedef-Struktur hinzugefügt werden darf – stattdessen muss der allgemeine Name des Bausteins verwendet werden
Diese Definition ist insbesondere dann sinnvoll, falls Eingänge einer Vendor-Funktion auf der Basis eines allgemeinen Datentyps (z.B. ANY_NUM) deklariert werden, der Ergebniswert aber auf der Basis eines konkreten Datentyps deklariert ist (z.B. TIME).

Definitionen, die sich auf die Validierung auswirken, falls der Vendor-Baustein aufgerufen wird

allowedTypeWhitelist und allowedTypeBlacklist

bestimmt, welche Datentypen unterstützt werden, falls die Eingänge/Ausgänge des Vendor-Baustein-Aufrufs beschaltet sind
Die Beschaltung eines Elements mit einem zulässigen Datentyp verursacht keine Fehlermeldung. F alls Sie jedoch ein Element mit einem unzulässigen Datentyp beschaltet, wird der Code oder die Logik als fehlerhaft markiert.

allowedTypeWhitelist nennt die zulässigen Datentypen, allowedTypeBlacklist die unzulässigen Datentypen. Es ist erlaubt, beide Definitionen oder nur eine der Definitionen zu verwenden. Ohne die Definition allowedTypeWhitelist sind alle Datentypen erlaubt (Standard ist ANY). Ohne die Definition allowedTypeBlacklist sind alle Datentyp zulässigi.
Diese Definitionen sind nur sinnvoll, falls Eingänge des Vendor-Bausteins auf der Grundlage eines allgemeinen Datentyps deklariert werden (z.B. ANY_MAGNITUDE oder ANY_BIT).

Erlaubte Werte für beide Definitionen (als kommagetrennte Liste):

  • alle allgemeinen Datentypen und alle elementaren Datentypen

  • Kurzform anstelle von bestimmten elementaren Datentypen
    T (statt TIME), LT (statt LTIME), DT (statt DATE_AND_TIME), LDT (statt LDATE_AND_TIME), D (statt DATE), LD (statt LDATE), TOD (statt TIME_OF_DAY), LTOD (statt LTOD)

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Kontaktieren Sie logi.cals, falls Ihr Vendor-Baustein oder die elementaren Datentypen CHAR oder STRING unterstützen soll.

returnValueMustBeAssigned

legt fest, dass im Falle eines Funktionsaufrufs der Ergebniswert einer konkreten Variablen zugewiesen werden muss
Diese Definition ist nur für Funktionen sinnvoll.

Was ist ein generischer Datentyp? Welches sind die geeigneten elementaren Datentypen? Siehe →allgemeiner Datentyp

Beispiele mit Implementierungseigenschaften

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/information.svg Die folgenden Beispiele verwenden hauptsächlich die Systembausteine von logi.CAD 3, um die Verwendung der obigen Definitionen zu veranschaulichen. Beachten Sie, dass die Systembausteine aus internen Gründen den Teil CustomNameSpace := Name anstelle der empfohlenen Anweisungen NAMESPACE ... END_NAMESPACE verwenden.

Falls Sie sich dafür interessieren, wie logi.cals die Systembausteine implementiert hat und Sie sich die entsprechenden H- und C-Dateien im Detail ansehen wollen: Kontaktieren Sie logi.cals, um die Quellen mit der entsprechenden Systembibliothek zu erhalten.
In der Regel handelt es sich bei den Quellen um ein logi.CAD 3-Projekt, das die Systembausteine und eine Bibliothekskonfiguration enthält.

Beispiele, die sich auf die Dateistruktur auswirken

Beispiel mit 'additionalLibraries' und 'additionalObjects'

Beispiel 1 für Schnittstelle
{ CustomImplementation}
NAMESPACE Copies
FUNCTION_BLOCK myFB01
{ ImplementationProperties (additionalLibraries:="additionalLibrary1,additionalLibrary2"; additionalObjects:="additionalObject1, additionalObject2"; )}
VAR_INPUT
...
END_FUNCTION_BLOCK
END_NAMESPACE

Die Erzeugung der Bibliothek MyLibWithVendorBlocks (siehe nächstes Beispiel) erfordert die zusätzlichen Bibliotheksdateien additionalLibrary1 und additionalLibrary2 sowie die zusätzlichen Objektdateien additionalObject und additionalObject2.
Beachten Sie:

  • Der Speicherort dieser Dateien ist abhängig von den Anweisungen COMMON_SOURCE und SUPPORTED_PTKS, die in der Bibliothekskonfiguration angegeben sind. Bei der folgenden Bibliothekskonfiguration werden die Dateien im Pfad project/MoreFiles/src-code/WindowsX86 gesucht.
    Ohne die Anweisung COMMON_SOURCE werden die Dateien in dem Pfad project/src-code/WindowsX86 gesucht.

  • Die Erweiterung dieser Dateien hängt ebenfalls von der Anweisung SUPPORTED_PTKS ab. Bei der folgenden Bibliothekskonfiguration werden die Dateien additionalLibrary1.lib und additionalLibrary2.lib, additionalObject.o und additionalObject2.o durchsucht.

Beispiel für Bibliothekskonfiguration
LIBRARY MyLibWithVendorBlocks
Version := 0.0.1;
SUPPORTED_PTKS := WindowsX86;
COMMON_SOURCE := MoreFiles;
FOLDER "folderName"
IEC := myFB01;
END_FOLDER
END_LIBRARY

Spezielles Verhalten:

  • Falls Sie in der Bibliothekskonfiguration die Plattform BuiltInPlc (anstelle von WindowsX86) definieren, hängt der Speicherort der Datei vom Betriebssystem ab, unter dem die Bibliothek verwendet wird. Für Windows ist der Unterordner WindowsX86 (wie bereits oben angegeben), für Linux ist der Unterordner LinuxX86.

  • Falls Sie den Vendor-Baustein direkt innerhalb des Projekts verwenden (in dem Sie den Vendor-Baustein erstellt haben), werden die zusätzlichen Dateien beginnend mit der Zielplattform gesucht. Das heißt, f alls die Plattform BuiltInPlc in der Ressource für das Projekt angegeben ist, werden die zusätzlichen Dateien im Pfad project/src-code/BuiltInPlc gesucht.

Beispiel mit/ohne 'extraIncludes'

Beispiel für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION GET_TYPE_FROM_VARNAME : UDINT
{ altName := ""; vNameAlignment := "center"; width:=208;}
{ ImplementationProperties ( extraIncludes := "RTSSNS.h,RTSSNSUtil.h"; functionHasCFile; ) }
VAR_INPUT
...
END_FUNCTION

Die Codegenerierung benötigt die H-Datei lcfu_iec61131__GET_TYPE_FROM_VARNAME.h, die C-Datei lcfu_iec61131__GET_TYPE_FROM_VARNAME.c sowie die zusätzlichen H-Dateien RTSSNS.h, RTSSNSUtil.h.
Falls in der Bibliothekskonfiguration nichts anderes angegeben ist, sucht logi.CAD 3 nach den zusätzlichen Dateien im Pfad project/src-code.

Beispiel mit/ohne 'functionHasCFile'

Beispiel 1 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION FIND : ANY_INT { FIND { altName := "" }; ... }
{ ImplementationProperties ( functionHasCFile; ) }
VAR_INPUT
...
END_FUNCTION

Die Codegenerierung benötigt die H-Datei lcfu_iec61131__FIND.h als auch die C-Datei mit dem Namen lcfu_iec61131__FIND.c.

Vergleichen Sie die folgende Kopie des Systembausteins, die leicht verändert wurde:

Beispiel 2 für Schnittstelle
{ CustomImplementation}
NAMESPACE Copies
FUNCTION FIND_Copy : INT { FIND { altName := "" }; }
END_FUNCTION
END_NAMESPACE

Die Codegenerierung benötigt nur die H-Datei lcfu___copies.FIND_COPY.h. Aufgrund der fehlenden Definition functionHasCFile ist keine C-Datei erforderlich.

Beispiel mit/ohne 'implementationName'

Beispiel für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION TO_SINT : SINT { hideIONames; ... }
{ ImplementationProperties ( ...; functionHasCFile; implementationName:="CONVERT"; ) }
VAR_INPUT
...
END_FUNCTION
 
 
...
 
FUNCTION TO_INT : INT { hideIONames; ... }
{ ImplementationProperties ( ...; functionHasCFile; implementationName:="CONVERT"; ) }
VAR_INPUT
...
END_FUNCTION

Die Codegenerierung benötigt die H-Datei lcfu_iec61131__CONVERT.h und die C-Datei lcfu_iec61131__CONVERT.c – statt den H-Dateien lcfu_iec61131__TO_SINT.h , lcfu_iec61131__TO_INT.h und den C-Dateien lcfu_iec61131__TO_SINT.c, lcfu_iec61131__TO_INT.c.

Beachten Sie:

  • Falls das erste ST-Objekt mit der Funktion TO_SINT gespeichert wird, generiert logi.CAD 3 automatisch die Dateien lcfu_iec61131__CONVERT.h und die C-Datei lcfu_iec61131__CONVERT.c mit den Implementierungs-Stubs für TO_SINT.

  • Falls das zweite ST-Objekt, das die Funktion TO_INT enthält, später gespeichert wird, aktualisiert logi.CAD 3 die Dateien lcfu_iec61131__CONVERT.h und die C-Datei lcfu_iec61131__CONVERT.c nicht, um die Implementierungsstubs für TO_INT darin aufzunehmen.

Falls Sie unterschiedliche Implementierungs-Stubs für TO_SINT und TO_INT benötigen, ist es am besten, die Definition implementationName nicht zu verwenden. Verwenden Sie die Definition implementationName nur, falls die gleiche Implementierung in der gleichen Datei benötigt wird.

Beispiele, die sich auf den Inhalt der H-Datei auswirken

Beispiel mit/ohne 'expandable'

Beispiel 1 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION ADD : ANY_MAGNITUDE { minInputs := 2; ... }
{ ImplementationProperties ( expandable; untypedCFunctionNameWhitelist:="ANY_NUM,ANY_DURATION"; ) }
VAR_INPUT
IN1 : ANY_MAGNITUDE;
...
IN16 : ANY_MAGNITUDE;
END_VAR
END_FUNCTION
Code, der für die Codegenerierung erforderlich ist
#define lcfu_iec61131__ADD__ANY__2(LC_this, IN1, IN2, pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_2(IN1,IN2)
 
#define lcfu_iec61131__ADD__ANY__3(LC_this, IN1, IN2, IN3,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_3(IN1,IN2,IN3)
 
#define lcfu_iec61131__ADD__ANY__4(LC_this, IN1, IN2, IN3,IN4,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_4(IN1,IN2,IN3,IN4)
 
#define lcfu_iec61131__ADD__ANY__5(LC_this, IN1, IN2, IN3,IN4,IN5,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_5(IN1,IN2,IN3,IN4,IN5)
 
#define lcfu_iec61131__ADD__ANY__6(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_6(IN1,IN2,IN3,IN4,IN5,IN6)
 
#define lcfu_iec61131__ADD__ANY__7(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_7(IN1,IN2,IN3,IN4,IN5,IN6,IN7)
 
#define lcfu_iec61131__ADD__ANY__8(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_8(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8)
 
#define lcfu_iec61131__ADD__ANY__9(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_9(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9)
 
#define lcfu_iec61131__ADD__ANY__10(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_10(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10)
 
#define lcfu_iec61131__ADD__ANY__11(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_11(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11)
 
#define lcfu_iec61131__ADD__ANY__12(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_12(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12)
 
#define lcfu_iec61131__ADD__ANY__13(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_13(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13)
 
#define lcfu_iec61131__ADD__ANY__14(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,IN14,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_14(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,IN14)
 
#define lcfu_iec61131__ADD__ANY__15(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,IN14,IN15,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_15(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,IN14,IN15)
 
#define lcfu_iec61131__ADD__ANY__16(LC_this, IN1, IN2, IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,IN14,IN15,IN16,pEPDB) \
(LC_this)->LC_VD_ADD = LC_MF_ADD_ANY_16(IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8,IN9,IN10,IN11,IN12,IN13,IN14,IN15,IN16)
Beispiel 2 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION_BLOCK RS { vNameAlignment := "center"; ... }
VAR_INPUT
S : BOOL;
R1 : BOOL;
END_VAR
...
END_FUNCTION_BLOCK
Code, der für die Codegenerierung erforderlich ist
#define lcfu_iec61131__RS(LC_this, pEPDB) \
(LC_this)->LC_VD_Q1 = (!(LC_this)->LC_VD_R1) && ((LC_this)->LC_VD_S || (LC_this)->LC_VD_Q1

Beispiel mit/ohne 'passConcreteTypeParameter'

Beispiel für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION PACK : ANY_ELEMENTARY { minInputs := 2; ... }
{ ImplementationProperties ( allowedTypeWhitelist:="ANY_ELEMENTARY"; allowedTypeBlacklist:="ANY_CHARS"; expandable; passConcreteTypeParameter; functionHasCFile; untypedCFunctionNameWhitelist:="ANY_ELEMENTARY"; untypedCFunctionNameBlacklist:="ANY_CHARS,BOOL"; ) }
VAR_INPUT
IN0 : BYTE;
...
IN7 : BYTE;
END_VAR
END_FUNCTION
Code, der für die Codegenerierung erforderlich ist
#define lcfu_iec61131__PACK__ANY__2(TYPE,LC_this, v1,v2,pEPDB) lcfu_iec61131__PACK__ANY(sizeof(TYPE),&((LC_this)->LC_VD_PACK),2,v1,v2)
...

Beispiel mit 'untypedCFunctionNameWhitelist' und ohne 'untypedCFunctionNameBlacklist' und ohne beide

Beispiel 1 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION SUB : ANY_MAGNITUDE { hideIONames; ... }
{ ImplementationProperties ( untypedCFunctionNameWhitelist:="ANY_NUM,ANY_DURATION"; ) }
VAR_INPUT
...
END_FUNCTION

Für SUB ergibt sich die folgende Liste konkreter Datentypen:

Konkrete Datentypen wegen der "White-List"

Konkrete Datentypen nach der "Black-List"

REAL, LREAL, USINT, UINT, UDINT, ULINT, SINT, INT, DINT, LINT – aufgrund von ANY_NUM

TIME – aufgrund von ANY_DURATION (Derzeit wird LTIME von logi.CAD 3 nicht unterstützt.)

identisch, weil es keine "Black-List" gibt

Die Codegenerierung setzt voraus, dass __ANY (anstelle von __REAL, __LREAL, __USINT usw.) innerhalb der Implementierung (z.B. in der H-Datei) verwendet wird.

Code, der für die Codegenerierung erforderlich ist
/* Implementation of helper macros (inlined) */
#define LC_MF_SUB_ANY(IN1,IN2) ((IN1)-(IN2))
 
#define lcfu_iec61131__SUB__ANY(LC_this, IN1, IN2, pEPDB) \
(LC_this)->LC_VD_SUB = LC_MF_SUB_ANY(IN1,IN2)

Vergleichen Sie den folgenden Baustein, der die "White-Liste" und "Black-List" verwendet:

Beispiel 2 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION OR : ANY_BIT { minInputs := 2; ... }
{ ImplementationProperties ( expandable; untypedCFunctionNameWhitelist:="ANY_BIT"; untypedCFunctionNameBlacklist:="BOOL"; ) }
VAR_INPUT
...
END_FUNCTION

Für OR ergibt sich die folgende Liste konkreter Datentypen:

Konkrete Datentypen wegen der "White-List"

Konkrete Datentypen nach der "Black-List"

BOOL, BYTE, WORD, DWORD, LWORD – aufgrund von ANY_BIT

BYTE, WORD, DWORD, LWORD BOOL ist entfernt worden.

Die Codegenerierung setzt voraus, dass __ANY (anstelle von __BYTE, __WORD, __DWORD and __LWORD) innerhalb der Implementierung (z.B. in der H-Datei) verwendet wird, aber nicht der konkrete Datentyp BOOL.

Code, der für die Codegenerierung erforderlich ist (Auszug)
#define lcfu_iec61131__OR__BOOL__2(LC_this, IN1, IN2, pEPDB) \
(LC_this)->LC_VD_OR = LC_MF_OR_BOOL_2(IN1,IN2)
 
#define lcfu_iec61131__OR__BOOL__3(LC_this, IN1, IN2, IN3,pEPDB) \
(LC_this)->LC_VD_OR = LC_MF_OR_BOOL_3(IN1,IN2,IN3)
...
 
#define lcfu_iec61131__OR__ANY__2(LC_this, IN1, IN2, pEPDB) \
(LC_this)->LC_VD_OR = LC_MF_OR_ANY_2(IN1,IN2)
 
#define lcfu_iec61131__OR__ANY__3(LC_this, IN1, IN2, IN3,pEPDB) \
(LC_this)->LC_VD_OR = LC_MF_OR_ANY_3(IN1,IN2,IN3)
...

Beispiel mit 'useUntypedTypeStructure'

Beispiel 1 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION MUL_TIME : TIME { hideIONames; ... }
{ ImplementationProperties ( useUntypedTypeStructure; ) }
VAR_INPUT
IN1 : TIME;
IN2 : ANY_NUM;
END_VAR
END_FUNCTION

Normalerweise würde der allgemeine Datentyp ANY_NUM des 2. Eingangs erfordern, dass die konkreten Datentypen beim Namen der typedef-Struktur hinzugefügt werden. Dies ist aufgrund der Implementierung selbst nicht notwendig. Daher wird useUntypedTypeStructure in der Schnittstelle verwendet.

Code, der für die Codegenerierung erforderlich ist
typedef struct _LC_TD_Function_MUL_TIME
{
LC_TD_BOOL LC_VD_ENO;
LC_TD_TIME LC_VD_MUL_TIME;
} LCCG_StructAttrib LC_TD_Function_MUL_TIME;

Vergleichen Sie die folgende Kopie des Systembausteins, die leicht verändert wurde: MUL_TIME_Copy wird ohne useUntypedTypeStructure angegeben.

Beispiel 2 für Schnittstelle
{ CustomImplementation}
NAMESPACE Copies
FUNCTION MUL_TIME_Copy : TIME { hideIONames; }
VAR_INPUT
IN1 : TIME;
IN2 : ANY_NUM;
END_VAR
END_FUNCTION

Die Codegenerierung erfordert, dass die konkreten Datentypen beim Namen der typedef-Struktur hinzugefügt werden. Daher lauten die Namen für die Strukturen:

  • MUL_TIME_REAL

  • MUL_TIME_LREAL

  • MUL_TIME_USINT

  • MUL_TIME_UINT

  • MUL_TIME_UDINT

  • MUL_TIME_ULINT

  • MUL_TIME_SINT

  • MUL_TIME_INT

  • MUL_TIME_DINT

  • MUL_TIME_LINT

Code, der für die Codegenerierung erforderlich ist
typedef struct _LC_TD_Function_MUL_TIME_REAL
{
LC_TD_BOOL LC_VD_ENO;
LC_TD_TIME LC_VD_MUL_TIME;
} LCCG_StructAttrib LC_TD_Function_MUL_TIME_REAL;
 
 
typedef struct _LC_TD_Function_MUL_TIME_LREAL
{
LC_TD_BOOL LC_VD_ENO;
LC_TD_TIME LC_VD_MUL_TIME;
} LCCG_StructAttrib LC_TD_Function_MUL_TIME_LREAL;
 
 
typedef struct _LC_TD_Function_MUL_TIME_USINT
{
LC_TD_BOOL LC_VD_ENO;
LC_TD_TIME LC_VD_MUL_TIME;
} LCCG_StructAttrib LC_TD_Function_MUL_TIME_USINT;
 
 
/* and more blocks according to the data type */

Beispiele, die sich auf die Validierung beim Aufruf des Vendor-Bausteins auswirken

Beispiel mit 'allowedTypeWhitelist' und ohne 'allowedTypeBlacklist' und ohne beide

Beispiel 1 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION SHL : ANY_ELEMENTARY { vNameAlignment := "center"; width := 100; bgColor := "dodgerblue"; }
{ ImplementationProperties ( allowedTypeWhitelist:="ANY_BIT,ANY_INT"; ) }
VAR_INPUT
IN : ANY_ELEMENTARY;
N : INT;
END_VAR
END_FUNCTION

Für SHL ergibt sich die folgende Liste konkreter Datentypen:

Konkrete Datentypen wegen der "White-List"

Konkrete Datentypen nach der "Black-List"

BOOL, BYTE, WORD, DWORD, LWORD – aufgrund von to ANY_BIT

USINT, UINT, UDINT, ULINT, SINT, INT, DINT, LINT – aufgrund von ANY_INT

identisch, weil es keine "Black-List" gibt

Diese konkreten Datentypen werden unterstützt, wenn der Eingang IN eines SHL-Bausteins angeschlossen ist.

Beispiel für Aufrufe dieser Funktion
PROGRAM Test1
VAR
result1 : INT;
result2 : REAL;
END_VAR
result1 := SHL(IN := INT#40, N := 1); (* allowed *)
result2 := SHL(IN := REAL#40.0, N := 1); (* NOT allowed *)
END_PROGRAM

Vergleichen Sie den folgenden Systembaustein, der die "White-Liste" und "Black-List" verwendet:

Beispiel 2 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION LIMIT : ANY_ELEMENTARY { LIMIT { altName := ""}; ... }
{ ImplementationProperties ( allowedTypeWhitelist:="ANY_ELEMENTARY"; allowedTypeBlacklist:="ANY_CHARS"; untypedCFunctionNameWhitelist:="ANY_ELEMENTARY"; untypedCFunctionNameBlacklist:="ANY_CHARS"; ) }
VAR_INPUT
MN : ANY_ELEMENTARY;
IN : ANY_ELEMENTARY;
MX : ANY_ELEMENTARY;
END_VAR
END_FUNCTION

Für LIMIT ergibt sich die folgende Liste konkreter Datentypen:

Konkrete Datentypen wegen der "White-List" – aufgrund von ANY_ELEMENTARY

Konkrete Datentypen nach der "Black-List" – aufgrund von to ANY_CHARS

REAL, LREAL

USINT, UINT, UDINT, ULINT

SINT, INT, DINT, LINT

TIME

BOOL, BYTE, WORD, DWORD, LWORD

STRING

CHAR

DATE_AND_TIME, DATE, TIME_OF_DAY, LDATE

REAL, LREAL

USINT, UINT, UDINT, ULINT

SINT, INT, DINT, LINT

TIME

BOOL, BYTE, WORD, DWORD, LWORD



DATE_AND_TIME, DATE, TIME_OF_DAY, LDATE

Diese konkreten Datentypen werden unterstützt, wenn der Eingang des LIMIT-Bausteins angeschlossen ist. Dies gilt für alle 3 Eingänge MN, IN und MX.
Beachten Sie: logi.CAD 3 unterstützt einige der konkreten Datentypen (z.B. LTIME) nicht. Andernfalls wären diese Datentypen aufgrund von ANY_ELEMENTARY enthalten.

Beispiel für Aufrufe dieser Funktion
PROGRAM Test1
VAR
result1 : INT;
result2 : STRING[10];
END_VAR
result1 := LIMIT(MN := 5, IN := 99, MX := 100); (* allowed *)
result2 := LIMIT(MN := "a", IN := "aa", MX := "aaa"); (* NOT allowed *)
END_PROGRAM

Beispiel mit/ohne 'returnValueMustBeAssigned'

Beispiel 1 für Schnittstelle
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION GET_NAMED_MEMORY : ANY
{ altName := ""; ... }
{ ImplementationProperties ( ...; functionHasCFile; returnValueMustBeAssigned;) }
VAR_INPUT
...
END_FUNCTION

Vergleichen Sie die folgende Kopie des Systembausteins, die leicht verändert wurde:

Beispiel 2 für Schnittstelle
{ CustomImplementation}
NAMESPACE Copies
FUNCTION GET_NAMED_MEMORY_Copy : INT
{ ImplementationProperties ( functionHasCFile;) }
END_FUNCTION
END_NAMESPACE
Beispiel für den Aufruf dieser Funktionen
PROGRAM Test1
VAR
Var1 : REF_TO INT;
END_VAR
GET_NAMED_MEMORY(); (* NOT allowed because of 'returnValueMustBeAssigned' in the vendor block interface *)
Var1 := GET_NAMED_MEMORY(); (* allowed *)
 
GET_NAMED_MEMORY_Copy(); (* allowed *)
Var1 := GET_NAMED_MEMORY_Copy(); (* allowed *)
END_PROGRAM

Funktionsreferenzen

Das Pragma { FunctionReferences } muss in einem Vendor-Baustein verwendet werden, wenn Funktionen einer Bibliothek im C-Code des Vendor-Bausteins aufgerufen werden. Dieses Pragma wird benötigt, damit logi.CAD 3 beim Erstellen der Anwendung, die den Vendor-Baustein verwendet, ausreichende Informationen über die aufgerufenen Funktionen erhält.
Vergleichen Sie:

  • Sie müssen dieses Pragma nicht einfügen, wenn im C-Code des Vendor-Bausteins nur Funktionsbausteine aufgerufen werden.

  • Sie müssen dieses Pragma bei ST-/FBS-/KOP-POE, die Funktionen aufrufen, nicht einfügen. Dieses Pragma wird von logi.CAD 3 automatisch eingefügt, wenn Sie diese POE mit dem Wert INTERFACE oder DEPLOY als Teil einer Bibliothek angeben.

Ergänzen Sie das Pragma { FunctionReferences } durch die Namen der aufgerufenen Funktionen. Trennen Sie die Funktionsnamen durch das Zeichen ",".

Beispiel für Funktionsreferenzen
{ CustomImplementation }
FUNCTION_BLOCK TestVendorFB
USING logicals.standard.util.schedule;
{ ImplementationProperties (functionHasCFile; ) }
{ FunctionReferences TO_INT, TO_SINT, MUL_TIME, AND }
 
(* The functions "TO_INT", "TO_SINT", "MUL_TIME" and "AND" are called in the C-code of the vendor block "TestVendorFB". *)
 
(* variable declarations *)
END_FUNCTION_BLOCK

Definitionen für Variablen

Es ist möglich, einige spezielle Definitionen für deklarierte Variablen einzuzufügen – zusätzlich zu den Anweisungen/Definitionen, die unterhalb von "Unterstützte ST-Syntax" angeführt sind.

Syntax
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION_BLOCK name | FUNCTION name : data-type
USING Namespace_1; (* possible statement, if a namespace should be used *)
{ list of interface statements; }
{ ImplementationProperties (...) };
 
VAR_IN_OUT
name_1 : data-type := initial-value { REQUIRES_NON_TEMP_VALUE };
...
END_VAR
 
VAR | VAR_INPUT | VAR_OUTPUT | VAR_IN_OUT | VAR_GLOBAL | VAR_EXTERNAL
name_1, name_2, ..., name_n : data-type := initial-value {
description := "string";
comment := "string";
customDataJson := 'Json-String';
concreteType := data-type;
};
...
END_VAR
 
END_FUNCTION_BLOCK | END_FUNCTION
END_NAMESPACE

Definition für Variable

Zweck

{REQUIRES_NON_TEMP_VALUE}

definiert, dass temporäre Werte nicht mit der entsprechenden Ein-/Ausgangsvariable (VAR_IN_OUT) verbunden werden dürfen.
Siehe das folgende Beispiel.

{
description := "string";
comment := "string";
customDataJson := 'Json-String';
concreteType := data-type;
}

gibt die folgenden zusätzlichen Daten (= Datenelemente) für die Variable an:

  • eine Beschreibung (auch als Langname bezeichnet)

  • ein Kommentar

  • eine JSON-Zeichenkette

  • einen konkreten Datentypen für die Instanz eines anderen Vendor-Funktionbausteins, der Eingänge mit einem →allgemeinen Datentyp enthält
    images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Die Anweisung concreteType ist unbedingt erforderlich, damit beim Erstellen der Anwendung die nötigen Typisierungsinformation zum Vendor-Funktionbaustein mit den ANY-Eingängen vorhanden ist.

Siehe "Beschreibung, Kommentar, JSON-String oder Typ für Variablen oder Datentypen angeben" für Details.

Beispiele mit '{REQUIRES_NON_TEMP_VALUE}'

Beispiel für Schnittstelle des Vendor-Bausteins
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION myFUN_noTV
VAR_IN_OUT
IO1 : INT {REQUIRES_NON_TEMP_VALUE} ;
END_VAR
END_FUNCTION
END_NAMESPACE
Beispiel für den Aufruf des Vendor-Bausteins (in der Bibliothek integriert)
PROGRAM Test1
USING com.oem1.lib1;
VAR_TEMP
tempVar1 : INT;
END_VAR
myFUN_noTV(IO1:=tempVar1);
(* not allowed because of '{REQUIRES_NON_TEMP_VALUE}' in the vendor block interface and
because 'tempVar1' is a temporary variable. *)
END_PROGRAM

Zusätzliche Anweisungen, die nicht verwendet werden dürfen

Die folgenden Anweisungen sind nur als Referenz enthalten. images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Verwenden Sie diese Anweisungen nicht für Ihre manuell erstellten Schnittstellen.

Syntax
{ DoNotValidateThisFile ('') }
 
{CustomImplementation}
{ AccessLevel := Private|Public }
 
{suppressWarning modelRuleNamespace.modelRuleId('reason for suppression'), scope:=element|file}
FUNCTION_BLOCK name | FUNCTION name : data-type
USING Namespace_1; (* possible statement, if a namespace should be used *)
...
END_FUNCTION_BLOCK | END_FUNCTION


Anweisung

Zweck

{ DoNotValidateThisFile ('') }

ignoriert den gesamten Inhalt des aktuellen ST-Objekts
images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg logi.CAD 3 empfiehlt Ihnen, diese Anweisung nur für automatisch erzeugte ST-Objekte zu verwenden. Wenn Sie diese Anweisung trotzdem am Anfang einer manuell erstellten Schnittstelle einfügen, erhalten Sie keine Meldungen wegen fehlerhaften Anweisungen.

Siehe "Anweisung zum Ignorieren von ST-Objekten" für Details zu dieser Anweisung.

{ AccessLevel := Private|Public }

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Derzeit wird diese Anweisung nicht für die Verwendung innerhalb von Vendor-Bausteinen unterstützt.
Die Anweisung { AccessLevel := ...} wird automatisch von logi.CAD 3 für eine POE in einer Bibliothek erzeugt, da die POE in einer Bibliothekskonfiguration angegeben ist.

{suppressWarning modelRuleNamespace.modelRuleId('reason for suppression'), scope:=element|file}

images/s/b2ic8e/9012/1ca6q62/_/images/icons/emoticons/warning.svg Derzeit wird diese Anweisung nicht für die Verwendung innerhalb von Vendor-Bausteinen unterstützt.

Siehe "Anweisung zum Unterdrücken von Warnungen" für Details zu dieser Anweisung.