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;
}
サンプルプログラムはsplctest.exeをクリックして起動します。このサンプルプログラムは次の機能があります。
機能 | 説明 |
接点読込み | 接点番号を16進数で入力して、接点読込みボタンを押します。1、0が表示されます |
接点書き込み | 接点番号を16進数で入力して、ON、OFFボタンを押します。 |
データ読込み | データ番号を16進数で入力して、データ読込みボタンを押します。データが16進で表示されます |
データ書き込み | データ番号とでデータを16進数で入力して、データ書き込みボタンを押します。 |
このサンプルプログラムは、サンプルラダーcb_sample.splに対応しています。SPLCでcb_sample.splを開いて、実行させます。
その後、サンプルプログラムを操作してください。概観を次に示します。