WriteHandle.cs 2.4 KB

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