WriteHandle.cs 2.4 KB

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