Array of BIT/BOOL

Max2.0

Level-2
Beiträge
63
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich komme eigentlich eher aus der Siemens Welt und habe daher recht wenig Erfahrungen mit Beckhoff.
Hier ist mir aufgefallen, dass ein BOOL immer ein BYTE Platz brauch.
Ich habe eine Schnittstelle zur Safety und bekomme von dort ein WORD mit Informationen zu den Schutztüren.
Es funktioniert zwar so wie ich das jetzt gemacht habe finde es aber nicht gut gelöst.

Aktueller stand:
Code:
// Read Safety Inputs
MEMCPY(destAddr := ADR(SafetyToPLC), srcAddr := ADR(SafetyIN), n := SIZEOF(SafetyToPLC));

// Map Inputs Door
Doors[1].closed:=SafetyToPLC.DoorClosed.0;
Doors[2].closed:=SafetyToPLC.DoorClosed.1;
Doors[3].closed:=SafetyToPLC.DoorClosed.2;
Doors[4].closed:=SafetyToPLC.DoorClosed.3;
Doors[5].closed:=SafetyToPLC.DoorClosed.4;
Doors[6].closed:=SafetyToPLC.DoorClosed.5;
Doors[7].closed:=SafetyToPLC.DoorClosed.6;
Doors[8].closed:=SafetyToPLC.DoorClosed.7;
Doors[9].closed:=SafetyToPLC.DoorClosed.8;
Doors[10].closed:=SafetyToPLC.DoorClosed.9;

Doors[1].locked:=SafetyToPLC.DoorLocked.0;
Doors[2].locked:=SafetyToPLC.DoorLocked.1;
Doors[3].locked:=SafetyToPLC.DoorLocked.2;
Doors[4].locked:=SafetyToPLC.DoorLocked.3;
Doors[5].locked:=SafetyToPLC.DoorLocked.4;
Doors[6].locked:=SafetyToPLC.DoorLocked.5;
Doors[7].locked:=SafetyToPLC.DoorLocked.6;
Doors[8].locked:=SafetyToPLC.DoorLocked.7;
Doors[9].locked:=SafetyToPLC.DoorLocked.8;
Doors[10].locked:=SafetyToPLC.DoorLocked.9;

Ich Hätte es mir aber eher so vorgestellt:

Code:
    FOR I := 1 TO 16 DO
        Doors[i].closed:=SafetyToPLC.DoorClosed.I-1;;
        Doors[i].locked:=SafetyToPLC.DoorLocked.I-1;;
    END_FOR

Wie könnte man dass denn in der Beckhoff Welt elegant lösen?

Danke für die Hilfe
 
Du könntest Dir eine Hilfsvariable machen: WORD.
Die belegst Du mit 1 vor.
Dann schiebst Du sie um x Bits nach links, also bis zu dem Bit, welches Du auswerten möchtest.
Und dann verUNDest Du das mit Deinem DoorLocked/DoorClosed:


Code:
    FOR I := 1 TO 16 DO
        TestWord := SHL(1, I-1);
        Doors[i].closed:=(SafetyToPLC.DoorClosed AND TestWord) <> 0;
        Doors[i].locked:=(SafetyToPLC.DoorLocked AND TestWord) <> 0;
    END_FOR

Hab ich jetzt so aus dem Kopf aufgeschrieben... bitte testen.
 
Ansonsten könntest Du mit Strukturen arbeiten, da gibt es den Variablentyp Bit. Dann könntest Du Dein Word direkt in die Struktur kopieren und mit der Struktur dann weiterarbeiten.
Eine Beschreibung dazu findest Du hier im Infosys.
Ansonsten gibt es in der UTIL Bibliothek Funktionen zum Bitzugriff, vielleicht helfen die auch schon weiter.
Belegen bei Siemens Variablen vom Typ BOOL nicht auch ein Byte?
 
Zuletzt bearbeitet:
Ich kann bei S
Nur bei 1500er und wenn DB optimiert:
Anhang anzeigen 73841
Mit Serialize kann ich aber ein Byte in ein Array of Bit packen.(evtl versteht der Compiler auch, dass die anderen bits in dem Byte nicht belegt sind und passt das von sich aus an)
Wenn ich das bei TC3 versuchen alndet das bit 0.0 in Array[0] und das 1.0 in Array[1].
Damit komme ich also nicht weiter.
 
Du könntest Dir eine Hilfsvariable machen: WORD.
Die belegst Du mit 1 vor.
Dann schiebst Du sie um x Bits nach links, also bis zu dem Bit, welches Du auswerten möchtest.
Und dann verUNDest Du das mit Deinem DoorLocked/DoorClosed:


Code:
    FOR I := 1 TO 16 DO
        TestWord := SHL(1, I-1);
        Doors[i].closed:=(SafetyToPLC.DoorClosed AND TestWord) <> 0;
        Doors[i].locked:=(SafetyToPLC.DoorLocked AND TestWord) <> 0;
    END_FOR

Hab ich jetzt so aus dem Kopf aufgeschrieben... bitte testen.


