ms_cikar
Üye
- Katılım
- 14 Nis 2011
- Mesajlar
- 26
- Puanları
- 1
- Yaş
- 37
Slm Ustalar
Okulda Yaptigimiz bir Proje icin Ax2000 serisini kullaniyoruz.
bir State Machine programlamamiz lazim.
Arkadaslarla elimizden geldigi kadar acemice birtane yaptik, ama problem var ve problemin tam olarak nerden kaynaklandigini bulamiyoruz
Umarim siz Tecrübeli Ustalarimiz bize yardim edebilirsiniz.
Almanyadan Selamlar.
(*++++FPGA_Drive_State control+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
IF ((wAx_Status AND 16#000F) <> 16#0008) THEN
sys_cycle_cnt := sys_cycle_cnt +1;
IF (sys_cycle_cnt > Lim_2s) THEN
sys_cycle_cnt := 0;
IF En_Drive = TRUE THEN
IF ((wAx_Status AND 16#00FF) = 16#0060) THEN
wAx_Control := 16#0006; (*Init*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0040) THEN
wAx_Control := 16#0006; (*PreCharge*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0021) THEN
wAx_Control := 16#0907; (*PreRun, change to Opmode 9 => v/f - control*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0023) THEN
wAx_Control := 16#090F; (*RuN*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0027) THEN
U_cmd := U_cmd_percent;
speed_cmd := speed_cmd_rpm;
END_IF
ELSE
wAx_Control := 16#0000;
U_cmd := 0;
speed_cmd := 0;
END_IF;
END_IF;
ELSE (*Drive_Error*)
sys_cycle_cnt := 0;
En_Drive := FALSE; (* Disable on Error *)
U_cmd := 0;
speed_cmd := 0;
END_IF;
IF ( Clr_Fault = TRUE ) THEN
IF ((wAx_Status AND 16#000F) = 16#0008) THEN
wAx_Control := 16#0080; (*reset Error*)
END_IF
Clr_Fault := FALSE ;
END_IF
SysTime(timeLoDW => NewSysTime);
CycTime := (NewSysTime - OldSysTime)/10; (* cycle time in [µs]*)
IF (CycTime = 0) THEN
CycTime := 1000;
END_IF
OldSysTime := NewSysTime;
Lim_2s := 2000000 / CycTime;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
STATE MASCHINE
Beckhoff Information System - German
Okulda Yaptigimiz bir Proje icin Ax2000 serisini kullaniyoruz.
bir State Machine programlamamiz lazim.
Arkadaslarla elimizden geldigi kadar acemice birtane yaptik, ama problem var ve problemin tam olarak nerden kaynaklandigini bulamiyoruz
Umarim siz Tecrübeli Ustalarimiz bize yardim edebilirsiniz.
Almanyadan Selamlar.
(*++++FPGA_Drive_State control+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
IF ((wAx_Status AND 16#000F) <> 16#0008) THEN
sys_cycle_cnt := sys_cycle_cnt +1;
IF (sys_cycle_cnt > Lim_2s) THEN
sys_cycle_cnt := 0;
IF En_Drive = TRUE THEN
IF ((wAx_Status AND 16#00FF) = 16#0060) THEN
wAx_Control := 16#0006; (*Init*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0040) THEN
wAx_Control := 16#0006; (*PreCharge*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0021) THEN
wAx_Control := 16#0907; (*PreRun, change to Opmode 9 => v/f - control*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0023) THEN
wAx_Control := 16#090F; (*RuN*)
ELSIF ((wAx_Status AND 16#00FF) = 16#0027) THEN
U_cmd := U_cmd_percent;
speed_cmd := speed_cmd_rpm;
END_IF
ELSE
wAx_Control := 16#0000;
U_cmd := 0;
speed_cmd := 0;
END_IF;
END_IF;
ELSE (*Drive_Error*)
sys_cycle_cnt := 0;
En_Drive := FALSE; (* Disable on Error *)
U_cmd := 0;
speed_cmd := 0;
END_IF;
IF ( Clr_Fault = TRUE ) THEN
IF ((wAx_Status AND 16#000F) = 16#0008) THEN
wAx_Control := 16#0080; (*reset Error*)
END_IF
Clr_Fault := FALSE ;
END_IF
SysTime(timeLoDW => NewSysTime);
CycTime := (NewSysTime - OldSysTime)/10; (* cycle time in [µs]*)
IF (CycTime = 0) THEN
CycTime := 1000;
END_IF
OldSysTime := NewSysTime;
Lim_2s := 2000000 / CycTime;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
STATE MASCHINE
Beckhoff Information System - German