public bool Equals(Address other) { return this.area == other.area && this.dataBlock == other.dataBlock && this.startAddress == other.startAddress && this.transportType == other.transportType && this.length == other.length; }
private byte[] ReadWriteMessage(Action action, Address address) { return ReadWriteMessage(action, address.area, address.dataBlock, address.startAddress, address.byteLength, address.transportType); }
private byte[] ReadBytesRaw(string address, uint bytes) { var s7address = new Address(address); s7address.byteLength = (ushort)bytes; return ReadBytesRaw(s7address); }
protected virtual void WriteBytesRaw(Address address, byte[] data) { var bytes = address.byteLength; if (bytes > 65535) throw new IndexOutOfRangeException("max bytes = 65535"); if (bytes < 1) throw new IndexOutOfRangeException("min bytes = 1"); if (bytes != data.Length) throw new ArgumentException("data size does not match address"); // send read request message var message = ReadWriteMessage(Action.Write, address); DebugWrite("ReadWriteMessage", message); message = EncodeTPDU(TPKT, message, data); DebugWrite("TPDU", message); var response = socket.Write(message); DebugWrite("response", response); }
protected void WriteBytesRaw(string address, byte[] data) { var s7address = new Address(address); s7address.byteLength = (ushort)data.Length; WriteBytesRaw(s7address, data); }
protected virtual byte[] ReadBytesRaw(Address address) { var bytes = address.byteLength; if (bytes > 65535) throw new IndexOutOfRangeException("max bytes = 65535"); if (bytes < 1) throw new IndexOutOfRangeException("min bytes = 1"); var message = new byte[] {}; var tpdu = new byte[] {}; var response = new byte[] {}; var data = new byte[] {}; // maximum page size = 220 bytes if (bytes <= MAX_BYTES_PER_PAGE) { try { // send read request message message = ReadWriteMessage(Action.Read, address); DebugWrite("ReadWriteMessage", message); tpdu = EncodeTPDU(TPKT, message); DebugWrite("TPDU", tpdu); response = socket.Write(tpdu); DebugWrite("response", response); data = ExtractTPDU(response); DebugWrite("data", data); if (data.Length != bytes) throw new ApplicationException("responce data size does not match requested size"); } catch (SocketException ex) { sar.Base.Program.Log("s7Adaptor ERROR"); sar.Base.Program.Log(" >> " + this.ipAddress); sar.Base.Program.Log(" >> " + address.ToString()); // auto-reconnect this.Reconnect(); throw ex; } catch (Exception ex) { sar.Base.Program.Log("s7Adaptor ERROR"); sar.Base.Program.Log(" >> " + this.ipAddress); sar.Base.Program.Log(" >> " + address.ToString()); sar.Base.Program.Log(StringHelper.ArrayToString("ReadWriteMessage", message)); sar.Base.Program.Log(StringHelper.ArrayToString("TPDU", tpdu)); sar.Base.Program.Log(StringHelper.ArrayToString("response", response)); sar.Base.Program.Log(StringHelper.ArrayToString("data", data)); throw ex; } return data; } else { data = new byte[bytes]; address.byteLength = MAX_BYTES_PER_PAGE; Array.Copy(ReadBytesRaw(address), 0, data, bytes-MAX_BYTES_PER_PAGE, MAX_BYTES_PER_PAGE); address.byteAdddress += MAX_BYTES_PER_PAGE; address.startAddress += (MAX_BYTES_PER_PAGE * 8); address.byteLength = (ushort)(bytes - MAX_BYTES_PER_PAGE); Array.Copy(ReadBytesRaw(address), 0, data, 0, address.byteLength); return data; } }