目次へ  /  次へ

4章 簡易防犯システムの作成(基礎編)

センサとしてリードスイッチを使用した簡単な防犯システムを作ってみます。警報装置(アクチュエータ)としてブザーを使用しています。計測制御ユニットには、弊社のアナログデジタル計測制御ユニットKCXH-IOB30RTAを使用します。
本システムは、BI、BOオブジェクトの基本的な使用法を理解して頂くことが目的です。
 

4.1 システム設計

それでは、どのようなシステムにするか簡単に設計しましょう。まず、どのような機能を実現するか考えます。今回は、窓やドアが強制的に開けられた時に警報を音で知らせる簡単なものにしました。家の見取り図を作ってセンサの設置場所を検討します。
コンピュータへ接続するための配線経路も考えておきます。


    図4.1 簡易防犯システムの概要

 



4.2 センサ、アクチュエータの設置

リードスイッチは、DIYセンターなどで「防犯スイッチ」などの名称で手にいれることができます[写真4.1]。 リードスイッチは、磁石を離すとスイッチがONするON型と、磁石を離すとスイッチがOFFするOFF型が市販されていますが、今回はON型を使用して窓があいている時にスイッチがONになって検知するようにしています。 リードスイッチを、窓や扉に設置して配線を計測制御ユニットに接続します。

     
    写真4.1 防犯スイッチとブザー


    写真4.2 防犯スイッチの設置

警報装置としてDC12Vで動作するブザーを使用しています。KCXH-IOB30RTAのVdd電源端子から(ACアダプタから直通の)出力電源を供給しています。
ブザーのON/OFFはデジタル出力(BOオブジェクト)として扱います。ブザーの消費電流が12Vで約20mAですので、KCXH-IOB30RTAの内部電源とフォトMOSリレー接点出力(120mA)で直接ドライブできます。
端子台のDOUT1、Vdd、D-GND(グランド)端子を図4.2のように接続して下さい。
「防犯スイッチ」のON/OFF状態は、デジタル入力(BIオブジェクト)として扱います。端子台のDIN1〜DIN4に接続して下さい。


    写真4.4 計測制御ユニットの配線


    図4.2 配線図



4.3 オブジェクト登録
 

KARACRIXでは、センサやアクチュエータなどの情報を入出力する機器をオブジェクトと呼んでシステム上で抽象化しています。ここでは、「防犯スイッチ」「ブザー」をオブジェクトとして扱います。
今回は、防犯スイッチ 4個、ブザー1個を使用してシステムを構築します。各オブジェクトには名前をつけて整理しておきます。また、これらのオブジェクトの種類も分類しておきます。

    機器
    ID名
    オブジェクト名
    オブジェクト型
    防犯スイッチ1 Bi01 玄関ドア BI(バイナリ入力)
    防犯スイッチ2 Bi02 居間窓 BI(バイナリ入力)
    防犯スイッチ3 Bi03 和室窓 BI(バイナリ入力)
    防犯スイッチ4 Bi04 寝室窓 BI(バイナリ入力)
    ブザー Bo01 防犯ブザー BO(バイナリ出力)

以上のように分類できたら、オブジェクト登録を行います。
「メインメニュー」から“SYSENV”ボタンを選択して「システム環境メニュー」画面を表示して、“オブジェクト登録”ボタンを選して下さい[図4.3]。
BIオブジェクトは、bi01、bi02などのID名で初期設定されています。
先程分類した「防犯スイッチ」を bi01〜bi04 に割り当てます。図4.3のようにオブジェクト名を変更します。フォーマットは、監視パネル上で表示される“文字表現形式”で、変更可能ですがここではデフォルトのままで使用します。


    図4.3 BIオブジェクトの登録

BOオブジェクトは、bo01、bo02などのID名で設定されています。
「ブザー」を bo01 に割り当てます[図4.4]。


    図4.4 BOオブジェクトの登録

