Gibt es eine möglichkeit in Deklarationsteil gewisse Definitionen Auszuschliessen.

oMALIK

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe folgende Frage: Besteht die Möglichkeit eine If Then Anweisung oder über einer Variable in deklarationsteil gewisse Sachen Ein- oder Auszuschliessen.
Beispiel: Ich habe einen Baustein der für die Temperatur und Feuchtigkeit zuständig ist. Nun hat aber nicht immer jede Zone beides. Eine Methode ist wenn es die Feuchtigkeit nicht in diese Zeilen gibt das mit (* *) aus zu dokumentieren.
Ich möchte nicht unnötig Variablen generieren die dann nicht verknüpft werden.

Das wird immer gebaucht
(* ------ Temperatur: Hardware Abbild der Widerstandssensor PT1000 Klemmen ----- *)
Temp_Data_IN_KL AT %I*: INT; (* Temperatur Data IN der Klemme*)
Temp_Status_IN_KL AT %I*: USINT; (* Temperatur Status IN der Klemme*)
Temp_Data_OUT_KL AT %Q*: INT; (* Temperatur Data OUT der Klemme*)
Temp_Status_OUT_KL AT %Q*: USINT; (* Temperatur StatusOUT der Klemme*)


Das ist Situativ
(* ------ Feuchtikeit: Hardware Abbild der 0-10V Eingangsklemme Klemmen ----- *)
Feucht_Data_IN_KL AT %I*: INT; (* Feuchtikeit Data IN der Klemme*)
Feucht_Status_IN_KL AT %I*: USINT; (* Feuchtikeit Status IN der Klemme*)
Feucht_Data_OUT_KL AT %Q*: INT; (* Feuchtikeit Data OUT der Klemme*)
Feucht_Status_OUT_KL AT %Q*: USINT; (* Feuchtikeit StatusOUT der Klemme*)
 
... möchtest du in der Variablen-Deklaration/-Zuweisung etwas "ausblenden" oder an einem Baustein etwas nicht benutzen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich nehmen an, dass es dir darum geht nicht für alle möglichen Zonen jeweils Adressvariablen zu erstellen die nicht immer genutzt werden -
würde mich auch interessieren ob und wie sowas geht! Falls du dass meinst ... Bin zwar etwas länger nicht mehr aktiv dabei gewesen aber das Problem sehe ich in der Erzeugung des tpy Files, darüber erfolgen ja die Verknüpfungen der Adressen im TC SystemManager. Da kannst du ja nachher keine PLC haben in der über ein z.B. "if then else" immer wieder einen andere Adressierung vorhanden ist ... ich lasse mich aber auch gerne korrigieren ...
 
Als Beispiel:

If Zone_hat_RH then
(* ------ Temperatur: Hardware Abbild der Widerstandssensor PT1000 Klemmen ----- *)
Temp_Data_IN_KL AT %I*: INT; (* Temperatur Data IN der Klemme*)
Temp_Status_IN_KL AT %I*: USINT; (* Temperatur Status IN der Klemme*)
Temp_Data_OUT_KL AT %Q*: INT; (* Temperatur Data OUT der Klemme*)
Temp_Status_OUT_KL AT %Q*: USINT; (* Temperatur StatusOUT der Klemme*)

(* ------ Feuchtikeit: Hardware Abbild der 0-10V Eingangsklemme Klemmen ----- *)
Feucht_Data_IN_KL AT %I*: INT; (* Feuchtikeit Data IN der Klemme*)
Feucht_Status_IN_KL AT %I*: USINT; (* Feuchtikeit Status IN der Klemme*)
Feucht_Data_OUT_KL AT %Q*: INT; (* Feuchtikeit Data OUT der Klemme*)
Feucht_Status_OUT_KL AT %Q*: USINT; (* Feuchtikeit StatusOUT der Klemme*)


Else

(* ------ Temperatur: Hardware Abbild der Widerstandssensor PT1000 Klemmen ----- *)
Temp_Data_IN_KL AT %I*: INT; (* Temperatur Data IN der Klemme*)
Temp_Status_IN_KL AT %I*: USINT; (* Temperatur Status IN der Klemme*)
Temp_Data_OUT_KL AT %Q*: INT; (* Temperatur Data OUT der Klemme*)
Temp_Status_OUT_KL AT %Q*: USINT; (* Temperatur StatusOUT der Klemme*)

End_if
 
Hi,
zumindest in CoDeSys V3.x kann man das über "Conditional Pragmas" lösen. Gibt ein paar Beispiele in der Hilfe.

Da kann man bspw. folgendes machen:

Code:
VAR
    {IF hasvalue(g_xCreateVar,'1')}
         xTest    : BOOL := TRUE;
    {END_IF} 
END_VAR

xTest wird nur erzeugt, wenn die (globale) Variable g_xCreateVar auf TRUE steht.
Gibt noch andere Möglichkeiten. Man kann die Deklaration auch abhängig davon machen in welcher Applikation die POU aufgerufen wird. Einfach mal ausprobieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein sowas geht nicht. Es gibt nur eine Hand voll Pragma Direktiven in TwinCAT2 und die machen auch nicht das, was du gerne hättest.
Du kannst ja mehrere Varianten von deinem FB erstellen, die in eine Bibliothek packen und dann immer den Verwenden der zum Aufbau passt. Das wäre für mich die sauberste Lösung.

Generell wäre ich auch bei Präprozessor-Anweisungen sehr vorsichtig. In C / C++ werden ifdef und Co meist nur zum debuggen verwendet, weil man sich damit auch ordentlich Sch...e eintreten kann.
 
Zuletzt bearbeitet:
Ich halte es in der SPS (unabhängig vom System) für höchst gefährlich Deklarationen dynamisch zu erstellen da dies unweigerlich zu schweren Ausnahmefällen zur Laufzeit führen kann. Denn wie soll der Compiler vernünftig prüfen ob die Variable in dem Moment wo du sie lesen/schreiben willst auch tatsächlich exitsiert? .NET würde dir eine Null Reference Exception in nettem Popup liefern, deine Anlage würde einfach stehen bleiben....
 
Zurück
Oben