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

Ergebnis 1 bis 4 von 4

Thema: Bit/Byte/Wortadressierung aus definiertem Array?

  1. #1
    Registriert seit
    05.11.2008
    Beiträge
    54
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    möchte gern einen meiner Bibl-Bausteine aus S7 auf CoDeSys umsetzen, einfach um das CoDeSys besser zu verstehen.

    Folgende Funktion:
    1.) Array (1-128 ) in dem unzusammenhängende Eingangsbytes abgelegt sind.
    2.) Array (1-128 ) in dem einzelne Bedienbits aus der Visu abgelegt sind.
    3.) Array (1-128 ) in dem vorangegeangene Arrays verunded bzw. verodert werden und dann auf unzusammenhängende Ausgänge verschaltet werden.

    Die interne Verschaltung ist kein Problem, mein Problem ist der Einzelzugriff auf Elemente innerhalb des Arrays, zumindest wenn ich nicht jedes Bit einzeln beschalten will.

    Bei S7 in AWL sieht das z.B. folgendermassen aus:
    Code:
          L     EB     0
          T     DB10.DBB  128
          L     ED     6
          T     DB10.DBD  130
          L     EW    10
          T     DB10.DBW  134
    
          L     DB10.DBB  256
          T     AB     0
          T     DB10.DBD  258
          T     AD     6
          T     DB10.DBW  262
          T     AW    10
    Bei CoDeSys habe ich meine 3 Arrays als Globaldaten definiert:
    Code:
    VAR_GLOBAL
        EIN:   ARRAY[1..128] OF BOOL;
        BEDI:  ARRAY[1..128] OF BOOL;
        AUS:   ARRAY[1..128] OF BOOL;
    END_VAR
    Wie funktioniert die Beschaltung bei CoDeSys?
    Zitieren Zitieren Bit/Byte/Wortadressierung aus definiertem Array?  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von momo99 Beitrag anzeigen
    ...
    Wie funktioniert die Beschaltung bei CoDeSys?
    Auch wenn mir jetzt wieder einer mangelndes Feingefühl vorwirft:
    AM BESTEN GAR NICHT! Ich finde die Lösung schon auf der Step7 Seite übelst.
    Wenn es ein innerer Drang ist das 1:1 auf CoDeSys umzusetzen viel Spaß dabei und vor allem damit.

    Also zu erst mal die Lösung zu Deinem Ansatz:
    Verundung des gesamten Bereichs:
    Code:
    FOR i := 1 TO 128 DO
      AUS[i] := BEDI[i] AND EIN[i];
    END_FOR
    Veroderung der ersten zehn Elemente:
    Code:
    FOR i := 1 TO 10 DO
      AUS[i] := BEDI[i] OR EIN[i];
    END_FOR
    ---
    Ich würde das aber gaaaaanz anders lösen. Du hast ja drei mal eine gleiche Struktur (EIN/BEDI/AUS) Dafür würde ich kein doofes nichtssagendes Array verwenden sondern einen Datentyp (UDT) anlegen und mit dem je eine (also drei) Variable mit diesem Type anlegen.
    Dann hat jedes element eine "sinnvolle" Bezeichnung (die die man dem Kind halt gibt). Wenn Du das soweit verstanden hast und auch noch gutfindest würde ich dann eine Funktion schreiben die diesen Type verundet bzw. verodert dies geht dank Pointer relativ einfach.

    Hier die Funktion:
    Code:
    FUNCTION myType_AND : test_type
    VAR_INPUT
      In  : POINTER TO BYTE;
      Vis : POINTER TO BYTE;
    END_VAR
    VAR
      Res : test_type;
      i : INT;
      ptByte : POINTER TO BYTE;
    END_VAR
    
    ptByte := ADR(Res);
    FOR i := 1 TO SIZEOF(Res)  DO
      ptByte^ := In^ AND Vis^;
      ptByte := ptByte + 1;
      In := In + 1;
      Vis := Vis + 1;
    END_FOR
    myType_AND := Res;

    Hier der Aufruf:
    Code:
    PROGRAM PLC_PRG
    VAR
      var1 : test_type;
      var2 : test_type;
      Res  : test_type;
    END_VAR
    
    Res := myType_AND(In:=ADR(var1), Vis:=ADR(var2));
    If you open your Mind too much, your Brain will fall out.

  3. #3
    momo99 ist offline Benutzer
    Themenstarter
    Registriert seit
    05.11.2008
    Beiträge
    54
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Daumen hoch

    Hallo zotos,

    Danke für die Mühe und ausführliche Antwort!
    Wenn ich das richtig verstanden habe (und ich muß gestehen, daß meine CoDeSys-Kenntnisse was Typen und Strukturen betrifft derzeit noch nicht ausreichen...) geht das Ganze aber trotzdem an meinem Problemkern vorbei.
    Es ist so, daß ich die Funktion an sich relativ einfach gewählt habe - die Programmierung derselben ist ja auch nicht das Thema, das ist sicher auf verschiedene Arten machbar.

    Meine Frage war, da ich ja von der Siemens-Seite (FUP/AWL) komme, folgende:
    Wenn ich eine Deklaration mache z.B.:
    Test_W: INT;
    dann liegt das Ganze ja bei Siemens in einem DB (Global-/ Instanz-DB respektive Lokaldatenbereich), meinetwegen im DB10.DBW0, worauf man dann auch Bit- oder Byteweise zugreifen kann (ohne eigene Deklaration).
    Wieder z.B.:

    Code:
    L EB 5
    T DB10.DBB0      //Byte0 von Test_W
    L DB10.DBB1      //Byte1 von Test_W
    T AB 3
    (Ob das jetzt Sinn macht sei einmal egal)

    Kann ich das bei CoDeSys ohne grosse Verrenkungen auch machen oder geht das nur über Pointer und Strukturadressierung?
    Anders gesagt: Mir will das Prinzip der Adressierung, welche bei S7/S5 symbolisch UND absolut möglich ist, bei CoDeSys nicht einleuchten...

    Gruss
    momo

  4. #4
    Registriert seit
    18.02.2009
    Beiträge
    16
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Bei CoDeSys gibt es keine Datenbausteine. Deshalb benötigst du entweder; Array, Strukturen oder Pointer, um dein Beispiel umsetzen zu können.
    Bei Arrays legst du Felder fest, in dem du die Daten hinterlegen kannst.
    Bei Strukturen legst du Objekte an, in dem du Datentypen definieren kannst.
    Und den Pointer kannst du wie bei Step 7 verwenden.

  5. Folgender Benutzer sagt Danke zu Christian84 für den nützlichen Beitrag:

    momo99 (26.02.2009)

Ähnliche Themen

  1. Pointer in ein Byte Array umwandeln
    Von kai86 im Forum Simatic
    Antworten: 31
    Letzter Beitrag: 04.02.2011, 11:09
  2. array of [1..8] byte
    Von domino im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 13.04.2010, 07:25
  3. Array of Byte to String[12] ,S7
    Von sb9674 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 28.09.2009, 19:15
  4. byte in array kopieren [AWL]
    Von vierlagig im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 17.11.2008, 22:55
  5. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12

Lesezeichen

Berechtigungen

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