This code is my standard FB for controlling a positioning axis from Lenze.
We are starting with Portal.
Is there a way to migrate this scl source to portal ?
Kind Regards,
C
We are starting with Portal.
Is there a way to migrate this scl source to portal ?
Kind Regards,
C
Code:
FUNCTION_BLOCK FB840
VAR_INPUT
PN_STAT_W: WORD;
PN_SPD_ACT_W: WORD;
PN_POS_ACT_D: DWORD;
PN_DRIVE_STAT_W: WORD;
Mode_Auto: BOOL;
Machine_Gestart: BOOL;
Noodstop: BOOL;
Deuren: BOOL;
Reset_Fault: BOOL;
Safe_Motion_F: BOOL;
Safe_Motion_B: BOOL;
Man_F: BOOL;
Man_B: BOOL;
Manual_Fast: BOOL;
POS_SET: REAL;
SPEED_SET: REAL;
UNIT_SPEED_SET: REAL;
FEED_CTE: REAL;
TIMER_EXEC: TIMER;
END_VAR
VAR_IN_OUT
Start_Pos_ABS_F: BOOL;
Start_Pos_ABS_B: BOOL;
Start_Pos_REL: BOOL;
Start_Homing: BOOL;
Pos_ABS_F_Done: BOOL;
Pos_ABS_B_Done: BOOL;
Pos_REL_Done: BOOL;
END_VAR
VAR_OUTPUT
PN_CTRL_W: WORD;
PN_SPD_SET_W: WORD;
PN_POS_SET_D: DWORD;
POS_ACT: REAL;
HOME_DONE: BOOL;
RUNNING: BOOL;
FAULT: BOOL;
LIM_1_ACTIVE: BOOL;
LIM_2_ACTIVE: BOOL;
MANUAL_STATUS: INT;
END_VAR
VAR_TEMP
Start_Flank: BOOL;
Home_Flank: BOOL;
STAT_WORD: WORD;
STAT_DRIVE: WORD;
STATUSBITS AT STAT_WORD: STRUCT
IN_TARGET: BOOL;
PROFILE_BUSY: BOOL;
NC_2: BOOL;
TP_1: BOOL;
NC_3: BOOL;
NC_4: BOOL;
NC_5: BOOL;
QSTP: BOOL;
ERROR: BOOL;
HOME_DONE: BOOL;
PROFILE_DONE: BOOL;
INHIBITED: BOOL;
READY: BOOL;
LIM_1: BOOL;
LIM_2: BOOL;
NC_1: BOOL;
END_STRUCT;
DRIVESTATUSBITS AT STAT_DRIVE: STRUCT
Status_Code_bit_0: BOOL;
Status_Code_bit_1: BOOL;
Status_Code_bit_2: BOOL;
Fault_Active: BOOL;
Warning: BOOL;
Trouble: BOOL;
Free_Statusbit_14: BOOL;
Free_Statusbit_15: BOOL;
Free_Statusbit_0: BOOL;
Power_Disabled: BOOL;
Free_bit_2: BOOL;
Free_bit_3: BOOL;
Free_bit_4: BOOL;
Free_bit_5: BOOL;
Act_Spd_Zero: BOOL;
CInh: BOOL;
END_STRUCT;
TEMPVAR_REC_POS_DWORD: DWORD;
TEMPVAR_REC_POS_DINT: DINT;
END_VAR
VAR
CTRL_WORD: WORD;
CONTROLBITS AT CTRL_WORD: STRUCT
EXEC_PROF: BOOL;
ACTIVATE_SPD_OVERRIDE: BOOL;
SET_HOME_POS: BOOL;
FLT_RESET: BOOL;
JOG_NEG: BOOL;
JOG_POS: BOOL;
START_HOMING: BOOL;
NC_4: BOOL;
BRAKE_RELEASE: BOOL;
FINISH_TARGET: BOOL;
POS_STOP: BOOL;
CInh: BOOL;
PROF_1: BOOL;
PROF_2: BOOL;
PROF_4: BOOL;
PROF_8: BOOL;
END_STRUCT;
MEM_St: BOOL;
MEM_ho: BOOL;
REL_Busy: BOOL;
Homing_Busy: BOOL;
INTERRUPTED: BOOL;
DELAYED_EXEC_TIME: S5TIME;
EXEC: BOOL;
EXEC_DELAYED: BOOL;
END_VAR
BEGIN
Start_Flank:= (Start_Pos_ABS_F OR Start_Pos_ABS_B OR Start_Pos_REL) AND (NOT MEM_St);
Home_Flank:= Start_homing AND (NOT MEM_ho);
STAT_WORD:= PN_STAT_W;
STAT_DRIVE:= PN_DRIVE_STAT_W;
// OPEN BRAKES
IF (((Machine_Gestart AND STATUSBITS.HOME_DONE AND Mode_Auto) OR ((Man_F AND Safe_Motion_F AND NOT Mode_Auto) OR (Man_B AND Safe_Motion_B AND NOT Mode_Auto))) AND NOT STATUSBITS.ERROR AND deuren AND noodstop) OR Start_Homing THEN
CONTROLBITS.BRAKE_RELEASE:= True;
ELSE
CONTROLBITS.BRAKE_RELEASE:= False;
END_IF;
// FIXED BITS
CONTROLBITS.CInh:= FALSE; // CInh = Bit must be FALSE
IF Start_Homing THEN
CONTROLBITS.ACTIVATE_SPD_OVERRIDE:= FALSE; // Speed Override
ELSE
CONTROLBITS.ACTIVATE_SPD_OVERRIDE:= TRUE; // Speed Override
END_IF;
// DIRECTS
HOME_DONE:= STATUSBITS.HOME_DONE; // Status voor de Machinereset
IF (INT_TO_REAL(WORD_TO_INT(PN_SPD_ACT_W)) / 16384.0 * 100.0) > 2.0 THEN
RUNNING:= TRUE;
ELSE
RUNNING:= FALSE;
END_IF;
// MANUAL JOG
IF Man_F AND Safe_Motion_F AND NOT STATUSBITS.ERROR THEN
CONTROLBITS.JOG_POS:= TRUE;
CONTROLBITS.JOG_NEG:= FALSE;
ELSIF Man_B AND Safe_Motion_B AND NOT STATUSBITS.ERROR THEN
CONTROLBITS.JOG_POS:= FALSE;
CONTROLBITS.JOG_NEG:= TRUE;
ELSE
CONTROLBITS.JOG_POS:= FALSE;
CONTROLBITS.JOG_NEG:= FALSE;
END_IF;
//FAULT HANDLING
FAULT:= STATUSBITS.ERROR;
CONTROLBITS.FLT_RESET:= Reset_Fault;
LIM_1_ACTIVE:= STATUSBITS.LIM_1 AND NOT Start_homing;
LIM_2_ACTIVE:= STATUSBITS.LIM_2 AND NOT Start_homing;
// MANUAL STATUS VISU
IF (CONTROLBITS.JOG_POS OR CONTROLBITS.JOG_NEG) AND NOT Machine_Gestart AND NOT Mode_Auto AND NOT STATUSBITS.ERROR THEN
MANUAL_STATUS:= 1;
ELSIF FAULT THEN
MANUAL_STATUS:= 2;
ELSE
MANUAL_STATUS:= 0;
END_IF;
// RESET STATUS
IF Start_Flank OR Home_Flank THEN
Pos_REL_Done:= false;
Pos_ABS_F_Done:= false;
Pos_ABS_B_Done:= false;
REL_Busy:= false;
Homing_Busy:= false;
INTERRUPTED:= false;
END_IF;
// POS REL // POS ABS // HOMING // CANCEL (EXECUTE PROFILE)
IF Mode_Auto AND Safe_Motion_F AND Deuren AND Noodstop AND Machine_Gestart AND (Start_Pos_REL) AND NOT INTERRUPTED AND NOT STATUSBITS.ERROR THEN
EXEC:= TRUE;
CONTROLBITS.POS_STOP:= FALSE;
ELSIF Mode_Auto AND NOT STATUSBITS.ERROR AND Deuren AND Noodstop AND Machine_Gestart AND STATUSBITS.HOME_DONE AND ((Start_Pos_ABS_F AND Safe_Motion_F) OR (Start_Pos_ABS_B AND Safe_Motion_B)) THEN
EXEC:= TRUE;
CONTROLBITS.POS_STOP:= FALSE;
ELSIF Mode_Auto AND NOT STATUSBITS.ERROR AND Deuren AND Noodstop AND Start_Homing AND Safe_Motion_B THEN
Start_Homing:= TRUE;
EXEC:= TRUE;
CONTROLBITS.POS_STOP:= FALSE;
ELSE
EXEC:= FALSE;
CONTROLBITS.POS_STOP:= TRUE;
IF Start_Pos_REL AND NOT STATUSBITS.IN_TARGET THEN
INTERRUPTED:= TRUE;
CONTROLBITS.FINISH_TARGET:= false;
END_IF;
END_IF;
CONTROLBITS.SET_HOME_POS:= EXEC; // SET HOMEPOSITION
// FINISH RELATIVE PROFILE IF INTERRUPTED
IF INTERRUPTED AND Mode_Auto AND Safe_Motion_F AND NOT STATUSBITS.ERROR AND Deuren AND Noodstop AND Machine_Gestart AND (Start_Pos_REL) THEN
CONTROLBITS.FINISH_TARGET:= true;
CONTROLBITS.POS_STOP:= FALSE;
END_IF;
// PROFILE
IF Start_Homing THEN // Profiel 1 (HOMING)
CONTROLBITS.PROF_1:= true;
CONTROLBITS.PROF_2:= false;
CONTROLBITS.PROF_4:= false;
CONTROLBITS.PROF_8:= False;
ELSIF Start_Pos_ABS_F THEN // Profiel 3 (ABS FORWARD)
CONTROLBITS.PROF_1:= true;
CONTROLBITS.PROF_2:= true;
CONTROLBITS.PROF_4:= false;
CONTROLBITS.PROF_8:= False;
ELSIF Start_Pos_ABS_B THEN // Profiel 4 (ABS BACKWARD)
CONTROLBITS.PROF_1:= false;
CONTROLBITS.PROF_2:= false;
CONTROLBITS.PROF_4:= true;
CONTROLBITS.PROF_8:= False;
ELSIF Start_Pos_REL THEN // Profiel 5 (REL)
CONTROLBITS.PROF_1:= true;
CONTROLBITS.PROF_2:= false;
CONTROLBITS.PROF_4:= true;
CONTROLBITS.PROF_8:= False;
END_IF;
// HOME DONE
IF Start_Homing AND STATUSBITS.PROFILE_BUSY THEN
Homing_Busy:= TRUE;
END_IF;
IF (Homing_Busy AND NOT STATUSBITS.PROFILE_BUSY AND Start_Homing AND STATUSBITS.HOME_DONE) OR NOT Mode_Auto THEN
Start_Homing:= false;
Homing_Busy:= false;
END_IF;
// ABS F POS DONE
IF NOT STATUSBITS.PROFILE_BUSY AND Start_Pos_ABS_F AND POS_SET <= POS_ACT + 0.5 AND POS_SET >= POS_ACT - 0.5 AND STATUSBITS.IN_TARGET AND STATUSBITS.PROFILE_DONE THEN
Pos_ABS_F_Done:= True;
Start_Pos_ABS_F:= False;
END_IF;
// ABS B POS DONE
IF NOT STATUSBITS.PROFILE_BUSY AND Start_Pos_ABS_B AND POS_SET <= POS_ACT + 0.5 AND POS_SET >= POS_ACT - 0.5 AND STATUSBITS.IN_TARGET AND STATUSBITS.PROFILE_DONE THEN
Pos_ABS_B_Done:= True;
Start_Pos_ABS_B:= False;
END_IF;
// REL POS DONE
IF Start_Pos_REL AND STATUSBITS.PROFILE_BUSY AND NOT INTERRUPTED THEN
REL_Busy:= TRUE;
END_IF;
IF REL_Busy AND NOT STATUSBITS.PROFILE_BUSY AND Start_Pos_REL AND STATUSBITS.IN_TARGET AND STATUSBITS.PROFILE_DONE THEN
Pos_REL_Done:= True;
Start_Pos_REL:= False;
REL_Busy:= false;
INTERRUPTED:= FALSE;
CONTROLBITS.FINISH_TARGET:= FALSE;
END_IF;
// SEND POSITION
PN_POS_SET_D := ROL (
IN := DINT_TO_DWORD(ROUND(POS_SET * FEED_CTE)),
N := 16) ;
// RECEIVE POSITION
TEMPVAR_REC_POS_DWORD := ROL (
IN := PN_POS_ACT_D,
N := 16) ;
TEMPVAR_REC_POS_DINT:= DWORD_TO_DINT(TEMPVAR_REC_POS_DWORD);
POS_ACT:= DINT_TO_REAL(TEMPVAR_REC_POS_DINT) / FEED_CTE;;
// SPEED LIMITATION
IF SPEED_SET >= 100.0 THEN
SPEED_SET:= 100.0;
END_IF;
IF SPEED_SET <= 0.0 THEN
SPEED_SET:= 0.0;
END_IF;
// SEND SPEED
IF NOT Mode_Auto AND Manual_Fast THEN
PN_SPD_SET_W:= 8190;
ELSIF NOT Mode_Auto AND NOT Manual_Fast THEN
PN_SPD_SET_W:= 4096;
ELSE
PN_SPD_SET_W:= DINT_TO_WORD(ROUND(SPEED_SET * (UNIT_SPEED_SET / 100.0) / 100.0 * 16384.0));
END_IF;
IF NOT Mode_Auto AND NOT Machine_Gestart THEN
CONTROLBITS.PROF_1:= false;
CONTROLBITS.PROF_2:= true;
CONTROLBITS.PROF_4:= false;
CONTROLBITS.PROF_8:= False;
END_IF;
DELAYED_EXEC_TIME := S_ODT (T_NO:= TIMER_EXEC, S:=EXEC, TV:=T#100ms, R:=FALSE, Q:=EXEC_DELAYED);
CONTROLBITS.EXEC_PROF:= EXEC_DELAYED;
PN_CTRL_W:= CTRL_WORD;
MEM_St:= (Start_Pos_REL OR Start_Pos_ABS_F OR Start_Pos_ABS_B);
MEM_Ho:= Start_Homing;
END_FUNCTION_BLOCK