Timer関数に関連して質問です;VBをCに変換してます。
Posted: 2007年1月31日(水) 20:54
C言語初心者です。どうか力を貸してください。
質問です。わかりやすく質問のところには◆マークがあります。
今、私はVisual Basicのコードで書かれたものをC言語に直してFPGAに実装することを目指しています。
そのコード内容には、10ms単位の細かいタイマーが必要です。
Visual Basicでは、それを可能にする細かいタイマー関数があるのですが、
◆C言語のtime()関数でも同様に可能なのでしょうか?
コード内容は、大雑把に言えば、5つある電磁弁を指定した割合で1秒を時間分割して、順々にそれぞれの開閉を制御するというものです。
電磁弁にはON/OFFの信号を送ることで開閉します。
わかりやすく例をあげて説明すると、電磁弁1、2、3、4、5を、
10% 15% 20% 15% 40%(合計は必ず100%)
の濃度ファイルで一秒を分割するとすると、
順に、
0.1s 0.15s 0.20s 0.15s 0.4s と一秒経過する中でそれぞれ順に電磁弁に送られる信号のスリープ時間が決まります。
◆C言語自体で無理ならば、FPGAにタイマーをハードウェアで作ってとりつけるしかないのでしょうか??
ここで、参考までに
Visual Basicのソースコードと、time()関数を使えると想定してC言語に書き換えたコードを載せておきます。
(一部を抜いているので関数や記号の宣言などが抜けてますがそこは気にしないでください)
ダメ出しでもなんでもかまわないので意見をお願いしますm(_ _)m
********Visual Basic*************
Dim TimeBeforeProcess As Long '処理を行う前の時間
Dim WaitingTime As Long '時間調整のためのプログラムの待ち時間
For i = 0 To intOdorCount - 1
If varConcentration(i) > 0 Then
TimeBeforeProcess = timeGetTime
/*timeGetTimeは現時刻を意味する*/
/*varConcentrationは濃度(%)(時間の割合)を表す*/
For j = 0 To intOdorCount - 1
OutBitNo = j
OutBuf = IIf(j = i, 1, 0)
If DioOutBit(lngHDrv, OutBitNo, OutBuf) <> 0 Then GoTo dbErrHandler
Next
/*制御信号をデバイスに送信する*/
If Not SendCtrlSignal Then GoTo dbErrHandler
WaitingTime = CLng(varConcentration(i) * 10) -(timeGetTime - TimeBeforeProcess)
/*濃度1%につき10msなので10をかけている*/
/*For文に入った時刻と現時刻との誤差を引いている*/
If WaitingTime > 0 Then Call Sleep(WaitingTime)
End If
Next
IOdorGeneration_GenerateOdor = True
Exit Function
dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
********C言語*************
(C言語に直しきれてないところもあります。そこはご教授ください。)
time_t TimeBeforeProcess; //処理を行う前の時間;
time_t WaitingTime; //時間調整のためのプログラムの待ち時間;
for(i=0;i<=intOdorCount - 1;i++){
if(varConcentration(i) > 0){
time(&TimeBeforeProcess);
/*TimeBeforeProcessに現時刻を格納?*/
for(j=0;j<=intOdorCount - 1;j++){
OutBitNo = j;
if(j=i) OutBuf=1;
else OutBuf=0;
If(DioOutBit(lngHDrv, OutBitNo, OutBuf) != 0) GoTo dbErrHandler;
/*どういじればいいのか分かりません;*/
}
/*制御信号をデバイスに送信する:/
if(Not SendCtrlSignal)GoTo dbErrHandler;
WaitingTime = CLng(varConcentration(i) * 10) - _
(timeGetTime - TimeBeforeProcess);
if(WaitingTime > 0) Call Sleep(WaitingTime);
}
}
IOdorGeneration_GenerateOdor = True
Exit Function
dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
*****************************
◆C言語にはVBのtimeGetTimeのような現時刻を表す便利なものはないですか?
◆なにか意見があればお願いします(><)
質問です。わかりやすく質問のところには◆マークがあります。
今、私はVisual Basicのコードで書かれたものをC言語に直してFPGAに実装することを目指しています。
そのコード内容には、10ms単位の細かいタイマーが必要です。
Visual Basicでは、それを可能にする細かいタイマー関数があるのですが、
◆C言語のtime()関数でも同様に可能なのでしょうか?
コード内容は、大雑把に言えば、5つある電磁弁を指定した割合で1秒を時間分割して、順々にそれぞれの開閉を制御するというものです。
電磁弁にはON/OFFの信号を送ることで開閉します。
わかりやすく例をあげて説明すると、電磁弁1、2、3、4、5を、
10% 15% 20% 15% 40%(合計は必ず100%)
の濃度ファイルで一秒を分割するとすると、
順に、
0.1s 0.15s 0.20s 0.15s 0.4s と一秒経過する中でそれぞれ順に電磁弁に送られる信号のスリープ時間が決まります。
◆C言語自体で無理ならば、FPGAにタイマーをハードウェアで作ってとりつけるしかないのでしょうか??
ここで、参考までに
Visual Basicのソースコードと、time()関数を使えると想定してC言語に書き換えたコードを載せておきます。
(一部を抜いているので関数や記号の宣言などが抜けてますがそこは気にしないでください)
ダメ出しでもなんでもかまわないので意見をお願いしますm(_ _)m
********Visual Basic*************
Dim TimeBeforeProcess As Long '処理を行う前の時間
Dim WaitingTime As Long '時間調整のためのプログラムの待ち時間
For i = 0 To intOdorCount - 1
If varConcentration(i) > 0 Then
TimeBeforeProcess = timeGetTime
/*timeGetTimeは現時刻を意味する*/
/*varConcentrationは濃度(%)(時間の割合)を表す*/
For j = 0 To intOdorCount - 1
OutBitNo = j
OutBuf = IIf(j = i, 1, 0)
If DioOutBit(lngHDrv, OutBitNo, OutBuf) <> 0 Then GoTo dbErrHandler
Next
/*制御信号をデバイスに送信する*/
If Not SendCtrlSignal Then GoTo dbErrHandler
WaitingTime = CLng(varConcentration(i) * 10) -(timeGetTime - TimeBeforeProcess)
/*濃度1%につき10msなので10をかけている*/
/*For文に入った時刻と現時刻との誤差を引いている*/
If WaitingTime > 0 Then Call Sleep(WaitingTime)
End If
Next
IOdorGeneration_GenerateOdor = True
Exit Function
dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
********C言語*************
(C言語に直しきれてないところもあります。そこはご教授ください。)
time_t TimeBeforeProcess; //処理を行う前の時間;
time_t WaitingTime; //時間調整のためのプログラムの待ち時間;
for(i=0;i<=intOdorCount - 1;i++){
if(varConcentration(i) > 0){
time(&TimeBeforeProcess);
/*TimeBeforeProcessに現時刻を格納?*/
for(j=0;j<=intOdorCount - 1;j++){
OutBitNo = j;
if(j=i) OutBuf=1;
else OutBuf=0;
If(DioOutBit(lngHDrv, OutBitNo, OutBuf) != 0) GoTo dbErrHandler;
/*どういじればいいのか分かりません;*/
}
/*制御信号をデバイスに送信する:/
if(Not SendCtrlSignal)GoTo dbErrHandler;
WaitingTime = CLng(varConcentration(i) * 10) - _
(timeGetTime - TimeBeforeProcess);
if(WaitingTime > 0) Call Sleep(WaitingTime);
}
}
IOdorGeneration_GenerateOdor = True
Exit Function
dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
*****************************
◆C言語にはVBのtimeGetTimeのような現時刻を表す便利なものはないですか?
◆なにか意見があればお願いします(><)