示例#1
0
 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;
 }
示例#2
0
 private byte[] ReadWriteMessage(Action action, Address address)
 {
     return ReadWriteMessage(action, address.area, address.dataBlock, address.startAddress, address.byteLength, address.transportType);
 }
示例#3
0
        private byte[] ReadBytesRaw(string address, uint bytes)
        {
            var s7address = new Address(address);
            s7address.byteLength = (ushort)bytes;

            return ReadBytesRaw(s7address);
        }
示例#4
0
        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);
        }
示例#5
0
        protected void WriteBytesRaw(string address, byte[] data)
        {
            var s7address = new Address(address);
            s7address.byteLength = (ushort)data.Length;

            WriteBytesRaw(s7address, data);
        }
示例#6
0
        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;
            }
        }