| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | using System;using System.Collections.Generic;using PLC.Siemens.Protocol.Common;using PLC.Siemens.Protocol.ReadData;using PLC.Siemens.Protocol.WriteData;using PLC.Siemens.O;namespace PLC.Siemens.ProtocolHandle{    public class WriteHandle: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Ö»ÄÜдһλ");            const int rhSize = 10 +    // Request header                               2 +                       // FunWrite+ItemCount (of TReqFunWriteParams)                               12 +// 1 item reference                               4; // ReturnCode+TransportSize+DataLength            var sizeByte = DataItem.SizeByte;            var maxCount = (ushort)((PduLength - rhSize) / sizeByte);            var totalCount = DataItem.Length;            var offset = DataItem.Start;            DataItem currentItem = new DataItem()            {                AreaType = DataItem.AreaType,                DataType = DataItem.DataType,                Db = DataItem.Db,                Start = DataItem.Start,                Data = DataItem.Data,                Length = 0,                DataOffset = 0            };            while (totalCount > 0)            {                var curCount = totalCount;                if (curCount > maxCount)                    curCount = maxCount;                currentItem.Start = offset;                currentItem.Length = curCount;                WriteRequest write = new WriteRequest();                write.DataItems = new List<DataItem>() {currentItem};                WriteResponse res = sender.IsoSend<WriteRequest, WriteResponse>(write);                if (res.Header.Error == 0x0000)                {                    var size = (ushort)(currentItem.SizeByte * curCount);                    offset += size;                    currentItem.DataOffset += size;                    totalCount -= curCount;                }                else                    break;            }            ResultCode = ResultCode.OKFF;        }    }}
 |