SzlHandle.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using PLC.Siemens.Protocol.Common;
  2. using PLC.Siemens.Protocol.Szl;
  3. using PLC.Siemens.O;
  4. namespace PLC.Siemens.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. }