elfrosch - 2017-02-08

Hallo zusammen,

ich hab mit der sufu nichts brauchbares gefunden und google war auch nicht mein Freund, darum trage ich mein Anliegen hier vor...

Ich wollte zum spielen mal einen Zylinder implementieren

also erstmal ein Interface:

INTERFACE ICylinder
METHOD move2Home: ICylinder
METHOD move2WorkingPos: ICylinder
METHOD isInHomePos: BOOL
METHOD isInWorkingPos: BOOL

Nun kommt ein Zylinder mit 2 Ausgängen und 2 Eingängen:

FUNCTION_BLOCK Cylinder2Out2In IMPLEMENTS ICylinder
VAR
   DO_Cylinder2WorkingPos: POINTER TO BOOL; (* digital output for move cylinder to working position *)
   DO_Cylinder2HomePos: POINTER TO BOOL; (* digital output for move cylinder to home position *)
   DI_CylinderInHomePos: POINTER TO BOOL; (* digital input for cylinder is in home position *)
   DI_CylinderInWorkingPos: POINTER TO BOOL; (* digital input for cylinder is in working position *)
END_VAR
METHOD move2Home: ICylinder
   DO_Cylinder2WorkingPos^ := FALSE;
   DO_Cylinder2HomePos^ := TRUE;
   move2Home := this;
METHOD move2WorkingPos: ICylinder
   DO_Cylinder2WorkingPos^ := TRUE;
   DO_Cylinder2HomePos^ := FALSE;
   move2Home := this;
METHOD isInHomePos: BOOL
   isInHomePos := ((DI_CylinderInHomePos^) AND (NOT (DI_CylinderInWorkingPos^)));
METHOD isInWorkingPos: BOOL
   isInHomePos := ((DI_CylinderInWorkingPos^) AND (NOT (DI_CylinderInHomePos^)));
METHOD constructor: Cylinder2Out2In
VAR_INPUT
   doCylinder2WorkingPos: POINTER TO BOOL; (* digital output for move cylinder to working position *)
   doCylinder2HomePos: POINTER TO BOOL; (* digital output for move cylinder to home position *)
   diCylinderInHomePos: POINTER TO BOOL; (* digital input for cylinder is in home position *)
   diCylinderInWorkingPos: POINTER TO BOOL; (* digital input for cylinder is in working position *)
END_VAR
   DO_Cylinder2WorkingPos := doCylinder2WorkingPos;
   DO_Cylinder2HomePos := doCylinder2HomePos;
   DI_CylinderInHomePos := diCylinderInHomePos;
   DI_CylinderInWorkingPos := diCylinderInWorkingPos;
   constructor := this;   

so würde das Ganze in etwa aussehen, ich weiß es gibt keine Fehlerbehandlung und die getter für home und working pos sind auch nicht schön...
Mein Problem ist ich bekomme keine Bits in die Klasse, Booleans haben eine länge von 1 Byte... liegen nun meine Ausgänge auf QX1.0 und QX1.1 dann Funktioniert das nicht.
Nun könnte man sagen, abreite halt mit Byte und Bit Adressen:

   OutByte^.DO_Cylinder2WorkingPos := TRUE;

Aber das ist auch Lahm, nun hat sich 3S sicher was dabei gedacht uns Klassen und Interfaces zur Verfügung zu stellen, denn PLCs verarbeiten halt Hauptsächlich IOs.
POINTER TO BIT geht leider nicht, REFERENCE TO BIT geht auch nicht. Ist auch logisch die Adressen können vom Aufbau her auf nichts zeigen was kleiner wie ein Byte ist, Siemens kann dass, dafür sind Siemens Pointer für sonst nichts zu gebrauchen, da sie auf keine echten Bereiche im Speicher zeigen.

Das ist der nächste Punkt, ich will eigentlich nicht mit Pointern Arbeiten sondern mit Referencen aber ich bekomme die Referencen via setter nicht initialisiert.

Ich habe mich gefreut über die Interfaces, weil wir so Polymorphie in die Steuerungen bekommen, aber ich brauche IOs.

Ich bin dankbar für Hints und Lösungen, Flames bitte an e flames@trashmail.com e

Viele Grüße

elfrosch