Exemplo n.º 1
0
        void Test(ModbusModel model, ModbusMaster master)
        {
            master.WriteCoil(1, 2, true);
            Assert.AreEqual(true, master.ReadCoil(1, 2));
            master.WriteCoil(1, 3, false);
            Assert.AreEqual(false, master.ReadCoil(1, 3));
            master.WriteCoils(1, 4, bo(false, true));
            Assert.AreEqual(bo(true, false, false, true), master.ReadCoils(1, 2, 4));

            model.setDIs(11, 12, bo(true, true, false, false));
            Assert.AreEqual(true, master.ReadInput(11, 12));
            Assert.AreEqual(true, master.ReadInput(11, 13));
            Assert.AreEqual(false, master.ReadInput(11, 14));
            Assert.AreEqual(false, master.ReadInput(11, 15));
            Assert.AreEqual(bo(true, true, false, false), master.ReadInputs(11, 12, 4));

            master.WriteRegister(1, 2, 0xabcd);
            Assert.AreEqual(0xabcd, master.ReadHoldingRegister(1, 2));
            master.WriteRegister(1, 3, 0xcdab);
            Assert.AreEqual(0xcdab, master.ReadHoldingRegister(1, 3));
            master.WriteRegisters(1, 4, us(0xcda1, 0xcda2));
            Assert.AreEqual(us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadHoldingRegisters(1, 2, 4));

            model.setWIs(11, 12, us(0xabcd, 0xcdab, 0xcda1, 0xcda2));
            Assert.AreEqual(0xabcd, master.ReadInputRegister(11, 12));
            Assert.AreEqual(0xcdab, master.ReadInputRegister(11, 13));
            Assert.AreEqual(0xcda1, master.ReadInputRegister(11, 14));
            Assert.AreEqual(0xcda2, master.ReadInputRegister(11, 15));
            Assert.AreEqual(us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadInputRegisters(11, 12, 4));
        }
Exemplo n.º 2
0
        public static void SharedSlaveTest(ModbusModel model, ModbusMaster master)
        {
            master.WriteCoil(1, 2, true);
            Assert.AreEqual(true, master.ReadCoil(1, 2));
            master.WriteCoil(1, 3, false);
            Assert.AreEqual(false, master.ReadCoil(1, 3));
            master.WriteCoils(1, 4, H.bo(false, true));
            Assert.AreEqual(H.bo(true, false, false, true), master.ReadCoils(1, 2, 4));

            //race condition avoided by access order
            model.setDIs(11, 12, H.bo(true, true, false, false));
            Assert.AreEqual(true, master.ReadInput(11, 12));
            Assert.AreEqual(true, master.ReadInput(11, 13));
            Assert.AreEqual(false, master.ReadInput(11, 14));
            Assert.AreEqual(false, master.ReadInput(11, 15));
            Assert.AreEqual(H.bo(true, true, false, false), master.ReadInputs(11, 12, 4));

            master.WriteRegister(1, 2, 0xabcd);
            Assert.AreEqual(0xabcd, master.ReadHoldingRegister(1, 2));
            master.WriteRegister(1, 3, 0xcdab);
            Assert.AreEqual(0xcdab, master.ReadHoldingRegister(1, 3));
            master.WriteRegisters(1, 4, H.us(0xcda1, 0xcda2));
            Assert.AreEqual(H.us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadHoldingRegisters(1, 2, 4));

            //race condition avoided by access order
            model.setWIs(11, 12, H.us(0xabcd, 0xcdab, 0xcda1, 0xcda2));
            Assert.AreEqual(0xabcd, master.ReadInputRegister(11, 12));
            Assert.AreEqual(0xcdab, master.ReadInputRegister(11, 13));
            Assert.AreEqual(0xcda1, master.ReadInputRegister(11, 14));
            Assert.AreEqual(0xcda2, master.ReadInputRegister(11, 15));
            Assert.AreEqual(H.us(0xabcd, 0xcdab, 0xcda1, 0xcda2), master.ReadInputRegisters(11, 12, 4));
        }
