// DOCUMENTATION

API リファレンス

KcpX の公開 API をクラス図・接続からメソッドごとの読み書き・モニタ・例外処理まで解説します。すべてのメソッドには ~Async 版があります。

概要

KcpX クラスは、上位リンクのコマンドを 1 回ずつ発行する HostLink クラスを拡張し、点数の上限を超える読み書きの自動分割や、統合読み書き・モニタなどを加えたクラスです。通常はこの KcpX クラスを使用します。API は McpX と同じ形にそろえています。

Namespace

KcpXLib

Assembly

KcpXLib.dll

継承階層

object → BasePlc → HostLink → KcpX

実装インターフェース: IDisposable, IPlc

NuGet からパッケージを追加します。対象は .NET 7 / 8 / 9 と .NET Standard 2.0(.NET Core 2.0+ / .NET Framework 4.6.1+)です。

terminal
dotnet add package KcpX

KcpXLib の public 型のクラス図です。中核は object → BasePlc → HostLink → KcpX の継承スパインです。KV STUDIO シミュレータに接続する KcpXSimulator は、その KcpX を継承しています。

object «BCL»
BasePlc «abstract»
implements IDisposable
  • # BasePlc(transport)
  • + Request(packet)
  • + RequestAsync(packet)
  • + Dispose()
HostLink «partial»
implements IPlc
  • + Series : PlcSeries
  • + Read<T>() / Write<T>()
  • + ContinuousRead<T>() / ContinuousWrite<T>()
  • + ReadTimerCounter() / ContinuousReadTimerCounter()
  • + WriteSetValue<T>() / ContinuousWriteSetValue<T>()
  • + ForceSet() / ForceReset()
  • + ContinuousForceSet() / ContinuousForceReset()
  • + ReadOperatingMode() / ChangeOperatingMode()
KcpX «partial»
implements IDisposable, IPlc
  • + KcpX(ip, port, isUdp, …)
  • + BatchRead<T>() / BatchWrite<T>()
  • + Read(configure) / Write(configure)
  • + BatchReadTimerCounter()
  • + BatchWriteSetValue<T>()
  • + BatchForceSet() / BatchForceReset()
  • + MonitorRegist(configure) : MonitorSession
  • + ReadInt16() / BatchWriteDouble() …
KcpXSimulator «sealed»
  • + KcpXSimulator(ip, port, timeout)
  • TCP · PlcSeries.KV8000
  • MonitorRegist → NotSupportedException

▸ は継承(派生方向)を表します。

インターフェース · KcpXLib.Interfaces

IPlc

  • Series
  • Request / RequestAsync

IPlcTransport

: IDisposable

  • Request / RequestAsync

IPacketBuilder

  • ToAsciiBytes()

IPlcCommand<T>

: IPacketBuilder

  • Execute(plc) / ExecuteAsync(plc)

列挙型 · KcpXLib.Enums

Prefix «enum»
  • R B MR LR CR VB DM EM …
  • 全 24 種
PlcSeries «enum»
  • KV8000
  • KV7000
  • KV5000
  • KVNano
OperatingMode «enum»
  • Program
  • Run
HostLinkErrorCode «enum»
  • E0 E1 E2 E4 E5 E6

例外 · KcpXLib.Exceptions

いずれも Exception を継承

DeviceAddressExceptionHostLinkExceptionReceivePacketException

継承関係のまとめ

型種別継承 / 実装
BasePlc抽象クラスIDisposable
HostLinkクラス(partial)BasePlc, IPlc
KcpXクラス(partial)HostLink
KcpXSimulatorクラス(sealed)KcpX
ReadBuilder / WriteBuilder / MonitorBuilderクラス(sealed)object
MonitorSessionクラス(sealed)object
TimerCounterValue構造体(readonly)ValueType
IPlcTransportインターフェースIDisposable
IPlcCommand<T>インターフェースIPacketBuilder
DeviceAddressException例外クラスException
HostLinkException例外クラスException
ReceivePacketException例外クラスException
凡例 · 継承(実線+中空三角)/ インターフェース実装(破線+中空三角)/ 依存(破線+矢印)。Exception・IDisposable は .NET 標準(BCL)型で KcpXLib 外です。

PLC(EtherNet/IP ユニット・CPU 内蔵ポート)の上位リンク通信の設定に合わせた接続情報を指定してインスタンスを生成します。PLC 側にラダープログラムは不要です。生成時に接続し、破棄時に切断します。

