ReadHandle.cs 2.9 KB

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