UDP通信による日付の取得

2002/09/20-


■概要
UDP通信による簡単な例について説明します.ネットワークに接続しているPCから’y’,’m’,’d’をEPN-001へ送信し,それに対応したデータである「年」,「月」,「日」を返信します.このサンプルプログラムを動作させるには,Visual C++が必要です.


■必要なファイル
1.FPGA内部回路 ( VHDL ) ASB004_05.zip
2.USBにてASB-004を制御するプログラム ( VC ) EPN_USB01.zip
3.TCP/IP,UDP通信実験ソフト ( VC ) TcpUdp.zip

→ダウンロードページ


■動作の確認

まず,UDP通信にて文字を送るために,実験ソフトをダウンロードして起動してください.この送受信用のソフトは,同一のPCでなくてもかましません.UDPの[開始]ボタンを押します.


次に,ASB-004のFPGAをコンフィグレーションし,EPN_USB01を起動します.このソフトはDOSプログラムです.


次に,UDP通信にて上のウィンドウのようにyear(年)の'y'を送信します.受信用のDOS窓に受信(4)>>2002と表示されます.これは”2002”という4文字の文字列を受信したという意味です.続けて,’m’,’d’を送信します.2002/09/20という日付を得ることができました.非常に単純な動作ですが,FA装置の状態をポーリングしたり,監視などに応用できそうです.



■EPN側のプログラムの説明

このプログラムは,動作の理解を優先していますので,S1S60000にセットしたコマンドをセットし,正常処理されることを前提にしています.よって,ケーブルが切断するなどの予期せぬ障害には対応していません.printf文やデバッグによって,ステータスレジスタやフラグレジスタの変化を目視で確認することができます.次にmain関数について抜粋して説明します.

仮想COMポートを利用するための関数です.2,3番目の引数はボーレートとストップビット長です.これはUSB通信に仮想COMポートを利用するために使用します.第1引数はポート番号です.デバイスマネージャを確認して何番目か確認して下さい.ComRcvInitは受信用スレッドによって,受信したデータを待ち行列に格納します.表示をスムーズにするために,スレッドにしたものであり,実際にはスレッドにする必要はありません.

ComOpen( 3, 300, 1 );
ComRcvInit();

この関数は 0x16 0x1B 0x00 0x00 によって,物理的にS1S60000のリセット信号を ”Low” に下げ初期化します.
epn_reset();

ブート状態でなければ,初期化コマンドを送信し,初期化されるまで待ちます.
EpnInit();
コマンドのシーケンス番号は手動で与えてあります.

システムの端点をオープンします.ポート番号は固定です.
EpnSystemOpen("192.168.0.254", "255.255.255.0", "192.168.0.1", "192.168.0.2");

UDP0端点をオープンします.
EpnUdpOpen("192.168.0.2");


ここからが,メインの処理です.単純な処理であることがわかります.受信した先頭の文字rbuf[0]によって,年,月,日を送信しています.’e’によって,端点をクローズし,プログラムを終了します.

while( TRUE ) {

  nBytes = EpnUdpReceive(rbuf);

  if( nBytes > 0 )
    printf("受信(%d)>>%s\n", nBytes, rbuf); //確認用

  switch( rbuf[0] )
  {
    case 'y': EpnUdpSend( year ); break; // 年
    case 'm': EpnUdpSend( month ); break; // 月
    case 'd': EpnUdpSend( day ); break; // 日
    case 'e': EpnUdpClose();
          ComClose();
          exit(1); // 終了
  }
}

実際のアプリケーションには,改良が必要です.


受信すると次のように表示になります.データポートや受信した文字などを表示させています.リアルタイムにデータを表示させ,理解のお役に立ててください.



メールでのご質問はこちらへどうぞ

HDLのホームページへ