// Coming from an udp class1 device, with a previous ForwardOpen action public void On_ItemMessageReceived(object sender, byte[] packet, SequencedAddressItem ItemPacket, int offset, int msg_length, IPEndPoint remote_address) { if (ItemPacket.ConnectionId != T2O_ConnectionId) { return; } if ((msg_length - offset) == 0) { return; } RawData = new byte[msg_length - offset]; Array.Copy(packet, offset, RawData, 0, RawData.Length); if (DecodedMembers != null) { int Idx = 0; try { DecodedMembers.DecodeAttr(Id, ref Idx, RawData); } catch { } } if (T2OEvent != null) { T2OEvent(this); } }
public override EnIPNetworkStatus ReadDataFromNetwork() { byte[] DataPath = EnIPPath.GetPath(myInstance.myClass.Id, myInstance.Id, Id); EnIPNetworkStatus ret = ReadDataFromNetwork(DataPath, CIPServiceCodes.GetAttributeSingle); if (ret == EnIPNetworkStatus.OnLine) { CIPObjectLibrary classid = (CIPObjectLibrary)myInstance.myClass.Id; try { if (DecodedMembers == null) // No decoder { if (myInstance.DecodedMembers == null) { myInstance.AttachDecoderClass(); } DecodedMembers = myInstance.DecodedMembers; // get the same object as the associated Instance } int Idx = 0; DecodedMembers.DecodeAttr(Id, ref Idx, RawData); } catch { } } return(ret); }
public override EnIPNetworkStatus ReadDataFromNetwork() { byte[] DataPath = EnIPPath.GetPath(myClass.Id, Id, null); EnIPNetworkStatus ret = ReadDataFromNetwork(DataPath, CIPServiceCodes.GetAttributesAll); if (ret == EnIPNetworkStatus.OnLine) { if (DecodedMembers == null) { AttachDecoderClass(); } try { DecodedMembers.SetRawBytes(RawData); } catch { } } return(ret); }
public override bool EncodeFromDecodedMembers() { byte[] NewRaw = new byte[RawData.Length]; try { int Idx = 0; if (DecodedMembers.EncodeAttr(Id, ref Idx, NewRaw) == true) { RawData = NewRaw; return(true); } else { return(false); } } catch { return(false); } }
public override EnIPNetworkStatus ReadDataFromNetwork() { // Read all class static attributes byte[] ClassDataPath = EnIPPath.GetPath(Id, 0, null); EnIPNetworkStatus ret = ReadDataFromNetwork(ClassDataPath, CIPServiceCodes.GetAttributesAll); // If rejected try to read all attributes one by one if (ret == EnIPNetworkStatus.OnLineReadRejected) { MemoryStream rawbuffer = new MemoryStream(); ushort AttId = 1; // first static attribut number do { ClassDataPath = EnIPPath.GetPath(Id, 0, AttId); ret = ReadDataFromNetwork(ClassDataPath, CIPServiceCodes.GetAttributeSingle); // push the buffer into the data stream if (ret == EnIPNetworkStatus.OnLine) { rawbuffer.Write(RawData, 0, RawData.Length); } AttId++; }while (ret == EnIPNetworkStatus.OnLine); // yes OK like this, pull the data out of the stream into the RawData if (rawbuffer.Length != 0) { Status = ret = EnIPNetworkStatus.OnLine; // all is OK even if the last request is (always) rejected RawData = rawbuffer.ToArray(); } } if (ret == EnIPNetworkStatus.OnLine) { CIPObjectLibrary classid = (CIPObjectLibrary)Id; try { if (DecodedMembers == null) { try { if (DecoderClass == null) { // try to create the associated class object var o = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, "System.Net.EnIPStack.ObjectsLibrary.CIP_" + classid.ToString() + "_class"); DecodedMembers = (CIPObject)o.Unwrap(); } else { var o = Activator.CreateInstance(DecoderClass); DecodedMembers = (CIPObject)o; } } catch { // echec, get the base class as described in Volume 1, §4-4.1 Class Attributes DecodedMembers = new CIPObjectBaseClass(classid.ToString()); } } DecodedMembers.SetRawBytes(RawData); } catch { } } return(ret); }