提供指针信息
GetPointer32函数以数据类型POINTER32的预定义数据单元型(DUT)提供变量的32位指针信息,可用于函数或功能块。通过此类指针信息和对应的指针函数,可直接在外部数据的地址区域读取或写入函数或功能块。
输入
必须位于DT、FL或Y内存区的任何数据类型的输入变量。
输出
输入变量的指针信息。
用户自定义函数或用户自定义功能块可如下使用指针信息:
指针元素iSize可指定值的数量,即(元素数量 = Pointer.iSize / Size_Of_Var (DataElement))
通过对应的指针函数AreaOffs32_ToVar和Var_ToAreaOffs32以及指针元素iArea和diOffset,可直接在外部数据的地址区域进行读取或写入。
通过内存区指令Is_AreaDT或Is_AreaFL以及地址指令AdrDT_Of_Offs32或AdrFL_Of_Offs32,也可以将FP指令用于数据的地址区域。
输入变量必须位于内存区DT或FL,原因如下:
因为内存区指令Is_AreaDT或Is_AreaFL和地址指令AdrDT_Of_Offs32或AdrFL_Of_Offs32仅用于这些内存区。
因为指针指令AreaOffs32_ToVar和Var_ToAreaOffs32仅在这些内存区内正确工作。
此指令替代指令AreaOffs_OfVar。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
arData: ARRAY [0..2] OF REAL:=[10.0,20.0,30.0];
diNumberOfElements: DINT:=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
所有用于编程此函数的输入和输出变量已在POU头中声明。所有编程语言使用相同的POU头。
(* 从指针构件diSize计算元素数量 *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* 将偏移量复制到可在以后增加的内部偏移量 *)
diOffset:=prArray.diOffset;
(* 循环所有元素 *)
对于di := 1至diNumberOfElements进行
(* 计算当前元素di*10.0 *)
rCurrentElement:=DINT_TO_REAL(di)*10.0;
(* 将当前元素写入指针所指的数据 *)
Var_ToAreaOffs32(Var := rCurrentElement,
iArea => prArray.iArea,
diOffs => diOffset);
(* 将偏移量增大至下一个元素 *)
diOffset:=diOffset + INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* 从指针构件iSize计算元素数量 *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* 将偏移量复制到可在以后增加的内部偏移量 *)
diOffset:=prArray.diOffset;
(* 循环所有元素 *)
对于di := 1至diNumberOfElements进行
(* 从指针所指的数据读取当前元素 *)
rCurrentElement:=AreaOffs32_ToVar(iArea := prArray.iArea, diOffs := diOffset);
(* 计算总和和平方和 *)
rSum:=rSum+rCurrentElement;
rSquareSum:=rSquareSum+rCurrentElement*rCurrentElement;
(* 将偏移量增大至下一个元素 *)
diOffset:=diOffset+INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* 最终计算附加的统计参数 *)
rNumberOfElements:=DINT_TO_REAL(diNumberOfElements);
rMean:=rSum/rNumberOfElements;
rDeviation:=SQRT(1.0/(rNumberOfElements-1.0)*rSquareSum);