执行离散值的线性插补
此FP指令根据相邻参考点Pw(xw, yw)和Pw+1(xw+1, yw+1)执行线性插补,以此渲染位置x的值y。在此例中,w是最近的参考点,其x值小于输入值s1_x,即此函数将单个参考点串联并根据输入值s1_x渲染输出值d_y。
输入
输入值
在16位PLC类型上:(INT, DINT, REAL)
在32位PLC类型上: (INT, DINT, UINT, UDINT, REAL, LREAL)
将用户自定义DUT的第一个元素(即xy值的数量)应用到此输入。请参阅以下DUT结构的描述。
输出
结果
在16位PLC类型上:(INT, DINT, REAL)
在32位PLC类型上: (INT, DINT, UINT, UDINT, REAL, LREAL)
应用示例:
例如使用非线性传感器线性化测量值
相对于外部温度x渲染加热器的流动温度y
如果使用索引寄存器指定的区域超出限制。
如果参考点的数量超出2–256的范围。
如果s2_xyData超出范围。
如果参考点的x值不是升序。
如果使用索引寄存器指定的区域超出限制。
如果参考点的数量超出2–256的范围。
如果s2_xyData超出范围。
如果参考点的x值不是升序。
如果输入值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类型变量而复制到函数。
元素:数据类型ARRAY[1..z] OF INT的变量(在16位PLC类型上:INT, DINT, REAL;在32位PLC类型上: (INT, DINT, UINT, UDINT, REAL))或ARRAY[0..z-1] of INT(在16位PLC类型上:INT, DINT, REAL;在32位PLC类型上: (INT, DINT, UINT, UDINT, REAL)),包含x值。此处z代表参考点数量的放置标记(见项目1)。
元素:数据类型ARRAY[1..z] OF INT的变量(在16位PLC类型上:INT, DINT, REAL;在32位PLC类型上: (INT, DINT, UINT, UDINT, REAL))或ARRAY[0..z-1] of INT(在16位PLC类型上:INT, DINT, REAL;在32位PLC类型上: (INT, DINT, UINT, UDINT, REAL)),包含y 值。此处z代表参考点数量的放置标记(见项目1)。
FP_SCALE支持以下数据类型:
在16位PLC类型上(FP-Sigma、FP-X):INT、DINT、REAL
在32位PLC类型上(FP7):INT, DINT, REAL, UINT, UDINT
相应的F型指令:F282_SCAL, F283_DSCAL, F354_FSCAL
使用数据单元类型(DUT),可以定义由其他数据类型组成的数据单元类型。DUT首先在DUT池中定义,然后像全局变量列表或POU头中的标准数据类型(BOOL、INT等)一样进行处理。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bStart: BOOL:=FALSE;
iInput: INT:=50;
xy_data: xy_data_dut;
iScaledOutput: INT:=0;
@'': @'';
END_VAR
当变量bStart设置为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_CONTACT,,bStart,4,2,6,4,);
B(B_F,FP_SCALE!,,17,1,25,6,,?DEN?Ds1_x?Ds2_xyData?AENO?Cd_y);
B(B_VARIN,,iInput,15,3,17,5,);
B(B_VAROUT,,iScaledOutput,25,3,27,5,);
B(B_VARIN,,xy_data.iNumberOfValues,15,4,17,6,);
L(1,0,1,6);
L(1,3,4,3);
L(6,3,17,3);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (bStart) then
FP_SCALE(s1_x := iInput,
s2_xyData := xy_data.iNumberOfValues,
d_y => iScaledOutput);
END_IF;