4.共有レジスタ

4.1 概要

SPLCは、共有レジスタを介して他のアプリケーションと連携することができます。共有レジスタはメモリマップトファイルを使用しています。サンプルプログラムはVisual C++で作成しましたが、Win32APIを使用してVisual Basicや他の言語でも使用できます。

4.2 使用方法

SPLCは次の関数を使用してプロジェクト毎に2Kバイトのメモリマップトファイルを作成します。

  m_hFileMap = CreateFileMapping((HANDLE) 0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 2048,"splc_mmf" );

このメモリマップトファイルのファイル名は"splc_mmf"という固定な名前を使用します。このメモリマップトファイルを他のアプリケーションが共有する場合は、同じファイル名を使用する必要があります。アプリケーションは、次の関数にプロジェクト名を使用して、メモリマップトファイルをオープンします。(Ver1.10では、メモリマップトファイルのファイル名をプロジェクト名としましたが、Ver1.20では"splc_mmf"という固定な名前しました。)

  m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,FALSE, "splc_mmf" );

正常にオープンしたならば、次の関数でファイルをプロセスのアドレス空間にマッピングします。

  LPVOID lp = MapViewOfFile(m_hFileMap,FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

正常にポインタが取得できたなら、UINT型のポインタにキャストしてデータにアクセスします。

      UINT *puiTemp = (UINT *)lp;
      *( puiTemp + uiAdrs ) = uiData;   //書き込み
 または *uiData = *( puiTemp + uiAdrs );  //読込み

データのアクセスが終了したならば、マッピングの開放、ハンドルの開放をして処理を終了します。

    UnmapViewOfFile(lp);     //マッピングの開放
    CloseHandle(m_hFileMap);  //ハンドルの開放

共有レジスタは、全てUINT型(unsigned int)で次のように配置しています。

 UINTのアドレス  レジスタ番号 名称 点数
0〜0xFF CB00〜CBFF 共有ビットレジスタ 256点
0x100〜0x1FF CN00〜CNFF 共有データレジスタ 256点

次に、共有レジスタにアクセスする関数例を示します。

// 関数名 MmfWriteData
// 日本語名 共有メモリへ1データ書込
// 概要
//    CB,CNデータを共有メモリに1データ書き込みします
// パラメータ
//    UINT uiAdrs データのアドレス
//    UINT uiData データ
// 戻り値
//    BOOL TRUE : 成功
//         FALSE : 失敗
// 備考
BOOL Cmmf::MmfWriteData( UINT uiAdrs , UINT uiData )
{
  m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,FALSE, m_strFileName );
  if (m_hFileMap != NULL) {
    LPVOID lp = MapViewOfFile(m_hFileMap,FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    if (lp != NULL) {
      UINT *puiTemp = (UINT *)lp;
      *( puiTemp + uiAdrs ) = uiData;
      UnmapViewOfFile(lp);
    } else {
      CloseHandle(m_hFileMap);
      return FALSE;
    }
    CloseHandle(m_hFileMap);
  }
  return TRUE;
}

// 関数名 MmfReadData
// 日本語名 共有メモリから1データ読込
// 概要
//    共有メモリからCB,CNデータを1データ読み込みます
// パラメータ
//    UINT uiAdrs データのアドレス
//    UINT *uiData データのポインタ
// 戻り値
//    BOOL TRUE : 成功
//         FALSE : 失敗
// 備考
BOOL Cmmf::MmfReadData( UINT uiAdrs , UINT *uiData )
{
  m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,FALSE, m_strFileName );
  if (m_hFileMap != NULL) {
    LPVOID lp = MapViewOfFile(m_hFileMap,FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    if (lp != NULL) {
      UINT *puiTemp = (UINT *)lp;
      *uiData = *( puiTemp + uiAdrs );
      UnmapViewOfFile(lp);
    } else {
      TRACE("Can't map view of file.");
      CloseHandle(m_hFileMap);
      return FALSE;
    }
    CloseHandle(m_hFileMap);
  } else {
    return FALSE;
  }
  return TRUE;
}

4.3 サンプルプログラム

サンプルプログラムはsplctest.exeをクリックして起動します。このサンプルプログラムは次の機能があります。

機能 説明
接点読込み 接点番号を16進数で入力して、接点読込みボタンを押します。1、0が表示されます
接点書き込み 接点番号を16進数で入力して、ON、OFFボタンを押します。
データ読込み データ番号を16進数で入力して、データ読込みボタンを押します。データが16進で表示されます
データ書き込み データ番号とでデータを16進数で入力して、データ書き込みボタンを押します。

このサンプルプログラムは、サンプルラダーcb_sample.splに対応しています。SPLCでcb_sample.splを開いて、実行させます。
その後、サンプルプログラムを操作してください。概観を次に示します。



戻る