CODESYS Example Projectを調べてみる #2
Visu Event Handlerを学ぶ
今回は、CODESYSのVisu Event Handler Exampleについて調査した結果をまとめます。このExampleでは、GUI上のイベントを処理する方法を学ぶことができます。
解凍したVisu_Event_Handler.zip
には以下の3つのプロジェクトが含まれていました:
-
EditboxHandler.project
テキストボックスへの入力イベントの処理例。 -
KeyEventHandler.project
キー入力イベントの処理例。 -
MouseHandler.project
マウスイベントの処理例。
セットアップ
プロジェクトのセットアップは簡単です。以下の手順で行います:
- プロジェクトをCODESYSにインポート。
- 自身の環境に合わせてデバイスを更新。
- ビルドして実行。
それでは、各プロジェクトの中身を詳しく見ていきます。
Example Projectの解説
1. EditboxHandler
このプロジェクトでは、VisuElems.IEditBoxInputHandler
インターフェースを使用して、テキストボックスの編集イベントを処理します。
ハンドラ登録
ハンドラの登録は以下のコードで行います:
VisuElems.Visu_Globals.g_VisuEventManager.SetEditBoxEventHandler(PLC_PRG.inst);
PLC_PRG.inst
はPOU(FB)のインスタンスで、IEditBoxInputHandler
を実装しています。
イベント処理
イベント処理はVariableWritten
メソッドで実装されています。このメソッドは、テキストボックスに値が書き込まれるたびに呼び出されます。
METHOD VariableWritten : BOOL
VAR_INPUT
pVar : POINTER TO BYTE; // 変数のポインタ
varType : VisuElems.Visu_Types; // データ型
iMaxSize : INT; // 最大サイズ
pClient : POINTER TO VisuElems.VisuStructClientData; // クライアントデータ
END_VAR
PLC_PRG.stInfo := 'Variable written; type: ';
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, INT_TO_STRING(varType));
このコードでは、書き込まれた変数の型やアドレス、クライアントタイプをログに記録しています。
2. KeyEventHandler
このプロジェクトでは、VisuElems.IKeyEventHandler
インターフェースを使用して、キー入力イベントを処理します。
ハンドラ登録
VisuElems.Visu_Globals.g_VisuEventManager.SetKeyEventHandler(PLC_PRG.inst);
イベント処理
キーイベントはHandleKeyEvent
メソッドで処理されます。以下はイベント発生時に実行される処理の例です:
METHOD HandleKeyEvent : BOOL
VAR_INPUT
bKeyUpEvent : BOOL; // キーの押下またはリリース
dwKey : DWORD; // キーコード
dwModifiers : DWORD; // 修飾キー(Shift、Alt、Ctrl)
pClient : POINTER TO VisuElems.VisuStructClientData; // クライアントデータ
END_VAR
PLC_PRG.stInfo := 'KeyEvent up: ';
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, BOOL_TO_STRING(bKeyUpEvent));
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, ', key: ');
PLC_PRG.stInfo := CONCAT(PLC_PRG.stInfo, DWORD_TO_STRING(dwKey));
3. MouseHandler
このプロジェクトでは、VisuElems.VisuElemBase.IMouseEventHandler
インターフェースを使用して、マウスイベントを処理します。
ハンドラ登録
VisuElems.VisuElemBase.g_VisuEventManager.SetMouseEventHandler(PLC_PRG.evHandler);
イベント処理
マウスイベントは以下の2つのメソッドで処理されます:
-
HandleMouseBtnEvent
マウスボタンの押下・リリースを処理。 -
HandleMouseMoveEvent
マウスの移動を処理。
マウスポジションは以下の構造体で参照できます:
ptMouse : VisuElems.CmpVisuHandler.VisuStructPoint;
このプロジェクトでは、MouseInfo
構造体を使用してイベント情報を管理しています。たとえば、ドラッグ&ドロップのような機能を実現する際に便利そうです。
気づきと学び
-
ライブラリ情報
ライブラリについて調べるにはこちらを参照するのがよさそうです。 -
インターフェースの種類
今回のExampleやその他のインターフェースについてはこちらを参照してください。 -
REFERENCE TO
とREF=
の使用-
MouseHandler
で使用されていました。 -
特徴:
REFERENCE TO
ではNULLを許可しないため、参照先を直接バインドする必要があります。
-
-
参照とポインタの使い分け
- 参照(REFERENCE TO): イベントハンドラやシングルトンパターン向け。
- ポインタ(POINTER TO): 動的データ構造向け。
まとめ
CODESYSのVisu Event Handler
は、GUIイベントを効率的に処理するための強力な仕組みを提供します。それぞれのExampleプロジェクトは、特定のユースケースに対応しており、実際のプロジェクトに適用できる知見が得られました。
特に、MouseHandler
ではREFERENCE TO
を使ったデータの管理方法が興味深く、柔軟なイベント処理を実現するための重要なポイントを学びました。
Discussion