以上で、登録は終了です。
 

ここで、以上の設定をシステムに反映させるために、「オブジェクト登録」画面で“END”ボタンを選択して「メインメニュー」へ戻り、KARACRIXコンソールの “RST”ボタンを選択してKARACRIXをリセットさせて下さい。しばらくするとKARACRIXが自動的に再起動されます。


    図4.5 KARACRIXの終了と再実行でオブジェクトデータベースを更新
    (上記メインメニュー画面は、KaracrixBuilderPro-500R)



4.4 パネルの作成
 

監視パネルは、遠方にある監視制御対象をパソコン画面上に線画やイメージで表現して対応させるものです。画面上で制御対象を遠方操作したり、監視対象の状況を知ることができます。つまり、実際の監視制御対象の相似型をパソコン画面上に作成することになります。でも、現実をそっくり表現する必要はありません、要は監視制御をする あなたが十分理解できる表現で作成すればよいわけです。現実を精密に再現するよりも、デフォルメした方が理解しやすい場合も多いはずです。以上のようなことを頭に入れて、監視パネルの下絵を作成しておきます。


    図4.6 ラフスケッチを描く

それでは、下絵に基づいての監視パネルを作成しましょう。「メインメニュー」から“監視/手動操作”ボタンを選択して「監視パネルメニュー」の空いている欄に画面名称を登録して 「監視パネル」を呼び出し、「監視パネルCAD」を起動します。

     
    図4.7 監視パネルの登録

     


    図4.8 監視パネルCADの起動


●住宅平面図を描く

[静部品A]-[連続線] を選択して敷地境界の塀を描きます[図4.9] 。表示された線は、[静環境]-[線] で設定されている属性で表示されます。 もうすこし、太い線で表現するために [編集]-[変更] を選択して描画された線の属性を変更しましょう。
色の属性も変えてみました[図4.10]


    図4.9 敷地境界を作図

     


    図4.10 線属性の変更

次に、住宅の各部屋を描きましょう。[静部品A]-[四角形] を選択して下さい。グリッドに丸めて書くと四角形をきれいに並べて書くことが出来ますので、[丸め]ボタンを選択しておきます。四角形を使って各部屋を描画します[図4.11]。
玄関の扉は、[静部品A]-[円弧] と [静部品A]-[直線] を組み合わせて描画します [図4.12]。

     
    図4.11 各部屋の作図

     


    図4.12 扉の作図

ガレージは、[静部品A]-[多角形]で描画したのちに、[編集]-[変更]で "塗りつぶし属性情報" をパターンに変更して "煉瓦パターン" らしく表現しています[図4.13]。
植栽は、サンプルで登録されているビットマップ部品を使用して描いています。[静部品B]-[BITMAP]を選択して、植栽のビットマップ部品を選択します[図4.14]。
部屋名称は、[静部品B]-[文字] で描画します[図4.15]。

     
    図4.13 ガレージの作図

     


    図4.14 植栽の作図

     
    図4.15 名称を入れる

     


    図4.16 背景図の完成

背景としての住宅平面図が作成できましたら、一度“ENT”ボタンを選択して保存すると共に、監視パネルで表示されるか確認しておきます[図4.16,図4.17]。
監視パネルで表示されることが確認できたら、再度“監視パネルCAD”ボタンを選択して下さい。


    図4.17 監視パネルで表示を確認


●オブジェクト部品の設定

背景の住宅平面図が完成しましたら、その上に センサ、アクチュエータを表現する動部品を設定してゆきます。
下絵にある窓や扉は、センサを設置してある場所ですから動部品を設定します。 まず玄関の扉を“動部品”の“直線”で設定しましょう。“直線”部品は、スイッチの状態がON/OFFで切り替わる時に色の変化で状態を表現する部品です。 [動部品B]-[直線] を選択して下さい。
“OBJECT名”を選択して「オブジェクト選択」プルダウンメニューからオブジェクトIDを選択します。「オブジェクト登録」で登録した名称を選択します[図4.18]。“始点位置”、“終点位置”、“線幅”、“カラー”を設定します[図4.19]。

     
    図4.18 オブジェクトIDの選択

     


    図4.19 直線動部品の設定

