Ejemplo n.º 1
1
        public void RTU_ADU_DocSampleReq()
        {
            var DocRequest = new byte[]
            {
                0x01,
                0x10, 0x00, 0x01, 0x00, 0x01, 0x02, 0xFF, 0xFF,
                0xA6, 0x31,
            };

            var DocResponse = new byte[]
            {
                0x01,
                0x10, 0x00, 0x01, 0x00, 0x01,
                0x50, 0x09,
            };

            var ClientPDU = new WriteMultipleRegistersPDU(1, new int[] { 0xFFFF });
            var Device = new RTU_Device(1);

            var ClientADU = new RTU_ADU(Device, ClientPDU);

            CollectionAssert.AreEqual(DocRequest, ClientADU.BuildRequest());

            Assert.AreEqual(Status.OK, ClientADU.CheckResponse(DocResponse));

            

        }
        [TestMethod]        // Oficial Example 
        public void WriteMultipleRegistersPDU_DocSampleReq()
        {
            var ClientPDU = new WriteMultipleRegistersPDU(1, new int[] { 10, 258 });

            var DacRequest = new byte[] 
            {          
                0x10,       // Code Function
                0x00, 0x01, // Starting Address
                0x00, 0x02, // Quantity
                0x04,       // Byte Count
                0x00, 0x0A, // Value[0]
                0x01, 0x02, // Value[1]
            };

            var OKResponse = new byte[]
            {
                0x10,       // Code Function
                0x00, 0x01, // Starting Address
                0x00, 0x02, // Quantity
            };

            var ExResponse = new byte[]
            {
                0x90,
                0x01,
            };


            CollectionAssert.AreEqual(DacRequest, ClientPDU.BuildRequest(), "Wrong Request");
            Assert.AreEqual(Status.OK, ClientPDU.CheckResponse(OKResponse), "OK Status not recognited");
            Assert.AreEqual(Status.Exception, ClientPDU.CheckResponse(ExResponse), "Exception Status not recognited");
            Assert.AreEqual(0x01, ClientPDU.ExceptionCode, "Exception not recognited");
        }
        public void WriteMultipleRegistersPDU_ArgumentRange()
        {
            IProtocolDataUnit TestingPDU;

            try
            {
                TestingPDU = new WriteMultipleRegistersPDU(MinAddress - 1, new int[NormQuantity]);
                Assert.Fail("Min Address Error");
            }
            catch (ArgumentOutOfRangeException) { }

            try
            {
                TestingPDU = new WriteMultipleRegistersPDU(MaxAddress + 1, new int[NormQuantity]);
                Assert.Fail("Max Address Error");
            }
            catch (ArgumentOutOfRangeException) { }

            try
            {
                TestingPDU = new WriteMultipleRegistersPDU(NormAddress, new int[MinQuantity - 1]);
                Assert.Fail("Min Quantity Error");
            }
            catch (ArgumentOutOfRangeException) { }

            try
            {
                TestingPDU = new WriteMultipleRegistersPDU(NormAddress, new int[MaxQuantity + 1]);
                Assert.Fail("Max Quantity Error");
            }
            catch (ArgumentOutOfRangeException) { }
        }
Ejemplo n.º 4
0
        public Status CheckRequest(byte[] Request)
        {
            if  (Request.Length < 13)    
                return Status.Error;

            Header = new MBAP(Request);

            if (Header.ProtocolID != 0)
                return Status.Error;



            switch (Request[1])
            {
                case 0x01: PDU = new ReadCoilsPDU(); break;
                case 0x02: PDU = new ReadDiscreteInputsPDU(); break;
                case 0x03: PDU = new ReadHoldingRegistersPDU(); break;
                case 0x04: PDU = new ReadInputRegistersPDU(); break;
                case 0x05: PDU = new WriteSingleCoilPDU(); break;
                case 0x06: PDU = new WriteSingleRegisterPDU(); break;
                case 0x0F: PDU = new WriteMultipleCoilsPDU(); break;
                case 0x10: PDU = new WriteMultipleRegistersPDU(); break;
                default: return Status.Error;
            }

            var PDURequest = new byte[Request.Length - 3];

            for (int i=0; i<PDURequest.Length; i++)
                PDURequest[i] = Request[i + 1];

            return PDU.CheckRequest(PDURequest);
        }
        [TestMethod]        // Handling Request on Server
        public void WriteMultipleRegistersPDU_LifeCycle()
        {
            var RandomGen = new Random();

            int Address = RandomGen.Next(MinAddress, MaxAddress);
            int Quantity = RandomGen.Next(MinQuantity, MaxQuantity);

            #region Build Server and Values
            var Server = new BaseModbusServer();
            var Value = new int[Quantity];

            for (int i = 0; i < Quantity; i++)
            {
                Value[i] = RandomGen.Next(0xFFFF);
                Server.AddHoldingRegister(Address + i);
            }
            #endregion

            var ClientPDU = new WriteMultipleRegistersPDU(Address, Value);
            var Request = ClientPDU.BuildRequest();

            var ServerPDU = new WriteMultipleRegistersPDU();

            var ReqStatus = ServerPDU.CheckRequest(Request);

            Assert.AreEqual(Status.OK, ReqStatus, "Recognition Error");
            Assert.AreEqual(Address, ServerPDU.StartingAddress, "Whong Address recognition in CheckRequest");

            ServerPDU.Handle(Server);

            CollectionAssert.AreEqual(Value, ServerPDU.Value, "Whong Address recognition in CheckRequest");

            ClientPDU.CheckResponse(ServerPDU.BuildResponse());

            CollectionAssert.AreEqual(Value, ClientPDU.Value, "Whong Address recognition in CheckRequest");
        }
Ejemplo n.º 6
0
        public void WriteMultipleRegisters(IModbusDevice Device, int StartAddr, int[] Value)
        {
            if (!(Device is RTU_Device))
                throw new ArgumentException("Wrong Type", "Device");

            var PDU = new WriteMultipleRegistersPDU(StartAddr, Value);
            var ADU = new RTU_ADU((Device as RTU_Device), PDU);

            Query(ADU) ;

       
        }
Ejemplo n.º 7
0
        public Status CheckRequest(byte[] Request)
        {
            if ( (Request.Length < 4) || (Request[0] != Device.Address) )    // 3 = Address + FuncCode + CRC_Lo + CRC_Hi
                return Status.Error;
           
            if (CRC.Get(Request) != 0)
                return Status.Error;

            switch (Request[1])
            {
                case 0x01: PDU = new ReadCoilsPDU(); break;
                case 0x02: PDU = new ReadDiscreteInputsPDU(); break;
                case 0x03: PDU = new ReadHoldingRegistersPDU(); break;
                case 0x04: PDU = new ReadInputRegistersPDU(); break;
                case 0x05: PDU = new WriteSingleCoilPDU(); break;
                case 0x06: PDU = new WriteSingleRegisterPDU(); break;
                case 0x0F: PDU = new WriteMultipleCoilsPDU(); break;
                case 0x10: PDU = new WriteMultipleRegistersPDU(); break;
                default: return Status.Error;
            }

            var PDURequest = new byte[Request.Length - 3];

            for (int i=0; i<PDURequest.Length; i++)
                PDURequest[i] = Request[i + 1];

            return PDU.CheckRequest(PDURequest);
        }