离散INT值的线性插补
此函数根据相邻参考点Pw(xw, yw)和Pw+1(xw+1, yw+1)执行线性插补,以此渲染位置x的值y。在此例中,w是最近的参考点,其x值小于输入值x,即此函数将单个参考点串联并根据输入值x渲染输出值y。
输入
激活函数(当EN = TRUE时,在各PLC循环期间执行函数)
输入值 x
将用户自定义DUT的第一个元素(即xy值的数量)应用到此输入。请参阅以下DUT结构的描述。
输出
输出值y
只要执行此函数,ENO即设置为TRUE。当使用EN函数层叠功能块时很有用。
如果参考点的数量不在2 ...100之间,或x值不是升序(x1 < x2 < x3 < ...)。
如果参考点的数量不在2 ...100之间,或x值不是升序(x1 < x2 < x3 < ...)。
如果输入值x小于第一个参考点的x坐标(P1:x < x1),输出y将设置为第一个参考点的y坐标(输出y = y1,图形左上角的水平虚线)。
如果输入值x大于最后一个参考点的x坐标(P8:x> x8),输出y将设置为最后一个参考点的y坐标(输出y= y8,图形右上角的水平虚线)。
xy值对(参考点P1、P2...)的DUT:
参考点(P1、P2...)通过包含参考点数量和xy值对(数量;x1、x2...;y1、y2;...)的DUT类型变量而复制到函数。
元素:x值(ARRAY[1..z] OF INT或ARRAY[0..z-1] of INT)
元素:y值(ARRAY[1..z] OF INT或ARRAY[0..z-1] of INT)
重要信息:
x值
必须以升序输入x值(x1 < x2 < x3 < ...)。如果x值相同(例如x2 = x3 = x4),将忽略参考点P2(x2,y2)和P3(x3,y3)。
为避免计算时溢出,相邻参考点必须满足以下条件:
|ya - yb| < 32767 |x - xb| < 32767 |(ya - yb)*(x - xb)| < 32767 |xa - xb| < 32767 |
此函数只能处理整数。当计算值y时,小数点之后的数字将被去除。例如,如果在位置x, y = 511,13,函数返回值511。
在DUT池中,声明参考点的数量和xy值对。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
start: BOOL:=FALSE;
(*avtivates the function*)
input_value: INT:=0;
(*input_value x*)
measured_value: Interpolation_8 (X_values := [-5,5,15,20,30,42,45,50],Y_values := [5,-5,10,2,2(5),0,2]);
(*number of reference
points*)
output_value: INT:=0;
(*output_value y*)
@'': @'';
END_VAR
此处声明输入变量measured_value,对应于以上定义的DUT的类型。在POU头中执行x值和y值的分配。但是,可以通过对变量分配值(例如:对x分配Measuredvalues.X_Values[1])在本体中更改x值和y值。
当变量start设置为TRUE时,执行此函数。对于位置x的输入值,通过变量measured_value中存储的相邻参考点的线性插补计算输出值y。
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_F,F282_SCAL!,Instance,15,0,22,5,,?DEN?Dx?Dxy_data?AENO?Cy);
B(B_VARIN,,input_value,13,2,15,4,);
B(B_VARIN,,measured_value.referencepoints,13,3,15,5,);
B(B_VAROUT,,output_value,22,2,24,4,);
B(B_CONTACT,,start,6,1,8,3,);
L(8,2,15,2);
L(1,2,6,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F282_SCAL(input_value, measured_value.referencepoints, output_value);
END_IF;