さらに、文字を使って扉の開閉状況を表示する“文字”部品を使ってみましょう。“文字”部品は、スイッチの状態がON/OFFで切り替わる時に表示文字列の変化で状態を表現する部品です。[動部品A]-[文字]を選択して下さい。

     
    図4.20 フォントの選択

     


    図4.21 文字動部品の設定

“オブジェクト登録”、“表示位置”、“カラー”は、“直線”部品と同様です。
“背景”は、文字の背景を表示するかどうかを決めるものです。
“フォント”は、X11ドットフォント固定になっており変更できません。
“サイズ”は、X11フォントで標準で内蔵されている日本語フォントのサイズから選択できます[図4.20,図4.21]。
同様にして、すべてのオブジェクトを設定して下さい[図4.22]。


    図4.22 すべての動部品を設定したところ

動部品の設定ができましたら、“ENT”ボタンを選択して保存すると共に、「監視パネル」で表示されるか確認します[図4.23]。 登録部品が図の様に表示されていれば完成です。


    図4.23 完成した監視パネル



4.5 監視パネルを使う
 

それでは、監視パネルで機器の状態をモニタしてみましょう。センサ、アクチュエータと制御ユニットの配線を確認して下さい。 また、パソコンの計測制御ユニットがネットワーク接続されている事も確認します。
次に、「メインメニュー」から“制御プログラム”ボタンを選択して「制御プログラム登録」画面から“計測制御通信プログラム(KCXH-IOB30RTA用)”を実行して下さい。“END” ボタンで「メインメニュー」に戻ります。
次に、「メインメニュー」から“監視/手動操作”ボタンを選択して「監視パネルメニュー」から作成した監視パネルを表示して下さい。監視パネルで、玄関ドアに設定した“文字”動部品を選択してみましょう。図4.24のように状態表示ダイアログが表示されます。
状態表示ダイアログには、“オブジェクト名”、“ID名”、“現在の状態”、“設定値”の情報が表示されます[図4.25]。

     
    図4.24 防犯スイッチの状態表示

     


    図4.25 状態表示ダイアログ

次に、“防犯ブザー”を選択してみましょう。操作ダイアログが表示されます[図4.26]。 ここで、“現在の状態”が“OFF”になっている場合、“ON”ボタンを押してみます。ブザーへ電源が供給されて警報が鳴れば成功です。正常に動作しています。

     
    図4.26 ブザーのリモート操作

     


    図4.27 操作ダイアログ

ドアの開閉をしてみて下さい。監視パネルの玄関ドアに設定した“直線”動部品に色変化がおきますか? “文字”動部品の表示が“ON”、“OFF”と変化すればOKです。この状態で、ドアや窓の開閉状態は、監視することが出来るようになりました。
しかし、いつも画面をながめているわけにはいきません。 侵入者が窓を開けたりドアを開けたときに、自動的に警報を通知してくれるようでないと意味がありません。そこで、次の節で自動監視プログラムを作成してみましょう。

 



4.6 監視制御プログラムの作成


    図4.28 フロー図

それでは、フロー図をもとにプログラミングをしてみましょう。 「メインメニュー」から “制御プログラム”ボタンを選択して「制御プログラム登録」画面を表示して下さい。
未登録行にプログラム名称を登録して“プログラム編集”欄を選択してプログラムエディタを起動して下さい。 プログラムテンプレートが表示されます。

     
    図4.29 制御プログラム登録

     


    図4.30 プログラム編集画面

 
KARCRIXでのプログラム作成の基本的な手順は、次の様になります。

1.プログラム初期化処理
2.使用するオブジェクトのオープン
3.ユーザーアルゴリズムの記述

