Bit/Byte/Wortadressierung aus definiertem Array?

momo99

Level-2
Beiträge
54
Reaktionspunkte
4
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?
 
...
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));
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zurück
Oben