Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: UDT Variable über Vorwahl aufrufen

  1. #1
    Registriert seit
    24.03.2009
    Beiträge
    7
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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;
    Zitieren Zitieren UDT Variable über Vorwahl aufrufen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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

  3. #3
    hans_adamm ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.03.2009
    Beiträge
    7
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  4. #4
    hans_adamm ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.03.2009
    Beiträge
    7
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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 ...

    Gruß
    Larry

  6. #6
    hans_adamm ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.03.2009
    Beiträge
    7
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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;
    Geändert von hans_adamm (04.01.2014 um 17:38 Uhr)

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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

  8. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    hans_adamm (05.01.2014)

  9. #8
    hans_adamm ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.03.2009
    Beiträge
    7
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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;

  10. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.709 Danke für 1.240 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Was du vorhast nennt sich in der Programmierung Introspektion oder auch Reflektion.
    Es gibt einige Programmiersprachen in denen das möglich ist, SCL gehört aber nicht dazu.

  11. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    hans_adamm (05.01.2014)

Ähnliche Themen

  1. Bild aufrufen durch PLC-Variable?
    Von D4K!ZZ4 im Forum HMI
    Antworten: 1
    Letzter Beitrag: 21.10.2011, 13:27
  2. FC über in-Variable aufrufen
    Von Gerri im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 05.07.2010, 14:31
  3. UDT in FB statisch aufrufen
    Von Bitte_ein_Bit im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 25.11.2008, 01:12
  4. Antworten: 7
    Letzter Beitrag: 18.11.2007, 09:10
  5. IN OUT Variable UDT
    Von slma im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 26.07.2007, 08:08

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •