ARRAY[1..2048] OF BOOL nach Word

Blackforest

Level-2
Beiträge
92
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Habe ein : ARRAY[1..2048] OF BOOL; und muß an eine übergeordnete Schnittstelle diese informationen über Merker im Word format schicken

wie bekomme ich jetzt jeweils fortlaufend 16 Bit auf ein Merkerwort geschrieben ??

gibt es hier vieleich einen Blockkopierbefehl bzw Transferbefehl
 
Hi Blackforest,

Mein Vorschlag einfach den Speicherbereich des Arrays festlegen mit z.B. at %MW0 dann müsste vom Merkerwort 0 bis Merkerwort 127 dein Array liegen.

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mavorkit,
Mein Vorschlag einfach den Speicherbereich des Arrays festlegen mit z.B. at %MW0 dann müsste vom Merkerwort 0 bis Merkerwort 127 dein Array liegen.
Deine Antwort enthält eine der klassischen Fehler die gemacht werden, wenn man sich mit den internen Strukturen von Codesys und seinen Derivaten nicht so auskennt. Bei Codesys und Co. belegt eine Variable vom Typ Bool nicht ein Bit, sondern ein Byte im Speicher, daher klappt Dein Vorschlag nicht.
@Blackforest: Ich kenne leider nur einen Bruchteil der vorhandenen Funktionen und FBs von Codesys auswendig, außerdem können sich Name, Funktion oder auch das grundsätzliche Vorhandensein je nach SPS-Hersteller ändern. Eine mögliche Lösung wäre, dass Du Dir eine Funktion selber schreibst. Diese Funktion gibt ein Word mit den eingefügten Bits zurück und erhält als Übergabeparameter einen Pointer auf das erste Element im Array of Bool das in das Word geschoben werden soll und die Anzahl an Bits die ins Word geschoben werden sollen, falls es mal weniger als 16 sind. In der Funktion legst Du zwei Hilfsvariable vom Typ Word an, wovon Du eine mit 0 initialisierst. In einer FOR-Schleife schiebst Du die erste Variable um ein Bit nach links, dann tust Du mit BOOL_TO_WORD jeweils ein Bit in die andere Hilfsvariable und machst eine ODER-Verknüpfung mit der ersten Hilfsvariable, fertig.
 
Zuletzt bearbeitet:
Hallo Mavorkit,

Deine Antwort enthält eine der klassischen Fehler die gemacht werden, wenn man sich mit den internen Strukturen von Codesys und seinen Derivaten nicht so auskennt. Bei Codesys und Co. belegt eine Variable vom Typ Bool nicht ein Bit, sondern ein Byte im Speicher, daher klappt Dein Vorschlag nicht.

Das heißt dass Array würde als Array of Byte gespeichert? Ändert das eine Adressierung als Bit? Oder lässt sich das für ein Array nicht so leicht sagen?

Gesendet von meinem SM-G389F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Mavorkit: Was wolltest Du mit der Kopie meiner Antwort an Dich ohne weiteren Kommentar mitteilen?

Von irgendwas mit Internetzugang gesendet
Die Finger waren Mal wieder schneller als das Hirn, habs bearbeitet.

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk
 
Hallo Mavorkit,
Das heißt dass Array würde als Array of Byte gespeichert? Ändert das eine Adressierung als Bit? Oder lässt sich das für ein Array nicht so leicht sagen?
ich muss gestehen, dass ich Deine Frage nicht so ganz verstehe. Sein ARRAY OF BOOL [1..2048] nimmt genau so viel Speicher, nämlich 2k, ein wie ein ARRAY OF BYTE[1..2048]. Aus diesem Grunde hättest Du bei Deinem Mapping auf das Merkerwort 0 auch in jedem Wort immer nur zwei Bits des ARRAY OF BOOL, nämlich im High-Byte und Low-Byte jeweils eins auf dem LSB.
@TE: In meinem Beispiel in #3 könntest Du eine Hilfsvariable sparen, wenn Du stattdessen die Ausgangsvariable der Funktion nimmst, aber ich denke so wie ich es geschrieben hatte ist es sauberer.
 
Zuletzt bearbeitet:
Lösung

