using PLC.Siemens.Protocol.ReadData;
using PlcSiemens.O;
using PlcSiemens.Protocol.Common;
using PlcSiemens.Protocol.ReadData;
namespace PlcSiemens.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 Exception("plc连接异常");
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;
}
}
}