F283_DSCAL

DINT型離散値の直線補間

隣り合った基準点Pw(xw, yw)Pw+1(xw+1, yw+1)を直線的に補間し、x に対するyの値を求めます。この例では、wは最も近い基準点であり、そのx値は入力値xよりも小さな値になります。つまり、このファンクションは、個々の連続した基準点をつなぎ、出力値yを入力値xに従って求めます。

パラメータ

入力

EN (BOOL)

ファンクションの実行条件(EN = TRUEのとき、PLCサイクル毎に実行されます。)

x (DINT)

入力値x

xy_data (ユーザー定義DUT)

ユーザー定義DUTの最初の要素(xy値の数)は、この入力に適用されます。以下のDUTの説明をご参照ください。

出力

ENO (BOOL)

ファンクションが実行されると、すぐにENOTRUEにセットされます。EN機能付きのファンクションブロックをカスケード接続することができます。

y (DINT)

出力値y

解説

F命令を使用する代わりに、対応するFP7命令を使用することをおすすめします。FP_SCALE 離散値の直線補間

この機能は以下のような用途に利用することができます:

  • 計測値の線形化、例: 非線形センサ

  • 外気温xに対応したヒーターのフロー温度yの算出

  • その他

エラーフラグ

sys_bIsOperationErrorHold (TRUEになり、TRUEを保持)

基準点の数が2~100でない、またはx値が昇順(x1 < x2 < x3 < ...)になっていないとき

sys_bIsOperationErrorNonHold (1回のスキャンに対してTRUE)

基準点の数が2~100でない、またはx値が昇順(x1 < x2 < x3 < ...)になっていないとき

出力値yの制限:

入力値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形変数を介して、ファンクションにコピーされます。

ユーザ定義DUTの構造:

  1. 要素: 基準点の数z (INT)。基準点の数(xy値のペア)は、2~100の範囲で設定することができます。グラフでは、8つの基準点(P1P8)が使われています。
  2. 要素: x値(ARRAY[1..z] OF DINTまたはARRAY[0..z-1] of DINT)

  3. 要素: 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を返します。

DUT

基準点数、x、yの組み合わせで構成される構造体(DUT)を宣言します。

POUヘッダ

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])

POUボディ

変数startがON (TRUE)のとき、このファンクションが実行されます。x位置のinput_valueに対して、変数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_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

STボディ

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

ILボディ

最終修正日: 2019-08-05このページに関するフィードバックお問い合わせ窓口