private void m_adapter_OnProfinetArrival(ConnectionInfoEthernet sender, Stream stream) { RT.FrameIds frameID; //Real Time RT.DecodeFrameId(stream, out frameID); if (frameID == RT.FrameIds.DCP_Identify_ResPDU || frameID == RT.FrameIds.DCP_Identify_ReqPDU || frameID == RT.FrameIds.DCP_Get_Set_PDU || frameID == RT.FrameIds.DCP_Hello_ReqPDU) { DCP.ServiceIds serviceID; uint xid; ushort responseDelayFactor; ushort dcpDataLength; DCP.DecodeHeader(stream, out serviceID, out xid, out responseDelayFactor, out dcpDataLength); Dictionary <DCP.BlockOptions, object> blocks; DCP.DecodeAllBlocks(stream, dcpDataLength, out blocks); if (OnDcpMessage != null) { OnDcpMessage(sender, new DcpMessageArgs(serviceID, xid, responseDelayFactor, blocks)); } } else if (frameID == RT.FrameIds.PTCP_DelayReqPDU) { //ignore this for now } else if (frameID >= RT.FrameIds.RTC_Start && frameID <= RT.FrameIds.RTC_End) { long dataPos = stream.Position; stream.Position = stream.Length - 4; UInt16 cycleCounter; RT.DataStatus dataStatus; RT.TransferStatus transferStatus; RT.DecodeRTCStatus(stream, out cycleCounter, out dataStatus, out transferStatus); stream.Position = dataPos; if (OnCyclicMessage != null) { OnCyclicMessage(sender, cycleCounter, dataStatus, transferStatus, stream, (int)(stream.Length - dataPos - 4)); } } else if (frameID == RT.FrameIds.Alarm_Low || frameID == RT.FrameIds.Alarm_High) { UInt16 alarmDestinationEndpoint; UInt16 alarmSourceEndpoint; RT.PDUTypes pduType; RT.AddFlags addFlags; UInt16 sendSeqNum; UInt16 ackSeqNum; UInt16 varPartLen; RT.DecodeRTAHeader(stream, out alarmDestinationEndpoint, out alarmSourceEndpoint, out pduType, out addFlags, out sendSeqNum, out ackSeqNum, out varPartLen); if (OnAcyclicMessage != null) { OnAcyclicMessage(sender, alarmDestinationEndpoint, alarmSourceEndpoint, pduType, addFlags, sendSeqNum, ackSeqNum, varPartLen, stream); } } else { Trace.TraceWarning("Unclassified RT message"); } }
private void conn_OnDcpMessage(ConnectionInfoEthernet sender, DcpMessageArgs args) { if (args.Xid == mXid) { Result = args.Blocks; IsCompleted = true; mWait.Set(); } }