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;
- }
- }
- }
|