public void SendCyclicData(PhysicalAddress destination, UInt16 frameID, UInt16 cycleCounter, byte[] userData)
        {
            Trace.WriteLine("Sending cyclic data", null);

            MemoryStream mem = new MemoryStream();

            //ethernet
            Ethernet.Encode(mem, destination, adapter.MacAddress, (Ethernet.Type) 0x8892);

            //Profinet Real Time
            RT.EncodeFrameId(mem, (RT.FrameIds)frameID);

            //user data
            if (userData == null)
            {
                userData = new byte[40];
            }
            if (userData.Length < 40)
            {
                Array.Resize <byte>(ref userData, 40);
            }
            mem.Write(userData, 0, userData.Length);

            //RT footer
            RT.EncodeRTCStatus(mem, cycleCounter, RT.DataStatus.DataItemValid |
                               RT.DataStatus.State_Primary |
                               RT.DataStatus.ProviderState_Run |
                               RT.DataStatus.StationProblemIndicator_Normal,
                               RT.TransferStatus.OK);

            //Send
            Send(mem);
        }
        public void SendSetResponse(PhysicalAddress destination, uint xid, DCP.BlockOptions option, DCP.BlockErrors status)
        {
            Trace.WriteLine("Sending Set " + option.ToString() + " response", null);

            MemoryStream mem = new MemoryStream();

            //ethernet
            Ethernet.Encode(mem, destination, adapter.MacAddress, Ethernet.Type.VLanTaggedFrame);

            //VLAN
            VLAN.Encode(mem, VLAN.Priorities.Priority0, VLAN.Type.PN);

            //Profinet Real Time
            RT.EncodeFrameId(mem, RT.FrameIds.DCP_Get_Set_PDU);

            //Profinet DCP
            DCP.EncodeSetResponse(mem, xid, option, status);

            //Send
            Send(mem);
        }
        public void SendIdentifyResponse(PhysicalAddress destination, uint xid, Dictionary <DCP.BlockOptions, object> blocks)
        {
            Trace.WriteLine("Sending identify response", null);

            MemoryStream mem = new MemoryStream();

            //ethernet
            Ethernet.Encode(mem, destination, adapter.MacAddress, Ethernet.Type.VLanTaggedFrame);

            //VLAN
            VLAN.Encode(mem, VLAN.Priorities.Priority0, VLAN.Type.PN);

            //Profinet Real Time
            RT.EncodeFrameId(mem, RT.FrameIds.DCP_Identify_ResPDU);

            //Profinet DCP
            DCP.EncodeIdentifyResponse(mem, xid, blocks);

            //Send
            Send(mem);
        }
        public IAsyncResult BeginGetRequest(PhysicalAddress destination, DCP.BlockOptions option)
        {
            Trace.WriteLine("Sending Get " + option.ToString() + " request", null);

            MemoryStream mem = new MemoryStream();

            //ethernet
            Ethernet.Encode(mem, destination, adapter.MacAddress, Ethernet.Type.VLanTaggedFrame);

            //VLAN
            VLAN.Encode(mem, VLAN.Priorities.Priority0, VLAN.Type.PN);

            //Profinet Real Time
            RT.EncodeFrameId(mem, RT.FrameIds.DCP_Get_Set_PDU);

            //Profinet DCP
            UInt16 xid = ++lastXid;

            DCP.EncodeGetRequest(mem, xid, option);
            //start Async
            return(new ProfinetAsyncDcpResult(this, mem, xid));
        }
        public void SendIdentifyBroadcast()
        {
            Trace.WriteLine("Sending identify broadcast", null);

            MemoryStream mem = new MemoryStream();

            //ethernet
            PhysicalAddress ethernetDestinationHwAddress = PhysicalAddress.Parse(RT.MulticastMACAdd_Identify_Address);

            Ethernet.Encode(mem, ethernetDestinationHwAddress, adapter.MacAddress, Ethernet.Type.VLanTaggedFrame);

            //VLAN
            VLAN.Encode(mem, VLAN.Priorities.Priority0, VLAN.Type.PN);

            //Profinet Real Time
            RT.EncodeFrameId(mem, RT.FrameIds.DCP_Identify_ReqPDU);

            //Profinet DCP
            DCP.EncodeIdentifyRequest(mem, ++lastXid);

            //Send
            Send(mem);
        }