F282_SCAL

离散INT值的线性插补

此函数根据相邻参考点Pw(xw, yw)Pw+1(xw+1, yw+1)执行线性插补,以此渲染位置x的值y。在此例中,w是最近的参考点,其x值小于输入值x,即此函数将单个参考点串联并根据输入值x渲染输出值y

参数

输入

EN (BOOL)

激活函数(当EN = TRUE时,在各PLC循环期间执行函数)

x (INT)

输入值 x

xy_data(用户自定义DUT)

将用户自定义DUT的第一个元素(即xy值的数量)应用到此输入。请参阅以下DUT结构的描述。

输出

y (INT)

输出值y

ENO (BOOL)

只要执行此函数,ENO即设置为TRUE。当使用EN函数层叠功能块时很有用。

标注

建议使用相应的FP7指令,来代替使用此F型指令:FP_SCALE 执行离散值的线性插补

此函数可用于:

  • 例如使用非线性传感器线性化测量值

  • 相对于外部温度x渲染加热器的流动温度y

错误标志

sys_bIsOperationErrorHold(变为TRUE并保持为TRUE)

如果参考点的数量不在2 ...100之间,或x值不是升序(x1 < x2 < x3 < ...)。

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)

如果参考点的数量不在2 ...100之间,或x值不是升序(x1 < x2 < x3 < ...)。

输出值y的限制:

如果输入值x小于第一个参考点的x坐标(P1x < x1),输出y将设置为第一个参考点的y坐标(输出y = y1,图形左上角的水平虚线)。

如果输入值x大于最后一个参考点的x坐标(P8x> x8),输出y将设置为最后一个参考点的y坐标(输出y= y8,图形右上角的水平虚线)。

xy值对(参考点P1P2...)的DUT:

参考点(P1P2...)通过包含参考点数量和xy值对(数量;x1x2...;y1y2;...)的DUT类型变量而复制到函数。

用户自定义DUT的结构:

  1. 元素:参考点的数量z INT)。参考点(xy值对)的数量可以在2~100之间任意设置。在图中,使用八个参考点(P1~P8)。
  2. 元素:x值(ARRAY[1..z] OF INTARRAY[0..z-1] of INT

  3. 元素:y值(ARRAY[1..z] OF INTARRAY[0..z-1] of INT

重要信息:

x

必须以升序输入x值(x1 < x2 < x3 < ...)。如果x值相同(例如x2 = x3 = x4),将忽略参考点P2x2,y2)和P3x3,y3)。

函数溢出:

为避免计算时溢出,相邻参考点必须满足以下条件:

|ya - yb| < 32767

|x - xb| < 32767

|(ya - yb)*(x - xb)| < 32767

|xa - xb| < 32767

计算精度:

此函数只能处理整数。当计算值y时,小数点之后的数字将被去除。例如,如果在位置x, y = 511,13,函数返回值511。

示例

DUT

在DUT池中,声明参考点的数量和xy值对。

POU头

所有用于编程此函数的输入和输出变量已在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值。

POU本体

当变量start设置为TRUE时,执行此函数。对于位置x的输入值,通过变量measured_value中存储的相邻参考点的线性插补计算输出值y。

LD本体

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

ST本体

IF start then
    F282_SCAL(input_value, measured_value.referencepoints, output_value);
END_IF;

IL本体

最后更新日期: 此页面上的反馈松下热线