PLCデバイス抽象化・共有デバイス基盤
LTAnnaDeviceMap.DLLは、LTAnna.exe上でPLCデバイス相当の値を扱うための拡張DLLです。PLCデバイス抽象化、クライアント・サーバー型共有メモリ、変数名ベースの型付きアクセス機構を兼ねます。
PLCデバイス抽象化
PLCのBIT、ワード、文字列、浮動小数点をLua側ではRemoteValueとして扱います。PLC差異は下位DLLに閉じ込めます。
共有デバイス
サーバーで公開した値を、GUI、3Dシミュレータ、装置ロジック、PLCシミュレータなど複数クライアントで共有します。
イベント駆動
値変化をOnMapValue_<Name>Changed(v)形式のイベントで受け取り、ポーリング中心ではない設計にできます。
全体アーキテクチャ
LuaアプリとPLC DLLの間にDeviceMapを置くことで、アプリケーションをPLC種別に依存しにくくします。
レイヤ構成
Luaアプリ ↓ DeviceMap(共通抽象) ↓ AnnaPlc API ↓ PLC DLL(LTMelsecLink2 / LTPanaLink2 等) ↓ PLC実機 / PLCシミュレータ
三菱PLC構成
Ethernet通信。IPアドレスとポートを指定します。
AnnaDLLLoad(RUNTIMEID, "LTMelsecLink2.DLL") AnnaPlcStart(RUNTIMEID, plcIP, plcPort)
パナPLC構成
シリアル通信。CONFIG_RS.xmlのフォルダを指定します。
AnnaDLLLoad(RUNTIMEID, "LTPanaLink2.DLL") AnnaPlcStart(RUNTIMEID, "CONFIG_RS.xmlのフォルダ", 0)
PLC切替
- ロードするPLC DLLを変更
- AnnaPlcStart引数を変更
- 上位LuaのDeviceMapアクセスは共通化
サーバーとクライアントの責務
mapSrvとmapCltを混同しないことが安定した設計の基本です。
サーバー側責務
- DeviceMap領域の公開
- PLCバッファの追加
- PLC通信開始
- サーバー側所有領域の書込み
- DeviceMap初期化
クライアント側責務
- 必要なマップだけ購読
- RemoteValueの解決
- 変更イベントの受信
- GUI / 3D / 装置ロジックの実行
- クライアント側所有領域の書込み
使い分けルール
- サーバーコードではmapSrv
- クライアントコードではmapClt
- Client側でmapSrvをFindValueしない
- Server側でmapCltをFindValueしない
通信方式とチャネル設計
AnnaDeviceMapServerStart / ClientStartのtypeで通信方式を選択します。
| 1 : TCP | 別PC接続や分散構成がある場合に検討します。ポートやファイアウォール設定も考慮します。 |
|---|---|
| 2 : HTTP | 特殊用途向けです。通常の同一PC内連携では優先度は低めです。 |
| 3 : IPC | 同一PC内の高速・安定通信向け。LTAnna、GUI、3D、PLCシミュレータを同一PCで動かす場合の標準推奨です。 |
| chName / objUR | サーバーとクライアントで一致させます。不一致は接続不可やRemoteValue未解決の原因です。 |
デバイスタイプとアクセスプロパティ
定義した型とアクセスプロパティを一致させます。
| BIT | BitValue。0=OFF、非0=ON。 |
|---|---|
| BYTE | ByteValue。 |
| U2 / I2 | U2Value / I2Value。 |
| U4 / I4 | U4Value / I4Value。 |
| U8 / I8 | U8Value / I8Value。 |
| STR | StrValue。ASCII、固定長バイト配列、NULL無しの空文字仕様。 |
| FLOAT4 / FLOAT8 | F4Value / F8Value。 |
U2型にI2Valueでアクセスする、BIT型にU2Valueでアクセスする、といった型不一致は避けます。
初期化シーケンス
生成、Start、PLCバッファ追加、PLC開始の順序を守ります。ClientStartは非同期です。
サーバー側
AnnaDLLLoad(RUNTIMEID, "LTAnnaDeviceMap.DLL") AnnaDLLLoad(RUNTIMEID, "LTMelsecLink2.DLL") mapSrv = AnnaDeviceMapCreateServer(RUNTIMEID, CONFIG_mmapConfig) AnnaDeviceMapServerStart(mapSrv, 3, "PortName", "MelsecLink") AnnaPlcAddBuffByDeviceServer(mapSrv) AnnaPlcStart(RUNTIMEID, plcIP, plcPort)
サーバー側ポイント
- ServerStart後にFindValue可能
- AnnaPlcStartは初期化の最後
- mapSrvでサーバー所有値を扱う
クライアント側
mapClt = AnnaDeviceMapCreateClient(RUNTIMEID, CONFIG_mmapConfig) AnnaDeviceMapClientAddListenerDevice(mapClt, "CUS3D") AnnaDeviceMapClientStart(mapClt, 3, "PortName", "MelsecLink")
クライアント側ポイント
- ClientStartは非同期
- 接続完了後にFindValue
- 必要なDeviceだけ購読
RemoteValue解決と変更イベント
クライアントは接続完了後にRemoteValueを解決し、値変化はイベントで受け取ります。
接続完了後の解決
function OnMapClient_ConnectStatusChanged(uri, isConnect)
if (isConnect) then
Redraw = AnnaDeviceMapFindValue(mapClt, "Redraw")
PLC_StatusRun = AnnaDeviceMapFindValue(mapClt, "PLC_StatusRun")
end
end変更イベント
function OnMapValue_PLC_StatusRunChanged(v)
if (v.BitValue ~= 0) then
-- RUN状態になった時の処理
end
endイベント設計
- イベント内で重い処理をしない
- 必要ならキューへ積む
- nilチェックを入れる
- 頻繁に変化する値は注意
命名ルール
所有者、方向、用途が名前から分かることが重要です。
| PLC_XXXX | PLC → Annaの読み込み系。例:PLC_StatusInit、PLC_StatusRun、PLC_STExist01。 |
|---|---|
| PC_XXXX | Anna → PLCの書込み系。例:PC_Mode_Auto、PC_MoveFromSt、PC_MoveToSt、PC_StartReq。 |
| PLCCUS3D_XXXX | PLCシミュレータ → LTAnnaの入力系として使う命名例。 |
| CUS3D_XXXX | LTAnna → PLCシミュレータ側の出力系として使う命名例。 |
| GUI / SIM補助 | SW1_Off、Redraw、LampStatusなど。 |
禁止事項
- 同一意味で別名を使う
- 読込用と書込用を同名にする
- 省略しすぎた名前にする
推奨
- 方向を接頭辞で表す
- PLC仕様書の信号名と対応させる
- DeviceMap名とLua変数名を揃える
レビュー観点
- 誰が書く値か
- 誰が読む値か
- 型は合っているか
- イベント名が自然か
非同期反映への対策
書込み直後に値が即座に反映されるとは限らない前提で設計します。
READ / WRITE分離
読込領域と書込領域を分けます。PLC_StatusRunはPLC側が書く値、PC_Mode_AutoはPC側が書く値、というように所有者を分けます。
Trigger + パラメータ
パラメータを書いた後、最後にTriggerをインクリメントして通知します。搬送指示などに向きます。
GENERAL領域分割
共通領域を用途別に分け、誰がいつ更新する値かを明確にします。
搬送指示例
PLCCUS3D_FromST.I2Value = 1 PLCCUS3D_ToST.I2Value = 5 PLCCUS3D_Trigger.U2Value = PLCCUS3D_Trigger.U2Value + 1
避けたい設計
- 書いた直後に同じ値を読んで判定
- 同じDeviceMapを複数側が書く
- Triggerより後にパラメータを書く
- イベント内で長時間待機する
CUS3D / 3Dシミュレータ利用例
3Dシミュレータでは、DeviceMap ServerをPLCシミュレータ側、LTAnnaをDeviceMap Clientとして構成し、共有メモリで搬送指示をやり取りします。
代表構成
- PLCシミュレータ:DeviceMap Server
- LTAnna:DeviceMap Client(mapClt)
- 通信方式:IPC
- 3D表示:Anna3DViewer.dll
主要Lua
- MainScript.lua:起動・終了制御
- MAPLink.lua:DeviceMap接続・信号処理
- GUIApp.lua:GUI・3D連携
- CUS3DMT1/MT2.lua:モデル・ロボット制御
ロボット動作
- Get:取り出し
- Move:搬送
- Put:配置
- CmdFifoによる逐次実行
実装時チェックリスト
DeviceMap連携でトラブルを避けるため、以下を確認します。
接続・初期化
- ServerStart / ClientStartのtype一致
- chName / objUR一致
- 接続完了後にFindValue
- AnnaPlcStartは最後
設計・命名
- PLC_ / PC_ など方向が分かる
- Lua変数名と対応している
- 読込用と書込用を分離
- 型とアクセスプロパティが一致
イベント・非同期
- 即時反映に依存しない
- イベント内処理が重すぎない
- nilチェックあり
- Trigger + パラメータ順序が正しい