示例#1
0
        public void ControlResponse(Guid activity, uint sequence_no, ProfinetIO.BlockTypes block_type, ProfinetIO.ControlCommands control)
        {
            //Create RPC packet
            long         body_length_position;
            long         NDRDataHeader_position;
            MemoryStream mem = new MemoryStream();

            RPC.Encodings encoding             = RPC.Encodings.ASCII | RPC.Encodings.LittleEndian | RPC.Encodings.IEEE_float;
            Guid          destination_instance = RPC.GenerateObjectInstanceUUID(1, 0, m_device_id.DeviceId, m_device_id.VendorId);

            RPC.EncodeHeader(mem, RPC.PacketTypes.Response, RPC.Flags1.LastFragment | RPC.Flags1.NoFragmentAckRequested, 0, encoding, 0, destination_instance, RPC.UUID_IO_DeviceInterface, activity, 0, sequence_no, RPC.Operations.Control, 0, 0, out body_length_position);
            RPC.EncodeNDRDataHeader(mem, encoding, 0, 0, 0, 0, 0, out NDRDataHeader_position);

            //Create IO Packet
            ProfinetIO.ControlBlockConnect ctrl = new ProfinetIO.ControlBlockConnect();
            ctrl.BlockType      = block_type;
            ctrl.ARUUID         = m_aruuid;
            ctrl.SessionKey     = 1;
            ctrl.ControlCommand = control;
            ProfinetIO.EncodeControlResponse(mem, ctrl);

            //re-encode rpc lengths
            RPC.ReEncodeHeaderLength(mem, encoding, body_length_position);
            RPC.ReEncodeNDRDataHeaderLength(mem, encoding, NDRDataHeader_position, false);

            //send
            Trace.TraceInformation("Sending Control response");
            SendResponse(mem);
        }