SimpleGXC
三菱電機 MELSEC PLC 開発環境 GX Works に於けるシミュレータ機能(GX2: GX Simulator2, GX3: GX Simulator3) の起動中に, その仮想PLCデバイスに対して VC++, .NET (C#, VB.NET) 言語から値を読書きするための関数を実装したライブラリを作成した。MX Component 不要。
機能(関数)
ランダム書込(WriteDeviceRandom)
ランダム読込(ReadDeviceRandom)
一括書込(WriteDeviceBlock)
一括読込(WriteDeviceRead)
1点デバイス書込み (SetDevice)
1点デバイス読込 (ReadDevice)
読込の場合は参照渡し
MX Component 同様, 読み込みの関数において取得データは参照渡しの箱に格納される。
ステータス
いづれの関数も 引数は配列、戻り値intには最後に発生したエラーについて格納しており、オープン・クローズぞこない、タイムアウトなどの定数は列挙体(enumErrorCode) がある。
メモリ消費量
数万回実行で、数MB上昇
速度
数十ミリ秒~数百ミリ秒 (パソコンによる)
サポートしているデバイス
D, M, X, Y, L, B, W, TS, TC, TN, CS, CC, CN, Z, V, ZR, R, F
TS は タイマ接点(いわゆる T), TC はタイマコイル, TN はタイマ現在値である。カウンタもまたしかり。
動作確認PC
新規インストールした Windows 11 パソコンに, 体験版 GXWorks2, GX Works3 をインストールし動作確認した。
つまり、 GX Works の個体差(シリアルナンバー)に依存しない。
もちろん Windows 10 でも動作したのを確認した。 Windows 7 でも動作するはず。
ただし, VC++:Visual Studio C++ 2015 以上の Runtime のインストールが必要(すでにインストールされている場合もあります)
DL
SimpleGXC_v1.0_20250817_USE(v1.2, 2025.0817)
VC++ Lib, .h および C++/CLI DLL (.NET用), それらを用いたサンプルプロジェクトを同梱してゐる。
DLLの動作環境
VC++:Visual Studio C++ 2015 再頒布 (直リンクx64)
サンプルアプリの動作環境
.NET8 : (直リンクx64 )
サンプルアプリでは .NET8 を使っているが, .NET 4 のアプリでも利用できます。
利用規定
本製品は、GX Works2 , GX Works3 の利用規定 からすると, あまりよろしくありません。
したがって, これを利用したアプリは, あくまでも研究・趣味用とのみでの限定になります。
使い方(共通)
VC++ アプリなら、 ヘッダファイル, lib をインクルードしコンパイル。
C# , VB.NET アプリなら, DLL を参照しコンパイル。実行と同じフォルダに DLL, lib を設置しておく。
サンプルコード(VC++の場合)
//MX* ins1 = new MX((char)enumQPLC::UDPV,(char)enumMCProtocol::GXSim2) //GX Simulator2 利用時 (CPU はUDPVシリーズのとき)
MX* ins1 = new MX((char)enumRPLC::_Non, (char)enumMCProtocol::GXSim3); //GX Simulator3 利用時(CPU は Rxx 無印シリーズのとき)
ins1->SockOpen();
char* dev[1000];
for (int i = 0; i < 1000; i++) {
dev[i] = (char*)malloc(10);
memset(dev[i], 0x00, 10);
dev[i] = combStr_("M", d2ch_(0 + i), NULL);
}
char* dev_ = "D1002\nD1004\nD1006"
QWORD SendData[1960];
QWORD RcvData[1960];
int state = 0;
//ランダム読み書きではワードデバイスとビットデバイスの取り扱いは同じ。1000なら 1000ビット
state = ins1->WriteDeviceRandom(dev, 1000, SendData);
state = ins1->ReadDeviceRandom(dev, 1000, RcvData);
if(state == (QBYTE)enumErrorCode::NothingErr)for (int j = 0; j < 1000; j++) printf("%4x ", RcvData[j]); printf("\n\n\n");
サンプルコード(C#の場合)
MXNET ins1 = new MXNET((byte)enumRPLC._Non, (byte)enumMCProtocol.GXSim3);
string[] dev = new string[1960];
for (int i = 0; i < 1960; i++) dev[i] = "D" + (2000 + i).ToString();
string dev_ = "D1002\nD1004\nD1006"
ushort[] Senddat = new ushort[1960];
ushort[] Rcvdat = new ushort[1960];
ins1.SockOpen();
ushort state = 0;
state = ins1.WriteDeviceRandom(dev, 1000, Senddat);
state = ins1.ReadDeviceRandom(dev, 1000, ref Rcvdat);
if (state == (byte)enumErrorCode.NothingErr) for (int j = 0; j < 1000; j++) Console.Write("{1:X} ", j, Rcvdat[j]);
更新履歴
ver 1.0 (2025.0817)
<fix> GX Simulator3 のプロトコル動作が CPU依存であることが判明したので修正。なので GX Sim3 利用の場合も, CPUの種類を指定してください。
<del> バッファメモリ読み書き仕様削除 ( Rシリーズ一部において対応していないことが判明したので)
ver 1.0 (2025.0808)
new