Exemplo n.º 3
0
        public void TcpSlaveTest()
        {
            var model  = new ModbusModel();
            var stream = new ModelStream(model, new ModbusTCPScanner());
            var master = new ModbusMaster(stream, new ModbusTCPProtocol());

            Test(model, master);
        }
Exemplo n.º 4
0
        public void RtuTest()
        {
            var model  = new ModbusModel();
            var stream = new StreamModel(model, new ModbusRTUScanner());
            var master = new ModbusMaster(stream, new ModbusRTUProtocol());

            H.SharedSlaveTest(model, master);
        }
Exemplo n.º 5
0
 public SerialModel(string port, ModbusModel model, IModbusScanner scanner)
 {
     this.model   = model;
     this.scanner = scanner;
     serial       = new SerialPort(port);
     serial.Open();
     Task.Factory.StartNew(Run);
 }
Exemplo n.º 6
0
 public TcpServerModel(ModbusModel model, IModbusScanner scanner)
 {
     this.model   = model;
     this.scanner = scanner;
     server       = new TcpListener(IPAddress.Loopback, 0);
     server.Start();
     port = ((IPEndPoint)server.LocalEndpoint).Port;
     Task.Factory.StartNew(Run);
 }
Exemplo n.º 7
0
        public void TcpExceptionTest()
        {
            var model  = new ModbusModel();
            var stream = new StreamModel(model, new ModbusTCPScanner());
            var master = new ModbusMaster(stream, new ModbusTCPProtocol());
            var ex     = Assert.Throws <ModbusException>(() => H.SharedExceptionTest(master));

            Assert.AreEqual("Modbus exception 2", ex.Message);
            Assert.AreEqual(2, ex.Code);
        }
Exemplo n.º 8
0
        public void RtuOverIsolatedTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusRTUScanner();

            using (var server = new SerialModel(SlaveCOM, model, scanner))
                using (var master = ModbusMaster.IsolatedRTU(new SerialSettings(MasterCOM)))
                {
                    //race condition avoided by access order
                    H.SharedSlaveTest(model, master);
                }
        }
Exemplo n.º 9
0
        public void TcpOverSocketTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusTCPScanner();

            using (var server = new TcpServerModel(model, scanner))
                using (var master = ModbusMaster.TCP(IPAddress.Loopback.ToString(), server.Port))
                {
                    //race condition avoided by access order
                    H.SharedSlaveTest(model, master);
                }
        }
Exemplo n.º 10
0
        public void TcpTest()
        {
            var model    = new ModbusModel();
            var protocol = new ModbusTCPProtocol();
            var stream   = new StreamModel(model, new ModbusTCPScanner());
            var master   = new ModbusMaster(stream, protocol);

            Assert.AreEqual(0, protocol.TransactionId);
            master.WriteCoil(0, 0, false);
            Assert.AreEqual(1, protocol.TransactionId);
            H.SharedSlaveTest(model, master);
        }
Exemplo n.º 11
0
        public void RtuExceptionOverIsolatedTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusRTUScanner();

            using (var server = new SerialModel(SlaveCOM, model, scanner))
                using (var master = ModbusMaster.IsolatedRTU(new SerialSettings(MasterCOM)))
                {
                    var ex = Assert.Throws <ModbusException>(() => H.SharedExceptionTest(master));
                    Assert.AreEqual("Modbus exception 2", ex.Message);
                    Assert.AreEqual(2, ex.Code);
                }
        }
Exemplo n.º 12
0
        public void TcpOverIsolatedTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusTCPScanner();

            using (var server = new SerialModel(SlaveCOM, model, scanner))
                using (var stream = new ModbusIsolatedStream(new SerialSettings(MasterCOM), 400))
                {
                    var master = new ModbusMaster(stream, new ModbusTCPProtocol());
                    //race condition avoided by access order
                    H.SharedSlaveTest(model, master);
                }
        }
