// 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;
FOR I := 1 TO 16 DO
Doors[i].closed:=SafetyToPLC.DoorClosed.I-1;;
Doors[i].locked:=SafetyToPLC.DoorLocked.I-1;;
END_FOR
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
Und bei den optimierten IDBs gibt's dann auch noch die Ausnahme beim Überlagern, weil überlagerte Variablen nicht mehr wirklich optimiert sind.Nur bei 1500er und wenn DB optimiert:
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)Nur bei 1500er und wenn DB optimiert:
Anhang anzeigen 73841
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?
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: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
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))
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
// 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;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?