FUNCTION_BLOCK FB_SEW
VAR_INPUT
IO_ADDRESS:DWORD;
ENABLE_RAPID_STOP:BOOL;
RESET:BOOL;
JOG_PLUS_MODE:BOOL;
JOG_MINUS_MODE:BOOL;
REF_TRAVEL_MODE:BOOL;
POSITIONING_MODE:BOOL;
SETPOINT_POS:DINT;
SETPOINT_SPEED:INT;
START_RAMP:INT;
STOP_RAMP:INT;
END_VAR
VAR_OUTPUT
COMMUNICATION_OK:BOOL;
FAULT_OF_AXIS:BOOL;
WARNING_OF_AXIS:BOOL;
INVERTER_READY:BOOL;
REFERENCED:BOOL;
TARGET_POS_REACHED:BOOL;
AXIS_INTERLOCKED:BOOL;
FAULT_NO:INT;
ACTUAL_POSITION:DINT;
ACTUAL_SPEED:INT;
ACTUAL_CURRENT:INT;
END_VAR
VAR
PI: ARRAY[1..6] OF WORD;
PO: ARRAY[1..6] OF WORD;
DPRD_RET_VAL:DWORD;
DPWR_RET_VAL:DWORD;
tempRef:BOOL;
tempPos:BOOL;
DPRD_DAT: CommFB.RDREC;
DPWR_DAT: CommFB.WRREC;
END_VAR
//BEGIN
//DPRD_DAT: Konsistente Daten eines DP-Normslaves lesen
DPRD_DAT(REQ:=TRUE ,
ID:=IO_ADDRESS ,
MLEN := TO_INT(SIZEOF(PI)),
RECORD:= ADR(PI),
STATUS=>DPRD_RET_VAL );
IF DPRD_RET_VAL = 0 THEN COMMUNICATION_OK:=TRUE;
//bei fehlerfreiem Lesen werden die Prozesseingangsdaten verarbeitet:
ACTUAL_POSITION:=SHL(WORD_TO_DINT(PI[2]),16)+ WORD_TO_DINT(PI[3]); //Istposition aus High- + Low-Word zusammensetzen
ACTUAL_SPEED:=WORD_TO_INT(PI[4]);
ACTUAL_CURRENT:=(WORD_TO_INT(PI[5]))/10;
INVERTER_READY:=PI[1].1;// Bit 1: Umrichter betriebsbereit
WARNING_OF_AXIS:=PI[1].1 AND PI[1].5;// bereit und Fehler => Warnung
FAULT_OF_AXIS:=NOT PI[1].1 AND PI[1].5;// nicht bereit und Fehler => Störung;
REFERENCED:=PI[1].2;//Achse referenziert;
TARGET_POS_REACHED:=PI[1].3; //Zielposition erreicht;
IF PI[1].5=TRUE THEN
FAULT_NO:= WORD_TO_INT (SHR ( PI[1] , 8) );(*extrahieren des Statusbyte1 aus Statuswort1 und FU Fehlercode ausgeben*)
ELSE
FAULT_NO:=0;
END_IF; //Im Fehlerfall den Fehlercode ausgeben; andernfalls 0 ausgeben.
//Steuerbefehle:
PO[1].1:=ENABLE_RAPID_STOP; //Steuerwort, Bit 1: Freigabe/Schnellstopp;
PO[1].6:=RESET; //Fehler quittieren;
//Definition der Modi:
//exklusiv Jog+ angewählt:
PO[1].9:=(JOG_PLUS_MODE AND NOT JOG_MINUS_MODE AND NOT REF_TRAVEL_MODE AND NOT POSITIONING_MODE);
//exklusiv Jog- angewählt:
PO[1].10:=(NOT JOG_PLUS_MODE AND JOG_MINUS_MODE AND NOT REF_TRAVEL_MODE AND NOT POSITIONING_MODE);
//exklusiv Referenzieren angewählt:
tempRef:=(NOT JOG_PLUS_MODE AND NOT JOG_MINUS_MODE AND REF_TRAVEL_MODE AND NOT POSITIONING_MODE);
//exklusiv Positionieren angewählt:
tempPos:=(NOT JOG_PLUS_MODE AND NOT JOG_MINUS_MODE AND NOT REF_TRAVEL_MODE AND POSITIONING_MODE); //
//Def. Mode_low;
PO[1].11:=PO[1].9 OR PO[1].10 OR tempPos;
//Def. Mode_high;
PO[1].12:=tempRef OR tempPos; //Def. Mode_high;
//Wenn ein Modus angewählt ist, wird automatisch die Freigabe [X2] gesetzt:
PO[1].2:=PO[1].11 OR PO[1].12;
//Wenn keine Freigabe gesetzt ist, wurde kein oder mehrere Modi angewählt:
AXIS_INTERLOCKED:=NOT PO[1].2;
//Das Startsignal wird (zeitverzögert) gesetzt, wenn die Bremse gelüftet ist; erforderliche Zeitverzögerung für MDX-A
PO[1].8:=PI[1].4;
//ungenutzte Steuerwortbits ablöschen:
PO[1].0:=FALSE; //Bit 0: Reglersperre,..,..
PO[1].3:=FALSE;
PO[1].4:=FALSE;
PO[1].5:=FALSE;
PO[1].7:=FALSE;
PO[1].13:=FALSE;
PO[1].14:=FALSE;
PO[1].15:=FALSE;
//"Analog"-Werte wandeln & zuweisen:
PO[2]:=DINT_TO_WORD(SHR(SETPOINT_POS,16)); //High Word der Zielposition wandeln/rangieren
PO[3]:=DINT_TO_WORD(SETPOINT_POS);//Low-Word der Zielposition wandeln/rangieren
PO[4]:=INT_TO_WORD(SETPOINT_SPEED);
PO[5]:=INT_TO_WORD(START_RAMP);
PO[6]:=INT_TO_WORD(STOP_RAMP);
ELSE
JMP END; //wenn das Lesen der Prozesseingsgsdaten (DPRD_DAT) mit Fehler beendet wurde, wird das Schreiben übersprungen (DPWR_DAT)...
End_If;
//DPWR_DAT: Konsistente Daten eines DP-Normslaves schreiben
DPWR_DAT(
REQ:=TRUE ,
ID:=IO_ADDRESS ,
LEN:=TO_INT(SIZEOF(PO)) ,
RECORD:=ADR(PO) ,
STATUS=>DPWR_RET_VAL );
END:IF DPRD_RET_VAL <> 0 OR DPWR_RET_VAL <> 0 THEN
COMMUNICATION_OK:=FALSE; //Ausgänge ablöschen, wenn ein Lese/Schreibfehler aufgetreten ist:
FAULT_OF_AXIS:=FALSE;
WARNING_OF_AXIS:=FALSE;
INVERTER_READY:=FALSE;
REFERENCED:=FALSE;
TARGET_POS_REACHED:=FALSE;
AXIS_INTERLOCKED:=FALSE;
FAULT_NO:=0;
ACTUAL_POSITION:=0;
ACTUAL_SPEED:=0;
ACTUAL_CURRENT:=0;
End_If;
//END FUNCTION BLOCK