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.
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.
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.
Diese Anweisung hat die folgenden Auswirkungen:
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. 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.
{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
den Ergebniswert einer Funktion.
In der folgenden Beschreibung wird der allgemeine Begriff "Variable" verwendet.
EA-Definition |
Zweck |
loc := "orientation" |
bestimmt die Ausrichtung der angegebenen Variablen
|
index := # |
bestimmt die Position der angegebenen Variablen
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 |
width := # |
bestimmt die Breite des Bausteins, falls der Baustein in den FBS-Editor eingefügt wird |
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. |
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. |
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. |
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. |
minInputs := # |
bestimmt die Anzahl der Eingänge, die für die ordnungsgemäße Funktion des Vendor-Bausteins erforderlich sind 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. 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 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
.
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)
Siehe die folgenden Beispiele für die Ausrichtung. |
bgColor := "value" |
bestimmt die Hintergrundfarbe des Bausteins 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) |
pageSize := "valuexvalue" |
bestimmt die Seitengröße,
falls
die FBS-Logik im grafischen FBS-Editor angezeigt wird. |
instanceName := {definitions}; |
bestimmt das Layout des Instanznamens für eine Funktionsbaustein-Instanz
|
valueFields := {definitions}; |
fügt Wertfelder für Eingänge innerhalb der Schnittstelle hinzu und bestimmt das Layout dieser Wertfelder
|
commentFields := {definitions}; |
fügt Kommentarfelder innerhalb der Schnittstelle hinzu und bestimmt das Layout dieser Kommentarfelder
|
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 |
Beachten Sie die Warnsymbole aufgrund von minInputs := 2; |
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 |
Beachten Sie die Warnsymbole aufgrund der deklarierten Ein-/Ausgänge (= VAR_IN_OUT). |
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.
{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
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):
Weitere Informationen finden Sie in einem der nachfolgenden Beispiele. |
extraIncludes |
bestimmt eine oder mehrere zusätzlich benötigte H-Files 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) |
Definitionen, die sich auf den Inhalt der H-Datei auswirken ((type def-Struktur, Implementierung) |
|
expandable |
Diese Definition ist für die korrekte Codegenerierung eines erweiterbaren Bausteins notwendig (siehe Schnittstellen-Definition expandableGUI). 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 |
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. 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. Erlaubte Werte für beide Definitionen (als kommagetrennte Liste):
|
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 |
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 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. Erlaubte Werte für beide Definitionen (als kommagetrennte Liste):
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 |
Was ist ein generischer Datentyp? Welches sind die geeigneten elementaren Datentypen? Siehe →allgemeiner Datentyp
Beispiele mit Implementierungseigenschaften
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'
{ 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.
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'
...
{ 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'
...
{ 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:
{ 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'
...
{ 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'
...
{ 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
#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)
...
{ CustomImplementation , CustomNamespace := iec61131}
...
FUNCTION_BLOCK RS { vNameAlignment := "center"; ... }
VAR_INPUT
S : BOOL;
R1 : BOOL;
END_VAR
...
END_FUNCTION_BLOCK
#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'
...
{ 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
#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
...
{ 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.
/* 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:
...
{ 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.
#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'
...
{ 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.
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.
{ 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
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
...
{ 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.
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:
...
{ 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.
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'
...
{ 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:
{ CustomImplementation}
NAMESPACE Copies
FUNCTION GET_NAMED_MEMORY_Copy : INT
{ ImplementationProperties ( functionHasCFile;) }
END_FUNCTION
END_NAMESPACE
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 ",".
{ 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.
{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. |
{ |
gibt die folgenden zusätzlichen Daten (= Datenelemente) für die Variable an:
Siehe "Beschreibung, Kommentar, JSON-String oder Typ für Variablen oder Datentypen angeben" für Details. |
Beispiele mit '{REQUIRES_NON_TEMP_VALUE}'
{CustomImplementation}
NAMESPACE com.oem1.lib1
FUNCTION myFUN_noTV
VAR_IN_OUT
IO1 : INT {REQUIRES_NON_TEMP_VALUE} ;
END_VAR
END_FUNCTION
END_NAMESPACE
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. Verwenden Sie diese Anweisungen nicht für Ihre manuell erstellten Schnittstellen.
{ 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 Siehe "Anweisung zum Ignorieren von ST-Objekten" für Details zu dieser Anweisung. |
{ AccessLevel := Private|Public } |
Derzeit wird diese Anweisung nicht für die Verwendung innerhalb von Vendor-Bausteinen unterstützt. |
{suppressWarning modelRuleNamespace.modelRuleId('reason for suppression'), scope:=element|file} |
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. |