HOME 戻る

プログラム・サンプル

 
 
プログラムS1を並列稼働させながら使用するサンプルプログラムの解説をします。
 
※S1をマルチプロセス実行させておいてください。
※S1はリモートI/O通信と警報判断管理の役割を担っておりアプリケーションではこの出力を利用します。
 
1. プログラムS1の警報状態を使用し、自分のプログラムでリレー操作
2. プログラムS1計測のアナログ値がリミット超えたときにリレー操作
3. あるスイッチの状態みてリレーを操作
4. 警報やロック状態みて操作を制御
5. スイッチの状態みて操作と警報の履歴を生成
6. 監視画面に任意の数値や文字を刻々変化させて表示させる
 

 
【 1. プログラムS1の警報状態を使用し、自分のプログラムでリレー(ON/OFF)操作 】
 
  S1には状態警報を検出する機能を持っています。
  この警報状態を他のプロセス(プログラム)で簡単に利用できます。
 
  例題) ai001の警報が発生したらdo001をONし、警報停止したらdo001をOFFさせる。
  事例) 例えばS1で温度警報が発生したらこれを拾いリレー等をON/OFFさせる。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int   objid_ai001, objid_do001;
    int   alm_ai001,   stat_do001;
      kcxinit( argc, argv );
      objid_ai001 = kcxobj_open( "ai001" );
      objid_do001 = kcxobj_open( "do001" );
      for(;;){
        kcxobj_alm_stat_ird( objid_ai001, &alm_ai001 );  /*S1制御下の警報状態取得*/
        kcxobj_stat_ird( objid_do001, &stat_do001 );     /*do001の状態取得*/
        if( alm_ai001 == 1 ){                            /*ai001警報発生の場合*/
          if( stat_do001 == 0 ){                         /*do001がOFFの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 1 );     /*do001のONをS1に送り操作してもらう*/
          } 
        }else{                                           /*ai001警報解除の場合*/
          if( stat_do001 == 1 ){                         /*do001がONの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 0 );     /*do001のOFFをS1に送り操作してもらう*/
          }
        }
        sleep( 1 );  /*必須:CPUを負荷らせない待ち時間*/
      }
  }
 

 
【 2. プログラムS1計測のアナログ値がリミット超えたときにリレー(ON/OFF)操作 】
 
  例題) ai001の値が80.0以上あるいは20.0以下の場合に、do001をONさせる。
  事例) 例えば計測温度が自分のプログラムで定めた制御温度値を超えたらリレー等をON/OFFさせる。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int    objid_ai001, objid_do001;
    int    stat_do001;
    double fdata;
    double Hval, Lval;
      kcxinit( argc, argv );
      objid_ai001 = kcxobj_open( "ai001" );
      objid_do001 = kcxobj_open( "do001" );
      Hval = 80.0;  /*上限リミット値設定*/
      Lval = 20.0;  /*下限リミット値設定*/
      for(;;){
        kcxobj_stat_frd( objid_ai001, &fdata );       /*ai001の計測値取得*/
        kcxobj_stat_ird( objid_do001, &stat_do001 );  /*do001の状態取得*/
        if( fdata > Hval ){                           /*ai001がH(80.0)以上の場合*/
          if( stat_do001 == 0 ){                      /*do001がOFFの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 1 );  /*do001のONをS1に送り操作してもらう*/
          }
        }else if( fdata < Lval ){                     /*ai001がL(20.0)以下の場合*/
          if( stat_do001 == 0 ){                      /*do001がOFFの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 1 );  /*do001のONをS1に送り操作してもらう*/
          }
        }else{                                        /*ai001がH(80.0)以下L(20.0)以上の場合*/
          if( stat_do001 == 1 ){                      /*do001がONの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 0 );  /*do001のOFFをS1に送り操作してもらう*/
          }
        }
        sleep( 1 );  /*必須:CPUを負荷らせない待ち時間*/
      }
  }
 

 
【 3. あるスイッチの状態みてリレーを操作 】
 
  例題) di001の状態がONの時do001もONさせ、OFFの時はOFFに連動させる。
  事例) 例えば遠方の異常接点を検知して身近にあるリレーを操作する。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int   objid_di001, objid_do001;
    int   stat_di001,  stat_do001;
      kcxinit( argc, argv );
      objid_di001 = kcxobj_open( "di001" );
      objid_do001 = kcxobj_open( "do001" );
      for(;;){
        kcxobj_stat_ird( objid_di001, &stat_di001 );   /*di001の状態取得*/ 
        kcxobj_stat_ird( objid_do001, &stat_do001 );   /*do001の状態取得*/
        if( stat_di001 == 0 ){                         /*di001がOFFの場合*/
          if( stat_do001 == 1 ){                       /*do001がONの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 0 );   /*do001のOFFをS1に送り操作してもらう*/
          }
        }else{                                         /*di001がONの場合*/ 
          if( stat_do001 == 0 ){                       /*do001がOFFの場合*/
            kcxobj_sndistat_tokcx( objid_do001, 1 );   /*do001のONをS1に送り操作してもらう*/
          }
        }
        sleep( 1 );  /*必須:CPUを負荷らせない待ち時間*/
      }
  }
 

 
