F165_HighSpeedCounter_Cam

FP0R的CAM控制

此指令通过用于高速计数器的最多31个目标值,根据指定DUT中的参数执行CAM控制。只要经过值与其中一个目标值匹配,就可以执行中断程序。

参数

输入

iHscChannel* (INT)

高速计数器通道:0–5

s_dutDataTable (ANY_DUT)

包含数据表的区域的开始地址

样本:F165_HighSpeedCounter_Cam_8_Values_DUT

输出

dutBitOutputs (ANY_DUT)

包含输出字地址的区域的开始地址(WR),例如BOOL32_OVERLAPPING_DUT。根据使用diNumberOfTargetValuesAndOutputRelays设置的编号选择大小(16或32位)。

标注

使用以下DUT作为样本,创建您自己的DUTF165_HighSpeedCounter_Cam_8_Values_DUT

可以在DUT中指定以下参数:

  • 控制代码

  • 输出的字地址

  • 目标值数量

  • 目标值1

  • ...

  • 目标值n

  • 最大目标值

y

高速计数器的经过值

14000

最大目标值

(1)

执行条件

10000

目标值4

(2)

高速计数器控制标志

8000

目标值3

(3)

输出0-4

4000

目标值2

2000

目标值1

  • 只要经过值在目标值区域nn+1(递增计数)或n+1n(递减计数)范围内,相应的输出n就为TRUE

  • 在上述示例中,已启用最大目标值控制。当经过值达到最大目标值时,经过值复位至0且重新开始计数。

  • 在重叠DUT,例如BOOL32_OVERLAPPING_DUT中指定输出的字地址,并将此DUT应用于dutBitOutputs

  • 可以指定最多31个目标值。

  • 目标值必须以升序排列。没有值可以使用两次。

  • 当指令开始时,所有输出都为FALSE,输出0除外,如果经过值小于目标值1,该输出就变为TRUE。否则,对应于目标值区域的输出变为TRUE。例如:如果当前值在目标值2 = -4000和目标值3 = +4000之间,则输出2TRUE。在以下示例中,已禁用最大目标值控制。当经过值达到最后一个目标值时,计数继续且经过值不复位至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

  • 输出0变为TRUE

  • 经过值设置为0

当经过值达到最后一个目标值时:

  • 指针返回到目标值1

  • 输出0变为TRUE

  • 经过值继续递增,并以环形计数器的最小值重新开始

递减计数:

数据表的指针从最后一个目标值移动至目标值1

当经过值达到值-1时:

  • 指针返回到最后一个目标值

  • 对应于最后一个目标值的输出变为TRUE

  • 经过值设置为最大目标值

当经过值达到值-1时:

  • 指针返回到目标值n

  • 对应于最后一个目标值的输出变为TRUE

  • 经过值继续递减,并以环形计数器的最大值重新开始

注释

前提是既不使用复位输入也不使用软件复位。

硬件复位操作

通道

硬件复位输入

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

  • 当最大目标值控制与复位输入或软件复位一起使用时,请小心不要同时使用它们。

  • 在执行扫描时,高速计数器控制标志或脉冲输出控制标志的状态可能改变。例如,如果多次读取接收到的字节数,则在单次扫描中可能存在不同的状态。

错误标志

sys_bIsOperationErrorHold(变为TRUE并保持为TRUE)
  • 如果通道编号或数据表的值超出允许范围
  • 如果尚未在系统寄存器中设置高速计数器
  • 如果目标值>最大目标值。

  • 如果目标值= 0

  • 如果目标值未以升序排列

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果通道编号或数据表的值超出允许范围
  • 如果尚未在系统寄存器中设置高速计数器
  • 如果目标值>最大目标值。

  • 如果目标值= 0

  • 如果目标值未以升序排列

最大目标值控制的示例

DUT

DUT F165_HighSpeedCounter_Cam_8_Values_DUTFP Library中预定义,并且可以用作样本。

全局变量

在全局变量列表中,定义项目中所有POU都可以访问的变量。

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

POU本体

当变量bStartCam变为TRUE时,执行此函数。

LD本体

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

ST本体

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

DUT F165_HighSpeedCounter_Cam_8_Values_DUTFP Library中预定义,并且可以用作样本。

POU头

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

POU本体

当变量bStartCam设置为TRUE时,执行此函数。

LD本体

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

ST本体

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;

最后更新日期: 此页面上的反馈松下热线