FP0R的CAM控制
此指令通过用于高速计数器的最多31个目标值,根据指定DUT中的参数执行CAM控制。只要经过值与其中一个目标值匹配,就可以执行中断程序。
输入
高速计数器通道:0–5
包含数据表的区域的开始地址
样本:F165_HighSpeedCounter_Cam_8_Values_DUT
输出
包含输出字地址的区域的开始地址(WR),例如BOOL32_OVERLAPPING_DUT。根据使用diNumberOfTargetValuesAndOutputRelays设置的编号选择大小(16或32位)。
使用以下DUT作为样本,创建您自己的DUT:F165_HighSpeedCounter_Cam_8_Values_DUT
可以在DUT中指定以下参数:
控制代码
输出的字地址
目标值数量
目标值1
...
目标值n
最大目标值
y |
高速计数器的经过值 | 14000 |
最大目标值 |
(1) |
执行条件 | 10000 |
目标值4 |
(2) |
高速计数器控制标志 | 8000 |
目标值3 |
(3) |
输出0-4 |
4000 |
目标值2 |
2000 |
目标值1 |
只要经过值在目标值区域n至n+1(递增计数)或n+1至n(递减计数)范围内,相应的输出n就为TRUE。
在上述示例中,已启用最大目标值控制。当经过值达到最大目标值时,经过值复位至0且重新开始计数。
在重叠DUT,例如BOOL32_OVERLAPPING_DUT中指定输出的字地址,并将此DUT应用于dutBitOutputs。
可以指定最多31个目标值。
目标值必须以升序排列。没有值可以使用两次。
当指令开始时,所有输出都为FALSE,输出0除外,如果经过值小于目标值1,该输出就变为TRUE。否则,对应于目标值区域的输出变为TRUE。例如:如果当前值在目标值2 = -4000和目标值3 = +4000之间,则输出2为TRUE。在以下示例中,已禁用最大目标值控制。当经过值达到最后一个目标值时,计数继续且经过值不复位至0。
y |
高速计数器的经过值 | 8000 |
目标值4 |
(1) |
执行条件 | 4000 |
目标值3 |
(2) |
高速计数器控制标志 | -4000 |
目标值2 |
(3) |
输出0-4 |
-10000 |
目标值1 |
INT0 |
中断程序0 |
可以使用最大目标值控制来执行指令,以在达到最大目标值时将经过值复位至0。最大目标值控制可以在F165_HighSpeedCounter_Cam_8_Values_DUT的控制代码中启用。也可以使用复位输入或软件复位来复位经过值,而不是使用最大目标值控制。
若要执行最大目标值控制,必须为所有目标值指定正整数。
具有最大目标值控制的递增和递减计数:
y |
高速计数器的经过值 | 14000 |
最大目标值 |
(1) |
执行条件 | 10000 |
目标值4 |
(2) |
高速计数器控制标志 | 8000 |
目标值3 |
(3) |
输出0-4 |
4000 |
目标值2 |
2000 |
目标值1 |
最大目标值控制: |
启用 |
禁用(参见摘要) |
---|---|---|
递增计数: 数据表的指针从目标值1移动至最后一个目标值。 |
当经过值达到最大目标值时:
|
当经过值达到最后一个目标值时:
|
递减计数: 数据表的指针从最后一个目标值移动至目标值1。 |
当经过值达到值-1时:
|
当经过值达到值-1时:
|
前提是既不使用复位输入也不使用软件复位。
通道 |
硬件复位输入 |
---|---|
0 |
X2 |
1 |
|
2 |
X5 |
3 |
当经过值与目标值匹配时,将执行中断程序。任何已输入任务列表的中断都将自动启用。每个通道编号都会分配一个特殊的中断程序编号。
通道 |
0 |
1 |
2 |
3 |
4 |
5 |
中断程序 |
0 |
1 |
3 |
4 |
6 |
7 |
在系统寄存器中选择所需通道的高速计数器输入。
当执行高速计数器指令时,所用通道的高速计数器控制标志(例如sys_bIsHscChannel0ControlActive)变为TRUE。只要控制标志为TRUE,就无法执行使用相同通道的其他高速计数器指令。
若要取消指令执行,将存储高速计数器控制代码(sys_wHscOrPulseControlCode)的数据寄存器的第3位设置为TRUE。然后高速计数器控制标志变为FALSE。若要重新启用执行高速计数器指令,请将第3位复位至FALSE。
执行指令期间对所用通道重写经过值可能会导致意外操作。
确保相邻目标值之间的时间跨度大于1ms。
如果在主程序中执行指令,请确保相邻目标值之间的最小时间跨度大于扫描时间。
如果在中断程序中执行指令,请确保相邻目标值之间的最小时间跨度大于中断程序的最大执行时间。
此指令最多可以在两个通道上同时执行。
当使用复位输入或软件复位时,请确保目标值1是整数且³1。
当最大目标值控制与复位输入或软件复位一起使用时,请小心不要同时使用它们。
在执行扫描时,高速计数器控制标志或脉冲输出控制标志的状态可能改变。例如,如果多次读取接收到的字节数,则在单次扫描中可能存在不同的状态。
如果目标值>最大目标值。
如果目标值= 0。
如果目标值未以升序排列
如果目标值>最大目标值。
如果目标值= 0。
如果目标值未以升序排列
DUT F165_HighSpeedCounter_Cam_8_Values_DUT在FP Library中预定义,并且可以用作样本。
在全局变量列表中,定义项目中所有POU都可以访问的变量。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bStartCam: BOOL:=FALSE;
dut_F165_CAM_Example1: F165_Cam_Example1_4_Values_DUT;
END_VAR
VAR_EXTERNAL
WR0_bits_F165_CAM_Examples: BOOL16_OVERLAPPING_DUT;
END_VAR
当变量bStartCam变为TRUE时,执行此函数。
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_CONTACT,,sys_bIsFirstScan,5,2,7,4,);
B(B_F,E_MOVE!,Instance,14,1,20,5,,?DEN?D?AENO?C);
B(B_VARIN,,0,12,3,14,5,);
B(B_VAROUT,,sys_diHscChannel0ElapsedValue,20,3,22,5,);
B(B_COMMENT,,Reset the elapsed value,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,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_F,F165_HighSpeedCounter_Cam!,Instance,14,1,28,6,,?DEN?HiHscChannel?Ds_dutDataTable?AENO?CdutBitOutputs);
B(B_VARIN,,0,12,3,14,5,);
B(B_VARIN,,dut_F165_CAM_Example1,12,4,14,6,);
B(B_VAROUT,,WR1_dut_CAM1,28,3,30,5,);
B(B_CONTACT,,bStartCam,5,2,7,4,R);
B(B_COMMENT,,Start the cam control,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (sys_bIsFirstScan) then
sys_diHscChannel0ElapsedValue:=0;
END_IF;
IF DF(bStartCam) then
F165_HighSpeedCounter_Cam(iHscChannel := 0,
s_dutDataTable := dut_F165_CAM_Example1,
dutBitOutputs => WR0_bits_F165_CAM_Examples);
END_IF;
DUT F165_HighSpeedCounter_Cam_8_Values_DUT在FP Library中预定义,并且可以用作样本。
VAR
bStartCam: BOOL:=FALSE;
dut_F165_CAM_Example2: F165_Cam_Example2_4_Values_DUT;
END_VAR
VAR_EXTERNAL
WR0_bits_F165_CAM_Examples: BOOL16_OVERLAPPING_DUT;
END_VAR
当变量bStartCam设置为TRUE时,执行此函数。
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_CONTACT,,sys_bIsFirstScan,5,2,7,4,);
B(B_F,E_MOVE!,Instance,14,1,20,5,,?DEN?D?AENO?C);
B(B_VARIN,,0,12,3,14,5,);
B(B_VAROUT,,sys_diHscChannel0ElapsedValue,20,3,22,5,);
B(B_COMMENT,,Reset the elapsed value,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,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_F,F165_HighSpeedCounter_Cam!,Instance,14,1,28,6,,?DEN?HiHscChannel?Ds_dutDataTable?AENO?CdutBitOutputs);
B(B_VARIN,,0,12,3,14,5,);
B(B_VARIN,,dut_F165_CAM_Example2,12,4,14,6,);
B(B_VAROUT,,WR0_bits_F165_CAM_Examples,28,3,30,5,);
B(B_CONTACT,,bStartCam,5,2,7,4,R);
B(B_COMMENT,,Start the cam control,1,0,21,1,);
L(7,3,14,3);
L(1,3,5,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (sys_bIsFirstScan) then
sys_diHscChannel0ElapsedValue:=0;
END_IF;
IF DF(bStartCam) then
F165_HighSpeedCounter_Cam(iHscChannel := 0,
s_dutDataTable := dut_F165_CAM_Example2,
dutBitOutputs => WR0_bits_F165_CAM_Examples);
END_IF;