public override object Clone() { IsoServiceProvider newProvider = new IsoServiceProvider(); newProvider.ISOsrv.OnReceived = this.ISOsrv.OnReceived; // Copy callback newProvider.ISOsrv.EnableLocalTsapCheck = this.ISOsrv.EnableLocalTsapCheck; newProvider.ISOsrv.LocalTsaps = this.ISOsrv.LocalTsaps; newProvider.m_PlcsimIpAdress = this.m_PlcsimIpAdress; newProvider.m_PlcsimRackNumber = this.m_PlcsimRackNumber; newProvider.m_PlcsimSlotNumber = this.m_PlcsimSlotNumber; newProvider.m_PlcS7onlineMsgPump_Handle = this.m_PlcS7onlineMsgPump_Handle; newProvider.m_S7ProtocolVersionDetected = this.m_S7ProtocolVersionDetected; newProvider.m_Name = this.m_Name; return(newProvider); }
// JYB: void -> bool public bool start(string name, IPAddress networkIpAdress, List <byte[]> tsaps, IPAddress plcsimIp, int plcsimRackNumber, int plcsimSlotNumber, ref string error) { m_Provider = new IsoServiceProvider(); m_Provider.ISOsrv.OnReceived = this.IsoReceived; m_Provider.ISOsrv.SetValidTsaps(tsaps); m_Provider.ISOsrv.EnableLocalTsapCheck = m_enableTsapCheck; m_NetworkIpAdress = networkIpAdress; m_Provider.m_PlcsimIpAdress = plcsimIp; m_Provider.m_PlcsimRackNumber = plcsimRackNumber; m_Provider.m_PlcsimSlotNumber = plcsimSlotNumber; m_Provider.m_Name = name; m_Server = new TcpServer(m_Provider, 102); // m_Server.Start(m_NetworkIpAdress); var ret = m_Server.Start(m_NetworkIpAdress, ref error); return(ret); }
public void Process(IsoServiceProvider client, byte[] inPacket, int len) { int workedLen; TPKT PKT; TPDU PDU; byte[] packet = new byte[len]; Array.Copy(inPacket, packet, len); workedLen = 0; while (workedLen < len) { PKT = new TPKT(packet, len); PDU = new TPDU(PKT.Payload); switch (PDU.PDUType) { case (byte)TPDU.TPDU_TYPES.CR: { if (Connected) { break; } TPKT resPkt = new TPKT(); TPDU resPdu = new TPDU(); resPdu.PDUType = (byte)TPDU.TPDU_TYPES.CC; Connected = false; m_payloadFragmentData = new MemoryStream(1024); // Stream for TPDU fragments, S7 PDU has max. 960 bytes // get connect confirm, if tsaps not equal a exception is thrown try { resPdu.PduCon = PDU.PduCon.HandleConnectRequest(LocalTsaps, m_ProposedMaxTPDUSize, EnableLocalTsapCheck); // Add TPDU to TPKT resPkt.SetPayload(resPdu.GetBytes()); // send connect confirm TCPSend(client.client, resPkt.GetBytes()); Connected = true; m_MaxTPDUSize = resPdu.PduCon.GetMaxTPDUSize(); } catch (Exception) { } } break; case (byte)TPDU.TPDU_TYPES.DT: { if (!Connected) { Log("DT packet before state 'connected' received."); m_payloadFragmentData.SetLength(0); break; } // Handle DT TPDU fragments if (PDU.PduData.EOT == false) { m_payloadFragmentData.Write(PDU.PduData.Payload, 0, PDU.PduData.Payload.Length); } else { if (m_payloadFragmentData.Length == 0) { OnReceived(client, PDU.PduData.Payload); } else { m_payloadFragmentData.Write(PDU.PduData.Payload, 0, PDU.PduData.Payload.Length); byte[] payload = new byte[m_payloadFragmentData.Length]; payload = m_payloadFragmentData.ToArray(); OnReceived(client, payload); m_payloadFragmentData.SetLength(0); } } } break; case (byte)TPDU.TPDU_TYPES.DR: // Disconnect Request client.client.EndConnection(); break; default: Log("Cannot handle pdu type " + PDU.PDUType); break; } // Build next packet to work on workedLen += PKT.Length; Array.Copy(inPacket, workedLen, packet, 0, len - workedLen); } }
public void Process(IsoServiceProvider client, byte[] packet) { Process(client, packet, packet.Length); }
public void IsoReceived(IsoServiceProvider client, byte[] data) { // Skip empty messages if (data.Length < 1) { return; } // On the first S7 protocol telegram, determine the Plcsim version which has to be used // by checking the protocol type in S7 protocol header // 0x32 = S7comm // 0x72 = S7commPlus (1200/1500) if (client.m_S7ProtocolVersionDetected == false) { string message = String.Empty; bool plcsim_success = false; if (data[0] == 0x72) { plcsim_success = client.InitPlcsim(PlcsimProtocolType.S7commPlus); message = "Connecting to Plcsim using S7Comm-Plus mode for 1200/1500"; } else { plcsim_success = client.InitPlcsim(PlcsimProtocolType.S7comm); message = "Connecting to Plcsim using S7Comm mode for 300/400 or 1200/1500 (not optimized)"; } if (plcsim_success == false) { if (monitorDataReceived != null) { monitorDataReceived(client.client.RemoteEndPoint.ToString(), null, "Failed to connect to Plcsim"); } client.client.EndConnection(); return; } if (monitorDataReceived != null) { monitorDataReceived(client.client.RemoteEndPoint.ToString(), null, message); } client.m_S7ProtocolVersionDetected = true; } PlcS7onlineMsgPump.WndProcMessage msg = new PlcS7onlineMsgPump.WndProcMessage(); msg.pdu = data; msg.pdulength = data.Length; if (monitorDataReceived != null) { monitorDataReceived(client.client.RemoteEndPoint.ToString(), data, String.Empty); } byte[] res = null; // Test if we have to generate our own answer res = S7ProtoHook.RequestExchange(data); if (res == null) { client.SendDataToPlcsim(msg); } else { client.IsoSend(client.client, res); } // JYB DataReceived?.Invoke(data); }