KcpX (constructor)
public KcpX(
    string ip,
    int port = DEFAULT_PORT,          // 8501
    bool isUdp = false,
    ushort timeoutMilliseconds = 5000,
    PlcSeries series = PlcSeries.KV8000
)
引数型説明
ipstringPLC の IP アドレス。
portint上位リンクのポート番号。既定は 8501(KcpX.DEFAULT_PORT)。
isUdpboolUDP 交信を行う場合に true。既定は TCP 交信(false)。
timeoutMillisecondsushort通信タイムアウト(ミリ秒)。0 は無期限。TCP でタイムアウトや通信エラーが起きると接続を閉じるため、続けて通信するにはインスタンスを作り直します。既定は 5000。
seriesPlcSeriesPLC のシリーズ。1 コマンドで読み書きできる点数の上限の判定に使用します。既定は KV-8000(PlcSeries.KV8000)。
例外 · TimeoutException(接続や通信がタイムアウト)/ SocketException(接続が拒否された など)/ IOException(タイムアウトや通信エラーで TCP の接続が閉じた後の要求。インスタンスを作り直してください)/ HostLinkException(PLC からエラーレスポンス)/ ReceivePacketException(レスポンスが不正)
Program.cs
using KcpXLib;
using KcpXLib.Enums;

// TCP で接続(上位リンクのポート 8501)。series は点数の上限の判定に使用
using (var kcpx = new KcpX("192.168.12.89", 8501, series: PlcSeries.KV7000))
{
    // ここで読み書き
}

// UDP で接続
using var udp = new KcpX("192.168.12.89", isUdp: true);

シミュレータ接続(KcpXSimulator)

KcpXSimulator は、KV STUDIO のシミュレータに上位リンク(TCP)で接続するクラスです(KV STUDIO Ver.12.41 で確認)。KcpX を継承しているので、読み書きの API は実機と同じものがそのまま使えます。PLC が手元になくても開発やテストを進められます。

KcpXSimulator
public KcpXSimulator(
    string ip = "127.0.0.1",
    int port = DEFAULT_PORT,          // 8501
    ushort timeoutMilliseconds = 5000
);
引数型説明
ipstringシミュレータが動作している PC の IP アドレス。既定は 127.0.0.1。
portint上位リンクのポート番号。既定は 8501。
timeoutMillisecondsushort通信タイムアウト(ミリ秒)。0 は無期限。既定は 5000。
対象 PLC は KV-8000 / KV-X500 のプロジェクトです。交信は TCP に固定され、点数の上限は PlcSeries.KV8000 として判定します。
シミュレータは 127.0.0.1 でのみ待ち受けます。別の PC から接続する場合は、シミュレータ側の PC で 8501 を 127.0.0.1 へ転送してください(netsh interface portproxy など)。
シミュレータはモニタ(MBS / MBR / MWS / MWR)に応答しないため、MonitorRegist は NotSupportedException をスローします。
接続できるシミュレータは 1 台のみです。複数起動した場合は、最初に起動したシミュレータに接続されます。
Program.cs
using KcpXLib;
using KcpXLib.Enums;

// 127.0.0.1:8501 の KV STUDIO シミュレータに接続
using var sim = new KcpXSimulator();
// 別の PC で動作するシミュレータ(ポートフォワーディングが必要)
using var remote = new KcpXSimulator("192.168.12.90");

// 読み書きの API は KcpX と同じ
sim.Write<short>(Prefix.DM, "100", 123);
short dm0 = sim.Read<short>(Prefix.DM, "0");

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;
引数型説明
prefixPrefix読出し対象のデバイス(Prefix)。
addressstring読出し対象のアドレス。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");

// MR1015 = チャンネル 10 のビット 15
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;
引数型説明
prefixPrefix読出し対象のデバイス(Prefix)。
addressstring読出し対象の先頭アドレス。
lengthushort読み出す要素数(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
// 3000 点を 1000 点ずつ 3 回の RDS に自動分割
bool[] mrArr = kcpx.BatchRead<bool>(Prefix.MR, "0", 3000);

// int(.L)は 1 コマンド 500 点まで → 2 回に分割
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;
引数型説明
prefixPrefix書込み対象のデバイス(Prefix)。
addressstring書込み対象のアドレス。
valueT書き込む値。
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;
引数型説明
prefixPrefix書込み対象のデバイス(Prefix)。
addressstring書込み対象の先頭アドレス。
valuesT[]書き込む値の配列。

例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException

BatchWrite<T>.cs
// DM0〜DM1 に 1234、DM2〜DM3 に 5678 を符号付き 32 ビットで書込み
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);
引数型説明
configureAction<ReadBuilder>読み出すデバイス(範囲/単一)とコールバックを ReadBuilder に追加する処理。

