ReadHandle.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. namespace Houdar.PLC.Driver.Simenss.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 ArgumentException("发送消息异常");
  48. if (res.DataItems[0].Data.Length != curCount)
  49. {
  50. string msg = string.Format("读取DB[{0}]长度[{1}]与返回结果长度[{2}]不一致。", read.ListItems[0].Db, read.ListItems[0].Length, res.DataItems[0].DataLength);
  51. throw new ArgumentException(msg);
  52. }
  53. ResultCode = res.Header.Error;
  54. if (ResultCode != ResultCode.OK)
  55. {
  56. break;
  57. }
  58. ResultCode = ResultCode.OKFF;
  59. foreach (var b in res.DataItems)
  60. {
  61. DataItem.Err = (ResultCode)b.ReturnCode;
  62. if (DataItem.Err == ResultCode.OKFF)
  63. {
  64. Array.Copy(b.Data, 0, DataItem.Data, curCopyPos, currentItem.SizeByte * curCount);
  65. }
  66. else
  67. {
  68. ResultCode = (ResultCode)b.ReturnCode;
  69. break;
  70. }
  71. }
  72. curCopyPos += (ushort)(currentItem.SizeByte * curCount);
  73. offset += (ushort)(currentItem.SizeByte * curCount);//res.DataItems[0].DataLength;
  74. totalCount -= curCount;
  75. }
  76. if (ResultCode == ResultCode.OKFF) ResultCode = ResultCode.OK;
  77. }
  78. }
  79. }