Пример #1
0
        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);
        }
Пример #2
0
        // 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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 public void Process(IsoServiceProvider client, byte[] packet)
 {
     Process(client, packet, packet.Length);
 }
Пример #5
0
        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);
        }