戻り値 · なし(読み出した値は各 onRead コールバックへ渡されます)。

範囲指定は BatchRead と同じく、点数の上限を超えると自動で分割されます。すべての型に対応しています。
デバイスごとに別のコマンドで読み出すため、全デバイスを同一スキャンで取得することは保証されません。

例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException

Read(configure).cs
short[] block = [];
int     total = 0;
bool    mr10  = false;

// 点数あり → 連続読出し(RDS)
// 点数なし → 単一読出し(RD)
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);
引数型説明
configureAction<WriteBuilder>書き込むデバイス(範囲/単一)と値を WriteBuilder に追加する処理。
追加した順に書き込みます。

例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException

Write(configure).cs
// 配列 → 連続書込み(WRS)
// 単一の値 → 単一書込み(WR)
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);
引数型説明
prefixPrefix読出し対象のデバイス(T / C / CTH / CTC)。それ以外は NotSupportedException。
addressstring読出し対象の(先頭)アドレス。
lengthushort(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);

// 現在値だけ・接点だけなら TC / TS / CC / CS や bool で読める
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;
引数型説明
prefixPrefix書込み対象のデバイス(T / C / CTC)。
addressstring書込み対象の(先頭)アドレス。
valueT(WriteSetValue)書き込む設定値。
valuesT[](BatchWriteSetValue)書き込む設定値の配列。
Write<T> で T / C に書き込むと現在値が変わります。設定値を変えるときはこちらを使用します。
書込みプロテクト中のプログラムでは、エラー E4(HostLinkException)になります。

例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException

WriteSetValue<T>.cs
// T0 の設定値を 50 に変更(WS)
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);
引数型説明
prefixPrefix対象のデバイス。ForceSet は R / B / MR / LR / CR / VB / T / C、ForceReset はこれに加えて CTC。
addressstring対象のアドレス。
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);
引数型説明
prefixPrefix対象のデバイス(R / B / MR / LR / CR / VB)。
addressstring対象の先頭アドレス。
countushortON / OFF にする点数。

例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException

BatchForceSet / BatchForceReset.cs
// 40 点 → 16 + 16 + 8 点の 3 回の STS / RSS に分割
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);
引数型説明
configureAction<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;

// 登録は一度だけ(MBS / MWS)
var session = kcpx.MonitorRegist(m => m
    .Add<short>(Prefix.DM, "0", v => dm0 = v)
    .Add<bool>(Prefix.MR,  "0", v => mr0 = v));

// あとは何度でも読み出し(MBR / MWR)
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);
引数型説明
modeOperatingMode(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);

// 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);
// + ~Async
引数型説明
prefixPrefix対象のデバイス(Prefix)。
addressstring対象の先頭アドレス。
lengthushort読み出す要素数。
valuesT[]書き込む値の配列。
countbyte(ContinuousForceSet / Reset)点数(1〜16)。

戻り値 · (ContinuousRead / ContinuousReadTimerCounter)読み出した値の配列。

点数が 1 コマンドの上限を超える場合は ArgumentOutOfRangeException をスローします。

例外 · DeviceAddressException / ArgumentOutOfRangeException / NotSupportedException / ReceivePacketException / HostLinkException

Continuous*.cs
// 1 回のコマンドで送信。上限を超えると ArgumentOutOfRangeException
ushort[] dm = kcpx.ContinuousRead<ushort>(Prefix.DM, "0", 1000);
kcpx.ContinuousForceSet(Prefix.R, "100", 16);

Dispose

インスタンス破棄

接続を閉じ、使用済みのリソースを解放します。using 文で囲めば自動的に呼び出されます。

signature
public virtual void Dispose();

ジェネリックメソッドを型ごとにラップした利便性メソッド群です(KcpX.Compat.cs)。各メソッドに同期版・非同期版(~Async)があります。

カテゴリメソッド例ベース
単一読出しReadBool / ReadInt16 / ReadInt32 …Read<T>
一括読出しBatchReadBool / BatchReadInt16 / BatchReadInt32 …BatchRead<T>
単一書込みWriteBool / WriteInt16 / WriteInt32 …Write<T>
一括書込みBatchWriteBool / BatchWriteInt16 / BatchWriteInt32 …BatchWrite<T>

