HOME 戻る

プログラミング・ガイド2 (パラメータ入力/操作警報履歴出力)

 
 
KCXライブラリの以下使いかたを解説します。
 
1. プログラムパラメータの読み取り
2. 操作&警報履歴の作り方
 

 
【 1. プログラムパラメータの読み取り 】
 
  プログラムが、プログラムパラメータを読み取る方法を説明します。
  読み取るものは、画面内のキーワードに対する定義値です。
  例えば、下記のような画面内容の場合、
 
NO. キーワード 定義 入力画面:キーワード説明 入力画面:備考
1 mailperm on メール送信許可 on, off
  キーワード「mailperm」行の定義に設定されたデータ例えば「on」を取得することとなります。
 
  パラメータを読み取るプログラムはほぼ定番的なものです。
  下記プログラムを雛型にして使うのが便利でしょう。
 
  手順
  1. キーワードと定義データを格納するメモリ(keyword,paradata)を確保する。
  2. kcxprg_para_data_get()関数を使用しパラメータを読込みキーワード数を得る。
  3. キーワード個々を検査し定義データを得る。
     注意:この段階で得たデータ型は仕様により文字列型です。
  4. 使用したいデータが文字列型以外の場合、
     型を文字列から目的(整数(atoi)実数(atof)等)のものに変換する。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int    flag;
     /*重要な部分1はここから*/
    char  *keyword [BUFSIZ];   /*キーワード読込文字列*/
    char  *paradata[BUFSIZ];   /*定義データ読込文字列*/
     /*ここまで*/
    int    mode_int;           /*使用したい整数変数名(例)*/
    double ondo_flt;           /*使用したい実数変数名(例)*/
    char   memo_txt[256];      /*使用したい文字列変数名(例)*/

      kcxinit( argc, argv );

      mode_int = 0;            /*整数変数に初期値[0]を設定(例)*/
      ondo_flt = 0.0;          /*実数変数に初期値[0.0]を設定(例)*/
      strcpy( memo_txt, "" );  /*文字列変数に初期値[空]を設定(例)*/

      /*重要な部分2はここから*/
      /*プログラムパラメータデータを読み込みキーワードの数を得る*/
      keywords = kcxprg_para_data_get( mode, keyword, paradata, BUFSIZ );

      if( keywords >= 1 ){  /*キーワードが存在していたらパラメータデータを取り込む*/
        for(i=0;i<keywords;i++){  /*キーワード数分を検査する*/
          if( strcmp( keyword[i], "xxx-mode" ) == 0 ){   /*キーワードが[xxx-mode(例)]の場合*/
            mode_int = atoi( paradata[i] );  /*パラメータ文字列データを整数に変換し取り込む*/
          }
          if( strcmp( keyword[i], "xxx-ondo" ) == 0 ){   /*キーワードが[xxx-ondo(例)]の場合*/
            ondo_flt = atof( paradata[i] );  /*パラメータ文字列データを実数に変換し取り込む*/
          }
          if( strcmp( keyword[i], "xxx-memo" ) == 0 ){   /*キーワードが[xxx-memo(例)]の場合*/
            strcpy( memo_txt, paradata[i] ); /*パラメータ文字列データを文字列のまま取り込む*/
          }
        }
      }
      /*ここまで*/

      /* 以下はパラメータデータ使用例 */
      flag = 0;
      if( mode_int >  100  )  flag = 1;            /*パラメータデータ取得後の操作イメージ*/
      if( ondo_flt >= 32.1 )  flag = 1;            /*パラメータデータ取得後の操作イメージ*/
      if( strcmp( memo_txt, "ok" ) == 0 )  flag = 1;  /*パラメータデータ取得後の操作イメージ*/
  }
 《解説》
  (1) キーワードと定義データ変数名は都合悪く無い限りこのままお使いください
      char *keyword [BUFSIZ];
      char *paradata[BUFSIZ]; 
      データはポインタ配列変数と言うもので、実体メモリのアドレスを格納します。
      この実体メモリの確保とアドレス設定は、kcxprg_para_data_get()関数内で行っています。
      したがって上記を制御プログラムで行う必要はありません。
      配列値としてのBUFSIZは、パラメータ数以上あれば良いですがBUFSIZ推奨です。 
  (2) kcxprg_para_data_get()関数のmodeと戻り値について
      a. mode が 0 の場合
       本関数初回実行時には、パラメータを読み取りそのキーワードの数を戻します。
       2回目以降は、パラメータが編集変更されていない限り、0を戻します。
       つまり、パラメータデータが不変でパラメータを再度読取る必要がないという意味です。
       パラメータ編集変更後本関数を実行すると、そのパラメータを読みキーワード数を戻します。
      b. mode が 1 の場合
       本関数実行時常に、パラメータを読み取りそのキーワードの数を戻します。
      ※本関数実行時パラメータファイルが存在しなかった場合mode値に関係なく-1を戻します。
  (2) atoi (アルファベットtoイント[整数]) とは
      文字列を整数値に変換する関数です。(注:文字列に整数文字以外を与えてはいけません)
      整数値 = atoi ( 文字列 );
  (3) atof (アルファベットtoフロート[実数]) とは
      文字列を倍精度実数値に変換する関数です。(注:文字列に実数文字以外を与えてはいけません)
      倍精度実数値 = atof ( 文字列 );
      double  f;
       f = atof( "3.14" );
 
  プログラム中の、kcxprg_para_data_get() 関数は、
  KCXライブラリの一部として組み込まれていますが、そのソースプログラムを見ることが出来ます。
  Karacrix24A 或は Karacrix500B ディレクトリ下の /sys/ssrc/kcxlib_src.c です。
  この中に記述してあります。
  もし仕様を変更して使用したい場合には、このソース関数を自分のプログラム内に別名で複写し、
  これを改造し、kcxprg_para_data_get()関数名でなく、その別名でご使用ください。
  パラメータデータを自身の仕様に合わせ読めるようになると思います。
 
  kcxprg_para_data_get()関数は、プログラムS1も使用しています。
  複雑で見にくいと思いますが、参考にしてみてください。
 
 

 
 
