/* 園芸-A10:【日照連動水やり制御プログラム1:ON/OFF実行部】*/ /* 1.毎時0分時に処理する */ /* 2.データを取得し照度によりON時間を計算する */ /* 3.ON/OFF制御を操作対象に施す */ /* 履歴 */ /* v1.00 2011/11/11 : リリース */ /* 設計 */ /* di004(状態) = パターン1&2切替えSW) */ /* ai002(整数属性2) = 平均照度(KLux) */ /* do002(操作) = リレー等 */ /* di001(整数属性1-8) = パターン1,0-7時ON時間 */ /* di002(整数属性1-8) = パターン1,8-15時ON時間 */ /* di003(整数属性1-8) = パターン1,16-23時ON時間 */ /* di004(整数属性1-8) = パターン2,0-7時ON時間 */ /* di005(整数属性1-8) = パターン2,8-15時ON時間 */ /* di006(整数属性1-8) = パターン2,16-23時ON時間 */ /* do001(整数属性1-8) = 基準照度,0-7時データ */ /* do002(整数属性1-8) = 基準照度,8-15時データ */ /* do003(整数属性1-8) = 基準照度,16-23時データ */ #include #define PATTERN1 (0) #define PATTERN2 (1) typedef struct _a_ { int objid [3]; /* パターン1[0],パターン2[1],基準照度[2]の格納OBJID */ int atbut [3]; /* パターン1[0],パターン2[1],基準照度[2]の格納整数属性番号 */ int on_sec[2]; /* パターン1[0],パターン2[1]のON実行時間(秒) */ int kijyun_syoudo; /* 基準照度 */ } KcxTimeSX; KcxTimeSX pattern_time[24]; main( argc, argv ) int argc; char *argv[]; { int hour,sec,on_sec,pattern_sec,pattern_no,jyoutai; int heikin_syoudo; int kijyun_syoudo; int keisann_hiritsu; int volume_hosei; int crnt_hourmins,last_hourmins; double sec_kei1,sec2,sec1; double k_hiritsu,v_hosei; struct tm *jikan; time_t ttime; int objid_do002; int objid_di004; int objid_ai002; /* KARCRIX初期設定 */ kcxinit( argc, argv ); /* 使用するオブジェクトのオープン */ objid_do002 = kcxobj_open( "do002" ); objid_di004 = kcxobj_open( "di004" ); objid_ai002 = kcxobj_open( "ai002" ); /* パターンと基準照度に使用するオブジェクトの取得 */ /* 監視画面に動的変更は無いとして起動時に一回実行 */ initial_objid_get(); /* 保存時間の初期設定 */ last_hourmins = 0; /* 永久ループ */ for(;;){ /* 時間取得 */ sleep(1); /*負荷軽減必須 */ time( &ttime ); /*UNIX時間取得 */ jikan = localtime( &ttime ); /*ローカル時間化 */ if( jikan->tm_min != (0) ) continue; /*毎時0分(ON開始)以外はパス*/ crnt_hourmins = ( 24 * jikan->tm_hour ) + jikan->tm_min; if( crnt_hourmins == last_hourmins ) continue; /*2重実行パス */ last_hourmins = crnt_hourmins; hour = jikan->tm_hour; /*(0,1,2,23)*/ /* パターン1&2のON時間と基準照度をまとめて取得する */ /* 監視画面等でデータ変更考えられるので都度読み込み */ ontime_and_kijyunsyoudo_get(); kcxobj_stat_ird( objid_di004, &jyoutai ); /*パターン1&2切替えSWの状態*/ if( jyoutai == 1 ) pattern_no = PATTERN2; else pattern_no = PATTERN1; pattern_sec = pattern_time[hour].on_sec[pattern_no]; kcxobj_atbut_ird( objid_ai002, (4), &volume_hosei ); /*ボリューム補正値*/ if( volume_hosei < 0 ) volume_hosei = 0; if( volume_hosei > 200 ) volume_hosei = 200; v_hosei = 0.01 * (double)volume_hosei; /* 0〜200 → 0〜2.0 */ kijyun_syoudo = pattern_time[hour].kijyun_syoudo; /*基準照度(KLux)*/ if( kijyun_syoudo > 0 ){ /*照度による補正を行う場合*/ kcxobj_atbut_ird( objid_ai002, (2), &heikin_syoudo ); /*平均照度(KLux)*/ kcxobj_atbut_ird( objid_ai002, (5), &keisann_hiritsu ); /*計算対象比率*/ if( keisann_hiritsu < 0 ) keisann_hiritsu = 0; if( keisann_hiritsu > 100 ) keisann_hiritsu = 100; k_hiritsu = 0.01 * (double)keisann_hiritsu; /* 0〜100 → 0〜1.0 */ /*比率計算*/ sec1 = (double)pattern_sec * ( 1.0 - k_hiritsu ); sec2 = (double)pattern_sec * k_hiritsu * ( sqrt( (double)heikin_syoudo / (double)kijyun_syoudo )); on_sec = (int)( v_hosei * (sec1 + sec2) + 0.5 ); }else{ /*照度による補正を行なわない場合*/ on_sec = (int)( v_hosei * pattern_sec + 0.5 ); } /* ON/OFF操作を簡単にしている */ /* 本来は、ONがONになったか、I/Oを確認し場合によって再実行する必要がある */ /* このプログラムは、サンプルでもあり見易さを考慮しこの確認を省いている */ kcxobj_sndistat_tokcx( objid_do002, 1/*ON*/ ); sleep( on_sec ); kcxobj_sndistat_tokcx( objid_do002, 0/*OFF*/ ); } } ontime_and_kijyunsyoudo_get() { int i,idata,change; change = 0; for(i=0;i<24;i++){ kcxobj_atbut_ird( pattern_time[i].objid[0], pattern_time[i].atbut[0], &idata ); if( idata < 0 ) idata = 0; if( idata > 3600 ) idata = 3600; if( pattern_time[i].on_sec[0] != idata ) change = 1; pattern_time[i].on_sec[PATTERN1] = idata; /*パターン1のON時間設定*/ kcxobj_atbut_ird( pattern_time[i].objid[1], pattern_time[i].atbut[1], &idata ); if( idata < 0 ) idata = 0; if( idata > 3600 ) idata = 3600; if( pattern_time[i].on_sec[1] != idata ) change = 1; pattern_time[i].on_sec[PATTERN2] = idata; /*パターン2のON時間設定*/ kcxobj_atbut_ird( pattern_time[i].objid[2], pattern_time[i].atbut[2], &idata ); if( idata < 0 ) idata = 0; if( idata > 1000 ) idata = 1000; if( pattern_time[i].kijyun_syoudo != idata ) change = 1; pattern_time[i].kijyun_syoudo = idata; /*基準照度設定*/ } return change; } /*下記プログラムは監視画面の設計に合わせて設定されている*/ initial_objid_get() { /*パターン1*/ pattern_time[ 0].objid[0] = kcxobj_open( "di001" ); pattern_time[ 0].atbut[0] = 1; pattern_time[ 1].objid[0] = kcxobj_open( "di001" ); pattern_time[ 1].atbut[0] = 2; pattern_time[ 2].objid[0] = kcxobj_open( "di001" ); pattern_time[ 2].atbut[0] = 3; pattern_time[ 3].objid[0] = kcxobj_open( "di001" ); pattern_time[ 3].atbut[0] = 4; pattern_time[ 4].objid[0] = kcxobj_open( "di001" ); pattern_time[ 4].atbut[0] = 5; pattern_time[ 5].objid[0] = kcxobj_open( "di001" ); pattern_time[ 5].atbut[0] = 6; pattern_time[ 6].objid[0] = kcxobj_open( "di001" ); pattern_time[ 6].atbut[0] = 7; pattern_time[ 7].objid[0] = kcxobj_open( "di001" ); pattern_time[ 7].atbut[0] = 8; pattern_time[ 8].objid[0] = kcxobj_open( "di002" ); pattern_time[ 8].atbut[0] = 1; pattern_time[ 9].objid[0] = kcxobj_open( "di002" ); pattern_time[ 9].atbut[0] = 2; pattern_time[10].objid[0] = kcxobj_open( "di002" ); pattern_time[10].atbut[0] = 3; pattern_time[11].objid[0] = kcxobj_open( "di002" ); pattern_time[11].atbut[0] = 4; pattern_time[12].objid[0] = kcxobj_open( "di002" ); pattern_time[12].atbut[0] = 5; pattern_time[13].objid[0] = kcxobj_open( "di002" ); pattern_time[13].atbut[0] = 6; pattern_time[14].objid[0] = kcxobj_open( "di002" ); pattern_time[14].atbut[0] = 7; pattern_time[15].objid[0] = kcxobj_open( "di002" ); pattern_time[15].atbut[0] = 8; pattern_time[16].objid[0] = kcxobj_open( "di003" ); pattern_time[16].atbut[0] = 1; pattern_time[17].objid[0] = kcxobj_open( "di003" ); pattern_time[17].atbut[0] = 2; pattern_time[18].objid[0] = kcxobj_open( "di003" ); pattern_time[18].atbut[0] = 3; pattern_time[19].objid[0] = kcxobj_open( "di003" ); pattern_time[19].atbut[0] = 4; pattern_time[20].objid[0] = kcxobj_open( "di003" ); pattern_time[20].atbut[0] = 5; pattern_time[21].objid[0] = kcxobj_open( "di003" ); pattern_time[21].atbut[0] = 6; pattern_time[22].objid[0] = kcxobj_open( "di003" ); pattern_time[22].atbut[0] = 7; pattern_time[23].objid[0] = kcxobj_open( "di003" ); pattern_time[23].atbut[0] = 8; /*パターン2*/ pattern_time[ 0].objid[1] = kcxobj_open( "di004" ); pattern_time[ 0].atbut[1] = 1; pattern_time[ 1].objid[1] = kcxobj_open( "di004" ); pattern_time[ 1].atbut[1] = 2; pattern_time[ 2].objid[1] = kcxobj_open( "di004" ); pattern_time[ 2].atbut[1] = 3; pattern_time[ 3].objid[1] = kcxobj_open( "di004" ); pattern_time[ 3].atbut[1] = 4; pattern_time[ 4].objid[1] = kcxobj_open( "di004" ); pattern_time[ 4].atbut[1] = 5; pattern_time[ 5].objid[1] = kcxobj_open( "di004" ); pattern_time[ 5].atbut[1] = 6; pattern_time[ 6].objid[1] = kcxobj_open( "di004" ); pattern_time[ 6].atbut[1] = 7; pattern_time[ 7].objid[1] = kcxobj_open( "di004" ); pattern_time[ 7].atbut[1] = 8; pattern_time[ 8].objid[1] = kcxobj_open( "di005" ); pattern_time[ 8].atbut[1] = 1; pattern_time[ 9].objid[1] = kcxobj_open( "di005" ); pattern_time[ 9].atbut[1] = 2; pattern_time[10].objid[1] = kcxobj_open( "di005" ); pattern_time[10].atbut[1] = 3; pattern_time[11].objid[1] = kcxobj_open( "di005" ); pattern_time[11].atbut[1] = 4; pattern_time[12].objid[1] = kcxobj_open( "di005" ); pattern_time[12].atbut[1] = 5; pattern_time[13].objid[1] = kcxobj_open( "di005" ); pattern_time[13].atbut[1] = 6; pattern_time[14].objid[1] = kcxobj_open( "di005" ); pattern_time[14].atbut[1] = 7; pattern_time[15].objid[1] = kcxobj_open( "di005" ); pattern_time[15].atbut[1] = 8; pattern_time[16].objid[1] = kcxobj_open( "di006" ); pattern_time[16].atbut[1] = 1; pattern_time[17].objid[1] = kcxobj_open( "di006" ); pattern_time[17].atbut[1] = 2; pattern_time[18].objid[1] = kcxobj_open( "di006" ); pattern_time[18].atbut[1] = 3; pattern_time[19].objid[1] = kcxobj_open( "di006" ); pattern_time[19].atbut[1] = 4; pattern_time[20].objid[1] = kcxobj_open( "di006" ); pattern_time[20].atbut[1] = 5; pattern_time[21].objid[1] = kcxobj_open( "di006" ); pattern_time[21].atbut[1] = 6; pattern_time[22].objid[1] = kcxobj_open( "di006" ); pattern_time[22].atbut[1] = 7; pattern_time[23].objid[1] = kcxobj_open( "di006" ); pattern_time[23].atbut[1] = 8; /*基準照度*/ pattern_time[ 0].objid[2] = kcxobj_open( "do001" ); pattern_time[ 0].atbut[2] = 1; pattern_time[ 1].objid[2] = kcxobj_open( "do001" ); pattern_time[ 1].atbut[2] = 2; pattern_time[ 2].objid[2] = kcxobj_open( "do001" ); pattern_time[ 2].atbut[2] = 3; pattern_time[ 3].objid[2] = kcxobj_open( "do001" ); pattern_time[ 3].atbut[2] = 4; pattern_time[ 4].objid[2] = kcxobj_open( "do001" ); pattern_time[ 4].atbut[2] = 5; pattern_time[ 5].objid[2] = kcxobj_open( "do001" ); pattern_time[ 5].atbut[2] = 6; pattern_time[ 6].objid[2] = kcxobj_open( "do001" ); pattern_time[ 6].atbut[2] = 7; pattern_time[ 7].objid[2] = kcxobj_open( "do001" ); pattern_time[ 7].atbut[2] = 8; pattern_time[ 8].objid[2] = kcxobj_open( "do002" ); pattern_time[ 8].atbut[2] = 1; pattern_time[ 9].objid[2] = kcxobj_open( "do002" ); pattern_time[ 9].atbut[2] = 2; pattern_time[10].objid[2] = kcxobj_open( "do002" ); pattern_time[10].atbut[2] = 3; pattern_time[11].objid[2] = kcxobj_open( "do002" ); pattern_time[11].atbut[2] = 4; pattern_time[12].objid[2] = kcxobj_open( "do002" ); pattern_time[12].atbut[2] = 5; pattern_time[13].objid[2] = kcxobj_open( "do002" ); pattern_time[13].atbut[2] = 6; pattern_time[14].objid[2] = kcxobj_open( "do002" ); pattern_time[14].atbut[2] = 7; pattern_time[15].objid[2] = kcxobj_open( "do002" ); pattern_time[15].atbut[2] = 8; pattern_time[16].objid[2] = kcxobj_open( "do003" ); pattern_time[16].atbut[2] = 1; pattern_time[17].objid[2] = kcxobj_open( "do003" ); pattern_time[17].atbut[2] = 2; pattern_time[18].objid[2] = kcxobj_open( "do003" ); pattern_time[18].atbut[2] = 3; pattern_time[19].objid[2] = kcxobj_open( "do003" ); pattern_time[19].atbut[2] = 4; pattern_time[20].objid[2] = kcxobj_open( "do003" ); pattern_time[20].atbut[2] = 5; pattern_time[21].objid[2] = kcxobj_open( "do003" ); pattern_time[21].atbut[2] = 6; pattern_time[22].objid[2] = kcxobj_open( "do003" ); pattern_time[22].atbut[2] = 7; pattern_time[23].objid[2] = kcxobj_open( "do003" ); pattern_time[23].atbut[2] = 8; } /* FILE END */