お世話になります。
DIOボードを使用してDELPHIとやり取りを行おうとしています。
WINDOWS APIの「WaitForSingleObject」を使ってDIOボードから出力があったか検知しています。
割り込み処理の仕組みがよくわかっていないのですが、入力する側に出力したかどうかの検知コマンドを書かないと出来ないのでしょうか?
また例えば「Application.ProcessMessages」を使って検知出来る方法など
ないでしょうか?
教えて下さい。
「グローバル変数の扱い方」と同じ質問者ですか?
回答者にお礼も言わず、「統一した答え」のつもりを無視したひとが
また質問してるんですね。
Windows では割り込みはハード的には処理できません。監視専用の
スレッドをつくって、定期的に見にいき、入出力があったらメインスレッドに
メッセージ投げて知らせる、ってことになると思います。
>「グローバル変数の扱い方」と同じ質問者ですか?
そうです。前回の質問でお礼を忘れていました。改めて感謝致します。
うんとさん、ありがとうございます。
やはり入力側で監視しないと出来そうもないのですか。
調べましたが出来る方法が見つかりませんでした。
出来ないという事でしょうか。
コールバック関数を調べてみてはいかがでしょう。
kominさん、ありがとうございます。
「コールバック関数」をネットで調べましたが、今ひとつ自分には、理解できません。わかりやすい説明があるといいのですが…泣
「コールバック関数」は、検知したあと知らせる方法の一つとして考えられますが、
割り込み検知には直接関係ありませんよ。
うんとさん、ありがとうございます。
うんとさんのアドバイス通り、監視専用のスレッドをつくって、定期的に見にいく方法が良いのではないかと思っています。ただ、監視専用のメインスレッドを常に見たいので、スレッドの優先順位を「tpTimeCritical」の最高
にしていますが、他のスレッドとの時間差でメインスレッドの監視に取りこぼしがあるかもしれません。スレッドの優先順位はおそらくハードウェア構成によっても変わると思いますし(ディアルコアのCPUなど)決定的な方法が
見つからない状況です。Windowsは色々な事が一度にできる分こうゆう時困ってしまいます。
どのようなボードをお使いか分かりませんが
例えばInterface社 http://www.interface.co.jp/ では割り込みも使用できるライブラリ等が無償で公開されています。
他でもまともなメーカのボードではライブラリが入手できると思いますが・・・
DIOボードではコマンド/出力関数を使ってデータ出力したとたんに,ボードの出力端子に新しいデータが出てきます.(FIFO搭載ボード等を除く) 一般的な機械制御等の用途なら遅延は無視できます.
入力ならともかく,出力に割り込みを使うというのは不可解なのですが.........
例えばさん、ありがとうございます。
ボードはInterface社のものです。ただ割り込み処理をwindows APIの
WaitForSingleObjectというものを使って処理するのですが、結局
この命令にこないと割り込みが入ったかわからないので、割り込み処理と
いうよりも待ち合わせ処理のようになってしまうのです…
無名さん、ありがとうございます。
<DIOボードではコマンド/出力関数を使ってデータ出力したとたんに,ボー<ドの出力端子に新しいデータが出てきます
例えば、連続してデータ出力をすると前のデータは保持できるのでしょうか?それとも上書きされてしまうのですか?
>WaitForSingleObjectというものを使って処理するのですが、結局
>この命令にこないと割り込みが入ったかわからないので、割り込み処理と
>いうよりも待ち合わせ処理のようになってしまうのです…
WaitForSingleObjectを使えとあるのならそれはThreadを使えということになると思いますが・・・
Thread側からメインにイベントを送れば良いのでは?
>例えば、連続してデータ出力をすると前のデータは保持できるのでしょうか?それとも上書きされてしまうのですか?
FIFOでなければ当然上書きされると思いますが・・・
何をしたいのかが判断しかねます。もう少し分かり易く書いていただけないでしょうか?
タイマーでずっと出力を監視するのはだめですか?
例えばさん、ありがとうございます。
DIOボードのデータ出力信号をPCで受け取ります。受け取った信号内容
によって関数処理をします。DIOボードからのデータ出力信号は基本的にいつくるかわからないので、関数処理をしている間にデータ出力信号がくる可能性があるのです。
deldelさん、ありがとうございます。
タイマーでずっと出力を監視すると関数処理が出来ないのです。
うんとさんのアドバイス通り、作成して完全な割り込みが出来ない以上DIO
ボードの出力の方を制御してもらう事になりました。
DelphiのThreadクラスの実用的な使い方が疑問に残ります…。
>DIOボードのデータ出力信号をPCで受け取ります。受け取った信号内容
>によって関数処理をします。DIOボードからのデータ出力信号は基本的にいつ
>くるかわからないので、関数処理をしている間にデータ出力信号がくる可能>性があるのです。
信号は一時記憶しておき、順番に処理すればいいのでは。
TSさん、ありがとうございます。
信号は一時記憶しておきたいのですが、方法がわかりません。
ThreadクラスでDIOボードからのデータ出力信号待ちの関数を作成して
そのクラスを最高の優先順位にしてテストプログラムを作ったのですが、
Threadクラスのこの機能自体、ハードに依存する部分が多くまた、WINDOWS
が管理している部分らしく、プログラムで操作する事ができなそうです。
もっと根本的に違う方法があればいいのですが…
DIOボードの事は無知なもので、問題がよく解りませんが
デジタル入出力ボードActiveXコントロールは使われませんか。
http://www.interface.co.jp/catalog/utility_soft/bpa0507/bpa0507.asp
またはどのドライバーソフトを使用したときの問題なのでしょうか。
http://www.interface.co.jp/catalog/soft/select_soft_win.asp
TSさん、ありがとうございます。
勘違いをしている気がしてきました。
基本的な事になってしまいますが、割り込み処理の実用的な使い方を知りたいです。(デモのThreadクラスを使ったサンプルは実用的な使い方ではない気がします)
・ActiveXコントロール、勉強しておきます。
ツイート | ![]() |