【 2. 操作&警報履歴の作り方 】
 
  履歴は、プログラム処理中の事象を記録として残したい場合に用います。
  状態遷移や警報状態またプログラムの判断結果等を残すなどに使えます。
 
  履歴を作るには仕組み(流れ)を知る必要ありますが少々複雑です。
  これは履歴識別子(コード)を文字に置き換える履歴コード文字変換テーブルというものがあり、
  このテーブルをオブジェクトから間接指定するため分かりにくくなっている為です。
 
  先ず、履歴文字が生成される迄の処理の流れを示しておきます。
  1. 事象の発生
  2. ユーザプログラムが事象に対応した履歴識別子を使いKCXライブラリを実行
  3. 以後システム内部の処理
     ポイントオブジェクトの(ポイント登録で設定している)履歴コード文字変換ID(テーブル分類名)の選択
  4. 読取テーブル中の履歴識別子(コード)に対応するレベル、色、データ(文字フォーマット+変数)を抽出
  5. 文字フォーマット中にフォーマット指定子が存在していた場合、変数値に入れ換え文字を決定
  以上の過程を経ます。
 
  では、識別子(コード)から説明していきます。
  履歴は最終的に文字表示されるものです。
  但し、システム内部では文字を処理の流れに使っているのではなくコードで扱っています。
  履歴ファイルを事象内容別レベル別等一覧検索したり例えば統計取るのに大変便利で、
  小さなコードで長い可変長の文字表現も可能とさせるなどの利点がある為です。
  識別子は、「履歴キー」と「履歴ステータス」の2つより構成されます。
  「履歴キー」は「何が(Ev_KEY)」に相当し、
  「履歴ステータス」は「どうなった(Ev_STAT)」に相当し、
  これらの組合せに対応した文字フォーマットを、レベル、色と供に決めることにしています。
 
  次に、文字フォーマット+変数 について説明します。
  最終履歴文字の決定は、C言語のprintf関数のフォーマット定義に準じています。
  データ部には、「フォーマット」と「変数のリスト」を記述します。
  「変数のリスト」が無い場合には「フォーマット」の文字列が最終履歴文字列として決定されます。
  変数がある場合には、「フォーマット」中にあるフォーマット指定子が変数の内容に置き換わります。
  なお、フォーマット指定子と「変数のリスト」は1対1に対応付けされていなければなりません。
  「変数のリスト」は、$変数という書式でカンマ区切りのリストで記述します。
  この$変数は、履歴を作るプログラムが共用体変数というものを使って設定した値を1つずつ取り出すものです。
  共用体に関してはC言語の教本を読んで頂くとして、
  使用する共用体は、整数あるいは実数の共用メモリ7つより構成されています。
  使用上の制限は、メモリを共用していますので、
  メモリを整数として使っている場合には実数が、実数の場合は整数が使えませんので注意してください。
  具体的にプログラムを交えて説明すると、共用体名を udata10 とした場合、
  udata10[0].i = xxxx; に設定した整数 xxxx は $i0 で取り出します。
  udata10[9].f = yyyy; に設定した実数 yyyy は $f9 で取り出します。
  なお、変数の型を間違わないように注意してください。
  udata10[0〜9].i の i は、整数で、$変数は、$i0〜$i9 に対応させます。
  udata10[0〜9].f の f は、実数で、$変数は、$f0〜$f9 に対応させます。
  udata10[0].i = xxxx; に設定した整数 xxxx を $f0 で取り出すとデータ化け起こします。
  udata10[9].f = yyyy; に設定した実数 yyyy を $i9 で取り出すとデータ化け起こします。
  フォーマットと変数のリストを以下に示すように設定し、
 
