| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | using System;using System.Collections.Generic;using Houdar.PLC.Driver.Simenss.Protocol.Common;using Houdar.PLC.Driver.Simenss.Protocol.ReadData;namespace Houdar.PLC.Driver.Simenss.ProtocolHandle{    /// <summary>    ///     /// </summary>    public class ReadHandle: IPacketHandle    {        public ushort PduLength { get; set; }        public DataItem DataItem { get; set; }        public ResultCode ResultCode { get; private set; }        public void Handle(IIsoSender sender)        {            if (DataItem.Db > 65535 || DataItem.Length < 1)                throw new ArgumentException("参数异常");            if (DataItem.DataType == DataType.Bit && DataItem.Length > 1)                throw new ArgumentException("Bit只能读取一位");            var sizeByte = DataItem.SizeByte;            var maxCount = (ushort)((PduLength - 0x0A - 6 - 2) / sizeByte);            var totalCount = DataItem.Length;            var offset = DataItem.Start;            var curCopyPos = 0;            DataItem.Data = new byte[sizeByte * totalCount];            DataItem currentItem = new DataItem()            {                AreaType = DataItem.AreaType,                DataType = DataItem.DataType,                Db = DataItem.Db,                Start = DataItem.Start,                Length = 0            };            ResultCode = ResultCode.OKFF;            while (totalCount > 0 && ResultCode == ResultCode.OKFF)            {                var curCount = totalCount;                if (curCount > maxCount)                    curCount = maxCount;                currentItem.Length = curCount;                currentItem.Start = offset;                ReadRequest read = new ReadRequest();                read.ListItems = new List<DataItem> {currentItem};                ReadResponse res = sender.IsoSend<ReadRequest, ReadResponse>(read);                if (res == null)                    throw new ArgumentException("发送消息异常");                if (res.DataItems[0].Data.Length != curCount)                {                    string msg = string.Format("读取DB[{0}]长度[{1}]与返回结果长度[{2}]不一致。", read.ListItems[0].Db, read.ListItems[0].Length, res.DataItems[0].DataLength);                    throw new ArgumentException(msg);                }                ResultCode = res.Header.Error;                if (ResultCode != ResultCode.OK)                {                    break;                }                ResultCode = ResultCode.OKFF;                foreach (var b in res.DataItems)                {                    DataItem.Err = (ResultCode)b.ReturnCode;                    if (DataItem.Err == ResultCode.OKFF)                    {                        Array.Copy(b.Data, 0, DataItem.Data, curCopyPos, currentItem.SizeByte * curCount);                    }                    else                    {                        ResultCode = (ResultCode)b.ReturnCode;                        break;                    }                }                curCopyPos += (ushort)(currentItem.SizeByte * curCount);                offset += (ushort)(currentItem.SizeByte * curCount);//res.DataItems[0].DataLength;                totalCount -= curCount;            }            if (ResultCode == ResultCode.OKFF) ResultCode = ResultCode.OK;        }    }}
 |