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 { /// /// /// 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 {currentItem}; ReadResponse res = sender.IsoSend(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; } } }