Exemplo n.º 13
0
        public void TcpExceptionOverSocketTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusTCPScanner();

            using (var server = new TcpServerModel(model, scanner))
                using (var master = ModbusMaster.TCP(IPAddress.Loopback.ToString(), server.Port))
                {
                    var ex = Assert.Throws <ModbusException>(() => H.SharedExceptionTest(master));
                    Assert.AreEqual("Modbus exception 2", ex.Message);
                    Assert.AreEqual(2, ex.Code);
                }
        }
Exemplo n.º 14
0
        public void TcpExceptionOverIsolatedTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusTCPScanner();

            using (var server = new SerialModel(SlaveCOM, model, scanner))
                using (var stream = new ModbusIsolatedStream(new SerialSettings(MasterCOM), 400))
                {
                    var master = new ModbusMaster(stream, new ModbusTCPProtocol());
                    var ex     = Assert.Throws <ModbusException>(() => H.SharedExceptionTest(master));
                    Assert.AreEqual("Modbus exception 2", ex.Message);
                    Assert.AreEqual(2, ex.Code);
                }
        }
Exemplo n.º 15
0
        public void RtuOverSocketTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusRTUScanner();

            using (var server = new TcpServerModel(model, scanner))
                using (var client = new TcpClient())
                {
                    client.Connect(IPAddress.Loopback, server.Port);
                    var stream = new ModbusSocketStream(client, 400);
                    var master = new ModbusMaster(stream, new ModbusRTUProtocol());
                    //race condition avoided by access order
                    H.SharedSlaveTest(model, master);
                }
        }
Exemplo n.º 16
0
        public void RtuExceptionOverSocketTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusRTUScanner();

            using (var server = new TcpServerModel(model, scanner))
                using (var client = new TcpClient())
                {
                    client.Connect(IPAddress.Loopback, server.Port);
                    var stream = new ModbusSocketStream(client, 400);
                    var master = new ModbusMaster(stream, new ModbusRTUProtocol());
                    var ex     = Assert.Throws <ModbusException>(() => H.SharedExceptionTest(master));
                    Assert.AreEqual("Modbus exception 2", ex.Message);
                    Assert.AreEqual(2, ex.Code);
                }
        }
Exemplo n.º 17
0
        public void TransactionIdWrapTest()
        {
            var model    = new ModbusModel();
            var protocol = new ModbusTCPProtocol();
            var stream   = new StreamModel(model, new ModbusTCPScanner());
            var master   = new ModbusMaster(stream, protocol);

            Assert.AreEqual(0, protocol.TransactionId);
            master.WriteCoil(0, 0, false);
            Assert.AreEqual(1, protocol.TransactionId);
            //ensure TransactionId wraps around 0xFFFF
            protocol.TransactionId = 0xFFFF;
            master.WriteCoil(0, 0, false);
            Assert.AreEqual(0, protocol.TransactionId);
            master.WriteCoil(0, 0, false);
            Assert.AreEqual(1, protocol.TransactionId);
        }
