USB接続デジタル入出力基板などの製品は、パソコンのアプリケーションソフトから、どのような速度で動作させることができるのでしょうか。このページでは、アプリケーションソフトから、デジタル入出力などを動作させる場合の速度目安を解説しています。弊社製品を使用したシステムのご検討に参考としていただければ幸いです。 以下に記載する内容は、弊社製品を使用した場合を前提としています。一般的なデジタル入出力動作に適合するものではありません。
弊社のUSBインターフェイス基板に使用しているUSBチップは、USB2.0およびUSB1.1のフルスピードモードで動作しています。フルスピードモードのデータ転送速度は、12Mbit/sec です。弊社のデジタル入出力製品 (DACS-1500など) は、9文字(9byte)のコマンドとレスポンスで動作します。9byteを12Mbit/secで転送する時間は、わずかに 8×9/12 = 6μs という計算になるのですが、アプリケーションプログラムからみた場合に、実際には、こんなに速く動作するわけではありません。マイクロ秒単位の時間は、全く関係なくなるほど、ミリ秒単位で、WindowsなどのOSサイドで動作する時間がかかります。
WindowsのUSBポーリング時間はおよそ1msです。すなわち、WindowsはUSBのデータ送受信を1msの周期で監視しています。アプリケーションプログラムから、FT_WRITE関数にてコマンドを送信すると、OSはこの1msの周期にて送信要求を検出してデータ送信を実行します。OSサイドの諸々の処理を含めると、おおよそ 2~3ms の時間にて、デジタル入出力基板にデータがわたることになります。
デジタル入出力基板がコマンドを受信してから、その応答として、レスポンスデータの送信を準備するまでの時間 (データを送信バッファにセットし終わるまでの時間) は、約5μsです。例えば、デジタル出力コマンドを受信し終わってから(文字列最後のCRコードを受信してから)、デジタル出力を実行し、デジタル入力状態を、レスポンスデータとして送信バッファにセットし終わるまでの時間がこれにあたります。続いてデータ転送に数μsがかかりますが、これらの時間よりも、先にご説明した WindowsのUSBポーリング時間およそ1msが大きく関与します。すなわち、アプリケーションプログラムで、FT_READ関数にてデータ受信を実行しても、このポーリング時間以上に速くデータを受信することはできません。
アプリケーションプログラムにて、FT_WRITE関数でデータを送信し、そのまま、FT_READ関数でデータ受信完了を待つという処理は、Windowsがマルチタスクで動作していることを考えると、決してほめられた処理ではありません。FT_WRITE関数で送信したあとは、いったん処理を解放して、タイマーイベントなどのイベント処理で、データを受信するのが一般的な方法です。このような処理を含めると、コマンド送信からレスポンス受信完了までの一連の動作(ハンドシェイク)には、10~20ms の時間がかかることになります。
例えば、デジタル出力のみを連続して実行し、デジタル入力の状態を読み取る必要がないような場合でも、デジタル入出力基板から送られてくるデジタル入力などのレスポンスを、その都度、きちんと読み取らなければ、いつかは受信バッファがオーバーフローしてしまいます。「起動してしばらくは動作するが、その後、アプリケーションソフトがハングアップしてしまう」というトラブルの多くは、この問題から生じています。
動作時間を短縮する方法としては、1回のFT_WRITE関数で送信するコマンド数を、複数にするのが効果的です。DACS-1500をはじめとする弊社のデジタル入出力基板などでは、コマンドの区切り文字が2種類あります。通常は、CR文字(ASCIIコード0dh)ですが、もう一つ、&文字(ASCIIコード26h)を用意しています。
コマンド送信とレスポンス受信を対としたデータ転送は、ハンドシェイク方式ともいわれていて、一般的なものです。ハンドシェイクではなく、送信か受信のどちらかを一方的に実行すれば、転送時間を格段に短縮することができます。
| |||||
|