梯形控制
此指令根据指定DUT中的参数自动执行梯形控制。当指定通道的控制标志为FALSE且执行条件为TRUE时,脉冲从该通道输出。
输入
包含数据表的区域的开始地址
FP-S, FP-X:
F171_PulseOutput_Trapezoidal_DUT
FP0R:
F171_PulseOutput_Trapezoidal_Type0_DUT
F171_PulseOutput_Trapezoidal_Type1_DUT
脉冲输出通道:
FP-XH C30 T/P: 0~3
FP-XH C60 T/P: 0~5
FP-S: 0, 2
FP-X C30T/C60T: 0, 1, 2, 3
FP-XC14T: 0, 1, 2
FP-X R: 0, 1
FP0R: 0, 1, 2, 3
使用以下预定义DUT:F171_PulseOutput_Trapezoidal_DUT。
可以在DUT中指定以下参数:
初始和最终速度
目标速度
加速/减速时间
目标值
脉冲输出控制标志
执行条件
脉冲输出频率根据指定加速/减速时间而变化。目标和初始速度之差决定斜坡的斜率。
FP-X:当执行脉冲输出指令且正在输出脉冲时,相应通道的脉冲输出控制标志(例如sys_bIsPulseChannel0Active)为TRUE。只要此标志为TRUE,就无法执行其他脉冲输出指令。
FPS:高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)和脉冲输出控制标志(例如sys_bIsPulseChannel0Active)被分配为相同的特殊内部继电器编号(例如R903A)。因此,当执行高速计数器指令或脉冲输出指令时,所用通道的高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)和脉冲输出控制标志(例如sys_bIsPulseChannel0Active)均为TRUE。只要此标志为TRUE,就无法执行其他高速计数器指令或脉冲输出指令。
FPS:执行圆弧插补控制指令F176_PulseOutput_Center将圆弧插补控制标志(sys_bIsCircularInterpolationActive)设置为TRUE。保持此标志的状态,直到达到目标值(即使执行条件不再为TRUE)。在此期间,无法执行其他脉冲输出指令。
FPS:在系统寄存器中将所有分配到脉冲输出通道的高速计数器设置为"未使用"。
FP-X:在系统寄存器中设置所需通道的"脉冲输出"。
强烈建议将强制停止选项包含到位置控制程序中。
使用以下预定义DUT:F171_PulseOutput_Trapezoidal_Type0_DUT(最大速度 = 第一目标速度)或F171_PulseOutput_Trapezoidal_Type1_DUT(最大速度 = 50kHz)。
脉冲输出期间可以更改目标速度。
两个控制方法可用:
类型0:在第一个指定的目标速度范围内可以更改速度。
类型1:在最大速度(50kHz)范围内可以更改速度。
可以在DUT中指定以下参数:
脉冲输出特性
初始和最终速度
目标速度
加速时间
减速时间
目标值
脉冲输出控制标志
执行条件
减速停止请求
类型0:
目标速度和初始速度之差决定加速斜坡的斜率。目标速度和最终速度之差决定减速斜坡的斜率。
类型1:
最大速度50kHz和初始速度之差决定加速斜坡的斜率。最大速度50kHz和最终速度之差决定减速斜坡的斜率。
使用25%的占空比输出脉冲。通过脉冲输出方法"脉冲/方向",在已输出方向信号之后,输出脉冲约300ms;电机驱动器特性同时考虑在内。
减速停止
若要执行减速停止,请将存储脉冲输出控制代码的数据寄存器的第5位从FALSE设置为TRUE(例如MOVE(16#120, sys_wHscOrPulseControlCode);
)。当加速期间请求减速停止时,将以从目标速度减速的相同斜率执行减速。
脉冲输出期间更改目标速度
类型1:在最大速度(50kHz)范围内可以更改速度。
目标速度
目标速度的第1次改变
目标速度的第2次改变
加速时间
加速
减速
减速时间
脉冲输出控制标志
执行条件
若要更改速度,将执行条件保持为TRUE。
类型0:
如果指定的值大于启动时的目标速度,将被修正为启动时的目标速度。
类型1:
如果目标速度设置为大于50kHz的值,将被修正为50kHz。
如果加速期间经过值超过加速禁止区域开始位置(例如sys_diPulseChannel0AccelerationForbiddenAreaStartingPosition),则无法执行加速。
减速度不可低于修正的最终速度。
只要使用此指令开始在线编辑程序(例如在RUN模式中),脉冲输出即停止。
如果主程序和中断程序都包含同一通道的代码,请确保两者不同时执行。
强烈建议将强制停止选项包含到位置控制程序中。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bMotorSwitch: BOOL:=FALSE;
dutTrapez: F171_PulseOutput_Trapezoidal_DUT:=dwControlCode := 16#1100;
(*Control code:
Digit 3: 1=Duty ratio 25%
Digit 2: 1=Frequency range 48Hz-100kHz
Digit 1: 0=Relative value control
Digit 0: 0=CW/CCW*)
END_VAR
VAR_EXTERNAL
X0_bMotorSwitch: BOOL:=FALSE;
(*at X0*)
END_VAR
VAR
diInitialSpeed: DINT:=100;
diTargetSpeed: DINT:=2000;
diAccelerationTime: DINT:=300;
diTargetValue: DINT:=10000;
@'': @'';
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 16 ;
NETWORK_BODY
B(B_CONTACT,,bMotorSwitch,4,1,6,3,R);
B(B_F,E_MOVE!,Instance,17,4,23,8,,?DEN?D?AENO?C);
B(B_F,E_MOVE!,Instance,17,8,23,12,,?DEN?D?AENO?C);
B(B_VAROUT,,dutTrapez.diTargetSpeed,23,6,25,8,);
B(B_VARIN,,diTargetSpeed,15,6,17,8,);
B(B_VAROUT,,dutTrapez.diAccelerationAndDecelerationTime,23,10,25,12,);
B(B_VARIN,,diAccelerationTime,15,10,17,12,);
B(B_F,E_MOVE!,Instance,17,12,23,16,,?DEN?D?AENO?C);
B(B_VAROUT,,dutTrapez.diTargetValue,23,14,25,16,);
B(B_VARIN,,diTargetValue,15,14,17,16,);
B(B_F,E_MOVE!,Instance,17,0,23,4,,?DEN?D?AENO?C);
B(B_VAROUT,,dutTrapez.diInitialAndFinalSpeed,23,2,25,4,);
B(B_VARIN,,diInitialSpeed,15,2,17,4,);
L(7,2,7,6);
L(7,6,7,10);
L(1,2,4,2);
L(6,2,7,2);
L(7,2,17,2);
L(7,6,17,6);
L(7,10,17,10);
L(7,10,7,14);
L(7,14,17,14);
L(1,0,1,16);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bMotorSwitch,4,2,6,4,R);
B(B_VARIN,,dutTrapez,14,3,16,5,);
B(B_VARIN,,0,14,4,16,6,);
B(B_F,F171_PulseOutput_Trapezoidal!,Instance,16,1,31,6,,?DEN?Ds_dutDataTable?Hn_iPulseOutputChannel?AENO);
L(6,3,16,3);
L(1,3,4,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(bMotorSwitch) then
dutTrapez.diInitialAndFinalSpeed:=diInitialSpeed;
dutTrapez.diTargetSpeed:=diTargetSpeed;
dutTrapez.diAccelerationDecelerationTime:=diAccelerationTime;
dutTrapez.diDeviationCounterClearSignalOutputTime:=10;
END_IF;
IF DF(bMotorSwitch) then
F171_PulseOutput_Trapezoidal(s_dutDataTable := dutTrapez,
n_iPulseOutputChannel :=0);
END_IF;