このサンプルはRSW-ECAT-Masterを使用し、
OMRON
Corporation社のディジタルI/Oスレーブ製品を制御するC#アプリケーションです。コード中のオフセットアドレス、値などについては、メーカーの製品仕様に準じます。
VS2012サンプルプロジェクト:
RSWECATDOSample.zip
/*****************************************************************************
* Description : RSW-ECAT-Master : DO プログラムサンプル
\*****************************************************************************/
using System;
using System.Threading;
using System.Runtime.InteropServices;
using RSWECAT_dotNet;
/*****************************************************************************
* main 処理
\*****************************************************************************/
class Program
{
static void Main(string[] args)
{
EcatDIOProgram test = new EcatDIOProgram();
test.StartTestDIO(); // 処理実行
Console.ReadLine(); // 待機
test.StopTestDIO(); // 処理実行
}
}
/*****************************************************************************
* DO 処理
\*****************************************************************************/
class EcatDIOProgram
{
EcatHandler hEcat = null;
ushort usReqState = 0, usNowState = 0;
SLAVE_DETAIL stSlave;
uint uiCount = 0;
/*****************************************************************************
* 開始処理
\*****************************************************************************/
public void StartTestDIO()
{
try
{
// RSW-ECAT初期化(RSW-ECAT API コール)
// システムの初期化完了を待機するため複数回コールします。
for (int i = 0; i < 5; i++)
{
try { hEcat = new EcatHandler(); }
catch (EcatException er)
{
if (i >= 5) { throw er; }
}
if (hEcat != null) { break; }
}
// Masterステートチェンジ要求 (RSW-ECAT API コール)
// MST_OPERATIONAL : オペレーショナルへ遷移
hEcat.WEhRqState(EcatHandler.MST_OPERATIONAL);
// オペレーショナルへ遷移したかどうかの確認処理
while (true)
{
// 現在の Masterステート状態取得 (RSW-ECAT API コール)
hEcat.WEhGetState(ref usReqState, ref usNowState);
// オペレーショナルへ遷移完了かをチェック
if (usNowState == EcatHandler.MST_OPERATIONAL)
{
break;
}
// ステートチェンジ待機用スリープ
Thread.Sleep(500);
}
// ここからスレーブへのアクセス処理
// スレーブ検索
stSlave = new SLAVE_DETAIL();
stSlave.fnAryClear(); // 必ず行う
stSlave.uiSize = (uint)Marshal.SizeOf(stSlave);
stSlave.uiVendorID = 131;
stSlave.uiProductCode = 50;
stSlave.uiInstance = 0;
hEcat.WEhFindSlave(ref stSlave);
// Callbackの登録
hEcat.WEhSetEventCallBack(CallBack);
}
catch (EcatException er)
{
Console.WriteLine("<< EcatException >>");
Console.WriteLine(" - ApiReturn:0x{0:x8}", er.uiApiReturn);
Console.WriteLine(" - DotNetErr:0x{0:x8}", er.uiDotNetErr);
Console.WriteLine(" - IntrErr :0x{0:x8}", er.uiIntrErr);
Console.WriteLine("\n( InnerExp info )\n" + er.expDotNet.ToString());
Console.WriteLine("program end.");
// RSW-ECAT 終了処理 (RSW-ECAT API コール)
if (hEcat != null)
{
hEcat.WEhClose();
}
}
}
/*****************************************************************************
* イベント発生時にコールされるメソッド
\*****************************************************************************/
private void CallBack(object sender, EcatHandler.EcatEventArgs e)
{
try
{
// イベント処理
switch (e.Type)
{
// サイクリックイベント処理
case EcatHandler.EcatEventType.Cyclic:
uiCount++; // イベント数のカウント
if (200 < uiCount)
{
uiCount = 0;
// ループ毎にON/OFF変換要求
if (0 != hEcat.WEhReadbackByte(stSlave.uiViosOutBaseOffset))
{
hEcat.WEhWriteByte(stSlave.uiViosOutBaseOffset, 0x00);
}
else
{
hEcat.WEhWriteByte(stSlave.uiViosOutBaseOffset, 0xFF);
}
}
break;
// 診断イベント
case EcatHandler.EcatEventType.DiagEvent:
break;
// イベント待機処理にて例外発生
case EcatHandler.EcatEventType.Exception:
hEcat.WEhRqState(EcatHandler.MST_INIT); // INITへ(サイクリックイベントの停止)
hEcat.WEhClose(); // INITへ(サイクリックイベントの停止)
return;
}
}
catch (EcatException er)
{
// エラー処理
}
}
/*****************************************************************************
* 終了処理
\*****************************************************************************/
public void StopTestDIO()
{
try
{
// 回線クローズ(RSW-ECAT API コール)
hEcat.WEhClose();
}
catch (EcatException er)
{
Console.WriteLine("<< EcatException >>");
Console.WriteLine(" - ApiReturn:0x{0:x8}", er.uiApiReturn);
Console.WriteLine(" - DotNetErr:0x{0:x8}", er.uiDotNetErr);
Console.WriteLine(" - IntrErr :0x{0:x8}", er.uiIntrErr);
Console.WriteLine("\n( InnerExp info )\n" + er.expDotNet.ToString());
Console.WriteLine("program end.");
// RSW-ECAT 終了処理 (RSW-ECAT API コール)
if (hEcat != null)
{
hEcat.WEhClose();
}
}
}
}
上記のサンプルを高レベルAPIを使用して実装した場合は、下記となります。
RSW-ECAT初期化時にOPERATIONAL状態まで自動遷移するため、Masterステートチェンジ要求、およびOPERATIONALへの遷移確認処理が不要となります。
VS2012サンプルプロジェクト:
RSWECATDOSample2.zip
/*****************************************************************************
* Description : RSW-ECAT-Master : DO プログラムサンプル
\*****************************************************************************/
using System;
using System.Threading;
using System.Runtime.InteropServices;
using RSWECAT_dotNet;
/*****************************************************************************
* main 処理
\*****************************************************************************/
class Program
{
static void Main(string[] args)
{
EcatDIOProgram test = new EcatDIOProgram();
test.StartTestDIO(); // 処理実行
Console.ReadLine(); // 待機
test.StopTestDIO(); // 処理実行
}
}
/*****************************************************************************
* DO 処理
\*****************************************************************************/
class EcatDIOProgram
{
EcatHandler hEcat = null;
SLAVE_DETAIL stSlave;
uint uiCount = 0;
/*****************************************************************************
* 開始処理
\*****************************************************************************/
public void StartTestDIO()
{
try
{
// RSW-ECAT初期化(RSW-ECAT API コール) ※内部でOperationalまで自動遷移します。
hEcat = new EcatHandler(30000); // 本サンプルでは、タイムアウト値に30秒指定[単位:ms]
// ここからスレーブへのアクセス処理
// スレーブ検索
stSlave = new SLAVE_DETAIL();
stSlave.fnAryClear(); // 必ず行う
stSlave.uiSize = (uint)Marshal.SizeOf(stSlave);
stSlave.uiVendorID = 131;
stSlave.uiProductCode = 50;
stSlave.uiInstance = 0;
hEcat.WEhFindSlave(ref stSlave);
// Callbackの登録
hEcat.WEhSetEventCallBack(CallBack);
}
catch (EcatException er)
{
Console.WriteLine("<< EcatException >>");
Console.WriteLine(" - ApiReturn:0x{0:x8}", er.uiApiReturn);
Console.WriteLine(" - DotNetErr:0x{0:x8}", er.uiDotNetErr);
Console.WriteLine(" - IntrErr :0x{0:x8}", er.uiIntrErr);
Console.WriteLine("\n( InnerExp info )\n" + er.expDotNet.ToString());
Console.WriteLine("program end.");
// RSW-ECAT 終了処理 (RSW-ECAT API コール)
if (hEcat != null)
{
hEcat.HiWEhClose(false);
}
}
}
/*****************************************************************************
* イベント発生時にコールされるメソッド
\*****************************************************************************/
private void CallBack(object sender, EcatHandler.EcatEventArgs e)
{
try
{
// イベント処理
switch (e.Type)
{
// サイクリックイベント処理
case EcatHandler.EcatEventType.Cyclic:
uiCount++; // イベント数のカウント
if (200 < uiCount)
{
uiCount = 0;
// ループ毎にON/OFF変換要求
if (0 != hEcat.WEhReadbackByte(stSlave.uiViosOutBaseOffset))
{
hEcat.WEhWriteByte(stSlave.uiViosOutBaseOffset, 0x00);
}
else
{
hEcat.WEhWriteByte(stSlave.uiViosOutBaseOffset, 0xFF);
}
}
break;
// 診断イベント
case EcatHandler.EcatEventType.DiagEvent:
break;
// イベント待機処理にて例外発生
case EcatHandler.EcatEventType.Exception:
hEcat.WEhRqState(EcatHandler.MST_INIT); // INITへ(サイクリックイベントの停止)
hEcat.HiWEhClose(false); // INITへ(サイクリックイベントの停止)
return;
}
}
catch (EcatException er)
{
// エラー処理
}
}
/*****************************************************************************
* 終了処理
\*****************************************************************************/
public void StopTestDIO()
{
try
{
// 回線クローズ(RSW-ECAT API コール)
hEcat.HiWEhClose(false);
}
catch (EcatException er)
{
Console.WriteLine("<< EcatException >>");
Console.WriteLine(" - ApiReturn:0x{0:x8}", er.uiApiReturn);
Console.WriteLine(" - DotNetErr:0x{0:x8}", er.uiDotNetErr);
Console.WriteLine(" - IntrErr :0x{0:x8}", er.uiIntrErr);
Console.WriteLine("\n( InnerExp info )\n" + er.expDotNet.ToString());
Console.WriteLine("program end.");
}
}
}