圆弧插补(通过位置)
根据指定DUT中的参数从两个通道输出脉冲,从而使目标位置路径形成圆弧。通过指定中心位置和结束位置来计算圆的半径。当指定通道的控制标志为FALSE且执行条件为TRUE时,脉冲从该通道输出。
输入
脉冲输出通道:0, 2
输入/输出
包含数据表的区域的开始地址
使用以下预定义DUT:F176_PulseOutput_Pass_DUT
可以在DUT中指定以下参数:
控制代码
合成速度
X轴目标值
Y轴目标值
X轴通过值
Y轴通过值
在执行指令时计算各轴的以下参数并存储在DUT的运算结果区域中。
半径
X轴中心值
Y轴中心值
脉冲输出特性
(1) |
旋转方向:从通道0(x轴)到通道2(y轴)(对于两个通道正向移动)
|
(2) |
旋转方向:从通道2(y轴)到通道0(x轴)(对于两个通道正向移动)
|
Fv: |
合成速度 | O (Xo,Yo): |
中心位置 |
Fx: |
X轴速度 | S (Xs,Ys): |
当前位置(开始) |
Fy: |
Y轴速度 | P (Xp,Yp) |
通过位置 |
r: |
半径 | E (Xe,Ye) |
目标位置(结束) |
使通道0为X轴,通道2为Y轴。位置控制模式为绝对值控制。
当前位置为(q=60°、Xs=5000、Ys=8660)。中心位置O(Xo=0、Yo=0)用作参考点。脉冲从X轴(通道0)和Y轴(通道2)以Fv=2000Hz的速度输出,直到达到目标位置(q=-30°、Xe=8660、Ye=-5000)。
此指令的执行条件必须持续为TRUE。当执行条件为FALSE时,脉冲输出停止。
高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)和脉冲输出控制标志(例如sys_bIsPulseChannel0Active)被分配为相同的特殊内部继电器编号(例如R903A)。因此,当执行高速计数器指令或脉冲输出指令时,所用通道的高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)和脉冲输出控制标志(例如sys_bIsPulseChannel0Active)均为TRUE。只要此标志为TRUE,就无法执行其他高速计数器指令或脉冲输出指令。
执行圆弧插补控制指令F176_PulseOutput_Center将圆弧插补控制标志(sys_bIsCircularInterpolationActive)设置为TRUE。保持此标志的状态,直到达到目标值(即使执行条件不再为TRUE)。在此期间,无法执行其他脉冲输出指令。若要重新启动圆弧插补,请执行强制停止(停止脉冲输出)以便将圆弧插补控制标志(sys_bIsCircularInterpolationActive)设置为FALSE。
如果对操作连接模式选择"继续",请使用特殊标记(sys_bIsCircularInterpolationOverwritingPossible),以允许覆盖目标值。当执行圆弧插补指令时,单次扫描的标志为TRUE。
各轴的目标值必须在-8388608–8388607范围内。当此指令与其他脉冲输出指令(例如F171_PulseOutput_Trapezoidal)配合使用时,这些指令中的目标值必须在相同范围内。
如果扫描时间太长,圆弧插补的精度可能会降低。
RUN模式期间的在线编辑不可用于此指令。
如果主程序和中断程序都包含同一通道的代码,请确保两者不同时执行。
由于对原点返回没有插补函数,应对每个通道执行原点返回。
当在要求精度的应用中使用时,必须通过实际机器试运行。
在系统寄存器中将所有分配到脉冲输出通道的高速计数器设置为"未使用"。
强烈建议将强制停止选项包含到位置控制程序中。
在执行扫描时,高速计数器控制标志或脉冲输出控制标志的状态可能改变。例如,如果多次读取接收到的字节数,则在单次扫描中可能存在不同的状态。
(1) |
执行条件 X0 |
(2) |
脉冲输出控制标志,通道0(sys_bIsPulseChannel0Active) |
(3) |
脉冲输出控制标志,通道2(sys_bIsPulseChannel2Active) |
(4) |
圆弧插补控制标志(sys_bIsCircularInterpolationActive) |
(5) |
目标值覆盖可能标志(sys_bIsCircularInterpolationOverwritingPossible) |
a |
开始(S) |
b |
执行条件 FALSE |
c |
达到的目标值 |
d |
开始继续模式 |
e |
1次扫描 |
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
Trigger: BOOL:=FALSE;
dutPassData: F176_PulseOutput_Pass_DUT:=dwControlCode := 16#1000,
diSpeed := 2000,
diTargetPos_X := 8660,
diTargetPos_Y := -5000,
diPassPos_X := 9396,
diPassPos_Y := -3420;
(*Control code:
Digit 4: 0=Operation connection mode: stop
Digit 3: 1=Rotation direction: CCW (left)
Digit 2: 0=Fixed
Digit 1: 0=Relative value control
Digit 0: 2=Pulse/direction (Forward FALSE)
*)
@'': @'';
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,Trigger,4,2,6,4,R);
B(B_VARIN,,dutPassData,10,4,12,6,);
B(B_VARIN,,0,10,3,12,5,);
B(B_F,F176_PulseOutput_Pass!,Instance,12,1,27,6,,?DEN?Hn_iPulseOutputChannel?Ds_dutDataTable?As_dutDataTable?AENO);
L(1,3,4,3);
L(6,3,12,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(Trigger) then
F176_PulseOutput_Pass(n_iPulseOutputChannel := 0,
s_dutDataTable := dutPassData);
END_IF;