【 4. 警報やロック状態みて操作を制御 】
 
  例題) do001を3秒毎にON/OFFさせる。但し、di001が警報あるいはdo001がロック時は実行停止。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int objid_di001, objid_do001;
    int switch_flag, control_flag;
    int idata1,idata2;
      kcxinit( argc, argv );
      objid_di001 = kcxobj_open( "di001" );
      objid_do001 = kcxobj_open( "do001" );
      switch_flag = 0;
      for(;;){
        kcxobj_alm_stat_ird( objid_di001, &idata1 );  /*警報状態値の読込*/
        kcxobj_lock_ird( objid_do001, &idata2 );      /*ロック状態値の読込*/
        if(( idata1 >= 1 )||( idata2 >= 1 )){
          control_flag = 1;     /*di001が警報あるいはdo001がロック時*/
        }else{
          control_flag = 0; 
        }
        if( switch_flag == 0 ){
          if( control_flag == 1 ){                     /*do001操作許可時*/
            kcxobj_sndistat_tokcx( objid_do001, 0 );   /*do001のOFFをS1に送り操作してもらう*/
          }
          switch_flag = 1;
        }else{ 
          if( control_flag == 1 ){                     /*do001操作許可時*/
            kcxobj_sndistat_tokcx( objid_do001, 1 );   /*do001のONをS1に送り操作してもらう*/
          }
          switch_flag = 0;
        }
        sleep( 3 );  /*待ち時間、かつCPUを負荷らせない為の待ち時間*/
      }
  }
 

 
【 5. スイッチの状態みて操作と警報の履歴を生成 】
 
  例題) di001のON/OFF時に操作履歴をdi001に、di002に警報履歴をテスト生成する。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int   objid_di001;
    int   objid_di002;
    int   stat_di001;
    int   save_di001;
    int   Ev_KEY, Ev_STAT;
    KcxIntFlt_t  udata10[10];
      kcxinit( argc, argv );
      objid_di001 = kcxobj_open( "di001" );
      objid_di002 = kcxobj_open( "di002" );
      kcxobj_stat_ird( objid_di001, &save_di001 );       /*di001の初期状態取得*/ 
      for(;;){
        kcxobj_stat_ird( objid_di001, &stat_di001 );     /*di001の状態取得*/ 
        if( stat_di001 == 0 ){                           /*di001が現在OFFの場合*/
          if( save_di001 == 1 ){                         /*di001が前回ONの場合*/
            save_di001 = 0;                              /*di001の状態記憶*/
            memset( (void *)udata10,0,sizeof(udata10) );   /*履歴メモリ作業前クリア*/
            /* OFF操作履歴生成 */
            Ev_KEY  = 10;                                /*例えば"状態"表示用識別子*/
            Ev_STAT =  0;                                /*例えば"OFF"表示用識別子 */
            kcxobj_ope_log_10uwt( objid_di001,Ev_KEY,Ev_STAT,udata10 ); 
            /* 警報解除履歴生成 */
            Ev_KEY  = 53;                                /*例えば"警報"表示用識別子*/
            Ev_STAT =  0;                                /*例えば"解除"表示用識別子*/
            kcxobj_alm_log_10uwt( objid_di002,Ev_KEY,Ev_STAT,udata10 ); 
          } 
        }else{                                           /*di001が現在ONの場合*/
          if( save_di001 == 0 ){                         /*di001が前回OFFの場合*/
            save_di001 = 1;                              /*di001の状態記憶*/
            memset( (void *)udata10,0,sizeof(udata10) );   /*履歴メモリ作業前クリア*/
            /* ON操作履歴生成 */
            Ev_KEY  = 10;                                /*例えば"状態"表示用識別子*/
            Ev_STAT =  1;                                /*例えば"ON"表示用識別子  */
            kcxobj_ope_log_10uwt( objid_di001,Ev_KEY,Ev_STAT,udata10 ); 
            /* 警報発生履歴生成 */
            Ev_KEY  = 53;                                /*例えば"警報"表示用識別子*/
            Ev_STAT =  1;                                /*例えば"発生"表示用識別子*/
            kcxobj_alm_log_10uwt( objid_di002,Ev_KEY,Ev_STAT,udata10 ); 
          } 
        }
        sleep( 1 );  /*必須:CPUを負荷らせない待ち時間*/
      }
  }
 

 
【 6. 監視画面に任意の数値や文字を刻々変化させて表示させる 】
 
  例題) 任意のカウント値を属性に設定し、監視画面に表示してもらう。
  事例) 例えば携帯やWEB画面に状況に応じた任意の情報を応用表示させる。
  #include <karacrix.h>
  main( argc, argv )
  int   argc;
  char *argv[];
  {
    int   objid_di001,objid_ai002,cnt;
    char  text[BUFSIZ];
      kcxinit( argc, argv );
      objid_di001 = kcxobj_open( "di001" );
      objid_ai002 = kcxobj_open( "ai002" );
      cnt = 0;
      for(;;){
        sprintf( text,"監視画面にメッセージ表示 CNT=%d",cnt++ );  /*文字データの生成*/
        kcxobj_atbut_cwt( objid_di001, 1, text );        /*di001の文字属性1にtext書込*/
        kcxobj_atbut_cwt( objid_ai002, 4, text );        /*ai002の文字属性4にtext書込*/
        kcxobj_atbut_iwt( objid_di001, 8, cnt  );        /*di001の整数属性8にcnt値書込*/
        kcxobj_atbut_fwt( objid_ai002, 3, (double)cnt );  /*ai002の実数属性3に実数化したcnt値書込*/
        sleep( 10 );   /*10秒毎にカウントアップ、かつCPUを負荷らせない為の待ち時間*/
      }
  }

 
 

HOME 戻る