DINT型離散値の直線補間
隣り合った基準点Pw(xw, yw)とPw+1(xw+1, yw+1)を直線的に補間し、x に対するyの値を求めます。この例では、wは最も近い基準点であり、そのx値は入力値xよりも小さな値になります。つまり、このファンクションは、個々の連続した基準点をつなぎ、出力値yを入力値xに従って求めます。
入力
ファンクションの実行条件(EN = TRUEのとき、PLCサイクル毎に実行されます。)
入力値x
ユーザー定義DUTの最初の要素(xy値の数)は、この入力に適用されます。以下のDUTの説明をご参照ください。
出力
ファンクションが実行されると、すぐにENOがTRUEにセットされます。EN機能付きのファンクションブロックをカスケード接続することができます。
出力値y
F命令を使用する代わりに、対応するFP7命令を使用することをおすすめします。FP_SCALE 離散値の直線補間
この機能は以下のような用途に利用することができます:
計測値の線形化、例: 非線形センサ
外気温xに対応したヒーターのフロー温度yの算出
その他
基準点の数が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、グラフ内右端の水平方向の破線)。
DUT内のxy値のペア(基準点P1, P2, ...):
基準点(P1, P2, ...)は、基準点の数とxy値のペア(番号; x1, x2, ...; y1, y2; ...)を含むDUT形変数を介して、ファンクションにコピーされます。
要素: x値(ARRAY[1..z] OF DINTまたはARRAY[0..z-1] of DINT)
要素: y値(ARRAY[1..z] OF DINTまたはARRAY[0..z-1] of DINT)
x値は昇順で入力してください。(x1 < x2 < x3 < ...)。x値が同じの場合(例. x2 = x3 = x4)、基準点P2 (x2,y2)とP3 (x3,y3)は無視されます。
演算中のオーバーフローを避けるため、隣り合った基準点は以下のように入力してください。
|ya - yb| < 2147483647 |x - xb| < 2147483647 |(ya - yb)*(x - xb)| < 2147483647 |xa - xb| < 2147483647 |
このファンクションで処理できるのは整数のみです。値yが算出されたとき、小数点以下の数字は切り捨てされます。例えば、x, y = 511.13の場合、ファンクションは値511を返します。
基準点数、x、yの組み合わせで構成される構造体(DUT)を宣言します。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
start: BOOL:=FALSE;
(*avtivates the function*)
input_value: DINT:=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: DINT:=0;
(*output_value y*)
@'': @'';
END_VAR
ここでは、上記で宣言された構造体(DUT)型の入力変数measured_valueが宣言されています。x値、y値がPOUヘッダで宣言されています。x値、y値に値を入力して変更することもできます。(y3の場合の例: Measuredvalues.Y_Values[3])
変数startがON (TRUE)のとき、このファンクションが実行されます。x位置のinput_valueに対して、変数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_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,);
B(B_F,F283_DSCAL!,Instance,15,0,22,5,,?DEN?Dx?Dxy_data?AENO?Cy);
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
F283_DSCAL(input_value, measured_value.referencepoints, output_value);
END_IF;