😎

CODESYS Example Projectを調べてみた #2

2024/11/17に公開

Visu Event Handlerを学ぶ

今回は、CODESYSのVisu Event Handler Exampleについて調査した結果をまとめます。このExampleでは、GUI上のイベントを処理する方法を学ぶことができます。

解凍したVisu_Event_Handler.zipには以下の3つのプロジェクトが含まれていました:

  • EditboxHandler.project
    テキストボックスへの入力イベントの処理例。
  • KeyEventHandler.project
    キー入力イベントの処理例。
  • MouseHandler.project
    マウスイベントの処理例。

セットアップ

プロジェクトのセットアップは簡単です。以下の手順で行います:

  1. プロジェクトをCODESYSにインポート。
  2. 自身の環境に合わせてデバイスを更新。
  3. ビルドして実行。

それでは、各プロジェクトの中身を詳しく見ていきます。

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つのメソッドで処理されます:

  1. HandleMouseBtnEvent
    マウスボタンの押下・リリースを処理。

  2. HandleMouseMoveEvent
    マウスの移動を処理。

マウスポジションは以下の構造体で参照できます:

ptMouse : VisuElems.CmpVisuHandler.VisuStructPoint;

このプロジェクトでは、MouseInfo構造体を使用してイベント情報を管理しています。たとえば、ドラッグ&ドロップのような機能を実現する際に便利そうです。

気づきと学び

  • ライブラリ情報
    ライブラリについて調べるにはこちらを参照するのがよさそうです。

  • インターフェースの種類
    今回のExampleやその他のインターフェースについてはこちらを参照してください。

  • REFERENCE TOREF=の使用

    • MouseHandlerで使用されていました。
    • 特徴: REFERENCE TOではNULLを許可しないため、参照先を直接バインドする必要があります。
  • 参照とポインタの使い分け

    • 参照(REFERENCE TO): イベントハンドラやシングルトンパターン向け。
    • ポインタ(POINTER TO): 動的データ構造向け。

まとめ

CODESYSのVisu Event Handlerは、GUIイベントを効率的に処理するための強力な仕組みを提供します。それぞれのExampleプロジェクトは、特定のユースケースに対応しており、実際のプロジェクトに適用できる知見が得られました。

特に、MouseHandlerではREFERENCE TOを使ったデータの管理方法が興味深く、柔軟なイベント処理を実現するための重要なポイントを学びました。

Discussion