포인터 정보 제공
GetPointer 함수는 함수 또는 펑션블록에서 사용할 수 있는 POINTER 데이터 형식의 사정 정의한 DUT에 있는 변수의 포인터 정보를 제공합니다. 이러한 포인터 정보와 해당 포인터 함수를 사용하여 함수 또는 펑션블록을 외부 데이터 어드레스 영역에서 직접 읽거나 외부 데이터 어드레스 영역에 쓸 수 있습니다.
입력
DT, FL 또는 Y 메모리 영역에 있어야 하는 모든 데이터 형식의 입력 변수입니다.
출력
입력 변수의 포인터 정보입니다.
사용자 정의 함수 또는 사용자 정의 펑션 블록은 다음과 같은 포인터 정보를 사용할 수 있습니다.
iSize 포인터 요소는 값의 수를 지정할 수 있습니다(예: 요소 수 = Pointer.iSize / Size_Of_Var (DataElement)).
해당 AreaOffs_ToVar 및 Var_ToAreaOffs 포인터 함수와 iArea 및 iOffset 포인터 요소를 사용하여 외부 데이터 어드레스 영역에서 직접 읽거나 외부 데이터 어드레스 영역에 쓸 수 있습니다.
또한 Is_AreaDT 또는 Is_AreaFL 메모리 영역 명령과 AdrDT_Of_Offs 또는 AdrFL_Of_Offs 어드레스 명령을 사용하여 외부 데이터 어드레스 영역으로 FP 명령을 사용할 수 있습니다.
다음과 같은 이유로 입력 변수는 DT 또는 FL 메모리 영역에 있어야 합니다.
Is_AreaDT 또는 Is_AreaFL 메모리 영역 명령과 AdrDT_Of_Offs 또는 AdrFL_Of_Offs 어드레스 명령은 이러한 메모리 영역을 통해서만 작동하기 때문입니다.
AreaOffs_ToVar 및 Var_ToAreaOffs 포인터 명령은 이러한 메모리 영역 내에서만 올바르게 작동하기 때문입니다.
이 명령은 AreaOffs_OfVar 명령을 대체합니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다. 모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
VAR
arData: ARRAY [0..2] OF REAL:=[3(0.0)];
iNumberOfElements: INT:=0;
rSum: REAL:=0.0;
rMean: REAL:=0.0;
rDeviation: REAL:=0.0;
@'': @'';
END_VAR
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_COMMENT,,These functions show the write access to an input array by using the GetPointer32 function.ø^The input array arDara is initialized with [10.0~ 20.0~ 30.0],3,0,42,2,);
B(B_VARIN,,arData,6,4,8,6,);
B(B_F,FunCalcStatisticsInitArray1!,,15,3,28,6,,?DprArray);
B(B_F,GetPointer32!,,8,4,15,6,,?D?C);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_VARIN,,arData,6,4,8,6,);
B(B_F,GetPointer32!,,8,4,15,6,,?D?C);
B(B_VAROUT,,diNumberOfElements,29,4,31,6,);
B(B_F,FunCalcStatistics1!,,15,3,29,9,,?DprArray?AdiNumberOfElements?ArSum?ArMean?ArDeviation);
B(B_VAROUT,,rSum,29,5,31,7,);
B(B_VAROUT,,rMean,29,6,31,8,);
B(B_VAROUT,,rDeviation,29,7,31,9,);
B(B_COMMENT,,These functions show the read access from an input array using the GetPointer function.ø^Some statistical features are calculated from the input array arData [10.0; 20.0; 30.0],3,0,42,2,);
L(1,0,1,9);
END_NETWORK_BODY
END_NET_WORK
END_BODY
이 함수는 10, 20, 30 등의 값 단계로 prArray에서 가리키는 데이터를 초기화합니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다.모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.
(* Calculate the number of elements from the pointer member diSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copy the offset to an internal offset which can be increased later *)
diOffset:=prArray.diOffset;
(* Loop over all elements *)
for di := 1 to diNumberOfElements do
(* Calculate the current element di*10.0 *)
rCurrentElement:=DINT_TO_REAL(di)*10.0;
(* Write the current element to the data to which the pointer refers *)
Var_ToAreaOffs32(Var := rCurrentElement,
iArea => prArray.iArea,
diOffs => diOffset);
(* Increase the offset to the next element *)
diOffset:=diOffset + INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
FunCalcStatistics1 사용자 정의 함수는 prArray에서 가리키는 값에서 통계를 계산합니다. 내부적으로 AreaOffs_ToVar는 외부 데이터 어드레스 영역에서 읽을 때 사용됩니다.
이 펑션 프로그램 시 사용한 모든 입력과 출력 변수는 POU 헤더에서 선언되었습니다.
모든 프로그래밍 언어에 같은 POU 헤더를 사용합니다.FunCalcStatistics1
(* Calculate the number of elements from the pointer member iSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copy the offset to an internal offset which can be increased later *)
diOffset:=prArray.diOffset;
(* Loop over all elements *)
for di := 1 to diNumberOfElements do
(* Read the current element from the data to which the pointer refers *)
rCurrentElement:=AreaOffs32_ToVar(iArea := prArray.iArea, diOffs := diOffset);
(* Calculate the sum and the square sum *)
rSum:=rSum+rCurrentElement;
rSquareSum:=rSquareSum+rCurrentElement*rCurrentElement;
(* Increase the offset to the next element *)
diOffset:=diOffset+INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* Final calculation of the additional statistical parameters *)
rNumberOfElements:=DINT_TO_REAL(diNumberOfElements);
rMean:=rSum/rNumberOfElements;
rDeviation:=SQRT(1.0/(rNumberOfElements-1.0)*rSquareSum);