では,順番に記述していきましょう。
 

1.プログラム初期化処理

kcxinit()関数は、KARACRIXライブラリの初期化を行います。
KARACRIXでプログラムを作成する時には、main()関数の先頭で必ずコールする必要があります。

  1
  2  #include 
  3
  4  main( argc, argv )
  5  int    argc;
  6  char  *argv[]; 
  7  {
  8
  9      /* KARCRIXライブラリの初期化(先頭に必須) */
 10      kcxinit( argc, argv );
 11
 12  }

2.使用するオブジェクトのオープン

次に、kcxobj_open()関数でパネルに配置したオブジェクトのID名から、KARCRIXライブラリ関数で使用するオブジェクトID番号を取得します。 また、各種変数の宣言を先頭で行います。 テンプレートにプログラムを追加していきましょう。
4行目に、防犯スイッチの数を定義しておきます。
11-17行目で、変数の宣言をしています。
24-28行目で、計測制御ユニットに接続されている、センサとアクチュエータのオブジェクトID番号を取得しています。 KARACRIXライブラリでは、このオブジェクトID番号を使用してオブジェクトの指定を記述していきます。

  1
  2  #include 
  3
  4  #define  SWOBJECTs   (4)   /* スイッチ4つを格納する配列の定義 */
  5
  6  main( argc, argv )
  7  int    argc;
  8  char  *argv[]; 
  9  {
 10
 11    int   i;
 12    int   idata;                   /* 整数値を格納するバッファメモリ */
 13    int   bz_flag;		      /* ブザーを鳴らすかどうかのフラグ */
 14    int   bz_objid;		      /* ブザーのオブジェクトID         */
 15    int   sw_objid   [SWOBJECTs];  /* スイッチのオブジェクトID       */
 16    int   sw_crntdata[SWOBJECTs];  /* スイッチの現在の状態を格納     */
 17    int   sw_savedata[SWOBJECTs];  /* スイッチの前回の状態を格納     */
 18
 19
 20      /* KARCRIXライブラリの初期化(先頭に必須) */
 21      kcxinit( argc, argv );
 22
 23      /* オブジェクトIDの取得 */
 24      sw_objid[0] = kcxobj_open( "bi01" );   /* 防犯スイッチ1 */
 25      sw_objid[1] = kcxobj_open( "bi02" );   /* 防犯スイッチ2 */
 26      sw_objid[2] = kcxobj_open( "bi03" );   /* 防犯スイッチ3 */
 27      sw_objid[3] = kcxobj_open( "bi04" );   /* 防犯スイッチ4 */
 28      bz_objid    = kcxobj_open( "bo01" );   /* ブザー        */
 29

[ライブラリ関数]

kcxobj_open() 関数 ... オブジェクトID名からオブジェクトID番号を取得

1) kcxobj_open( obj_name )
   char *obj_name  .....  オブジェクト名テキスト

3.ユーザーアルゴリズムの記述

