이동 평균값과 총 값에 대한 버퍼 영역 정의
이 FP 명령은 포함된 모든 값들의 평균값과 합계를 계산하기 위한 특수 버퍼를 지정합니다. 시작 어드레스는 d_Start로 설정되고 크기는 n_Words로 설정됩니다. 이 버퍼는 프로그래밍 예에 나와 있는 것처럼 특별한 구조를 갖습니다. 여기서 마지막 요소 iArrData의 배열 요소의 개수가 n_words에서 정의한 크기에 해당합니다. 버퍼에 쓰기 위해 명령 FP_AVERAGE_BUFFER_WRITE를 사용합니다.
입력
버퍼의 메모리 크기 지정
값: 1–30000
출력
버퍼의 시작 데이터 영역
프로그래밍 예에서와 같이 사용자 정의 DUT를 사용하는 것이 좋습니다.
파라미터에 지정된 값이 허용 범위를 벗어난 경우.
파라미터에 지정된 값이 허용 범위를 벗어난 경우.
DUT의 요소(식별자):
버퍼 크기
저장된 데이터의 수
저장된 데이터의 총 합계
이동 평균
쓰기 포인터의 위치
버퍼의 값들을 포함합니다. 정수 값들의 개수(이 예에서는 10)는 iNumberOfIntegerValues로 정의된 버퍼의 크기와 같아야 합니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
bDefine: BOOL:=FALSE;
bWrite: BOOL:=FALSE;
iCounter: INT:=0;
END_VAR
VAR CONSTANT
iNumberOfIntegerValues: INT:=10;
(*number of integers values must be equal to average buffer size*)
END_VAR
VAR
dutAverageBufferInt10: DUT_FP_AVERAGE_BUFFER_INT_10;
(*Average Buffer for integer numbers of size 10*)
END_VAR
변수 bDefine가 TRUE로 설정되면 함수가 실행됩니다.
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_F,FP_AVERAGE_BUFFER_DEFINE!,,13,2,28,6,,?DEN?Dn_Words?AENO?Cd_Start);
B(B_VARIN,,iNumberOfIntegerValues,11,4,13,6,);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,bDefine,4,1,6,3,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
L(1,2,4,2);
L(6,2,6,4);
L(6,4,13,4);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_CONTACT,,bWrite,2,1,4,3,);
B(B_CONTACT,,bDefine,6,1,8,3,N);
B(B_F,FP_AVERAGE_BUFFER_WRITE!,,14,2,28,6,,?DEN?D@'s'?AENO?Cd_Start);
B(B_VARIN,,sys_iRingCounter_2ms5,12,4,14,6,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,sys_bPulse1s,11,1,13,3,R);
L(1,2,2,2);
L(4,2,6,2);
L(8,2,11,2);
L(13,2,13,4);
L(13,4,14,4);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (bDefine) then
FP_AVERAGE_BUFFER_DEFINE(n_Words := iNumberOfIntegerValues,
d_Start => Adr_Of_Var(dutAverageBufferInt10));
END_IF;
If (bWrite) AND NOT (bDefine) AND DF(sys_bPulse1s) then
FP_AVERAGE_BUFFER_WRITE(s := sys_iRingCounter_2ms5,
d_Start => Adr_Of_Var(dutAverageBufferInt10));
End_if;