FP0R의 캠 제어
이 명령은 고속 카운터의 최대 목표 값 31개를 사용하여 지정한 DUT의 파라미터에 따라 캠 제어를 수행합니다. 경과 값이 목표 값 중 하나와 일치할 때마다 인터럽트 프로그램을 실행할 수 있습니다.
입력
고속 카운터 채널: 0–5
데이터 테이블이 포함된 영역의 시작 어드레스
샘플: F165_HighSpeedCounter_Cam_8_Values_DUT
출력
출력 워드 어드레스가 포함된 영역의 시작 어드레스(WR)(예: BOOL32_OVERLAPPING_DUT). diNumberOfTargetValuesAndOutputRelays를 사용하여 번호 설정에 따라 크기(16 또는 32비트)를 선택합니다.
샘플과 같은 다음 DUT를 사용하여 자체 DUT 만들기: F165_HighSpeedCounter_Cam_8_Values_DUT
DUT에서 F168_PulseOutput_Home_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)에서 출력의 워드 어드레스를 지정하고 dutBitOutputs에서 이 DUT를 적용합니다.
최대 목표 값 31개를 지정할 수 있습니다.
목표 값은 오름차순으로 정렬되어야 합니다. 두 번 사용될 수 있는 값은 없습니다.
명령이 시작되면 모든 출력은 FALSE이고(TRUE로 전환된 출력 0 제외) 목표 값 1보다 작은 경과 값을 제공합니다. 그렇지 않으면 목표 값 영역에 해당하는 출력은 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인지 확인합니다.
최대 목표 값 제어가 초기화 입력 또는 소프트웨어 입력과 함께 사용되는 경우, 동시에 사용하지 마십시오.
고속 카운터 제어 플래그 또는 펄스 출력 제어 플래그 상태는 스캔이 실행 중인 동안에 변경될 수 있습니다. 예를 들어, 수신된 바이트 수를 읽으면 스캔 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;