付録A INtime C 言語アプリケーションソースコードの一部抜粋 void inALL(DWORD BaseAddr, WORD* Inbuf) { Inbuf[0] = inhword(BaseAddr+(0*2)); Inbuf[1] = inhword(BaseAddr+(1*2)); Inbuf[3] = inhword(BaseAddr+(3*2)); Inbuf[4] = inhword(BaseAddr+(4*2)); } void outALL(DWORD BaseAddr, WORD* Outbuf) { outhword(BaseAddr+(5*2), Outbuf[5]); outhword(BaseAddr+(6*2), Outbuf[6]); outhword(BaseAddr+(7*2), Outbuf[7]); outhword(BaseAddr+(8*2), Outbuf[8]); } /*タイマスレッド------void TIME(timesem *TimeEve) { DWORD Dsta; while(1) { /*Phase1: スタートを待つ-----------------*/ WaitForRtSemaphore(TimeEve->S_Sem, 1, WAIT_FOREVER); /*Phase2: 時間のカウント & キャンセル受け入れ---------*/ Dsta = WaitForRtSemaphore(TimeEve->C_Sem, 1, 5000); if(Dsta != WAIT_FAILED) { //キャンセル発生 continue; /*Phase3: タイマ満了時の処理------else if(0x0001 == GetLastRtError()) { // タイマイベント送信 ReleaseRtSemaphore(TimeEve->Comp_Sem, 1); } } } /*メインロジック------void main(void) { /*タイマ処理を行うスレッド生成----------------------------------*/ TimeH0 = CreateRtThread(PRIO, TIME, 4096, &TimeEve[0]); while(1) { RtSleepEx(1); //1ms 周期 // (2) デバイスから情報読み込み inALL(BaseAddr, Inbuf); // (3) 単純コピー処理 Outbuf[5] = Inbuf[0]; Outbuf[6] = Inbuf[1]; p. 1 Outbuf[7] = Inbuf[3]; Outbuf[8] = Inbuf[4]; // (4) タイマ&カウンタ動作スイッチ取得 bit_Enable = Getrelay(Inbuf[2], 11); // (5) タイマ処理 for(i=0;i<5;i++) { bit_var = Getrelay(Inbuf[2], i); if(bit_var == 0x0001) // タイマ条件を満了 { // タイマスタート ReleaseRtSemaphore(TimeEve[i].S_Sem, 1); } } //(7) CH2 の 14 ビット目を、CH2 の 12 ビット目にコピー if(Getrelay(Inbuf[2],14)) Outbuf[2] |= 0x1000; else Outbuf[2] &= 0xEFFF; //(8) CH2 の 15 ビット目を、CH2 の 11 ビット目にコピー if(Getrelay(Inbuf[2],15)) Outbuf[2] |= 0x800; else Outbuf[2] &= 0xF7FF; //(9) CH10 ~ 13or16or20 の 1 ビット目(反転)をコピー for(i=10;i<=13;i++) { if( !Getrelay(Inbuf[i],0) ) Outbuf[i] = 0xFFFF; else Outbuf[i] = 0x0000; } // (11) デバイスに書き込み outALL(BaseAddr, Outbuf); p. 2
© Copyright 2024 ExpyDoc