langEnglish
ホーム > PCベースコントローラでのリアルタイム制御 > 3. Windowsアプリケーションとの連携
PCベースコントローラでのリアルタイム制御
3. Windowsアプリケーションとの連携


PCベースコントローラは、リアルタイム制御を行いながらWindowsシステムも動作しているため、サンプリングしたデータをHMIなどのWindowsアプリケーションから利用することができます。
シリアル通信やEthernet通信の他にも、OPC通信や共有メモリを介したデータの受け渡しが可能です。
PCベースコントローラでは、Windowsアプリケーションとリアルタイムアプリケーションを簡単に連携するために、以下の機能を提供しています。
  • INtimeのWindows用拡張APIライブラリ「NTX
  • 共有メモリI/Fコンポーネント「INpMac

NTXは、Windowsアプリケーションとリアルタイムアプリケーションのインターフェースとなるライブラリです。 WindowsスレッドがRTスレッドと通信及びデータ交換が可能になるようにWin32 APIに対してRTインターフェース拡張機能を提供します。
NTX
セマフォ、メールボックス、共有メモリ等さまざまなオブジェクトを利用した連携が可能です。
NTXを使用したWindowsアプリケーション(NTXアプリケーション)を開発するには、INtime開発環境が必要です。

INpMacは、Windowsアプリケーションから共有メモリを介して他アプリケーションとのデータ通信をサポートするWindowsコンポーネントです。
INpMac
INpMacを組み込んだWindowsアプリケーションは、同じPC上にある共有メモリにアクセスし、データの読み書きを行うことができます。
DLL とOCXを提供していますので、DLLを利用したアプリケーション(コンソールアプリケーション等)とOCXを利用したアプリケーション(.NETアプリケーション等)とで使用するコンポーネントを使い分けることができます。
(1) 共有メモリを使用したデータの受け渡し
memory
共有メモリを利用したメモリ間通信の場合、データの受け渡しは高速です。
リアルタイムアプリケーション側で共有メモリを作成しカタログ(名前付け)することで、別プロセスやWindowsアプリケーションからその共有メモリを検索・参照することが可能となります。
共有メモリをROOTプロセス以外のプロセス(カレントプロセス等)にカタログする場合は、そのプロセス自体をROOTプロセスにカタログする必要があります。

□■□■□■□■□■□■□■□  COFFEE BREAK  □■□■□■□■□■□■□■□
INpMacを使用して、INtimeアプリケーションがインクリメントする値をC#で作成した画面に表示する例です。
Win連携テスト

Windowsアプリケーション(C#) TestEXE.exe
  • プロジェクトの新規作成
    C#のWindowsフォームアプリケーションを作成し、TextBoxとButtonを1つずつ配置する。
  • API呼び出し定義
    C#からDLLの関数を呼び出す定義を記述する。
    今回は4バイトデータ読み込むので、lpDataはintの参照型として定義する。
    [DllImport("INpMacRt.dll")]
    extern static int INpMacRt_ReadMemory(
       String pProcName, String pName, int Offset
     , ref int lpData, int Buff_Size);
  • データの取得
    Buttonのクリックイベントに、共有メモリの先頭4バイトのデータを取得する処理を記述する。
    プロセス名 TestRTA
    共有メモリ名 TestMem
    private void button1_Click(...)
    {
      int iVal = 0;
      int iRet = INpMacRt_ReadMemory(
                       "TestRTA"  //プロセス名
                     , "TestMem"  //共有メモリ名
                     , 0          //オフセット
                     , ref iVal   //データ格納先
                     , 4);        //取得バイト数
      if (iRet > 0)
      {
        //取得したデータを画面に表示
        textBox1.Text = iVal.ToString("#,0");
      }
      else
      {
        //データ取得失敗
        textBox1.Text = "0x"+iRet.ToString("X8");
      }
    }
INtimeアプリケーション TestRTA.rta
  • プロジェクトの新規作成
    ウィザードを使用して、ポーリングスレッドと共有メモリを1つずつ作成する。
    ポーリングスレッド 周期 100ms
    共有メモリ カタログ名 TestMem
    メモリサイズ 4096 Bytes
    ウィザードを使用することで、カタログなどの必要な処理が自動的に作成される。
  • データの設定
    ポーリングスレッドに、共有メモリの先頭4バイトのデータをインクリメントする処理を記述する。
    /********************************************
    * FUNCTION:     Poll1
    * DESCRIPTION:
    *   ポーリングスレッド Poll1
    \\********************************************/
    void            Poll1(
        void*    param)
    {
        ...
        
        // 共有メモリの先頭4バイトを初期化
        ((DWORD*)gInit.pTestMem)[0] = 0;
        
        while (!gInit.bShutdown)
        {
            RtSleep(100);
            
            // データをインクリメント
            ((DWORD*)gInit.pTestMem)[0]++;
        }
    
        // 本スレッドの終了を通知
        gInit.htPoll1   = NULL_RTHANDLE;
    }
□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

< 1 2 3 4 >