KcpX クラスのメソッドです。型引数 T に応じて上位リンクのデータ形式(.U / .S / .D / .L)と点数が自動で決まり(unmanaged 制約のため参照型は不可)、点数の上限を超えるとコマンドを自動で分割します。各メソッドに ~Async 版があります。
Read<T>
単一読出し(RD / RDS) 単一デバイスの値を読み出します。型 T に応じたデータ形式(bool: ビット、ushort: .U、short: .S、uint/float: .D、int: .L)で RD を送ります。64 ビットの型(long / ulong / double)は .D の 2 点を RDS で読み出します。
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 | 読出し対象のデバイス(Prefix)。 |
| address | string | 読出し対象のアドレス。R / MR / LR / CR はチャンネル+2 桁のビット番号、B / VB / W は 16 進数、それ以外は 10 進数の文字列です。 |
戻り値 · 読み出した値を型 T に変換して返します。
T / C / CTH / CTC は bool で接点の状態を読み出せます。接点・現在値・設定値をまとめて読むには ReadTimerCounter を使用します。
例外 · DeviceAddressException / NotSupportedException / ReceivePacketException / HostLinkException
Read<T>.cs
short dm0 = kcpx.Read<short>(Prefix.DM, "0");
float dm2 = kcpx.Read<float>(Prefix.DM, "2");
bool mr = await kcpx.ReadAsync<bool>(Prefix.MR, "1015");
BatchRead<T>
一括読出し(RDS・自動分割) 連続したデバイスを読み出します。1 コマンドの点数の上限を超える場合は、複数回の RDS に分割して読み出します。
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 | 読出し対象のデバイス(Prefix)。 |
| address | string | 読出し対象の先頭アドレス。 |
| length | ushort | 読み出す要素数(T の要素数)。0 は ArgumentOutOfRangeException。 |
戻り値 · 読み出した値を型 T の配列で返します。
点数の上限はデバイス・データ形式・PLC シリーズで決まります(例: KV-8000 / 7000 / 5000 の DM はビット・16 ビットで 1000 点、32 ビットで 500 点。KV Nano は 256 点 / 128 点)。コンストラクタの series を接続先に合わせてください。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
BatchRead<T>.cs
bool[] mrArr = kcpx.BatchRead<bool>(Prefix.MR, "0", 3000);
int[] dmArr = await kcpx.BatchReadAsync<int>(Prefix.DM, "1000", 1000);
Write<T>
単一書込み(WR / WRS) 単一デバイスに値を書き込みます。データ形式は Read<T> と同じ規則で決まり、64 ビットの型は .D の 2 点を WRS で書き込みます。T / C / CTH は現在値、CTC は設定値に書き込みます。
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 | 書込み対象のデバイス(Prefix)。 |
| address | string | 書込み対象のアドレス。 |
| value | T | 書き込む値。 |
32 ビット以上の値は、指定したデバイスが下位ワードです。上位・下位ワードの同時性は、デバイス番号が偶数の場合のみ保証されます。
例外 · DeviceAddressException / NotSupportedException / ReceivePacketException / HostLinkException
Write<T>.cs
kcpx.Write<short>(Prefix.DM, "0", -1234);
kcpx.Write(Prefix.DM, "2", 3.14f);
await kcpx.WriteAsync(Prefix.MR, "0", true);
BatchWrite<T>
一括書込み(WRS・自動分割) 連続したデバイスに配列を書き込みます。1 コマンドの点数の上限を超える場合は、複数回の WRS に分割して書き込みます。
signature
public void BatchWrite<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
public async Task BatchWriteAsync<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 書込み対象のデバイス(Prefix)。 |
| address | string | 書込み対象の先頭アドレス。 |
| values | T[] | 書き込む値の配列。 |
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
BatchWrite<T>.cs
kcpx.BatchWrite<int>(Prefix.DM, "0", [1234, 5678]);
var values = Enumerable.Range(0, 2000).Select(i => (ushort)i).ToArray();
await kcpx.BatchWriteAsync(Prefix.DM, "11000", values);
Read(configure)
統合読出し(ビルダー) 連続する範囲と単一のデバイスを 1 つのビルダーでまとめて読み出します。点数を指定した Add<T>(prefix, address, length, onRead) は一括読出し(RDS)、点数を指定しない Add<T>(prefix, address, onRead) は単一読出し(RD)です。追加した順に読み出し、各コールバックに変換済みの値を渡します。
signature
public void Read(Action<ReadBuilder> configure);
public async Task ReadAsync(Action<ReadBuilder> configure);
| 引数 | 型 | 説明 |
|---|
| configure | Action<ReadBuilder> | 読み出すデバイス(範囲/単一)とコールバックを ReadBuilder に追加する処理。 |
戻り値 · なし(読み出した値は各 onRead コールバックへ渡されます)。
範囲指定は BatchRead と同じく、点数の上限を超えると自動で分割されます。すべての型に対応しています。
デバイスごとに別のコマンドで読み出すため、全デバイスを同一スキャンで取得することは保証されません。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
Read(configure).cs
short[] block = [];
int total = 0;
bool mr10 = false;
kcpx.Read(b => b
.Add<short>(Prefix.DM, "400", 100, v => block = v)
.Add<int>(Prefix.DM, "2000", v => total = v)
.Add<bool>(Prefix.MR, "10", v => mr10 = v));
Write(configure)
統合書込み(ビルダー) 連続する範囲と単一のデバイスに、1 つのビルダーでまとめて書き込みます。配列を指定した Add<T>(prefix, address, values) は一括書込み(WRS)、単一の値を指定した Add<T>(prefix, address, value) は単一書込み(WR)です。
signature
public void Write(Action<WriteBuilder> configure);
public async Task WriteAsync(Action<WriteBuilder> configure);
| 引数 | 型 | 説明 |
|---|
| configure | Action<WriteBuilder> | 書き込むデバイス(範囲/単一)と値を WriteBuilder に追加する処理。 |
追加した順に書き込みます。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
Write(configure).cs
await kcpx.WriteAsync(b => b
.Add<short>(Prefix.DM, "17100", [1, 2, 3])
.Add(Prefix.DM, "17110", 123456)
.Add(Prefix.MR, "50010", true));
ReadTimerCounter
タイマ / カウンタ読出し T / C / CTH / CTC の接点・現在値・設定値を TimerCounterValue(Contact / Current / Set)で読み出します。BatchReadTimerCounter は連続した番号を読み出し、点数の上限(KV-8000 / 7000 / 5000 は 120 点)を超えると RDS を分割します。
signature
public TimerCounterValue ReadTimerCounter(Prefix prefix, string address);
public async Task<TimerCounterValue> ReadTimerCounterAsync(Prefix prefix, string address);
public TimerCounterValue[] BatchReadTimerCounter(Prefix prefix, string address, ushort length);
public async Task<TimerCounterValue[]> BatchReadTimerCounterAsync(Prefix prefix, string address, ushort length);
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 読出し対象のデバイス(T / C / CTH / CTC)。それ以外は NotSupportedException。 |
| address | string | 読出し対象の(先頭)アドレス。 |
| length | ushort | (BatchReadTimerCounter のみ)読み出す点数。 |
戻り値 · TimerCounterValue(Contact: 接点、Current: 現在値、Set: 設定値)、または その配列。CTH の接点・設定値は常に false / 0 です。
ラダープログラムで使用していない T / C の番号は、単点の読出しでもエラー E0(HostLinkException)になります。TC / TS / CC / CS は未使用の番号でも読み出せます。
現在値・設定値だけが必要なら TC / TS / CC / CS を Read<T> で、接点だけなら T / C を bool で読み出せます。TC / TS / CC / CS は 32 ビット(.D)のデバイスで、64 ビットの型と float は使えません。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
ReadTimerCounter.cs
TimerCounterValue t0 = kcpx.ReadTimerCounter(Prefix.T, "0");
Console.WriteLine($"{t0.Contact} {t0.Current} {t0.Set}");
TimerCounterValue[] cs = await kcpx.BatchReadTimerCounterAsync(Prefix.C, "0", 200);
uint tc0 = kcpx.Read<uint>(Prefix.TC, "0");
bool t0Contact = kcpx.Read<bool>(Prefix.T, "0");
WriteSetValue<T>
設定値書込み(WS / WSS) T / C / CTC の設定値を書き込みます。BatchWriteSetValue は連続した番号の設定値を書き込み、点数の上限を超えると WSS を分割します。対応する型は short / ushort / int / uint です。
signature
public void WriteSetValue<T>(Prefix prefix, string address, T value) where T : unmanaged;
public async Task WriteSetValueAsync<T>(Prefix prefix, string address, T value) where T : unmanaged;
public void BatchWriteSetValue<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
public async Task BatchWriteSetValueAsync<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 書込み対象のデバイス(T / C / CTC)。 |
| address | string | 書込み対象の(先頭)アドレス。 |
| value | T | (WriteSetValue)書き込む設定値。 |
| values | T[] | (BatchWriteSetValue)書き込む設定値の配列。 |
Write<T> で T / C に書き込むと現在値が変わります。設定値を変えるときはこちらを使用します。
書込みプロテクト中のプログラムでは、エラー E4(HostLinkException)になります。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
WriteSetValue<T>.cs
kcpx.WriteSetValue<uint>(Prefix.T, "0", 50);
await kcpx.BatchWriteSetValueAsync<uint>(Prefix.C, "0", [10, 20, 30]);
ForceSet / ForceReset
強制セット / リセット(ST / RS) ForceSet は指定したビットデバイスやタイマ・カウンタの接点を ON に、ForceReset は OFF にします。
signature
public void ForceSet(Prefix prefix, string address);
public async Task ForceSetAsync(Prefix prefix, string address);
public void ForceReset(Prefix prefix, string address);
public async Task ForceResetAsync(Prefix prefix, string address);
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 対象のデバイス。ForceSet は R / B / MR / LR / CR / VB / T / C、ForceReset はこれに加えて CTC。 |
| address | string | 対象のアドレス。 |
KV STUDIO シミュレータは応答が速いため、OFF の直後に ON にするとスキャンが間に入らず、立ち上がりを取りこぼす場合があります。100 ms 程度待ってください。
例外 · DeviceAddressException / NotSupportedException / ReceivePacketException / HostLinkException
ForceSet / ForceReset.cs
kcpx.ForceSet(Prefix.MR, "50001");
await kcpx.ForceResetAsync(Prefix.MR, "50001");
BatchForceSet / BatchForceReset
連続強制セット / リセット(STS / RSS) 指定したアドレスから連続したビットデバイスを ON / OFF にします。1 コマンドは 16 点までのため、16 点を超える場合は複数回の STS / RSS に分割します。
signature
public void BatchForceSet(Prefix prefix, string address, ushort count);
public async Task BatchForceSetAsync(Prefix prefix, string address, ushort count);
public void BatchForceReset(Prefix prefix, string address, ushort count);
public async Task BatchForceResetAsync(Prefix prefix, string address, ushort count);
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 対象のデバイス(R / B / MR / LR / CR / VB)。 |
| address | string | 対象の先頭アドレス。 |
| count | ushort | ON / OFF にする点数。 |
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
BatchForceSet / BatchForceReset.cs
kcpx.BatchForceSet(Prefix.MR, "0", 40);
await kcpx.BatchForceResetAsync(Prefix.MR, "0", 40);
MonitorRegist
モニタ登録(ビルダー)→ MonitorSession モニタ対象のデバイスを PLC に登録(MBS / MWS)し、繰り返し読み出すための MonitorSession を返します。bool はビットモニタ(MBS / MBR)、それ以外の型はワードモニタ(MWS / MWR)に振り分けられます。登録は一度だけ行い、MonitorSession.Read() で何度でも最新値を読み出せます。
signature
public MonitorSession MonitorRegist(Action<MonitorBuilder> configure);
public async Task<MonitorSession> MonitorRegistAsync(Action<MonitorBuilder> configure);
| 引数 | 型 | 説明 |
|---|
| configure | Action<MonitorBuilder> | モニタ対象のデバイスとコールバックを MonitorBuilder に追加する処理(Add<T>(prefix, address, onRead))。 |
戻り値 · MonitorSession。Read() / ReadAsync()(MBR / MWR)で各 onRead に変換済みの値を渡します。
ビット・ワードそれぞれ最大 120 点まで登録できます(long / ulong / double は 1 つで 2 点を使用)。超えると ArgumentOutOfRangeException です。リレーをワード系の型でモニタする場合は、チャンネル単位(ビット番号 00)で指定します。
新たに MonitorRegist すると、以前に作成したセッションの Read() は InvalidOperationException になります。PLC の再起動などで登録が消えた場合(読出し時に E0)は、再度登録してください。
KV STUDIO シミュレータはモニタに対応していないため、KcpXSimulator では NotSupportedException をスローします。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
MonitorRegist.cs
short dm0 = 0;
bool mr0 = false;
var session = kcpx.MonitorRegist(m => m
.Add<short>(Prefix.DM, "0", v => dm0 = v)
.Add<bool>(Prefix.MR, "0", v => mr0 = v));
session.Read();
await session.ReadAsync();
ReadOperatingMode / ChangeOperatingMode
動作モード確認 / 切替(?M / M0 / M1) ReadOperatingMode は PLC の動作モード(PROGRAM / RUN)を読み出します。ChangeOperatingMode は PROGRAM(M0)または RUN(M1)に切り替えます。
signature
public OperatingMode ReadOperatingMode();
public async Task<OperatingMode> ReadOperatingModeAsync();
public void ChangeOperatingMode(OperatingMode mode);
public async Task ChangeOperatingModeAsync(OperatingMode mode);
| 引数 | 型 | 説明 |
|---|
| mode | OperatingMode | (ChangeOperatingMode)切り替える動作モード。未定義の値は ArgumentOutOfRangeException。 |
戻り値 · (ReadOperatingMode)OperatingMode。ラダーが登録されていない場合は Program を返します。
RUN への切替は、ラダーが登録されていない場合(または本体のスイッチが PROG の場合)に E2、CPU エラーが解除されていない場合に E5 の HostLinkException になります。
RUN への切替は、応答を受け取ってから実際に RUN へ移行するまでに時間がかかる場合があります(KV-7500 で数十ミリ秒)。移行を待つ場合は ReadOperatingMode で確認してください。
例外 · ArgumentOutOfRangeException / ReceivePacketException / HostLinkException
ReadOperatingMode / ChangeOperatingMode.cs
kcpx.ChangeOperatingMode(OperatingMode.Run);
while (kcpx.ReadOperatingMode() != OperatingMode.Run)
{
await Task.Delay(10);
}
Continuous*
低レベル(HostLink・1 コマンド) 基底クラス HostLink のメソッドで、上位リンクのコマンドを 1 回だけ送信します(RDS / WRS / WSS / STS / RSS)。自動分割は行いません。通常は Batch~ 系のメソッドを使用します。
signature
public T[] ContinuousRead<T>(Prefix prefix, string address, ushort length) where T : unmanaged;
public void ContinuousWrite<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
public TimerCounterValue[] ContinuousReadTimerCounter(Prefix prefix, string address, ushort length);
public void ContinuousWriteSetValue<T>(Prefix prefix, string address, T[] values) where T : unmanaged;
public void ContinuousForceSet(Prefix prefix, string address, byte count);
public void ContinuousForceReset(Prefix prefix, string address, byte count);
| 引数 | 型 | 説明 |
|---|
| prefix | Prefix | 対象のデバイス(Prefix)。 |
| address | string | 対象の先頭アドレス。 |
| length | ushort | 読み出す要素数。 |
| values | T[] | 書き込む値の配列。 |
| count | byte | (ContinuousForceSet / Reset)点数(1〜16)。 |
戻り値 · (ContinuousRead / ContinuousReadTimerCounter)読み出した値の配列。
点数が 1 コマンドの上限を超える場合は ArgumentOutOfRangeException をスローします。
例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException
Continuous*.cs
ushort[] dm = kcpx.ContinuousRead<ushort>(Prefix.DM, "0", 1000);
kcpx.ContinuousForceSet(Prefix.R, "100", 16);
Dispose
インスタンス破棄 接続を閉じ、使用済みのリソースを解放します。using 文で囲めば自動的に呼び出されます。
signature
public virtual void Dispose();