IsoControlPduHandle.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System.Collections.Generic;
  2. using PLC.Siemens.Protocol.Common;
  3. using PLC.Siemens.Protocol.Iso;
  4. using PLC.Siemens.O;
  5. namespace PLC.Siemens.ProtocolHandle
  6. {
  7. public class IsoControlPduHandle : IPacketHandle
  8. {
  9. public int IsoPduSize { get; set; }
  10. public ushort SrcRef { get; set; }
  11. public ushort DstRef { get; set; }
  12. public ushort SrcTSap { get; set; }
  13. public ushort DstTSap { get; set; }
  14. public IList<IsoControlPdu> Requests { get; set; }
  15. public IList<IsoControlPdu> Responses { get; set; }
  16. public ResultCode ResultCode { get; set; }
  17. public void Handle(IIsoSender sender)
  18. {
  19. var request = new IsoControlPdu
  20. {
  21. IsoPduSize = IsoPduSize,
  22. SrcRef = SrcRef,
  23. DstRef = DstRef,
  24. SrcTSap = SrcTSap,
  25. DstTSap = DstTSap
  26. };
  27. Requests.Add(request);
  28. var response = sender.Send<IsoControlPdu, IsoControlPdu>(request);
  29. if (response == null)
  30. {
  31. ResultCode = ResultCode.ReadDataFalut;
  32. return;
  33. }
  34. if (CheckPdu(response, PduType.ConnConfirm) != 0) return;
  35. Responses.Add(response);
  36. ResultCode = ResultCode.OK;
  37. }
  38. public IsoControlPduHandle()
  39. {
  40. ResultCode = ResultCode.Unknown;
  41. Requests = new List<IsoControlPdu>();
  42. Responses = new List<IsoControlPdu>();
  43. }
  44. private int CheckPdu(IsoControlPdu pdu, PduType pduType)
  45. {
  46. int size = pdu.Tpkt.Length;
  47. if (size < 7 || size > StaticConst.IsoPayloadSize || pdu.Cotp.PduType != (byte)pduType)
  48. return (int)ErrorType.ErrIsoInvalidPdu;
  49. return (int)ErrorType.NoError;
  50. }
  51. }
  52. }