第一章 第一个轴的运动
文章目录
前言
当Execute置1、EN置0、Stop置1,自动复位Done,
一、AxisID1功能块(FB)
FUNCTION_BLOCK AxisID
VAR_INPUT
EN: BOOL := 0; (* 运动确认 *)
Execute: BOOL := 0; (* 启动信号 *)
Stop: BOOL := 0; (* 急停:置1 ,使功能块立即停止 *)
AxisID: INT := 0; (* 轴ID *)
LSpeed: REAL := 10; (* 回零低速度 *)
EscapePos: DINT := 5000; (* 初始在限位处,离开的距离 *)
TrapP: TTrapPrm := (acc:= 3, dec:= 3, velStart:= 0, smoothTime:= 10); (* 用到的点位运动参数 *)
END_VAR
VAR_OUTPUT
Done: BOOL; (* 运动完成信号 *)
END_VAR
VAR
EN_R: R_TRIG; (* EN上升沿 *)
EN_F: F_TRIG; (* EN下降沿 *)
Exec_R: R_TRIG;
Timer3: TON;
psts: DINT := 0;
count: INT := 1;
pclock: DWORD := 0;
HStep: INT := 0;
END_VAR
Exec_R(CLK:=Execute);
EN_F(CLK:=EN);
IF EN THEN(* 运动确认 *)
GT_GetSts(AxisID,ADR(psts),count,ADR(pclock));(*读取轴状态*)
IF Stop THEN
HStep:=0;
Done:=0;
END_IF
IF Exec_R.Q AND NOT(Stop) THEN
HStep=1;
ELSE
END_IF
CASE HStep OF
0:
;
1:
GT_ClrSts(AxisID,1);
GT_ZeroPos(AxisID,1);
GT_PrfTrap(AxisID);
GT_SetTrapPrm(AxisID,ADR(TrapP));
GT_SetVel(AxisID, ABS(LSpeed));
GT_SetPos(AxisID,-ABS(EscapePos));
GT_Update(SHL(DWORD#1,AxisID-1));
HStep:=2;
2:
Timer3(IN:=1,PT:=T#0.3s);
IF Timer3.Q THEN
HStep:=3;
Timer3(IN:=0,PT:=T#0.3s);
END_IF
3:
IF NOT(psts.10) THEN
GT_Stop(SHL(DWORD#1,AxisID-1),1);
HStep:=4;
END_IF
4:
Done:=1;
HStep:=0;
END_CASE
END_IF
(*EN Fall*)
IF EN_F.Q THEN
HStep:=0;
Done:=0;
GT_Stop(SHL(DWORD#1,AxisID-1),1);
END_IF
二、AxisID1PRG程序(PRG)
1.变量
代码如下(示例):
PROGRAM AXISID1
VAR
AxisID1PRG:AxisID;
bGohome: BOOL;
bstop: BOOL;
END_VAR
2.写入数据
代码如下(示例):
AxisID1PRG(
EN:= 1,
Execute:=bGohome ,
Stop:= bstop,
AxisID:=1 ,
LSpeed:=10 ,
EscapePos:=10000 ,
Done=> );
IF bGohome THEN
bGohome :=1;
GT_AxisOn(1);
END_IF
IF AxisID1PRG.Done THEN
bGohome :=0;
END_IF
三、手自动切换
1.变量
FUNCTION_BLOCK SZDQH
VAR_INPUT
shouzi:BOOL;
zidong:BOOL;
shoudong:BOOL;
END_VAR
VAR_OUTPUT
kaiguan:BOOL;
END_VAR
VAR
END_VAR
2.程序
kaiguan:=(shouzi AND zidong)OR (NOT shouzi AND shoudong);
3.调用
TYPE Autonum :
STRUCT
yijianshoudong:BOOL;
yijianzidong:BOOL;
zhiliudianjishouzi:BOOL;
sanzhouxipanshouzi:BOOL;
fanzhaunxipanshouzi:BOOL;
guidaoxianshouzi:BOOL;
diyigedangweishouzi:BOOL;
diergedangweishouzi:BOOL;
tuopandingweishenshushouzi:BOOL;
quliaowei1tuiliaoshouzi:BOOL;
quliaowei2tuiliaoshouzi:BOOL;
quliaowei1xiliaoshouzi10:BOOL;
quliaowei1xiliaoshouzi11:BOOL;
dingweijiajinxiliaoshouzi:BOOL;
yuanzhuquliaoshouzi:BOOL;
zhiliudianjishoudong:BOOL;
sanzhouxipanshoudong:BOOL;
fanzhaunxipanshoudong:BOOL;
guidaoxianshoudong:BOOL;
diyigedangweishoudong:BOOL;
diergedangweishoudong:BOOL;
tuopandingweishenshushoudong:BOOL;
quliaowei1tuiliaoshoudong:BOOL;
quliaowei2tuiliaoshoudong:BOOL;
quliaowei1xiliaoshoudong10:BOOL;
quliaowei1xiliaoshoudong11:BOOL;
dingweijiajinxiliaoshoudong:BOOL;
yuanzhuquliaoshoudong:BOOL;
zhiliudianjizidong:BOOL;
sanzhouxipanzidong:BOOL;
fanzhaunxipanzidong:BOOL;
guidaoxianzidong:BOOL;
diyigedangweizidong:BOOL;
diergedangweizidong:BOOL;
tuopandingweishenshuzidong:BOOL;
quliaowei1tuiliaozidong:BOOL;
quliaowei2tuiliaozidong:BOOL;
quliaowei1xiliaozidong10:BOOL;
quliaowei1xiliaozidong11:BOOL;
dingweijiajinxiliaozidong:BOOL;
yuanzhuquliaozidong:BOOL;
Q0_0: BOOL;
Q0_1: BOOL;
Q0_2: BOOL;
Q0_3: BOOL;
Q0_4: BOOL;
Q0_5: BOOL;
Q0_6: BOOL;
Q0_7: BOOL;
Q1_0: BOOL;
Q1_1: BOOL;
Q1_2: BOOL;
Q1_3: BOOL;
Q1_4: BOOL;
Q1_5: BOOL;
Q1_6: BOOL;
flowStep: INT := 1;
belt1Flag: INT := 1;
isDecline: BOOL := TRUE;
END_STRUCT
END_TYPE
IF Autonum_t^.yijianshoudong THEN
Autonum_t^.yijianshoudong:=0;
Autonum_t^.diergedangweishouzi:=0;
Autonum_t^.diyigedangweishouzi:=0;
Autonum_t^.dingweijiajinxiliaoshouzi:=0;
Autonum_t^.fanzhaunxipanshouzi:=0;
Autonum_t^.guidaoxianshouzi:=0;
Autonum_t^.quliaowei1tuiliaoshouzi:=0;
Autonum_t^.quliaowei1xiliaoshouzi10:=0;
Autonum_t^.quliaowei1xiliaoshouzi11:=0;
Autonum_t^.quliaowei2tuiliaoshouzi:=0;
Autonum_t^.sanzhouxipanshouzi:=0;
Autonum_t^.tuopandingweishenshushouzi:=0;
Autonum_t^.yuanzhuquliaoshouzi:=0;
Autonum_t^.zhiliudianjishouzi:=0;
END_IF
IF Autonum_t^.yijianzidong THEN
Autonum_t^.yijianzidong:=0;
Autonum_t^.diergedangweishouzi:=1;
Autonum_t^.diyigedangweishouzi:=1;
Autonum_t^.dingweijiajinxiliaoshouzi:=1;
Autonum_t^.fanzhaunxipanshouzi:=1;
Autonum_t^.guidaoxianshouzi:=1;
Autonum_t^.quliaowei1tuiliaoshouzi:=1;
Autonum_t^.quliaowei1xiliaoshouzi10:=1;
Autonum_t^.quliaowei1xiliaoshouzi11:=1;
Autonum_t^.quliaowei2tuiliaoshouzi:=1;
Autonum_t^.sanzhouxipanshouzi:=1;
Autonum_t^.tuopandingweishenshushouzi:=1;
Autonum_t^.yuanzhuquliaoshouzi:=1;
Autonum_t^.zhiliudianjishouzi:=1;
END_IF
SZDQH1(shouzi:=Autonum_t^.zhiliudianjishouzi ,
zidong:=Autonum_t^.zhiliudianjizidong ,
shoudong:=Autonum_t^.zhiliudianjishoudong ,
kaiguan=>Autonum_t^.Q0_0);
DO1.0:= Autonum_t^.Q0_0;
GT_SetDo(12,DO1);
SZDQH1(shouzi:=Autonum_t^.sanzhouxipanshouzi ,
zidong:=Autonum_t^.sanzhouxipanzidong ,
shoudong:=Autonum_t^.sanzhouxipanshoudong ,
kaiguan=>Autonum_t^.Q0_1);
VAR1.0:=Autonum_t^.Q0_1;
4.声明
PROGRAM PLC_PRG
VAR
Autonum_t:Autonum;
IO_input_t:IO_input;
END_VAR
IO_inn(ADR(IO_input_t));
Autoo(ADR(Autonum_t),ADR(IO_input_t));
IO_outt(ADR(Autonum_t));
FUNCTION Autoo : BOOL
VAR_INPUT
Autonum_t:POINTER TO Autonum;
IO_input_t:POINTER TO IO_input;
END_VAR
VAR
END_VAR
FUNCTION IO_outt : BOOL
VAR_INPUT
Autonum_t:POINTER TO Autonum;
END_VAR
VAR
SZDQH1:SZDQH;
DO1:DWORD:= 16#FFFFFFFF;
VAR1 AT %QW0 : WORD;
VAR2 AT %QW1 : WORD;
END_VAR
FUNCTION IO_inn : BOOL
VAR_INPUT
IO_input_t:POINTER TO IO_input;
END_VAR
VAR
Di1:DWORD:= 16#FFFFFFFF;
VAR1 AT %IW0 : WORD;
VAR2 AT %IW1 : WORD;
END_VAR
总结
使用说明:
Gohome为FB块,建议使用时一直刷新,
通过控制其输入的EN / Execute 来使轴进行回零
1、EN置1,开启回零功能
2、设置轴号AxisID、回零高速度HSpeed、回零低速度LSpeed、搜索原点方向MoveDir,
按实际设置搜索限位范围和搜索Home范围ScanLmtPos和ScanHomePos,
按需设置离开距离EscapePos和偏移OffSet
3、(可选)设置运动参数TrapP
4、置位启动信号Execute,轴就按照设置的参数进行回原点。Execute为上升沿信号(已经内置上升沿)
6、回零成功后,完成信号Done置1,当Execute置1、EN置0、Stop置1,自动复位Done,
7、在EN为1时,Stop有信号可停止该轴的运动