離散値の直線補間
このFP命令は、隣り合った基準点Pw(xw, yw)とPw+1(xw+1, yw+1)を線形化(補間)し、位置xに対するyの値を求めます。この例では、wは最も近い基準点であり、そのx値は入力値s1_xよりも小さな値になります。つまり、このファンクションは、個々の連続した基準点をつなぎ、入力値d_yに従って出力値s1_xを求めます。
入力
入力値
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、グラフ内右端の水平方向の破線)。
DUT内のxy値のペア(基準点P1, P2, ...):
基準点(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構造体はData Unit Typeの略で、複数の異なるデータ型をもつ変数で構成されます。構造体をまず定義し、その後、標準的なデータ型(BOOL、INTなど)と同様にグローバル変数リストやPOUヘッダで使用します。
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;