PROGRAM xxxx
VAR
AnzahlMW:INT;
i:INT;
j:INT;
tw:WORD;
DE: ARRAY [0..100] OF BOOL;
END_VAR
(* @END_DECLARATION := '0' *)
FOR i:=0 TO (AnzahlMW-1) DO
tw:=0;
FOR j:=0 TO 15 DO
IF DE[i*16+j] THEN
tw:=tw OR SHL(WORD#1,j);
END_IF;

END_FOR;
MEMCPY(ADR(%MW0)+(i*2), ADR(tw), 2);
END_FOR;
END_PROGRAM
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mavorkit,

ich muss gestehen, dass ich Deine Frage nicht so ganz verstehe. Sein ARRAY OF BOOL [1..2048] nimmt genau so viel Speicher, nämlich 2k, ein wie ein ARRAY OF BYTE[1..2048]. Aus diesem Grunde hättest Du bei Deinem Mapping auf das Merkerwort 0 auch in jedem Wort immer nur zwei Bits des ARRAY OF BOOL, nämlich im High-Byte und Low-Byte jeweils eins auf dem LSB.

Hi Oliver,

Ich meinte wenn ich das Array auf %MX0.0 adressiere, aber das geht mit einem Array nicht (habs Mal getestet).

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk
 
Wieso sollte das auch gehen? und selbst wenn es gehen würde, nur weil du das Array von einem Bitmerker aus adressierst, ändert das doch nicht die Grundstruktur des Arrays (jedes BOOL hat die Größe eines BYTE)

Evtl. könnte man eine direkte Konvertierung zu WORD mit einem "ARRAY OF BIT" machen, aber in diesem Fall würde ich eine explizite Konvertierungsfunktion vorziehen.
 
MEMCPY(ADR(%MW0)+(i*2), ADR(tw), 2);

Hi Blackforest,

memcpy gibt es z.B. für WAGO nicht, zumindest konnte ich dazu nichts finden.

@ _Eddi_: War nur so ein Gedanke. Heist das dann wenn ich Boolsche Werte mit Bitadressierung einzeln speichere werden die auch alle als Byte hinterlegt? Sorry wenn ich so dumm Frage, find es nur sehr interessant.

Gruß
Mavorkit
 
@ _Eddi_: War nur so ein Gedanke. Heist das dann wenn ich Boolsche Werte mit Bitadressierung einzeln speichere werden die auch alle als Byte hinterlegt? Sorry wenn ich so dumm Frage, find es nur sehr interessant.

Das weiß ich auch nicht so genau, Programme mit direkter Festlegung der Adressierung hab ich seit Jahren nicht mehr geschrieben. und ehrlich gesagt, hatte ich nie vor, solche verqueren Adressierungsspielereien damit zu machen.

und das MEMCPY kannst du einfach ersetzen durch "WordArray := tw;" (wenn du irgendwo das WordArray hinreichend groß deklariert hast)
 
Also im TwinCat findet man die Speicherbelegung unter "<projektname> Instance"->"Data Area". Bei CoDeSys müßte es sowas auch geben, aber ich hab keins hier, um nachzuschauen.
 
Heist das dann wenn ich Boolsche Werte mit Bitadressierung einzeln speichere werden die auch alle als Byte hinterlegt? Sorry wenn ich so dumm Frage, find es nur sehr interessant.

MyBool:BOOL; // Belegt 1 Byte irgendwo
MyBit AT %MX0.0:BOOL; // Belegt das Merkerbit 0.0

Wenn es nur um boolesche Verknüpfungen geht, sind die als Byte gespeicherten BOOLs performanter, weil keine Bitmaskierungen notwendig sind. In Bytes oder Words gepackte Bits verwende ich nur, wenn
a) die Hardware es verlangt.
b) ich auch mehrere Bits auf einmal abfragen oder manipulieren will.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo StructuredTrash,
MyBool:BOOL; // Belegt 1 Byte irgendwo
MyBit AT %MX0.0:BOOL; // Belegt das Merkerbit 0.0
wusste gar nicht, dass das geht, danke wieder was gelernt. Allerdings funktioniert das, zumindest in TC3, nur mit einzelnen Variablen und nicht mit Arrays.
 
Allerdings funktioniert das, zumindest in TC3, nur mit einzelnen Variablen und nicht mit Arrays.

Ja, nur mit einzelnen Bools, auch in TC2. In TC3 gibt es aber immerhin Bit-Structs. Aber das ist alles irgendwie nur Herumgewurschtel. Ich würde es besser finden, wenn der Datentyp BIT als eigener Typ in vollem Umfang unterstützt würde. Gerade im HW-Bereich braucht man ihn ja doch des Öfteren.
 
Zurück
Oben