WriteHandle.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Collections.Generic;
  3. using Houdar.PLC.Driver.Simenss.Protocol.Common;
  4. using Houdar.PLC.Driver.Simenss.Protocol.ReadData;
  5. using Houdar.PLC.Driver.Simenss.Protocol.WriteData;
  6. namespace Houdar.PLC.Driver.Simenss.ProtocolHandle
  7. {
  8. public class WriteHandle:IPacketHandle
  9. {
  10. public ushort PduLength { get; set; }
  11. public DataItem DataItem { get; set; }
  12. public ResultCode ResultCode { get; private set; }
  13. public void Handle(IIsoSender sender)
  14. {
  15. if (DataItem.Db > 65535 || DataItem.Length < 1)
  16. throw new ArgumentException("²ÎÊýÒì³£");
  17. if (DataItem.DataType == DataType.Bit && DataItem.Length > 1)
  18. throw new ArgumentException("BitÖ»ÄÜдһλ");
  19. const int rhSize = 10 + // Request header
  20. 2 + // FunWrite+ItemCount (of TReqFunWriteParams)
  21. 12 +// 1 item reference
  22. 4; // ReturnCode+TransportSize+DataLength
  23. var sizeByte = DataItem.SizeByte;
  24. var maxCount = (ushort)((PduLength - rhSize) / sizeByte);
  25. var totalCount = DataItem.Length;
  26. var offset = DataItem.Start;
  27. DataItem currentItem = new DataItem()
  28. {
  29. AreaType = DataItem.AreaType,
  30. DataType = DataItem.DataType,
  31. Db = DataItem.Db,
  32. Start = DataItem.Start,
  33. Data = DataItem.Data,
  34. Length = 0,
  35. DataOffset = 0
  36. };
  37. while (totalCount > 0)
  38. {
  39. var curCount = totalCount;
  40. if (curCount > maxCount)
  41. curCount = maxCount;
  42. currentItem.Start = offset;
  43. currentItem.Length = curCount;
  44. WriteRequest write = new WriteRequest();
  45. write.DataItems = new List<DataItem>() {currentItem};
  46. WriteResponse res = sender.IsoSend<WriteRequest, WriteResponse>(write);
  47. if (res.Header.Error == 0x0000)
  48. {
  49. var size = (ushort)(currentItem.SizeByte * curCount);
  50. offset += size;
  51. currentItem.DataOffset += size;
  52. totalCount -= curCount;
  53. }
  54. else
  55. break;
  56. }
  57. ResultCode = ResultCode.OKFF;
  58. }
  59. }
  60. }