Exemplo n.º 18
0
        public void ApplyTest()
        {
            var model = new ModbusModel();

            model.setDO(0x01, 0x0506, true);
            Assert.AreEqual(bo(true), Apply(model, new ModbusF01ReadCoils(0x01, 0x0506, 1)));
            model.setDO(0x01, 0x0507, false);
            Assert.AreEqual(bo(false), Apply(model, new ModbusF01ReadCoils(0x01, 0x0507, 1)));
            Assert.AreEqual(bo(true, false), Apply(model, new ModbusF01ReadCoils(0x01, 0x0506, 2)));

            model.setDI(0x01, 0x0506, true);
            Assert.AreEqual(bo(true), Apply(model, new ModbusF02ReadInputs(0x01, 0x0506, 1)));
            model.setDI(0x01, 0x0507, false);
            Assert.AreEqual(bo(false), Apply(model, new ModbusF02ReadInputs(0x01, 0x0507, 1)));
            Assert.AreEqual(bo(true, false), Apply(model, new ModbusF02ReadInputs(0x01, 0x0506, 2)));

            model.setWO(0x01, 0x0506, 0x0a0b);
            Assert.AreEqual(us(0x0a0b), Apply(model, new ModbusF03ReadHoldingRegisters(0x01, 0x0506, 1)));
            model.setWO(0x01, 0x0507, 0x0a0c);
            Assert.AreEqual(us(0x0a0c), Apply(model, new ModbusF03ReadHoldingRegisters(0x01, 0x0507, 1)));
            Assert.AreEqual(us(0x0a0b, 0x0a0c), Apply(model, new ModbusF03ReadHoldingRegisters(0x01, 0x0506, 2)));

            model.setWI(0x01, 0x0506, 0x0a0b);
            Assert.AreEqual(us(0x0a0b), Apply(model, new ModbusF04ReadInputRegisters(0x01, 0x0506, 1)));
            model.setWI(0x01, 0x0507, 0x0a0c);
            Assert.AreEqual(us(0x0a0c), Apply(model, new ModbusF04ReadInputRegisters(0x01, 0x0507, 1)));
            Assert.AreEqual(us(0x0a0b, 0x0a0c), Apply(model, new ModbusF04ReadInputRegisters(0x01, 0x0506, 2)));

            Apply(model, new ModbusF05WriteCoil(0x01, 0x0203, true));
            Assert.AreEqual(true, model.getDO(0x01, 0x0203));
            Apply(model, new ModbusF05WriteCoil(0x01, 0x0204, false));
            Assert.AreEqual(false, model.getDO(0x01, 0x0204));
            Assert.AreEqual(bo(true, false), model.getDOs(0x01, 0x0203, 2));

            Apply(model, new ModbusF06WriteRegister(0x01, 0x0203, 0x0a0b));
            Assert.AreEqual(0x0a0b, model.getWO(0x01, 0x0203));
            Apply(model, new ModbusF06WriteRegister(0x01, 0x0204, 0x0a0c));
            Assert.AreEqual(0x0a0c, model.getWO(0x01, 0x0204));
            Assert.AreEqual(us(0x0a0b, 0x0a0c), model.getWOs(0x01, 0x0203, 2));

            Apply(model, new ModbusF15WriteCoils(0x01, 0x0708, bo(false, true)));
            Assert.AreEqual(bo(false, true), model.getDOs(0x01, 0x0708, 2));

            Apply(model, new ModbusF16WriteRegisters(0x01, 0x0708, us(0x0a0b, 0x0a0c)));
            Assert.AreEqual(us(0x0a0b, 0x0a0c), model.getWOs(0x01, 0x0708, 2));
        }
Exemplo n.º 19
0
        public void TcpRetryAfterTimeoutTest()
        {
            var model   = new ModbusModel();
            var scanner = new ModbusTCPScanner();

            using (var server = new TcpServerModel(model, scanner))
                using (var master = ModbusMaster.TCP(IPAddress.Loopback.ToString(), server.Port, 50))
                {
                    server.delay = 100;
                    Assert.Throws(typeof(Exception), () => master.WriteCoil(0, 0, false));
                    //client side delay needed to eat all server side delay otherwise
                    //the added socket stream discard on write will still throw tid mismatch
                    System.Threading.Thread.Sleep(100);
                    server.delay = 0;
                    master.WriteCoil(0, 0, false);
                }
        }
Exemplo n.º 20
0
 public ModelStream(ModbusModel model, IModbusScanner scanner)
 {
     this.model   = model;
     this.scanner = scanner;
 }
Exemplo n.º 21
0
 object Apply(ModbusModel model, IModbusCommand cmd)
 {
     return(cmd.ApplyTo(model));
 }