ReadHandle.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections.Generic;
  3. using PLC.Siemens.Protocol.Common;
  4. using PLC.Siemens.Protocol.ReadData;
  5. using PLC.Siemens.O;
  6. namespace PLC.Siemens.ProtocolHandle
  7. {
  8. /// <summary>
  9. ///
  10. /// </summary>
  11. public class ReadHandle: IPacketHandle
  12. {
  13. public ushort PduLength { get; set; }
  14. public DataItem DataItem { get; set; }
  15. public ResultCode ResultCode { get; private set; }
  16. public void Handle(IIsoSender sender)
  17. {
  18. if (DataItem.Db > 65535 || DataItem.Length < 1)
  19. throw new ArgumentException("参数异常");
  20. if (DataItem.DataType == DataType.Bit && DataItem.Length > 1)
  21. throw new ArgumentException("Bit只能读取一位");
  22. var sizeByte = DataItem.SizeByte;
  23. var maxCount = (ushort)((PduLength - 0x0A - 6 - 2) / sizeByte);
  24. var totalCount = DataItem.Length;
  25. var offset = DataItem.Start;
  26. var curCopyPos = 0;
  27. DataItem.Data = new byte[sizeByte * totalCount];
  28. DataItem currentItem = new DataItem()
  29. {
  30. AreaType = DataItem.AreaType,
  31. DataType = DataItem.DataType,
  32. Db = DataItem.Db,
  33. Start = DataItem.Start,
  34. Length = 0
  35. };
  36. ResultCode = ResultCode.OKFF;
  37. while (totalCount > 0 && ResultCode == ResultCode.OKFF)
  38. {
  39. var curCount = totalCount;
  40. if (curCount > maxCount)
  41. curCount = maxCount;
  42. currentItem.Length = curCount;
  43. currentItem.Start = offset;
  44. ReadRequest read = new ReadRequest();
  45. read.ListItems = new List<DataItem> { currentItem };
  46. ReadResponse res = sender.IsoSend<ReadRequest, ReadResponse>(read);
  47. if (res == null)
  48. throw new Exception("plc连接异常");
  49. ResultCode = res.Header.Error;
  50. if (ResultCode != ResultCode.OK)
  51. {
  52. break;
  53. }
  54. ResultCode = ResultCode.OKFF;
  55. foreach (var b in res.DataItems)
  56. {
  57. DataItem.Err = (ResultCode)b.ReturnCode;
  58. if (DataItem.Err == ResultCode.OKFF)
  59. {
  60. Array.Copy(b.Data, 0, DataItem.Data, curCopyPos, currentItem.SizeByte * curCount);
  61. }
  62. else
  63. {
  64. ResultCode = (ResultCode)b.ReturnCode;
  65. break;
  66. }
  67. }
  68. curCopyPos += (ushort)(currentItem.SizeByte * curCount);
  69. offset += (ushort)(currentItem.SizeByte * curCount);//res.DataItems[0].DataLength;
  70. totalCount -= curCount;
  71. }
  72. if (ResultCode == ResultCode.OKFF) ResultCode = ResultCode.OK;
  73. }
  74. }
  75. }