対応型(サフィックス): Bool·Int16·UInt16·Int32·UInt32·Int64·UInt64·Single·Double

型引数 T に指定できる型と、送信される上位リンクのデータ形式です。

型データ形式説明
bool—ビット。ビットデバイス(R / B / MR / LR / CR / VB)と、T / C / CTH / CTC の接点。
ushort.U10 進 16 ビット符号なし。
short.S10 進 16 ビット符号あり。
uint.D10 進 32 ビット符号なし(2 ワード)。指定したデバイスが下位ワード。
int.L10 進 32 ビット符号あり(2 ワード)。
float.D32 ビットのビット列を .D で読み書き(2 ワード)。
ulong.D × 2.D の 2 点(4 ワード)。
long.D × 2.D の 2 点(4 ワード)。
double.D × 2.D の 2 点(4 ワード)。

Namespace: KcpXLib.Enums

Prefix — デバイスの接頭辞(例: DM100 の DM)

メンバー番号の書式説明
Rch + bitリレー(例: "1015" = チャンネル 10 のビット 15)
BHEXリンクリレー
MRch + bit内部補助リレー
LRch + bitラッチリレー
CRch + bitコントロールリレー
VBHEXワークリレー
DMDECデータメモリ
EMDEC拡張データメモリ
FMDECファイルレジスタ
ZFDECファイルレジスタ(連番)
WHEXリンクレジスタ
TMDECテンポラリデータメモリ
ZDECインデックスレジスタ
TDECタイマ(接点・現在値・設定値)
TCDECタイマ現在値
TSDECタイマ設定値
CDECカウンタ(接点・現在値・設定値)
CCDECカウンタ現在値
CSDECカウンタ設定値
CTHDEC高速カウンタ
CTCDEC高速カウンタコンパレータ
ATDECデジタルトリマ
CMDECコントロールメモリ
VMDECワークメモリ

PlcSeries

KV8000KV-8000 / KV-8000A
KV7000KV-7500 / KV-7300
KV5000KV-5500 / KV-5000 / KV-3000
KVNanoKV Nano シリーズ(KV-NC1EP 経由)

OperatingMode

ProgramPROGRAM モード(ラダー未登録の場合を含む)
RunRUN モード

HostLinkErrorCode

E0デバイス番号異常(範囲外、未使用のタイマ・カウンタ、モニタ未登録での読出し など)
E1コマンド異常(未対応のコマンド、書式の誤り)
E2プログラム未登録
E4書込み禁止(書込みプロテクト中の設定値変更)
E5本体エラー(CPU エラー未解除)
E6コメントなし

Namespace: KcpXLib.Exceptions · いずれも System.Exception を継承します。通信のタイムアウトは .NET 標準の TimeoutException、接続の拒否は SocketException、デバイスと型の組み合わせが使えない場合は NotSupportedException でスローされます。

DeviceAddressException

デバイスアドレスの例外。アドレスの書式が不正な場合(10 進デバイスに数字以外、16 進デバイスに変換できない文字列、リレーのビット番号が 00〜15 の範囲外 など)に、送信前にスローされます。

HostLinkException

上位リンクの交信例外。PLC からエラーレスポンス(E0〜E6)を受信した場合にスローされます。受信したエラーコードは ErrorCode プロパティ(HostLinkErrorCode)で取得できます。

ReceivePacketException

受信パケットの例外。PLC から受け取ったレスポンスの内容が不正な場合にスローされます。

独自コマンドの追加や低レベルな拡張を行う場合の型です。

KcpXLib.HostLink

上位リンクのコマンドを 1 回ずつ発行するクラス。KcpX の基底です。点数の上限を超える読み書きは KcpX を使用してください。

KcpXLib.Interfaces

IPlc / IPlcTransport / IPlcCommand<T> / IPacketBuilder。独自コマンドの追加やトランスポート差し替えなど、低レベルな拡張に使用します。

KcpXLib.Abstracts

BasePlc(PLC 通信抽象クラス)。HostLink の基底で、Request / RequestAsync で生のコマンドを送受信します。

関連リンク

※ 本ページは KcpX v0.1.0 のソースコードと XML ドキュメントコメント(KcpXLib namespace)を整理したものです。最新かつ正確な仕様は GitHub リポジトリを参照してください。