33-72行目で、防犯システムのアルゴリズムの記述をしています。
kcxobj_stat_ird() 関数で、防犯スイッチの状態値を全て取得し、いずれかの値が(1)[ON状態]ならば 64行目の kcxobj_sndistat_tokcx() 関数で、ブザーへON信号(1)を出力します。
69行目で、sleep()(システム関数)が登場していますが、CPUタイムを独占しないように他プロセスへ制御を渡すためです。 ここでは、1秒間休止させています。

 30
 31      /* 初期設定 */
 32      /* 防犯スイッチの状態を検定する為の初期状態を取得しておく */
 33      for( i = 0; i < SWOBJECTs; i++ ){
 34        kcxobj_stat_ird( sw_objid[i], &idata );
 35        sw_savedata[i] = idata;
 36      }
 37
 38
 39      /* 防犯スイッチ1〜4の状態を毎秒(下記sleep(1)関数)監視する永久ループ */
 40      while( 1 ){
 41
 42        /* 防犯スイッチ1〜4の現在の状態を取得 */
 43        for( i = 0; i < SWOBJECTs; i++ ){
 44	     kcxobj_stat_ird( sw_objid[i], &sw_crntdata[i] );
 45        }
 46
 47        /* 防犯スイッチ1〜4のどこかで、ONになった時に限り        */
 48        /* つまり、前回の状態が0で、かつ現状態が1になった時に限り */
 49        /* ブザーフラグをONとする                                 */
 50
 51        bz_flag =  0;
 52
 53        for( i = 0; i < SWOBJECTs; i++ ){
 54          if( ( sw_crntdata[i] == (1) ) && 
 55             ( sw_savedata[i] == (0) ) ){
 56	       bz_flag =  1; 
 57	     }
 58          sw_savedata[i] =  sw_crntdata[i];
 59        }
 60
 61        if( bz_flag == 1 ){
 62          /* bz_objidをONにする為にI/O通信プログラムにデータを送る(スタック) */
 63          /* ※自動的にOFFを行なわせたい場合には、何か工夫してください       */
 64          kcxobj_sndistat_tokcx( bz_objid, (1) );
 65        }
 66
 67        /* CPUを(このプログラムだけで独占(負荷)させない為に)1秒停止させる  */
 68        /* ※sleep関数に出会うとCPUは次の待ちプロセスに実行を移して行きます */
 69        sleep( 1 );
 70
 71
 72     }/*(while)*/
 73
 74
 75 }/*(main)*/

[ライブラリ関数]

kcxobj_stat_ird()       関数 ..... オブジェクトの状態値を取得
kcxobj_sndistat_tokcx() 関数 ..... オブジェクトへ設定値を出力為のスタック操作

3) kcxobj_stat_ird( objid, data )
   int objid;  .....  オブジェクトID
   int *data;  .....  オブジェクトの状態値

4) kcxobj_sndistat_tokcx( objid, data )
   int objid;  .....  オブジェクトID
   int data;   .....  オブジェクトへの設定値

以上でプログラムが完成しました。



4.7 監視制御プログラムのコンパイル、デバック
 

作成したプログラムをコンパイルしてみましょう。“コンパイル”ボタンをクリックして下さい。コンパイル状況画面が表示されます。


    図4.31 コンパイル状況画面

プログラムが、文法的に正しく記述してあれば、コンパイルが終了すると編集画面の生成状態インジケータが赤く点灯します。もし、プログラムに文法的な間違いがあれば、次のようにメッセージが表示されます。


    図4.32 コンパイルエラー状況画面

エラー行番号が表示されるなど何らかの手がかりが表示されますので、「プログラム編集」画面で修正して、再びコンパイルボタンでコンパイルを実行します。エラーメッセージが表示されなくなるまで頑張ります。 メッセージを表示しているのは、OS付属の標準Cコンパイラです。 なお、当然ですがC言語の文法エラー以外の、アルゴリズムのエラーは見つけられません。



4.8 監視制御プログラムの実行
 

文法的に正しいプログラムが作成され、コンパイルも正常に終了して、実行ファイルが作成できたら、いよいよ実行してみます。「制御プログラム登録」画面に戻って下さい。

●プログラムを実行する

簡易防犯システムプログラムを実行する前に、計測制御通信プログラムが実行されていることを確認します。実行されていないときは、実行しておきます。
簡易防犯システムプログラムの“実行”欄をクリックすると、実行ダイアログが表示されますので”YES(実行)”ボタンを選択します[図4.33]。


    図4.33 ユーザープログラムの実行

この状態で、窓の開閉などを行って見てください。 連動してブザーが鳴ればアルゴリズムの通りにうまく動いています。
ここで作成したプログラムでは、防犯スイッチ1〜4のどれか一つがONになって、一度ブザーが警報を知らせたら鳴りっぱなしになるもっとも簡単なアルゴリズムを使っていますが、防犯スイッチ別に音の違うブザーにしたり、ブザー音の発音間隔を変えたりと、色々と発展させることができると思います。
 



