Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        /// <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));
 }
Esempio n. 4
0
        /// <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));
        }