F97_DSRC

32ビットテーブルデータのサーチ

s1で指定された32ビットデータをサーチデータとして、s2_Start (先頭アドレス)、s3_End (終端)アドレスで指定された範囲のエリア(テーブル)をサーチ(検索)します。

パラメータ

入力

s1(DWORD, DINT, UDINT, DATE, TOD, DT)

サーチするデータを格納しているエリアまたは定数データ(32ビット)

s2_Start(DWORD, DINT, UDINT, DATE, TOD, DT)

サーチテーブルの32ビットエリアの先頭アドレス

s3_End(DWORD, DINT, UDINT, DATE, TOD, DT)

サーチテーブルの32ビットエリアの終端アドレス

解説

  1.  (1) サーチデータ
  2.  (2) 32ビットデータテーブル
  • s1と同じ値を持つレジスタの個数を、特殊データレジスタDT90037 (sys_iNumberOfFoundMatches)に格納します。

  • 最初に一致したレジスタの位置を、s2_Start (先頭アドレス)からの相対位置番号として、特殊データレジスタDT90038 (sys_iPositionOfFirstMatch)に格納します。

  • 変数s2_Starts3_Endは同じデータ型を使用してください。

エラーフラグ

sys_bIsOperationErrorHold (TRUEになり、TRUEを保持)
  • インデックス修飾時にエリアを超えたとき

  • s2_Start>s3_Endのとき

sys_bIsOperationErrorNonHold (1回のスキャンに対してTRUE)
  • インデックス修飾時にエリアを超えたとき

  • s2_Start>s3_Endのとき

POUヘッダ

POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。

	VAR
		start: BOOL:=FALSE;
		data_table: ARRAY [0..3] OF DINT:=[-44,222222,-44,12345];
		number_matches: INT:=0;
		position_1match: INT:=0;
	END_VAR

POUボディ

変数startがON (TRUE)のとき、このファンクションが実行されます。この例では、ファンクションの入力"s1"に定数"-44"が割り当てられています。resultは、特殊データレジスタDT90037~DT90038に格納されます。MOVE命令により、結果が2つの変数number_matchesposition_1matchに転送されています。

LDボディ

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_F,F97_DSRC!,Instance,8,0,15,6,,?DEN?Ds1?Ds2_Start?Ds3_End?AENO);
B(B_VARIN,,start,6,1,8,3,);
B(B_VARIN,,-44,6,2,8,4,);
B(B_VARIN,,data_table[0],6,3,8,5,);
B(B_VARIN,,data_table[3],6,4,8,6,);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_F,E_MOVE!,Instance,8,1,14,5,,?DEN?D?AENO?C);
B(B_VAROUT,,number_matches,14,3,16,5,);
B(B_VARIN,,start,6,2,8,4,);
B(B_VARIN,,DT90037,6,3,8,5,);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_F,E_MOVE!,Instance,8,1,14,5,,?DEN?D?AENO?C);
B(B_VAROUT,,position_1match,14,3,16,5,);
B(B_VARIN,,start,6,2,8,4,);
B(B_VARIN,,DT90038,6,3,8,5,);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

STボディ

IF start then
    F97_DSRC( s1:= -44 ,
         s2_Start:= data_table[0] ,
         s3_End:= data_table[3] );
    number_matches:=DT90037;
    position1_match:=DT90038;
END_IF;

ILボディ

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