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

Page 1 of 3 123 LastLast
Results 1 to 10 of 23

Thread: Array an DWORD übergeben (SCL)

  1. #1
    Join Date
    02.09.2008
    Posts
    132
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi

    habe mal wieder ein Problem mit meinen Arrays .

    Folgendes ich bin grad dabei eine Synoptik für ein Projekt zu programmieren.
    der Status zu den jeweiligen Variablen die überprüft werden sollen wird in ein DWORD geschrieben. Und das jeweils als BIT gesehen.

    bsp:

    Code:
    IF Variable THEN
           "P_Systemdaten".Anl_Synoptik.Syn_Status   :=2#0000000000000000000000001000011  ;  
    (* Synoptik Status rot = 0, gruen = 1 *)*)
             END_IF;
    das funktioniert auch soweit wenn ich nur eine variable überprüfe aber im tatsächlichen Programm kommen mehere If -Abfragen hintereinander. und dann kommt was ja eigentlich klar ist... das dass DWORD immer überschrieben wird... gut eigentlich kein Thema dachte ich ändere ich einfach das DWORD in ein ARRAY of BOOL um. nur das kann ich nicht machen weil sonst mein kollege über einen tag beschäftigt ist die VISU neu einzustellen( ZENON )

    Jetzt dachte ich mache ich es so
    Code:
    IF Variable THEN
            Syn_Status_temp[0]   := TRUE; 
    (*"P_Systemdaten".Anl_Synoptik.Syn_Status   :=2#0000000000000000000000001000011  ;   (* Synoptik Status rot = 0, gruen = 1 *)*)
     END_IF;
    Nur weiß ich jetzt nicht wie bzw ob es überhaupt geht das Array wieder in das Dword zuschreiben, so dass mein Bitmuster wieder stimmt.

    Mein Versuch geht natürlich nicht...

    Code:
     FOR i := 0 TO 32 BY 1 DO
         "P_Systemdaten".Anl_Synoptik.Syn_Status := syn_status_temp[i];
         END_FOR;

    hat vllt jemand eine Idee?

    Grüßle
    Reply With Quote Reply With Quote Array an DWORD übergeben (SCL)  

  2. #2
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    Hallo Matthias,
    aus deiner Frage bin ich nicht so recht schlau geworden. 1 Sache habe ich dennoch :

    Code:
     
    VAR 
       Test_DWORD : DWORD ;
       Array_DWORD AT Test_DWORD : Array [0..31] of bool ;
     
    und im Code dann :
     
    Array_DWORD[14] := true ;
     
    usw.
    In meinem Beispiel wird mittels des Befehls AT eine andere Sicht auf dein DWORD gebildet und nicht etwa eine neue Variable). Wenn du dich hier an die Spielregeln hällst (beide Sichten sollten gleich groß sein), dann kann du so auch einzelne Bits in dem ursprünglichen DWORD verändern.

    Gruß
    LL

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

    MatthiasH24 (15.12.2008)

  4. #3
    MatthiasH24 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    02.09.2008
    Posts
    132
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Default

    So also hier mal der prinzippiele Ablauf wie es eigentlich gedacht war.. versuche es so mal zu erklären vllt ist es dann klarer. Was du mir mit deinem code sagen willst versethe ich nocht nicht so ganz. Muss mal in der hilfe nach dem AT befehl schauen

    Code:
    IF e100.0 THEN
       status :=2#00000000000000000000000000000001 ;
    ELSE
       status :=2#00000000000000000000000000000000 ;
     
    END_IF;
    IF e100.1 THEN
        status :=2#00000000000000000000000000000010;
        ELSE
       status :=2#00000000000000000000000000000000;
    END_IF;
    IF e100.2 THEN
        status :=2#00000000000000000000000000000100;
        ELSE
       status :=2#00000000000000000000000000000000;
    END_IF;
    IF e100.3 THEN
        status :=2#00000000000000000000000000001000;
        ELSE
       status :=2#00000000000000000000000000000000;
    END_IF;
    IF e100.4 THEN
        status :=2#00000000000000000000000000010000;
        ELSE
       status :=2#00000000000000000000000000000000;
    END_IF;
    IF e100.5 THEN
        status :=2#00000000000000000000000000100000;
        ELSE
       status :=2#00000000000000000000000000000000;
    END_IF;
    wie man sieht wird ja jedes mal der Status neu überschrieben (logisch aber irgendwie für manche doch nicht)

    Mein Problem ist halt das für jede Variable ein Kästchen in der Visu habe das je nachdem dem Wert des BITS die Farbe "rot" oder "grün" annimmt.
    und in der ELse schleife will ich es durch ein Array ersetzen das natürlich auch 32 BIT groß ist. und das Array soll dann wieder als DWORD ausgegeben werden und an die VISU zur Anzeige geschickt wird.

  5. #4
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,806
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    Larry hat dir ja einen sehr schönen Weg gezeigt, den würde ich empfehlen, gerade in SCL
    Eine andere Möglichkeit ist, die Bits zu maskieren.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    MatthiasH24 (15.12.2008)

  7. #5
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    ... dann schau dir das mit dem AT-Befehl mal an und test es ggf. mal - ich verspreche dir, dass es dir gefallen wird.

    Bezogen auf dein Beispiel könnte das dann so aussehen (keine Gewähr für die korrekte Bit-Position weil nicht getestet) :
    Code:
     
    ARRAY_Status[31] := e100.0 ;
    ARRAY_Status[30] := e100.1 ;
     
    usw.
    Wenn du mit Maskieren arbeiten willst, so mußt du vorher ausmaskieren :
    Code:
    Status := Status and 2#11111111111111111111111111111110 ;
    if e100.0 then status := status or 2#00000000000000000000000000000001 ; end_if ;

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

    MatthiasH24 (15.12.2008)

  9. #6
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    nach nochmaligem Ansehen deines Codes noch folgendes :
    Code:
    VAR 
       dw_Status : DWORD ;
       bool_array_Status AT dw_Status: Array [0..31] of bool ;
       byte_array_Status AT dw_Status: Array [0..3] of byte ;
       word_array_Status AT dw_Status: Array [0..1] of word ;
     
    somit geht dann natürlich auch :
     
    bool_array_Status [14] := e100.0 ;
     
    byte_array_Status [2] := eb101 ;
     
    word_array_Status [1] := ew102 ;
     
    und zwar sogar gemischt ...
    ich würde allerdings bei solchen Sachen eine absolute Adressierung immer hinterfragen ...

    Gruß
    LL

  10. Folgende 2 Benutzer sagen Danke zu Larry Laffer für den nützlichen Beitrag:

    MatthiasH24 (15.12.2008),Pinky (31.01.2014)

  11. #7
    MatthiasH24 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    02.09.2008
    Posts
    132
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Default

    Hi also gleichmal zu absoult adressierung das war nur ein Bsp. in echt sieht es nciht so aus.

    habe es mal eingespielt mit der Visu aber geht so leider nicht.

    hier Mal der komplette Code:
    Variablendeklaration
    Code:
    VAR_TEMP
    Syn_temp : DWORD;
    Syn_Status_temp  AT Syn_temp : ARRAY[0..31] OF BOOL;
    END_VAR
    Vordefintionen:
    Code:
    "P_Systemdaten".Anl_Synoptik.Syn_Ansicht :=2#00000000000000000000000001111111;(* Synoptik Ansicht der Bits einblenden *)
    Damit wird angegeben wieviel Bits für die jeweilige Gruppe es in der Synoptik gibt. hier 7 Stück

    Die If Abfragen für die Variablen

    Code:
     
    IF "P_I=0+S0-F04:14" THEN 
            Syn_Status_temp[0]   := TRUE;
    ELSE
            Syn_Status_temp[0]   := FALSE;
    END_IF;
     IF "P_I=00+S00-X31:703" THEN 
            Syn_Status_temp[1]   := TRUE
    ELSE
            Syn_Status_temp[1]   := FALSE;
    END_IF;
    IF "P_I=00+S00-B33.3:4" THEN 
         Syn_Status_temp[2]   := TRUE;
    ELSE
         Syn_Status_temp[2]   := FALSE;
    END_IF;
    IF "P_I=00+S00-0F1:14" THEN
         Syn_Status_temp[3]   := TRUE; 
    ELSE
        Syn_Status_temp[3]   := FALSE;
    END_IF;
    IF "P_I=00+S00-F3:14" THEN
            Syn_Status_temp[4]   := TRUE;
    ELSE
            Syn_Status_temp[4]   := FALSE;
    END_IF;
    IF "P_I=00+S00-F40:14" THEN 
            Syn_Status_temp[5]   := TRUE;
    ELSE
            Syn_Status_temp[5]   := FALSE;
    END_IF;
    IF "P_I=0+S0-0F22:14" THEN
          Syn_Status_temp[6]   := TRUE; 
    ELSE
          Syn_Status_temp[6]   := FALSE;
    END_IF;
    und anschließen nooch die Übergabe in das ursprüngliche DWORD

    Code:
    "P_Systemdaten".Anl_Synoptik.Syn_Status := Syn_temp;
    "P_Systemdaten".Anl_Synoptik.Syn_Uebersicht_Status := "P_Systemdaten".Anl_Synoptik.Syn_Status = "P_Systemdaten".Anl_Synoptik.Syn_Ansicht ;
    Die Bits im Array werde auch schön gesetzt, weiß nur nicht ob ich jetzt wegen den Arrays ein Programmierfehler habe oder weil ich was falsch von dir übernommen habe.

    Grüßle

  12. #8
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    das ist schon ganz schön ...

    ich meinte es aber so :
    Code:
     
    Syn_Status_temp[0]   := "P_I=0+S0-F04:14" ;
    Syn_Status_temp[1]   := "P_I=00+S00-X31:703"  ;
     
    usw.
    Das Umkopieren von Syn_Status_temp in Syn_temp kann (muß) entfallen. Du hast durch die AT-Zuweisung sowieso schon die Ganze Zeit in Wirklichkeit in dieses DWORD hinein geschrieben.

    AT bedeutet :
    Die Variable DWORD (in deinem Fall) wird außerdem noch als ARRAY[0..31] of BOOL betrachtet / verwendet. Es bleibt aber die gleiche Variable ...

    Gruß
    LL

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

    MatthiasH24 (15.12.2008)

  14. #9
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    ... ich habe mich in deinem Code verlesen - du arbeitest ja mit einer temp-Variablen. Somit mußt du natürlich rück-kopieren - außer du machst die AT-Sicht auf die Quell-Variable - das geht auch und erspart das kopieren ...

  15. #10
    MatthiasH24 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    02.09.2008
    Posts
    132
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by Larry Laffer View Post
    das ist schon ganz schön ...

    ich meinte es aber so :[code]

    Syn_Status_temp[0] := "P_I=0+S0-F04:14" ;
    Syn_Status_temp[1] := "P_I=00+S00-X31:703" ;
    Muss ich das zwingend so machen? wenn ja kein problem verstehe nur grad net das der unterschied sein soll

Similar Threads

  1. TIA ARRAY of byte in DWORD ändern
    By rerdma3s in forum Simatic
    Replies: 11
    Last Post: 18.03.2018, 22:11
  2. Replies: 20
    Last Post: 25.07.2016, 11:38
  3. Array ohne Pointer übergeben? (SCL)
    By tahren in forum Simatic
    Replies: 10
    Last Post: 15.06.2010, 12:08
  4. Replies: 6
    Last Post: 22.04.2010, 10:23
  5. DWord to Array
    By kai86 in forum Simatic
    Replies: 12
    Last Post: 02.03.2010, 13:05

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •