Ejemplo n.º 1
0
        public ModbusMessage ReadWriteMultipleRegisters(short readStartingAddress, short readRegisterQuantity, short writeStartingAddress, short writeRegisterQuantity, short[] writeRegisterValues)
        {
            if (readRegisterQuantity > 0x7d)
            {
                throw new ArgumentOutOfRangeException("readRegisterQuantity", "Cannot be grater than 125");
            }
            if (writeRegisterQuantity > 0x79)
            {
                throw new ArgumentOutOfRangeException("readRegisterQuantity", "Cannot be grater than 121");
            }

            ModbusMessage result = new ModbusMessage()
            {
                FunctionCode     = 0x17,
                StartingAddress  = readStartingAddress,
                RegisterQuantity = readRegisterQuantity
            };

            result.DataPoints.AddRange(BitConverter.GetBytes(writeStartingAddress));

            result.DataPoints.AddRange(BitConverter.GetBytes(writeRegisterQuantity));

            foreach (short register in writeRegisterValues)
            {
                result.DataPoints.AddRange(BitConverter.GetBytes(register));
            }

            return(SendMessage(result));
        }
Ejemplo n.º 2
0
        private byte[] ToBytes(ModbusMessage msg)
        {
            List <byte> result = new List <byte>();

            switch (transportEncoding)
            {
            case TransportEncoding.ASCII:
                result.AddRange(msg.ToAdu(true));
                result.AddRange(System.Text.Encoding.ASCII.GetBytes(ModbusMessage.CalculateLrc(result.ToArray()).ToString("X4")));
                result.AddRange(System.Text.Encoding.ASCII.GetBytes("\r\n"));
                break;

            case TransportEncoding.Binary:
                result.Add(UnitId);
                result.AddRange(msg.ToPdu());
                result.AddRange(ModbusMessage.CalculateCrc16(result.ToArray()));
                //result.Insert(0, UnitId);
                break;

            case TransportEncoding.IpWithOutCrc:
                msg.TransactionId = NextTransactionId;
                msg.UnitId        = UnitId;
                result.AddRange(msg.ToAdu());
                break;

            default:
            case TransportEncoding.IpWithCrc:
                msg.TransactionId = NextTransactionId;
                msg.UnitId        = UnitId;
                result.AddRange(msg.ToAdu());
                result.AddRange(ModbusMessage.CalculateCrc16(result.ToArray()));
                break;
            }
            return(result.ToArray());
        }
Ejemplo n.º 3
0
        public ModbusMessage WriteMultipleRegisters(short startingAddress, short registerQuantity, short[] registerValues)
        {
            if (registerQuantity > 0x7b)
            {
                throw new ArgumentOutOfRangeException("registerQuantity", "Cannot be grater than 123");
            }

            ModbusMessage result = new ModbusMessage()
            {
                FunctionCode     = 0x10,
                StartingAddress  = startingAddress,
                RegisterQuantity = registerQuantity
            };

            foreach (short register in registerValues)
            {
                result.DataPoints.AddRange(BitConverter.GetBytes(register));
            }

            return(SendMessage(result));
        }
Ejemplo n.º 4
0
 public ModbusMessage SendMessage(ModbusMessage msg)
 {
     return(SendMessage(msg, 0));
 }
Ejemplo n.º 5
0
        private ModbusMessage SendMessage(ModbusMessage msg, int retry)
        {
            if (retry > maxRetries)
            {
                throw new Exception("Not Responding");
            }

            if (!Socket.Connected)
            {
                Socket.Connect(ipEndPoint);
            }

            Socket.SendTimeout = Socket.ReceiveTimeout = sendRecieveTimeout;

            requestLog.Add(msg);

            byte[] outBytes = ToBytes(msg);

            if (Socket.Available > 0)
            {
                int r = Socket.Receive(new byte[Socket.Available]);
                if (transportProtocol == ProtocolType.Tcp)
                {
                    tcpRcvd += r;
                }
                else
                {
                    udpRcvd += r;
                }
            }

            if (transportProtocol == ProtocolType.Udp)
            {
                Socket.Send(outBytes);
            }
            else
            {
                netStream.Write(outBytes, 0, outBytes.Length);
            }

            if (tcpRcvd == 0 && udpRcvd == 0)
            {
                if (transportProtocol == ProtocolType.Udp)
                {
                    Socket.Send(outBytes);
                }
                else
                {
                    netStream.Write(outBytes, 0, outBytes.Length);
                }
            }

            if (transportProtocol == ProtocolType.Tcp)
            {
                tcpSent += outBytes.Length;
            }
            else
            {
                udpSent += outBytes.Length;
            }

            byte[] buffer = new byte[256];

            while (Socket.Available < 6)
            {
                System.Threading.Thread.Sleep(0);
            }

            int rcv = Socket.Receive(buffer);

            byte[] inBytes = new byte[rcv];

            Array.Copy(buffer, 0, inBytes, 0, rcv);

            if (transportProtocol == ProtocolType.Tcp)
            {
                tcpRcvd += inBytes.Length;
            }
            else
            {
                udpRcvd += inBytes.Length;
            }

            ModbusMessage result = new ModbusMessage(inBytes);

            recieveLog.Add(result);

            return(result);
        }