/// <summary> /// ワードデバイスの一括読出しをおこないます。ビットデバイスを読み出す場合は <see cref="ReadBitDevice"/>()、ダブルワードデバイスを読み出す場合は <see cref="ReadDoubleWordDevice"/>() を使用してください。 /// </summary> /// <param name="type">デバイス種別を指定します。</param> /// <param name="topAddress">読み出すデバイスの先頭アドレスを指定します。</param> /// <param name="dataNumbers">読み出すデバイスのワード数を指定します。</param> /// <returns>終了コードと受信処理結果のペアを返します。</returns> public KeyValuePair <McEndCode, short[]> ReadWordDevice(McWordDeviceType type, int topAddress, int dataNumbers) { if (this.IsDisposed) { throw new ObjectDisposedException(ObjectDisposedExceptionMessage, null as Exception); } if (type.IsBitDevice()) { throw new ArgumentException("ワードデバイスを指定してください。", "type"); } return(this._connection.ReadDevice(type, topAddress, dataNumbers, McConnection.WordDeviceReader)); }
/// <summary> /// ダブルワードデバイスの一括読出しをおこないます。ビットデバイスを読み出す場合は <see cref="ReadBitDevice"/>()、ワードデバイスを読み出す場合は <see cref="ReadWordDevice"/>() を使用してください。 /// </summary> /// <param name="type">デバイス種別を指定します。</param> /// <param name="topAddress">読み出すデバイスの先頭アドレスを指定します。</param> /// <param name="dataNumbers">読み出すデバイスのワード数を指定します。読み出したワード数分をダブルワードとして扱います。ダブルワード 1 点につきワード数 2 個として指定してください。</param> /// <returns>終了コードと受信処理結果のペアを返します。</returns> public KeyValuePair <McEndCode, Int32[]> ReadDoubleWordDevice(McWordDeviceType type, int topAddress, int dataNumbers) { if (this.IsDisposed) { throw new ObjectDisposedException(ObjectDisposedExceptionMessage, null as Exception); } if (type.IsBitDevice()) { throw new ArgumentException("ワードデバイスを指定してください。", "type"); } var pair = this._connection.ReadDevice(type, topAddress, dataNumbers, McConnection.WordDeviceReader); Int32[] values = null; if (pair.Key == McEndCode.Success) { // ワード単位で読み出した結果をダブルワード単位に変換する values = pair.Value.Chunk(2).Select(x => BitConverter.ToInt32(x.SelectMany(y => BitConverter.GetBytes(y)).ToArray(), 0)).ToArray(); } return(new KeyValuePair <McEndCode, Int32[]>(pair.Key, values)); }
/// <summary> /// ビットデバイスかどうかを確認します。 /// </summary> /// <param name="type"></param> /// <returns></returns> internal static bool IsBitDevice(this McWordDeviceType type) { return(BitDeviceTypes.Any(x => (byte)x == (byte)type)); }
/// <summary> /// ワード単位の一括読出しをおこないます。 /// </summary> /// <typeparam name="T">受信処理結果の型を表します。</typeparam> /// <param name="type">デバイス種別を指定します。</param> /// <param name="topAddress">読み出すデバイスの先頭アドレスを指定します。</param> /// <param name="dataNumbers">読み出すデバイスのワード数を指定します。</param> /// <param name="func">受信処理を指定します。</param> /// <returns>終了コードと受信処理結果のペアを返します。</returns> public KeyValuePair <McEndCode, T> ReadDevice <T>(McWordDeviceType type, int topAddress, int dataNumbers, Func <IEnumerable <byte>, int, T> func) { if (this._isDisposed) { throw new ObjectDisposedException("Dispose されたものは使用できません。", null as Exception); } if (!this.IsConnected) { throw new Exception("接続していません。"); } // 要求データ作成 var command = new byte[] { 0x01, 0x04 }; var subCommand = new byte[] { 0x00, 0x00 }; var address = BitConverter.GetBytes(topAddress).Take(3).ToArray(); var deviceCode = new byte[] { (byte)type }; var dataNumbersBytes = BitConverter.GetBytes((ushort)dataNumbers); var request = new byte[command.Length + subCommand.Length + address.Length + deviceCode.Length + dataNumbersBytes.Length]; Array.Copy(command, 0, request, 0, command.Length); Array.Copy(subCommand, 0, request, command.Length, subCommand.Length); Array.Copy(address, 0, request, command.Length + subCommand.Length, address.Length); Array.Copy(deviceCode, 0, request, command.Length + subCommand.Length + address.Length, deviceCode.Length); Array.Copy(dataNumbersBytes, 0, request, command.Length + subCommand.Length + address.Length + deviceCode.Length, dataNumbersBytes.Length); // 要求伝文生成 var bytes = this._3eFrame.CreateRequestMessage(request); // 伝文送信 this._stream.Write(bytes, 0, bytes.Length); // 応答受信 var n = this._stream.Read(this._buffer, 0, this._buffer.Length); // サブヘッダ取得 //ushort subHeader = 0; //if (n >= 2) subHeader = BitConverter.ToUInt16(this._buffer, 0); // アクセス経路取得 //if (n >= 7) ... // 応答データ長 ushort length = 0; if (n >= 9) { length = BitConverter.ToUInt16(this._buffer, 7); } // 終了コード McEndCode endCode = McEndCode.UnKnown; if (n >= 11) { endCode = (McEndCode)BitConverter.ToUInt16(this._buffer, 9); } // データ部取得 T data = default(T); if (endCode == McEndCode.Success) { var dataLength = length - 2; // 終了コード 2 バイト分を除いた値がデータ部の長さ if ((dataLength > 0) && (n == 11 + dataLength)) { data = func(this._buffer, dataNumbers); } } return(new KeyValuePair <McEndCode, T>(endCode, data)); }