IsoControlPduHandle.cs 1.8 KB

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