"データ= %d %05.2f", $i0, $f9
  プログラム側で次に示すデータを設定した場合、
 
udata[0].i = 123;
udata[9].f = 3.14;
  履歴文字は、
 
データ= 123 03.14
  と決定されます。
  履歴コード文字変換テーブルは、複数あります。
  これは設定データが見やすくなるよう性質の異なるI/O別に分類(できるように)している為です。
  これにより、ポイント毎どのテーブルを使用するかはポイント登録で予め設定しておく事になります。
  最後に、ポイントの履歴ではなく、システムとしての履歴があります。
  システムが起動したとか、通信エラーが生じたとかポイントに関係ない内容の場合です。
  これに関しては、一括してシステムポイントなるものが受け取ります。
  このシステムポイントなるOBJIDは、.sys 及び .sys2 です。
  またテーブル画面の .system .system2 等も参照にしてみてください。
  ポイントの履歴を作る同じ方法で、システム履歴も作成することが出来ます。
 
  使用するKCXライブラリ関数は、以下に示す操作及び警報履歴生成用の2種類です。
  引数の使いかたは同じです。関数名が、_ope_ か _alm_ かの違いだけです。
  int objid;
  int Ev_KEY;
  int Ev_STAT;
  KcxIntFlt_t udata10[10];
  kcxobj_ope_log_10uwt( objid, Ev_KEY, Ev_STAT, udata10 );   /*操作履歴生成*/
  kcxobj_alm_log_10uwt( objid, Ev_KEY, Ev_STAT, udata10 );   /*警報履歴生成*/
 
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int   system_objid;
    int   do_objid;
    int   ai_objid;
    int   Ev_KEY;
    int   Ev_STAT;
    KcxIntFlt_t  udata10[10];

      kcxinit( argc, argv );

      system_objid = kcxobj_open( ".sys"  );
      do_objid     = kcxobj_open( "do001" );
      ai_objid     = kcxobj_open( "ai001" );

      /* システム操作履歴例 (ここではudata10を文字に使用、取り出しは$c0) */ 
      memset( (void *)udata10, 0, sizeof(udata10) );
      kcxstr_text_to_udata10( 0, "温度監視", "", udata10 );
      Ev_KEY  =  2;  /*例えば"プログラム"表示識別子*/
      Ev_STAT =  1;  /*例えば"起動"表示識別子      */
      kcxobj_ope_log_10uwt( system_objid, Ev_KEY, Ev_STAT, udata10 );

      /* 操作履歴例 (ここではudata10内容未使用、取り出しは無し)  */ 
      memset( (void *)udata10, 0, sizeof(udata10) );
      Ev_KEY  =  2;  /*例えば"操作"表示識別子*/
      Ev_STAT =  1;  /*例えば"ON"表示識別子  */
      kcxobj_ope_log_10uwt( do_objid, Ev_KEY, Ev_STAT, udata10 );

      /* 警報履歴例 (ここではudata10の実数1つ使用、取り出しは$f0) */ 
      memset( (void *)udata10, 0, sizeof(udata10) );
      udata10[0].f = 40.0; /*例えば異常値*/
      Ev_KEY      =   53; /*例えば"警報"表示識別子*/
      Ev_STAT     =    1; /*例えば"発生"表示識別子*/
      kcxobj_alm_log_10uwt( ai_objid, Ev_KEY, Ev_STAT, udata10 );

  }
 《解説》
  (1) memset()関数とは
      メモリを第二引数値で埋めるというものです。
      本プログラム例では、udata10 を使用する前に 0 クリアさせています。
  (2) kcxstr_text_to_udata10()関数とは
      udata10 は、半角文字 80 バイト分のメモリでこの範囲で文字が扱えます。
      80 バイト以上知らずに書き込むとプログラムエリア壊し誤動作するなど影響が出ます。
      本関数は、このサイズを超えないよう文字を udata10 に書き込む関数です。
      自作プログラムで、文字を udata10 に書き込むときは注意してください。
      引数は以下の通りです。第1と3引数は将来対応のもので今は0と""にしてください。
      kcxstr_text_to_udata10( 0, 書き込む文字列, "", udata10 );
  (3) KcxIntFlt_t の定義とは
      karacrixXXX/sys/sinc/kcxux_program.h の中で以下定義(抜粋)されています。
      typedef union _intflt_ {
	double     f;
	long long  i;
      } 
      KcxIntFlt_t;
 
 

HOME 戻る