SzlHandle.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using PlcSiemens.O;
  2. using PlcSiemens.Protocol.Common;
  3. using PlcSiemens.Protocol.Szl;
  4. namespace PlcSiemens.ProtocolHandle
  5. {
  6. public class SzlHandle : IPacketHandle
  7. {
  8. public SzlCmd SzlCmd { get; set; }
  9. public SzlRequest SzlRequestFirst { get; set; }
  10. public SzlRequest SzlRequestNext { get; set; }
  11. public SzlResponse SzlResponseFirst { get; set; }
  12. public SzlNextResponse SzlNextResponseNext { get; set; }
  13. public ResultCode ResultCode
  14. {
  15. get;
  16. set;
  17. }
  18. public void Handle(IIsoSender sender)
  19. {
  20. var first = true;
  21. byte seq = 0x00;
  22. bool done = false;
  23. do
  24. {
  25. if (first)
  26. {
  27. SzlRequestFirst.First = true;
  28. SzlRequestFirst.Seq = seq;
  29. SzlRequestFirst.ID = SzlCmd.ID;
  30. SzlRequestFirst.Index = SzlCmd.Index;
  31. SzlResponseFirst = sender.IsoSend<SzlRequest, SzlResponse>(SzlRequestFirst);
  32. if (SzlResponseFirst == null) return;
  33. ResultCode = SzlResponseFirst.Data.Ret;
  34. if (SzlResponseFirst.Params.Err == ResultCode.OK)
  35. {
  36. if (SzlResponseFirst.Data.Ret == ResultCode.OKFF)
  37. {
  38. done = (SzlResponseFirst.Params.Rsvd & 0x00FF) == 0;
  39. seq = SzlResponseFirst.Params.Seq;
  40. }
  41. }
  42. }
  43. else
  44. {
  45. SzlRequestNext = new SzlRequest();
  46. SzlRequestNext.First = false;
  47. SzlRequestNext.Seq = seq;
  48. SzlRequestNext.ID = SzlCmd.ID;
  49. SzlRequestNext.Index = SzlCmd.Index;
  50. SzlNextResponseNext = sender.IsoSend<SzlRequest, SzlNextResponse>(SzlRequestNext);
  51. if (SzlNextResponseNext == null) return;
  52. ResultCode = SzlResponseFirst.Data.Ret;
  53. if (SzlNextResponseNext.Params.Err == ResultCode.OK)
  54. {
  55. if (SzlNextResponseNext.Data.Ret == ResultCode.OKFF)
  56. {
  57. done = (SzlNextResponseNext.Params.Rsvd & 0x00FF) == 0;
  58. seq = SzlNextResponseNext.Params.Seq;
  59. SzlResponseFirst.Data.AddNextData(SzlNextResponseNext.Data.Data, SzlNextResponseNext.Data.DLen);
  60. }
  61. }
  62. }
  63. first = false;
  64. } while (!done && ResultCode == ResultCode.OKFF);
  65. if (ResultCode == ResultCode.OKFF) ResultCode = ResultCode.OK;
  66. }
  67. public SzlHandle()
  68. {
  69. ResultCode = ResultCode.Unknown;
  70. SzlRequestFirst = new SzlRequest();
  71. SzlCmd = SzlInfo.ReadSzlAll;
  72. }
  73. }
  74. }