McpX クラスのメソッドです。型引数 T に応じて内部的なデバイス点数は自動調整され(unmanaged 制約のため参照型は不可)、点数上限を超えても自動でパケット分割されます。各メソッドに ~Async 版があります。
Read<T>
単一デバイス読み込み 単一デバイスの値を PLC から読み込みます。指定した型 T に応じて、内部的に読み込むデバイス点数は自動調整されます。
signature
public T Read<T>(Prefix prefix, string address) where T : unmanaged;
public async Task<T> ReadAsync<T>(Prefix prefix, string address) where T : unmanaged;
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 読み込み対象の先頭デバイスコード。 |
| address | string | 読み込み対象の先頭アドレス。 |
戻り値 · PLC から読み込んだ値を型 T に変換して返します。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
Read<T>.cs
short d0 = mcpx.Read<short>(Prefix.D, "0");
bool m0 = await mcpx.ReadAsync<bool>(Prefix.M, "0");
BatchRead<T>
連続デバイス読み込み 指定したデバイス範囲の値を PLC から読み込みます。点数上限を超えても、McpX が自動でパケットを分割して送信します。
signature
public T[] BatchRead<T>(Prefix prefix, string address, ushort length) where T : unmanaged;
public async Task<T[]> BatchReadAsync<T>(Prefix prefix, string address, ushort length) where T : unmanaged;
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 読み込み対象の先頭デバイスコード。 |
| address | string | 読み込み対象の先頭アドレス。 |
| length | ushort | 読み込み要素数。型 T に応じて内部でデバイス点数を自動調整するため、「最終的に取得する T 型配列の要素数」を指定します。 |
戻り値 · PLC から読み込んだ値を型 T の配列に変換して返します。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
BatchRead<T>.cs
bool[] mArr = mcpx.BatchRead<bool>(Prefix.M, "0", 7000);
int[] dArr = await mcpx.BatchReadAsync<int>(Prefix.D, "1000", 500);
Write<T>
単一デバイス書き込み 単一デバイスの値を PLC に書き込みます。指定した型 T に応じて、内部的に書き込むデバイス点数は自動調整されます。
signature
public void Write<T>(Prefix prefix, string address, T value) where T : unmanaged;
public async Task WriteAsync<T>(Prefix prefix, string address, T value) where T : unmanaged;
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 書き込み対象の先頭デバイスコード。 |
| address | string | 書き込み対象の先頭アドレス。 |
| value | T | 書き込みする値。 |
例外 · DeviceAddressException / RecivePacketException / McProtocolException
Write<T>.cs
mcpx.Write<short>(Prefix.D, "0", 42);
await mcpx.WriteAsync<bool>(Prefix.M, "0", true);
BatchWrite<T>
連続デバイス書き込み 指定したデバイス範囲に値を PLC へ書き込みます。点数上限を超えても、McpX が自動でパケットを分割して送信します。
signature
public T[] BatchWrite<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
public async Task<T[]> BatchWriteAsync<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 書き込み対象の先頭デバイスコード。 |
| address | string | 書き込み対象の先頭アドレス。 |
| values | T[] | 書き込みする値の配列。 |
戻り値 · values の値をそのまま返します。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
BatchWrite<T>.cs
mcpx.BatchWrite<short>(Prefix.D, "0", new short[] { 1, 2, 3 });
Read(build)
連続/ランダム統合読み込み(ビルダー) 連続するデバイス範囲と非連続のデバイスを 1 つのビルダーでまとめて読み込みます。build 内で点数を指定した Add<T>(prefix, address, length, onRead) は連続アクセス(BatchRead)で読み込みます。点数を指定しない Add<T>(prefix, address, onRead) はランダムアクセス(RandomRead)です。読み取りが終わると、各コールバックに変換済みの値が渡されます。
signature
public void Read(Action<ReadBuilder> build);
public async Task ReadAsync(Action<ReadBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<ReadBuilder> | 読み込むデバイス(範囲/単一)とコールバックを登録するビルダー操作。 |
戻り値 · なし(読み取った値は各 onRead コールバックへ渡されます)。
範囲指定は BatchRead と同じく、long/double を含むすべての型に対応します。点数の上限を超えたときは自動で分割されます。単一指定の振り分けは RandomRead と同じで、long/double には対応していません。
UseMultiBlockAccess(コンストラクタ引数 useMultiBlockAccess)を true にすると、範囲が 2 つ以上あるときに複数ブロック一括読出し(0406)で 1 回の交信にまとめます。既定は false で、範囲ごとに読み込みます。非対応の接続先(CPU 内蔵 Ethernet ポートなど)で true にするとエラーコード C059 の McProtocolException になるため、対応している接続先でだけ有効にしてください。
連続アクセスを先に実行し、その後ランダムアクセスをまとめて実行します。複数のリクエストに分かれるため、全デバイスを同一スキャンで取得することは保証されません。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
Read(build).cs
short[] block = [];
int total = 0;
bool m10 = false;
mcpx.Read(b => b
.Add<short>(Prefix.D, "400", 100, v => block = v)
.Add<int>(Prefix.D, "2000", v => total = v)
.Add<bool>(Prefix.M, "10", v => m10 = v));
Write(build)
連続/ランダム統合書き込み(ビルダー) 連続するデバイス範囲と非連続のデバイスに、1 つのビルダーでまとめて書き込みます。build 内で配列を指定した Add<T>(prefix, address, values) は連続アクセス(BatchWrite)で書き込みます。単一の値を指定した Add<T>(prefix, address, value) はランダムアクセス(RandomWrite)です。
signature
public void Write(Action<WriteBuilder> build);
public async Task WriteAsync(Action<WriteBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<WriteBuilder> | 書き込むデバイス(範囲/単一)と値を登録するビルダー操作。 |
連続アクセスを登録順に実行した後、ランダムアクセスをまとめて実行します。単一指定の型の振り分けと制約は RandomWrite と同じです。
UseMultiBlockAccess を true にすると、範囲が 2 つ以上あるときに複数ブロック一括書込み(1406)で 1 回の交信にまとめます。既定は false です。ビットデバイスへの bool で要素数が 16 の倍数でない範囲は、指定していないビットを上書きしないよう範囲ごとに書き込みます。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
Write(build).cs
await mcpx.WriteAsync(b => b
.Add<short>(Prefix.D, "500", new short[] { 1, 2, 3 })
.Add<int>(Prefix.D, "2000", 1234)
.Add<bool>(Prefix.M, "20", true));
BlockRead
複数ブロック一括読み込み(ビルダー) 離れた場所にある連続範囲(ブロック)を複数指定し、複数ブロック一括読出し(コマンド 0406)で 1 回の交信にまとめて読み込みます。build 内で Add<T>(prefix, address, length, onRead) を並べると、読み取り後に各コールバックへ変換済みの配列が渡されます。
signature
public void BlockRead(Action<BlockReadBuilder> build);
public async Task BlockReadAsync(Action<BlockReadBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<BlockReadBuilder> | 読み込む範囲とコールバックを登録するビルダー操作。 |
戻り値 · なし(読み取った値は各 onRead コールバックへ渡されます)。
ブロック数・点数の上限(Q/L: 120 ブロック、iQ-R: 60 ブロック、合計 960 点)を超えると、自動で複数のリクエストに分割します。bool はビットデバイスにだけ指定できます。ビットデバイスをワード型で指定すると 1 ワード=16 点として読み込みます。
接続先が複数ブロックに非対応の場合は McProtocolException(ErrorCode = 0xC059)をスローします。CPU 内蔵 Ethernet ポートなどが該当します。
例外 · DeviceAddressException / ArgumentException / RecivePacketException / McProtocolException
BlockRead.cs
short[] d100 = [];
int[] d500 = [];
bool[] m0 = [];
mcpx.BlockRead(b => b
.Add<short>(Prefix.D, "100", 10, v => d100 = v)
.Add<int>(Prefix.D, "500", 4, v => d500 = v)
.Add<bool>(Prefix.M, "0", 32, v => m0 = v));
BlockWrite
複数ブロック一括書き込み(ビルダー) 離れた場所にある連続範囲(ブロック)を複数指定し、複数ブロック一括書込み(コマンド 1406)で 1 回の交信にまとめて書き込みます。build 内で Add<T>(prefix, address, values) を並べます。
signature
public void BlockWrite(Action<BlockWriteBuilder> build);
public async Task BlockWriteAsync(Action<BlockWriteBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<BlockWriteBuilder> | 書き込む範囲と値を登録するビルダー操作。 |
ビットデバイスは 16 点(1 ワード)単位で書き込むため、bool は要素数を 16 の倍数にしてください。それ以外は ArgumentException になります。上限(Q/L: ブロック数×4+点数、iQ-R: ブロック数×9+点数 が 960 以下)を超えると自動で分割します。
接続先が複数ブロックに非対応の場合は McProtocolException(ErrorCode = 0xC059)をスローします。
例外 · DeviceAddressException / ArgumentException / RecivePacketException / McProtocolException
BlockWrite.cs
await mcpx.BlockWriteAsync(b => b
.Add<short>(Prefix.D, "100", new short[] { 1, 2, 3 })
.Add<int>(Prefix.D, "500", new[] { 1000, 2000 })
.Add<bool>(Prefix.M, "0", new bool[16]));
RandomRead
ランダム読み込み(ビルダー) 型ごとのアクセス単位(ビット/ワード/ダブルワード)を意識せずに、非連続のデバイスを一括で読み込みます。build 内で Add<T>(prefix, address, onRead) によりデバイスと「読み取り後に呼ばれるコールバック」を並べます。読み取り完了後、各コールバックに変換済みの値が渡されます。アクセス単位・点数上限・パケット分割は内部で自動処理されます。
signature
public void RandomRead(Action<RandomReadBuilder> build);
public async Task RandomReadAsync(Action<RandomReadBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<RandomReadBuilder> | 読み込むデバイスとコールバックを登録するビルダー操作。 |
戻り値 · なし(読み取った値は各 onRead コールバックへ渡されます)。
Add<T> は型でアクセス単位を自動振り分け: bool→ビット(ワードで読み出し bit0 を抽出)、short/ushort→ワード、int/uint/float→ダブルワード。long/double はランダムアクセスに存在しないため非対応(NotSupportedException)。
非推奨(0.8.0): ジェネリック版 RandomRead<T1, T2> と RandomReadBit は [Obsolete] です。このビルダー版を使用してください。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
RandomRead.cs
short d0 = 0;
bool m0 = false;
float d100 = 0;
mcpx.RandomRead(b => b
.Add<short>(Prefix.D, "0", v => d0 = v)
.Add<bool>(Prefix.M, "0", v => m0 = v)
.Add<float>(Prefix.D, "100", v => d100 = v));
RandomWrite
ランダム書き込み(ビルダー) 非連続のデバイスに対し、型ごとのアクセス単位を意識せずに一括で書き込みます。build 内で Add<T>(prefix, address, value) によりデバイスと値を並べます。ワード/ダブルワードとビットは MC プロトコル上サブコマンドが異なるため、別パケットで送信されます。
signature
public void RandomWrite(Action<RandomWriteBuilder> build);
public async Task RandomWriteAsync(Action<RandomWriteBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<RandomWriteBuilder> | 書き込むデバイスと値を登録するビルダー操作。 |
Add<T> は型でアクセス単位を自動振り分け: bool→ビット単位ランダム書き込み(コマンド 1402/サブコマンド 0001)、short/ushort→ワード、int/uint/float→ダブルワード。
非推奨(0.8.0): ジェネリック版 RandomWrite<T1, T2> と RandomWriteBit は [Obsolete] です。このビルダー版を使用してください。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
RandomWrite.cs
mcpx.RandomWrite(b => b
.Add<short>(Prefix.D, "0", 123)
.Add<bool>(Prefix.M, "0", true)
.Add<uint>(Prefix.D, "100", 456));
MonitorRegist
モニター登録(ビルダー)→ MonitorSession モニタ対象の非連続デバイスを登録(コマンド 0801)し、繰り返し読み出すための MonitorSession を返します。モニタ(コマンド 0802)は登録済みデバイスを読み出すだけの軽量なコマンドのため、登録は一度だけ行い、MonitorSession.Read() で繰り返し読み出すのが効率的です。
signature
public MonitorSession MonitorRegist(Action<MonitorBuilder> build);
public async Task<MonitorSession> MonitorRegistAsync(Action<MonitorBuilder> build);
| 引数 | 型 | 説明 |
|---|
| build | Action<MonitorBuilder> | モニタ対象のデバイスとコールバックを登録するビルダー操作。Add<T> は型でアクセス単位を自動振り分け(bool はワードで読み出し bit0 を抽出)。 |
戻り値 · 登録済みデバイスを繰り返し読み出すための MonitorSession。Read() / ReadAsync()(コマンド 0802)で各 onRead に変換済みの値を渡します。
点数上限はワード+ダブルワードの合計で 192 点(Q/L)/96 点(iQ-R)。モニタ登録はパケット分割ができず、再登録は全置換です。PLC の再立上げ等で登録が消去された場合は再登録してください。
例外 · DeviceAddressException / ArgumentException / RecivePacketException / McProtocolException
MonitorRegist.cs
short d0 = 0;
bool m0 = false;
var session = mcpx.MonitorRegist(b => b
.Add<short>(Prefix.D, "0", v => d0 = v)
.Add<bool>(Prefix.M, "0", v => m0 = v));
session.Read();
session.Read();
RemoteRun
リモート RUN 接続先の CPU ユニットを RUN 状態にします(コマンド 1001)。RUN にするときにクリアするデバイスメモリの範囲も指定できます。
signature
public void RemoteRun(bool force = false, RemoteRunClearMode clearMode = RemoteRunClearMode.None);
public Task RemoteRunAsync(bool force = false, RemoteRunClearMode clearMode = RemoteRunClearMode.None);
| 引数 | 型 | 説明 |
|---|
| force | bool | 他の機器がリモート STOP/PAUSE 中でも実行する場合に true。既定は false。 |
| clearMode | RemoteRunClearMode | RUN 時にクリアするデバイスメモリの範囲。既定はクリアしない(RemoteRunClearMode.None)。 |
CPU ユニットのスイッチが RUN のときに実行できます。スイッチが STOP だとコマンドは正常に完了しますが、RUN にはなりません。リモート操作後に電源の再投入やリセットをすると、スイッチの状態に戻ります。
例外 · RecivePacketException / McProtocolException
RemoteRun.cs
mcpx.RemoteRun();
await mcpx.RemoteRunAsync(force: true, clearMode: RemoteRunClearMode.OutsideLatch);
RemoteStop / RemotePause
リモート STOP / PAUSE RemoteStop は CPU ユニットを STOP 状態に(コマンド 1002)、RemotePause は PAUSE 状態にします(コマンド 1003)。
signature
public void RemoteStop();
public Task RemoteStopAsync();
public void RemotePause(bool force = false);
public Task RemotePauseAsync(bool force = false);
| 引数 | 型 | 説明 |
|---|
| force | bool | (RemotePause のみ)他の機器がリモート STOP/PAUSE 中でも実行する場合に true。既定は false。 |
RemotePause はスイッチが RUN のときに実行できます。スイッチが STOP だとコマンドは正常に完了しますが、PAUSE にはなりません。
例外 · RecivePacketException / McProtocolException
RemoteStop / RemotePause.cs
mcpx.RemoteStop();
mcpx.RemotePause();
RemoteLatchClear
リモートラッチクリア 接続先の CPU ユニットでラッチクリアを実行します(コマンド 1005)。ラッチ範囲のデバイスもクリアされます。
signature
public void RemoteLatchClear();
public Task RemoteLatchClearAsync();
CPU ユニットを STOP 状態にしてから実行してください。他の機器がリモート STOP/PAUSE 中の場合はエラーになります。
例外 · RecivePacketException / McProtocolException
RemoteLatchClear.cs
mcpx.RemoteStop();
mcpx.RemoteLatchClear();
RemoteReset
リモート RESET 接続先の CPU ユニットをリセットします(コマンド 1006)。リセット後は自動で接続し直し、SM400(常時 ON)が読めるようになるまで待ちます。リモートパスワードを指定している場合は解除もやり直すので、同じインスタンスで続けて通信できます。
signature
public void RemoteReset(int reconnectTimeoutMilliseconds = 30000);
public async Task RemoteResetAsync(int reconnectTimeoutMilliseconds = 30000);
| 引数 | 型 | 説明 |
|---|
| reconnectTimeoutMilliseconds | int | リセット後に接続し直すまでの最大待ち時間(ミリ秒)。0 を指定すると接続し直しません。既定は 30000。 |
CPU ユニットを STOP 状態にしてから実行してください(エラーで停止している場合は RUN でも実行できます)。パラメータでリモート RESET を許可する設定が必要です。
リセットで応答が返らない場合や接続が切れる場合があるため、通信の切断・タイムアウトは例外にしません。
例外 · RecivePacketException / McProtocolException
RemoteReset.cs
mcpx.RemoteStop();
mcpx.RemoteReset();
short d0 = mcpx.Read<short>(Prefix.D, "0");
ReadString
文字列読み込み 指定したデバイス範囲の値を文字列(Shift_JIS)として読み込みます。
signature
public string ReadString(Prefix prefix, string address, ushort length);
public async Task<string> ReadStringAsync(Prefix prefix, string address, ushort length);
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 読み込み対象の先頭デバイスコード。 |
| address | string | 読み込み対象の先頭アドレス。 |
| length | ushort | 読み込みデバイス点数。 |
戻り値 · Shift_JIS として解釈した文字列。
ビルド条件: 文字列系メソッドは #if !AOT で囲まれており、AOT ビルドでは無効になります。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
ReadString.cs
string label = mcpx.ReadString(Prefix.D, "100", 10);
WriteString
文字列書き込み 指定したデバイスに、Shift_JIS に変換した文字列データを書き込みます。
signature
public void WriteString(Prefix prefix, string address, string value);
public async Task WriteStringAsync(Prefix prefix, string address, string value);
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 書き込み対象の先頭デバイスコード。 |
| address | string | 書き込み対象の先頭アドレス。 |
| value | string | 書き込みする文字列。 |
ビルド条件: 文字列系メソッドは #if !AOT で囲まれており、AOT ビルドでは無効になります。
例外 · DeviceAddressException / RecivePacketException / McProtocolException
WriteString.cs
mcpx.WriteString(Prefix.D, "100", "McpX");
Dispose
インスタンス破棄 使用済みのリソースを解放し、必要に応じて PLC のリモートロックを実行します。using 文で囲めば自動的に呼び出されます。
signature
public override void Dispose();