/* 園芸-A10:【日照連動水やり制御プログラム2:データ設定及びLCD表示部】*/ /* 1.制御ボックス内のスイッチによりデータ設定モードに入り現場でLCD */ /* 表示を見ながらボリュームにて行う。 */ /* 2.各システム状態情報は、常時LCDに表示する。 */ /* 3.照度をメータに出力することによっておおよそのエネルギーを知る。 */ /* 履歴 */ /* v1.00 2011/11/11 : リリース */ /* 設計 */ /* ai001(状態[計測])= 現在温度(℃) */ /* ai002(状態[計測])= 現在湿度(%) */ /* ai003(状態[計測])= 現在照度出力(-) */ /* ai004(状態[計測])= ボリューム(-) */ /* ai001(実数属性1) = 目標温度(℃) */ /* ai002(整数属性1) = 現在照度(Lux) */ /* ai002(整数属性2) = 平均照度(KLux) */ /* ai002(整数属性3) = 次予想ON時間(秒) */ /* ai002(整数属性4) = ボリューム補正値(%) */ /* ai002(整数属性5) = 計算対象比率(%) */ /* ai002(整数属性6) = 現在基準照度(KLux) */ /* ai002(整数属性7) = 現在パターンON時間 */ /* ai002(整数属性8) = 時刻(0-23) */ /* di004(状態) = パターン1&2切替えSW) */ /* do002(操作) = リレー等 */ /* ao001(操作) = メータ出力 */ /* 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 AVRLUXs (600) /*平均(600秒)照度計算に使用 */ #define LCDIP "192.168.0.200" /*リモートIO装置のIPアドレス*/ int objid_di001; int objid_di002; int objid_di003; int objid_di004; int objid_di005; int objid_di006; int objid_do001; int objid_do002; int objid_do003; int objid_ai001; int objid_ai002; int objid_ai003; int objid_ai004; int objid_ao001; main( argc, argv ) int argc; char *argv[]; { struct tm *jikan; time_t ttime; int sockid; int i_lux100,avr_syoudo,heikin_syoudo; int i,k,sw2,sw3,i_volume,idata; int onsec,sec,hour; int save_sec1,save_sec2,save_sec3; int avr_lux[AVRLUXs]; int acr_lux_set_point; int r_onsec,r_kijyun_syoudo; double shitsudo,fdata; double haba,mokuhyou_H,mokuhyou_L,temp; double adval,save_adval,volt,lux100,hoseiritsu,f_volume; struct sockaddr_in sndaddr,rcvaddr; char lcdtext1L[64],lcdtext2L[64]; char lcdtext1a[32],lcdtext1b[32]; char lcdtext2a[32],lcdtext2b[32]; /*KARACRIX初期設定*/ kcxinit( argc, argv ); /*TK0040A通信の初期設定*/ karacrix_cominit( &sockid,&sndaddr,&rcvaddr ); /*オブジェクトIDの取得*/ objid_di001 = kcxobj_open( "di001" ); /*情報取得用*/ objid_di002 = kcxobj_open( "di002" ); /*情報取得用*/ objid_di003 = kcxobj_open( "di003" ); /*情報取得用*/ objid_di004 = kcxobj_open( "di004" ); /*情報取得用*/ objid_di005 = kcxobj_open( "di005" ); /*情報取得用*/ objid_di006 = kcxobj_open( "di006" ); /*情報取得用*/ objid_do001 = kcxobj_open( "do001" ); /*情報取得用*/ objid_do002 = kcxobj_open( "do002" ); /*情報取得用*/ objid_do003 = kcxobj_open( "do003" ); /*情報取得用*/ objid_ai001 = kcxobj_open( "ai001" ); /*温度センサ&情報表示用 */ objid_ai002 = kcxobj_open( "ai002" ); /*湿度センサ&情報表示用 */ objid_ai003 = kcxobj_open( "ai003" ); /*照度センサ*/ objid_ai004 = kcxobj_open( "ai004" ); /*ボリューム*/ objid_ao001 = kcxobj_open( "ao001" ); /*メータ*/ /*平均照度計算用メモリクリア*/ for(i=0;itm_hour; /*(0,1,2,23)*/ kcxobj_stat_ird( objid_di002, &sw2 ); /*ボリューム設定許可SW*/ if( sw2 == 1 ){ /* 1)設定許可SWがONの時/ボリューム値を下記設定値に代入する */ kcxobj_stat_frd( objid_ai004, &f_volume ); /*ボリューム値(0-100%)を得る*/ kcxobj_stat_ird( objid_di003, &sw3 ); /*ボリューム設定モードSW状態*/ if( sw3 == 1 ){ i_volume = 2 * (int)f_volume; if( i_volume < 0 ) i_volume = 0; if( i_volume > 200 ) i_volume = 200; kcxobj_atbut_iwt( objid_ai002, 4, i_volume ); /*ボリューム補正値書込*/ kcxobj_atbut_ird( objid_ai002, 2, &heikin_syoudo ); /*平均照度読み取り*/ onsec = control_sec( hour, heikin_syoudo, &r_onsec, &r_kijyun_syoudo ); /*LCD表示(照度補正値)*/ sprintf( lcdtext1L, "2.VolumeHosei" ); sprintf( lcdtext2L, "V=_%d_%_(onsec=%d)", i_volume, onsec ); karacrix_TK0040A_command_send( sockid,&sndaddr,&rcvaddr,lcdtext1L,lcdtext2L ); }else{ i_volume = (int)(f_volume + 0.5); /*四捨五入*/ if( i_volume < 0 ) i_volume = 0; if( i_volume > 100 ) i_volume = 100; mokuhyou_H = 50.0; /*目標温度上限値(ハードコーディング)*/ mokuhyou_L = 10.0; /*目標温度下限値(ハードコーディング)*/ haba = fabs( mokuhyou_H - mokuhyou_L ); temp = mokuhyou_L + ( haba * (double)i_volume * 0.01 ); /*目標温度計算*/ kcxobj_atbut_fwt( objid_ai001, 1, temp ); /*★目標温度の設定*/ /*LCD表示(目標温度)*/ strcpy ( lcdtext1L, "1.MokuhyoOndo" ); sprintf( lcdtext2L, "M=_%.2f_C", temp ); karacrix_TK0040A_command_send( sockid,&sndaddr,&rcvaddr,lcdtext1L,lcdtext2L ); } }else{ /* 2)設定許可SWがOFFの時/各計測データをLCDに表示する */ sec = jikan->tm_sec; /*(0,1,2,23)*/ if( save_sec1 != sec ){ /*1秒毎更新 */ kcxobj_stat_frd( objid_ai001, &temp ); /*現在温度取得*/ kcxobj_stat_frd( objid_ai002, &shitsudo ); /*現在湿度取得*/ sprintf( lcdtext1a, "T=_%.2fC__S=%.1f", temp, shitsudo ); strcat( lcdtext1a, "%" ); kcxobj_atbut_frd( objid_ai001, 1, &temp ); /*目標温度取得*/ sprintf( lcdtext2a, "M=_%.2fC", temp ); kcxobj_atbut_ird( objid_ai002, 1, &i_lux100 ); /*現在照度取得*/ sprintf( lcdtext1b, "L=_%dLux", i_lux100 ); /*LCD表示のためのデータ取得*/ kcxobj_atbut_ird( objid_ai002, 2, &heikin_syoudo ); /*平均照度取得*/ onsec = control_sec( hour, heikin_syoudo, &r_onsec, &r_kijyun_syoudo ); kcxobj_atbut_iwt( objid_ai002, 3, onsec ); /*予想操作時間書き込み*/ kcxobj_atbut_ird( objid_ai002, 4, &i_volume ); /*ボリューム補正値取得*/ sprintf( lcdtext2b, "V=_%d%_(onsec=%d)", i_volume, onsec ); /*通常LCD表示*/ strings_4to2_LCD( lcdtext1a,lcdtext1b,lcdtext1L, lcdtext2a,lcdtext2b,lcdtext2L ); karacrix_TK0040A_command_send( sockid,&sndaddr,&rcvaddr,lcdtext1L,lcdtext2L ); save_sec1 = sec; } } /* 以下は300msec毎に実行 */ kcxobj_stat_frd( objid_ai003, &adval ); /*照度センサの0-100%出力を得る*/ sec = jikan->tm_sec; /*(0,1,2,23)*/ if( save_sec2 != sec ){ /*1秒毎更新*/ if( save_adval != adval ){ /*同じ値は送信が負荷るのでキャンセル*/ kcxobj_sndfstat_tokcx( objid_ao001, adval ); /*照度出力をメータに出力*/ save_adval = adval; } save_sec2 = sec; } volt = 5.0 * ( adval * 0.01 ); /*ボルトに換算する */ lux100 = 10.0 * pow( 10.0, volt ); /*100Luxレンジ時:ルクスに変換 */ i_lux100 = (int)lux100; kcxobj_atbut_iwt( objid_ai002, 1, i_lux100 ); /*現在照度の書き込み*/ /*照度の平均*/ if( save_sec3 != sec ){ /*1秒毎更新*/ avr_lux[acr_lux_set_point++] = i_lux100; if( acr_lux_set_point >= AVRLUXs ) acr_lux_set_point = 0; for(i=k=0;iKLux*/ kcxobj_atbut_iwt( objid_ai002, 2, k ); /*平均照度書き込み(KLux)*/ save_sec3 = sec; } kcxobj_atbut_ird( objid_ai002, 4, &i_volume ); /*ボリューム補正値取得 */ hoseiritsu = 0.01 * (double)i_volume; /*補正値を0.0-2.0にする */ heikin_syoudo = hoseiritsu * (double)avr_syoudo * 0.001; /*平均照度算出 */ onsec = control_sec( hour, heikin_syoudo, &r_onsec, &r_kijyun_syoudo ); kcxobj_atbut_iwt( objid_ai002, 3, onsec ); /*次予想ON時間 */ kcxobj_atbut_iwt( objid_ai002, 6, r_kijyun_syoudo ); /*基準照度(KLux) */ kcxobj_atbut_iwt( objid_ai002, 7, r_onsec ); /*パターンON時間 */ kcxobj_atbut_iwt( objid_ai002, 8, hour ); /*時刻(0-23) */ kcxtim_msleep( 0, 30000 ); /*300msec*/ } } /*LCDに表示コマンドを送信する*/ karacrix_TK0040A_command_send( sockid,sndaddr,rcvaddr,lcdtext1,lcdtext2 ) int sockid; /* ソケットID */ struct sockaddr_in *sndaddr; /* 送信アドレス */ struct sockaddr_in *rcvaddr; /* 受信アドレス */ char lcdtext1[],lcdtext2[]; /* LCD表示文字列 */ { static int seqno = 0; char sndbuff[1024],rcvbuff[1024]; /*1.空文字列の変換処理*/ nullstrings_to_NULLCLEAR( lcdtext1 ); nullstrings_to_NULLCLEAR( lcdtext2 ); /*2.メッセージ1の文字列送信 [フレームID msg1-set ASCII文字列]*/ if( ++seqno > 9999 ) seqno = 1; /*通信シーケンス番号(0-9999)*/ sprintf( sndbuff, "%d msg1-set %s", seqno, lcdtext1 ); karacrix_sndrcv_com( sockid, sndaddr, rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff) ); /*3.メッセージ2の文字列送信 [フレームID msg2-set ASCII文字列]*/ if( ++seqno > 9999 ) seqno = 1; sprintf( sndbuff, "%d msg2-set %s", seqno, lcdtext2 ); karacrix_sndrcv_com( sockid, sndaddr, rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff) ); /*4.LCDページ制御コマンド送信 [フレームID lcdpage 表示番号 表示時間]*/ if( ++seqno > 9999 ) seqno = 1; sprintf( sndbuff, "%d lcdpage 100 0", seqno ); /*←コマンドリファレンス参照*/ karacrix_sndrcv_com( sockid, sndaddr, rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff) ); } /*ソケットインターフェイスの初期化*/ karacrix_cominit( sockid,sndaddr,rcvaddr ) int *sockid; /* ソケットID */ struct sockaddr_in *sndaddr; /* 送信アドレス */ struct sockaddr_in *rcvaddr; /* 受信アドレス */ { *sockid = socket( AF_INET, SOCK_DGRAM, 0 ); memset( (void *)sndaddr, 0, sizeof(struct sockaddr_in)); sndaddr->sin_family = AF_INET; sndaddr->sin_port = htons ( 20000 ); /* リモートIOのポート番号*/ sndaddr->sin_addr.s_addr = inet_addr( LCDIP ); /* ← リモートIOのIPアドレス*/ memset( (void *)rcvaddr, 0, sizeof(struct sockaddr_in)); rcvaddr->sin_family = AF_INET; rcvaddr->sin_addr.s_addr = htonl( INADDR_ANY ); rcvaddr->sin_port = htons( 40000 ); /* ← 二重設定に注意:自分(PC)のポート番号*/ bind( *sockid, (struct sockaddr *)rcvaddr, sizeof(struct sockaddr_in) ); } /* IPデータ送信し応答受けるプログラム(以下興味有る方はBSDソケットライブラリ参照) */ karacrix_sndrcv_com( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen ) int sockid; /* ソケットID */ struct sockaddr *sndaddr; /* 送信アドレス */ struct sockaddr *rcvaddr; /* 受信アドレス */ char sndbuff[]; /* 送信データバッファ */ int sndlen; /* 送信データ長 */ char rcvbuff[]; /* 受信データバッファ */ int rcvlen; /* 受信データバッファ長 */ { int len,retry; char snd_frameidname[1024]; char rcv_frameidname[1024]; sscanf( sndbuff, "%s", snd_frameidname ); for( retry = 0; retry < (5); retry ++ ){ rcv_frameidname[0] = (char)0; rcvbuff [0] = (char)0; len = karacrix_udp_com( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen ); if( len <= 0 ){ sleep( 1 ); continue; } rcvbuff[len] = (char)0; sscanf( rcvbuff, "%s", rcv_frameidname ); if( strcmp( snd_frameidname, rcv_frameidname ) == 0 ){ return len; /*正常終了*/ }else{ sleep( 1 ); continue; } } return (-1); /*失敗終了*/ } karacrix_udp_com( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen ) int sockid; struct sockaddr *sndaddr; struct sockaddr *rcvaddr; char sndbuff[]; int sndlen; char rcvbuff[]; int rcvlen; { int i,len,fds,addrlen; fd_set fdset; struct timeval tm; /*受信バッファクリア*/ for(i=0;i<100;i++){ fds = 1 + sockid; FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = tm.tv_usec = (0); if( select( fds,&fdset,(fd_set *)NULL,(fd_set *)NULL,&tm ) <= 0 ){ break; } addrlen = sizeof(struct sockaddr); (void)recvfrom( sockid,(void *)rcvbuff,rcvlen,0,rcvaddr,&addrlen ); } /* 送信チェック */ fds = 1 + sockid; FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = (1); tm.tv_usec = (0); if( select( fds,(fd_set *)NULL,&fdset,(fd_set *)NULL,&tm ) <= 0 ){ //perror("sendto-select"); return 0; } /* データ送信 */ addrlen = sizeof(struct sockaddr); (void)sendto( sockid,(void *)sndbuff,sndlen,0,sndaddr,addrlen ); /* 受信チェック */ FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = (20); /*要調整(ハング回避:無線LAN介入時等遅延可能性大の場合は30〜60)*/ tm.tv_usec = (0); if( select( fds,&fdset,(fd_set *)NULL,(fd_set *)NULL,&tm ) <= 0 ){ //perror("recvform-select"); return 0; } /* データ受信 */ if(( len = recvfrom( sockid,(void *)rcvbuff,rcvlen,0,rcvaddr,&addrlen )) < 0 ){ //perror("recvfrom-func"); return 0; } return len; /*受信データ長*/ } /*文字が無い時の対応*/ nullstrings_to_NULLCLEAR( text ) char text[]; { int i,len; len = strlen( text ); for(i=0;i 0 ){ for( i = len1a; i<(20); i++ ) lcdtext1L[i] = (char)'_'; lcdtext1L[i] = (char)0; strcat( lcdtext1L, lcdtext1b ); } if( len2b > 0 ){ for( i = len2a; i<(20); i++ ) lcdtext2L[i] = (char)'_'; lcdtext2L[i] = (char)0; strcat( lcdtext2L, lcdtext2b ); } } /*操作ON時間の取得*/ control_sec( int hour, int hikaku_lux, int *r_onsec, int *r_kijyun_syoudo ) { int sw,pattern_sec,next_hour; int volume_hosei; int keisann_hiritsu; int heikin_syoudo; int kijyun_syoudo; double sec1,sec2,v_hosei,k_hiritsu; static int on_sec; /*次の時刻のデータを取得する*/ next_hour = 1 + hour; if( next_hour >= 24 ) next_hour = 0; /*パターンスイッチを見る*/ kcxobj_stat_ird( objid_di004, &sw ); switch( next_hour ){ case 0: if(sw==0) kcxobj_atbut_ird( objid_di001, 1, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 1, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 1, &kijyun_syoudo ); break; case 1: if(sw==0) kcxobj_atbut_ird( objid_di001, 2, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 2, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 2, &kijyun_syoudo ); break; case 2: if(sw==0) kcxobj_atbut_ird( objid_di001, 3, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 3, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 3, &kijyun_syoudo ); break; case 3: if(sw==0) kcxobj_atbut_ird( objid_di001, 4, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 4, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 4, &kijyun_syoudo ); break; case 4: if(sw==0) kcxobj_atbut_ird( objid_di001, 5, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 5, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 5, &kijyun_syoudo ); break; case 5: if(sw==0) kcxobj_atbut_ird( objid_di001, 6, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 6, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 6, &kijyun_syoudo ); break; case 6: if(sw==0) kcxobj_atbut_ird( objid_di001, 7, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 7, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 7, &kijyun_syoudo ); break; case 7: if(sw==0) kcxobj_atbut_ird( objid_di001, 8, &pattern_sec ); else kcxobj_atbut_ird( objid_di004, 8, &pattern_sec ); kcxobj_atbut_ird( objid_do001, 8, &kijyun_syoudo ); break; case 8: if(sw==0) kcxobj_atbut_ird( objid_di002, 1, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 1, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 1, &kijyun_syoudo ); break; case 9: if(sw==0) kcxobj_atbut_ird( objid_di002, 2, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 2, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 2, &kijyun_syoudo ); break; case 10: if(sw==0) kcxobj_atbut_ird( objid_di002, 3, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 3, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 3, &kijyun_syoudo ); break; case 11: if(sw==0) kcxobj_atbut_ird( objid_di002, 4, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 4, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 4, &kijyun_syoudo ); break; case 12: if(sw==0) kcxobj_atbut_ird( objid_di002, 5, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 5, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 5, &kijyun_syoudo ); break; case 13: if(sw==0) kcxobj_atbut_ird( objid_di002, 6, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 6, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 6, &kijyun_syoudo ); break; case 14: if(sw==0) kcxobj_atbut_ird( objid_di002, 7, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 7, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 7, &kijyun_syoudo ); break; case 15: if(sw==0) kcxobj_atbut_ird( objid_di002, 8, &pattern_sec ); else kcxobj_atbut_ird( objid_di005, 8, &pattern_sec ); kcxobj_atbut_ird( objid_do002, 8, &kijyun_syoudo ); break; case 16: if(sw==0) kcxobj_atbut_ird( objid_di003, 1, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 1, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 1, &kijyun_syoudo ); break; case 17: if(sw==0) kcxobj_atbut_ird( objid_di003, 2, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 2, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 2, &kijyun_syoudo ); break; case 18: if(sw==0) kcxobj_atbut_ird( objid_di003, 3, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 3, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 3, &kijyun_syoudo ); break; case 19: if(sw==0) kcxobj_atbut_ird( objid_di003, 4, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 4, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 4, &kijyun_syoudo ); break; case 20: if(sw==0) kcxobj_atbut_ird( objid_di003, 5, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 5, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 5, &kijyun_syoudo ); break; case 21: if(sw==0) kcxobj_atbut_ird( objid_di003, 6, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 6, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 6, &kijyun_syoudo ); break; case 22: if(sw==0) kcxobj_atbut_ird( objid_di003, 7, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 7, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 7, &kijyun_syoudo ); break; case 23: if(sw==0) kcxobj_atbut_ird( objid_di003, 8, &pattern_sec ); else kcxobj_atbut_ird( objid_di006, 8, &pattern_sec ); kcxobj_atbut_ird( objid_do003, 8, &kijyun_syoudo ); break; } /*あり得ない値のチェック*/ if( pattern_sec < 0 ) pattern_sec = 0; if( pattern_sec > 3600 ) pattern_sec = 3600; if( kijyun_syoudo < 0 ) kijyun_syoudo = 0; if( kijyun_syoudo > 1000 ) kijyun_syoudo = 1000; 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 */ 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 ); } *r_onsec = pattern_sec; *r_kijyun_syoudo = kijyun_syoudo; return on_sec; } /* FILE_END */