Step 7 UDT Variable über Vorwahl aufrufen

hans_adamm

Level-2
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ist es möglich die im UDT deklarierte Structur variabel über Vorwahl aufzurufen?

Das was rot ist sollte Variabel sein.

VAR_IN_OUT
I_DB_Zeiten: ARRAY[1..C_MAX] OF udt21;
END_VAR

Der UDT21 sieht wie folgt aus
UDT21
_0_VZ DINT
_1_NLZ DINT
_2_NLZ_Alarm DINT

Ich möchte das Rot markierte Variabel machen das heißt über ein VAR_IN entscheiden was ich aus dem UDT nehmen will. z.B. Vorwahl x->"_1_NLZ" oder x->"_2_NLZ_Alarm"

I_DB_Zeiten[T_nSpal]._2_NLZ_Alarm:= I_DB_Matrix[T_nSpal,T_nLine].Zeiten;
 
Hallo,
klar geht das.
Wenn ich es richtig sehe dann möchtest du es mit SCL realisieren - das wäre dann auch der einfachste Weg.
Du mußt du nur eine (wie von dir schon selbst geschrieben) IN-Variable vom Typ INT machen über die du die Selektion ausführst und das dann über eine OUT-Variable (oder auch IN_OUT-Variable) vom richtigen Typ ausgeben.

Stell mal deinen Code etwas vollständiger hier ein ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

so habe jetzt mal den ganzen Code reinkopiert. Wie gebe ich dann an der IN-Variabel an was ich aus den UDT nehmen will?


FUNCTION_BLOCK fb30
CONST
C_MAX:=50;
END_CONST



VAR_INPUT
END_VAR

VAR_IN_OUT
I_DB_Matrix: ARRAY[1..C_MAX,1..C_MAX] OF udt23;
I_DB_Zeiten: ARRAY[1..C_MAX] OF udt21;
I_UDT_Var: INT;
END_VAR


VAR_TEMP
T_nAntr: INT; // Schleife Antriebe
T_nSpal: INT; // Schleife Spalte
T_nLine: INT; // Schleife Linie

END_VAR

VAR
END_VAR

VAR_OUTPUT
END_VAR

BEGIN
T_nSpal:= 1;
T_nLine:= 1;


FOR T_nSpal:= 1 TO C_MAX DO
FOR T_nLine:= 1 TO C_MAX DO
IF NOT I_DB_Matrix[T_nSpal,T_nLine].FRG_Aenderung THEN;

I_DB_Matrix[T_nSpal,T_nLine].Zeiten:= I_DB_Zeiten[T_nLine]._1_NLZ;
END_IF;
END_FOR;
END_FOR;



END_FUNCTION_BLOCK
 
Was ich noch vergessen habe

das was Rot markiert ist möchte ich Variabel machen. Die rot hinterlegten sind im udt21 bzw udt23 hinterlegt

I_DB_Matrix[T_nSpal,T_nLine].Zeiten:= I_DB_Zeiten[T_nLine]._1_NLZ;

Danke schon mal für die schnelle Antwort
 
Die Schwierigkeit für den Helfenden ist IMMER zu erkennen, was der Hilfesuchende eigentlich genau möchte.
Nach deiner letzten Antwort bin ich mir nicht mehr so sicher, es verstanden zu haben.
Vielleicht nimmst du dir doch noch die Zeit, mir etwas genauer zu beschrieben, was du tun möchtest.

Deinen ersten Post hätte ich so verstanden :
Wenn auf der IN-Variable (ich nenn sie mal myAuswahl) eine 0 steht dann soll der Wert von "_0_VZ" ausgegeben werden, bei 1 der Wert von "_1_NLZ" usw.
Das wäre ein Fall für eine IF .. THEN -Abfrage. Allerdings ... welcher Index soll (von z.B. _0_VZ) verwendet werden ...?

Nach den letzten beiden Posts weiß ich nun nicht mehr, was du willst ... 8)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Ok sorry ich versuche es mal deutlicher.

Ich möchte das was im Punkt 1) rot markiert ist Variabel haben d.h. Über eine Vorwahl entweder "_1_NLZ" oder "_2_NLZ_Alarm".
d.h. eine Vorwahl am Baustein ob ich auf die Variable im DB "I_DB_Zeiten" auf "_1_NLZ" oder "_NLZ_Alarm" zugreife.
d.h. ich möche eine Vorwahl für die Position im UDT wo drauf zugegriffen wird

Ich hoffe das es jetzt eindeutiger ist was ich gerne möchte

Der UDT21 sieht wie folgt aus
UDT21
_0_VZ DINT
_1_NLZ DINT
_2_NLZ_Alarm DINT

Auszug aud DB "I_DB_Zeiten"
DB.jpg

VAR_IN_OUT
I_DB_Zeiten: ARRAY[1..C_MAX] OF udt21;
End_Var

1)
I_DB_Matrix[T_nSpal,T_nLine].Zeiten:= I_DB_Zeiten[T_nLine]._1_NLZ;
 
Zuletzt bearbeitet:
Das könntest du z.B. so machen :

Du fügst dir eine IN-Variable mit Namen "Antrieb_Nr : INT" und eine "GetDaten : INT" ein.
Außerdem eine OUT-Variable "GetDaten_Wert : DINT".

Im Code machst du nun folgendes :
Code:
if Antrieb_Nr >= 1 and Antrieb_Nr <= C_Max then
   if GetDaten = 1 then
      GetDaten_Wert := I_DB_Zeiten[Antrieb_Nr]._1_NLZ ;
   elseif GetDaten = 2 then
      GetDaten_Wert := I_DB_Zeiten[Antrieb_Nr]._2_NLZ_Alarm ;
   else
      GetDaten_Wert := -1 ;
   end_if ;
end_if ;
... ich kann das aber gerade nicht gegenchecken bezüglich funktioneller und syntaktischer Korrektheit ...

Gruß
Larry
 
Danke schon mal so sollte es funktionieren. Aber das man den Ausdruck (rot) direkt in eine Variable legt und diese dann über Vowahl beschaltet ist nicht möglich?

Ich habe es einfach mal so hingeschrieben wie ich es mir vorstelle. (So wie es hier steht funktioniert es nicht nur zur Veranschaulichung!)

if GetDaten = 1 then
T_Ausdruck:='_1_NLZ' ;
elseif GetDaten = 2 then
T_Ausdruck:=._2_NLZ_Alarm ' ;
else
GetDaten_Wert := -1 ;
end_if ;

I_DB_Matrix[T_nSpal,T_nLine].Zeiten:= I_DB_Zeiten[T_nLine].T_Ausdruck;
 
Zurück
Oben