PWM输出
此指令根据指定的DUT传送脉宽调制输出信号。当指定通道的控制标志为FALSE且执行条件为TRUE时,从该通道输出脉冲。
输入
包含数据表的区域的开始地址
脉冲输出:0或1
使用以下预定义DUT:F170_PulseOutput_PWM_DUT
可以在DUT中指定以下参数:
近似频率
占空比(对于脉冲持续时间和周期)
矩形波形的脉冲持续时间和周期之间的比例。对于脉冲持续时间为1ms且脉冲周期为4ms的脉冲序列,占空比为0,25或25%。
只要使用此指令开始在线编辑程序(例如在RUN模式中),脉冲输出即停止。
在系统寄存器中将所有分配到脉冲输出通道的高速计数器设置为"未使用"。
如果主程序和中断程序都包含同一通道的代码,请确保两者不同时执行。
高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)和脉冲输出控制标志(例如sys_bIsPulseChannel0Active)被分配为相同的特殊内部继电器编号(例如R903A)。因此,当执行高速计数器指令或脉冲输出指令时,所用通道的高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)和脉冲输出控制标志(例如sys_bIsPulseChannel0Active)均为TRUE。只要此标志为TRUE,就无法执行其他高速计数器指令或脉冲输出指令。
在与最小或最大占空比接近的点,输出延迟,可能会造成占空比与指定值不同。
可对各扫描更改占空比。在下一次脉冲输出时更改生效。频率设置仅在开始执行指令时生效。
强烈建议将强制停止选项包含到位置控制程序中。
在执行扫描时,高速计数器控制标志或脉冲输出控制标志的状态可能改变。例如,如果多次读取接收到的字节数,则在单次扫描中可能存在不同的状态。
若要以FP0兼容模式运行FP0R,可以将FP0程序下载到FP0R。
通道和脉冲输出编号
通道编号 | 脉冲输出 | 脉冲输出方式 |
0 |
Y0 |
脉冲 |
Y2 |
方向 | |
1 |
Y1 |
脉冲 |
Y3 |
方向 |
所用内存区的系统变量. 括号中的值对FP0 T32有效。
描述 |
系统变量 |
|
---|---|---|
脉冲输出:通道的控制标志 |
0 |
sys_bIsPulseChannel0Active |
1 |
sys_bIsPulseChannel1Active |
|
脉冲输出:通道的经过值 |
0 |
sys_diPulseChannel0ElapsedValue |
1 |
sys_diPulseChannel1ElapsedValue |
|
脉冲输出:通道的目标值 |
0 |
sys_diPulseChannel0TargetValue |
1 |
sys_diPulseChannel1TargetValue |
|
高速计数器或脉冲输出控制代码 |
sys_wHscOrPulseControlCode |
在全局变量列表中,定义项目中所有POU都可以访问的变量。
DUTF170_PulseOutput_PWM_DUT在FP Library中预定义。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR_EXTERNAL
X6_bEnablePWM: BOOL:=FALSE;
END_VAR
VAR
dutPWMControl: F170_PulseOutput_PWM_DUT;
(*iFrequencyValue := 1: f=2.0Hz, T=502.5ms;*)
iPulseWidthModulationDuty: INT:=500;
(*500=50% duty*)
@'': @'';
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,E_MOVE!,Instance,15,1,21,5,,?DEN?D?AENO?C);
B(B_VARIN,,iPulseWidthModulationDuty,13,3,15,5,);
B(B_VAROUT,,dutPWMControl.iPulseWidthModulationDuty,21,3,23,5,);
B(B_CONTACT,,X6_bEnablePWM,4,2,6,4,);
L(6,3,15,3);
L(1,3,4,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,X6_bEnablePWM,4,2,6,4,);
B(B_F,F170_PulseOutput_PWM!,Instance,13,1,26,6,,?DEN?Ds_dutDataTable?Hn_iPulseOutputChannel?AENO);
B(B_VARIN,,dutPWMControl,11,3,13,5,);
B(B_VARIN,,2,11,4,13,6,);
L(1,3,4,3);
L(6,3,13,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (X6_bEnablePWM) then
dutPWMControl.iPulseWidthModulationDuty:=iPulseWidthModulationDuty;
END_IF;
IF (X6_bEnablePWM) then
F170_PulseOutput_PWM(s_dutDataTable := dutPWMControl,
n_iPulseOutputChannel := 2);
END_IF;