リスト4.1 簡易防犯システムプログラムリスト
  1
  2  #include 
  3
  4  #define  SWOBJECTs   (4)   /* スイッチ4つを格納する配列の定義 */
  5
  6  main( argc, argv )
  7  int    argc;
  8  char  *argv[]; 
  9  {
 10
 11    int   i;
 12    int   idata;                   /* 整数値を格納するバッファメモリ */
 13    int   bz_flag;		      /* ブザーを鳴らすかどうかのフラグ */
 14    int   bz_objid;		      /* ブザーのオブジェクトID         */
 15    int   sw_objid   [SWOBJECTs];  /* スイッチのオブジェクトID       */
 16    int   sw_crntdata[SWOBJECTs];  /* スイッチの現在の状態を格納     */
 17    int   sw_savedata[SWOBJECTs];  /* スイッチの前回の状態を格納     */
 18
 19
 20      /* KARCRIXライブラリの初期化(先頭に必須) */
 21      kcxinit( argc, argv );
 22
 23      /* オブジェクトIDの取得 */
 24      sw_objid[0] = kcxobj_open( "bi01" );  /* 防犯スイッチ1 */
 25      sw_objid[1] = kcxobj_open( "bi02" );  /* 防犯スイッチ2 */
 26      sw_objid[2] = kcxobj_open( "bi03" );  /* 防犯スイッチ3 */
 27      sw_objid[3] = kcxobj_open( "bi04" );  /* 防犯スイッチ4 */
 28      bz_objid    = kcxobj_open( "bo01" );  /* ブザー        */
 29
 30
 31      /* 初期設定 */
 32      /* 防犯スイッチの状態を検定する為の初期状態を取得しておく */
 33      for( i = 0; i < SWOBJECTs; i++ ){
 34        kcxobj_stat_ird( sw_objid[i], &idata );
 35        sw_savedata[i] = idata;
 36      }
 37
 38
 39      /* 防犯スイッチ1〜4の状態を毎秒(下記sleep(1)関数)監視する永久ループ */
 40      while( 1 ){
 41
 42        /* 防犯スイッチ1〜4の現在の状態を取得 */
 43        for( i = 0; i < SWOBJECTs; i++ ){
 44	     kcxobj_stat_ird( sw_objid[i], &sw_crntdata[i] );
 45        }
 46
 47        /* 防犯スイッチ1〜4のどこかで、ONになった時に限り         */
 48        /* つまり、前回の状態が0で、かつ現状態が1になった時に限り */
 49        /* ブザーフラグをONとする                                 */
 50
 51        bz_flag =  0;
 52
 53        for( i = 0; i < SWOBJECTs; i++ ){
 54          if(( sw_crntdata[i] == (1) ) && 
 55              ( sw_savedata[i] == (0) ) ){
 56	       bz_flag =  1; 
 57	     }
 58          sw_savedata[i] =  sw_crntdata[i];
 59        }
 60
 61        if( bz_flag == 1 ){
 62          /* bz_objidをONにする為にI/O通信プログラムにデータを送る(スタック) */
 63          /* ※自動的にOFFを行なわせたい場合には、何か工夫してください       */
 64          kcxobj_sndistat_tokcx( bz_objid, (1) );
 65        }
 66
 67        /* CPUを(このプログラムだけで独占(負荷)させない為に)1秒停止させる  */
 68        /* ※sleep関数に出会うとCPUは次の待ちプロセスに実行を移して行きます */
 69        sleep( 1 );
 70
 71
 72     }/*(while)*/
 73
 74
 75 }/*(main)*/


目次へ  /  次へ

Copyright(C) All Rights Reserved. by S.I.Soubou,Inc.