Das hat übrigens funktioniert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ansonsten könntest Du mit Strukturen arbeiten, da gibt es den Variablentyp Bit. Dann könntest Du Dein Word direkt in die Struktur kopieren und mit der Struktur dann weiterarbeiten.
Eine Beschreibung dazu findest Du hier im Infosys.
Ansonsten gibt es in der UTIL Bibliothek Funktionen zum Bitzugriff, vielleicht helfen die auch schon weiter.
Belegen bei Siemens Variablen vom Typ BOOL nicht auch ein Byte?

Ich arbeite schon mit einer Struktur.
Wenn ich aus dem WORD jetzt aber einzelne Bits mache muss ich ja auch jedes bit wieder einzeln zuweisen und kann das auch nicht in einer Schleife machen oder habe ich da einen Denkfehler.


Code:
TYPE SafetyToPlc :
STRUCT
  EStopOK : BIT;
  ControlIsON: BIT;
  DoorsOK : BIT;
  AirIsON : BIT;
  ZoneModuleOK : BIT;
  SafeAxisStop : BIT;
  Acknowledge : BIT;
  ButtonControlON: BIT;
  ButtonControlOFF: BIT;
  KeySwitch : BIT;
  EnablingSwitch : BIT;
  SafetyDoorsBypassed : BIT;
  res12 : BIT;
  res13 : BIT;
  res14 : BIT;
  res15 : BIT;
  res16 : BYTE;

 
  ZoneOK      : BYTE; //o24
  EStopPressed: WORD; //o32
  DoorClosed  : WORD; //o48
  DoorLocked  : WORD; //o64
  SafetySwitch: WORD; //o80
 
END_STRUCT
END_TYPE
 
Ich arbeite schon mit einer Struktur.
Wenn ich aus dem WORD jetzt aber einzelne Bits mache muss ich ja auch jedes bit wieder einzeln zuweisen und kann das auch nicht in einer Schleife machen oder habe ich da einen Denkfehler.


Code:
TYPE SafetyToPlc :
STRUCT
  EStopOK : BIT;
  ControlIsON: BIT;
  DoorsOK : BIT;
  AirIsON : BIT;
  ZoneModuleOK : BIT;
  SafeAxisStop : BIT;
  Acknowledge : BIT;
  ButtonControlON: BIT;
  ButtonControlOFF: BIT;
  KeySwitch : BIT;
  EnablingSwitch : BIT;
  SafetyDoorsBypassed : BIT;
  res12 : BIT;
  res13 : BIT;
  res14 : BIT;
  res15 : BIT;
  res16 : BYTE;

 
  ZoneOK      : BYTE; //o24
  EStopPressed: WORD; //o32
  DoorClosed  : WORD; //o48
  DoorLocked  : WORD; //o64
  SafetySwitch: WORD; //o80
 
END_STRUCT
END_TYPE
Ich würde sagen, ja hast Du. Wie ich schon schrieb, das Word mit dem Bitmuster in die Struktur kopieren, fertig. In Deinem Fall so:
Code:
MEMCPY(ADR(EStopOK), ADR(SafetyToPLC.States), SIZEOF(SafetyToPLC.States))
 
Ich würde sagen, ja hast Du. Wie ich schon schrieb, das Word mit dem Bitmuster in die Struktur kopieren, fertig. In Deinem Fall so:
Code:
MEMCPY(ADR(EStopOK), ADR(SafetyToPLC.States), SIZEOF(SafetyToPLC.States))

Das vestehe ich jetzt nicht ganz.
Ich habe jetzt mal die einzelnen Bits in die Struktur integriert.
Jetzt muss ich aber dich jedes Bit einzeln in mein Array zuweisen.

Code:
TYPE SafetyToPlc :
STRUCT
  EStopOK : BIT;
  ControlIsON: BIT;
  DoorsOK : BIT;
  AirIsON : BIT;
  ZoneModuleOK : BIT;
  SafeAxisStop : BIT;
  Acknowledge : BIT;
  ButtonControlON: BIT;
  ButtonControlOFF: BIT;
  KeySwitch : BIT;
  EnablingSwitch : BIT;
  SafetyDoorsBypassed : BIT;
  res12 : BIT;
  res13 : BIT;
  res14 : BIT;
  res15 : BIT;
  res16 : BYTE;

 
  ZoneOK      : BYTE; //o24
  EStopPressed: WORD; //o32
  Door1Closed  : BIT; //o48
  Door2Closed  : BIT; //o49 
  .
  .
  .
  Door16Closed  : BIT;//o63
  Door1Locked  : Bit; //o64
  Door2Locked  : Bit; //o64 
  .
  .
  .
  Door16Locked  : Bit; //o79
  SafetySwitch: WORD; //o80
 
END_STRUCT
END_TYPE

Code:
// Read Safety Inputs
MEMCPY(destAddr := ADR(SafetyToPLC), srcAddr := ADR(SafetyIN), n := SIZEOF(SafetyToPLC));

// Map Inputs Door
Doors[1].closed:=SafetyToPLC.Door1Closed;
Doors[2].closed:=SafetyToPLC.Door2Closed;
.
.
.
Doors[16].closed:=SafetyToPLC.Door16Closed;

// Map Inputs Door
Doors[1].Locked:=SafetyToPLC.Door1Locked;
Doors[2].Locked:=SafetyToPLC.Door2Locked;
.
.
.
Doors[16].Locked:=SafetyToPLC.Door16Locked;
 
Zurück
Oben