예제 #1
0
        public void NModbusSerialRtuSlave_BonusCharacter_VerifyTimeout()
        {
            SerialPort masterPort = ModbusMasterFixture.CreateAndOpenSerialPort(ModbusMasterFixture.DefaultMasterSerialPortName);
            SerialPort slavePort  = ModbusMasterFixture.CreateAndOpenSerialPort(ModbusMasterFixture.DefaultSlaveSerialPortName);

            using (var master = ModbusSerialMaster.CreateRtu(masterPort))
                using (var slave = ModbusSerialSlave.CreateRtu(1, slavePort))
                {
                    master.Transport.ReadTimeout = master.Transport.WriteTimeout = 1000;
                    slave.DataStore = DataStoreFactory.CreateTestDataStore();

                    Thread slaveThread = new Thread(slave.Listen);
                    slaveThread.IsBackground = true;
                    slaveThread.Start();

                    // assert successful communication
                    Assert.AreEqual(new bool[] { false, true }, master.ReadCoils(1, 1, 2));

                    // write "bonus" character
                    masterPort.Write("*");

                    // assert successful communication
                    Assert.AreEqual(new bool[] { false, true }, master.ReadCoils(1, 1, 2));
                }
        }
예제 #2
0
 public override async void SimulatorStart()
 {
     if (_simularorClient == null)
     {
         return;
     }
     await Task.Run(() =>
     {
         for (int i = 0; i < slaves.Count; i++)
         {
             try
             {
                 slaves[i].ModbusSlaveRequestReceived += Modbus_Serial_ModbusSlaveRequestReceived;
                 slaves[i].WriteComplete += Modbus_Serial_WriteComplete;
                 slaves[i].ListenAsync();
             }
             catch (Exception emx)
             {
                 this.SimulatorAppendLog("启动模拟器失败 " + emx.Message);
             }
         }
         Random rd = new Random();
         //初始化数据
         while (true)
         {
             for (int i = 0; i < slaves.Count; i++)
             {
                 slaves[i].DataStore = DataStoreFactory.CreateTestDataStore();
             }
             this.SimulatorAppendLog("所有从机初始化数据一次");
             Thread.Sleep(SimulatorUpdateCycle * 1000);
         }
     });
 }
예제 #3
0
    public static void StartSlave(ModbusSlave slave)
    {
        slave.DataStore = DataStoreFactory.CreateTestDataStore();
        Thread?slaveThread = new(async() => await slave.ListenAsync());

        slaveThread.Start();
    }
예제 #4
0
        public static void StartSlave(ModbusSlave slave)
        {
            slave.DataStore = DataStoreFactory.CreateTestDataStore();
            var slaveThread = new Thread(slave.Listen);

            slaveThread.Start();
        }
예제 #5
0
        public void ModbusUdpSlave_MultipleMasters()
        {
            Random    randomNumberGenerator = new Random();
            bool      master1Complete       = false;
            bool      master2Complete       = false;
            UdpClient masterClient1         = new UdpClient();

            masterClient1.Connect(ModbusMasterFixture.DefaultModbusIPEndPoint);
            ModbusIpMaster master1 = ModbusIpMaster.CreateIp(masterClient1);

            UdpClient masterClient2 = new UdpClient();

            masterClient2.Connect(ModbusMasterFixture.DefaultModbusIPEndPoint);
            ModbusIpMaster master2 = ModbusIpMaster.CreateIp(masterClient2);

            UdpClient slaveClient = CreateAndStartUdpSlave(ModbusMasterFixture.Port, DataStoreFactory.CreateTestDataStore());

            Thread master1Thread = new Thread(delegate()
            {
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(randomNumberGenerator.Next(1000));
                    _log.Debug("Read from master 1");
                    Assert.AreEqual(new ushort[] { 2, 3, 4, 5, 6 }, master1.ReadHoldingRegisters(1, 5));
                }
                master1Complete = true;
            });

            Thread master2Thread = new Thread(delegate()
            {
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(randomNumberGenerator.Next(1000));
                    _log.Debug("Read from master 2");
                    Assert.AreEqual(new ushort[] { 3, 4, 5, 6, 7 }, master2.ReadHoldingRegisters(2, 5));
                }
                master2Complete = true;
            });

            master1Thread.Start();
            master2Thread.Start();

            while (!master1Complete || !master2Complete)
            {
                Thread.Sleep(200);
            }

            slaveClient.Close();
            masterClient1.Close();
            masterClient2.Close();
        }
예제 #6
0
        public void DataStoreReadFromEvent_ReadHoldingRegisters()
        {
            DataStore dataStore = DataStoreFactory.CreateTestDataStore();

            bool readFromEventFired  = false;
            bool writtenToEventFired = false;

            dataStore.DataStoreReadFrom += (obj, e) =>
            {
                readFromEventFired = true;
                Assert.AreEqual(3, e.StartAddress);
                Assert.AreEqual(new ushort[] { 4, 5, 6 }, e.Data.B.ToArray());
                Assert.AreEqual(ModbusDataType.HoldingRegister, e.ModbusDataType);
            };

            dataStore.DataStoreWrittenTo += (obj, e) => writtenToEventFired = true;

            DataStore.ReadData <RegisterCollection, ushort>(dataStore, dataStore.HoldingRegisters, 3, 3, new object());
            Assert.IsTrue(readFromEventFired);
            Assert.IsFalse(writtenToEventFired);
        }
예제 #7
0
        public void DataStoreReadFromEvent_ReadInputs()
        {
            DataStore dataStore = DataStoreFactory.CreateTestDataStore();

            bool readFromEventFired  = false;
            bool writtenToEventFired = false;

            dataStore.DataStoreReadFrom += (obj, e) =>
            {
                readFromEventFired = true;
                Assert.AreEqual(4, e.StartAddress);
                Assert.AreEqual(new bool[] { false }, e.Data.A.ToArray());
                Assert.AreEqual(ModbusDataType.Input, e.ModbusDataType);
            };

            dataStore.DataStoreWrittenTo += (obj, e) => writtenToEventFired = true;

            DataStore.ReadData <DiscreteCollection, bool>(dataStore, dataStore.InputDiscretes, 4, 1, new object());
            Assert.IsTrue(readFromEventFired);
            Assert.IsFalse(writtenToEventFired);
        }
예제 #8
0
        public void DataStoreReadFromEvent_ReadInputRegisters()
        {
            DataStore dataStore = DataStoreFactory.CreateTestDataStore();

            bool readFromEventFired  = false;
            bool writtenToEventFired = false;

            dataStore.DataStoreReadFrom += (obj, e) =>
            {
                readFromEventFired = true;
                Assert.Equal(4, e.StartAddress);
                Assert.Equal(new ushort[] {}, e.Data.B.ToArray());
                Assert.Equal(ModbusDataType.InputRegister, e.ModbusDataType);
            };

            dataStore.DataStoreWrittenTo += (obj, e) => writtenToEventFired = true;

            dataStore.ReadData <RegisterCollection, ushort>(dataStore.InputRegisters, 4, 0, new object());
            Assert.True(readFromEventFired);
            Assert.False(writtenToEventFired);
        }
예제 #9
0
        public void DataStoreWrittenToEvent_WriteHoldingRegisters()
        {
            DataStore dataStore = DataStoreFactory.CreateTestDataStore();

            bool readFromEventFired  = false;
            bool writtenToEventFired = false;

            dataStore.DataStoreWrittenTo += (obj, e) =>
            {
                writtenToEventFired = true;
                Assert.AreEqual(3, e.Data.B.Count);
                Assert.AreEqual(0, e.StartAddress);
                Assert.AreEqual(new ushort[] { 5, 6, 7 }, e.Data.B.ToArray());
                Assert.AreEqual(ModbusDataType.HoldingRegister, e.ModbusDataType);
            };

            dataStore.DataStoreReadFrom += (obj, e) => readFromEventFired = true;

            DataStore.WriteData(dataStore, new RegisterCollection(5, 6, 7), dataStore.HoldingRegisters, 0, new object());
            Assert.IsFalse(readFromEventFired);
            Assert.IsTrue(writtenToEventFired);
        }
예제 #10
0
        public void DataStoreWrittenToEvent_WriteCoils()
        {
            DataStore dataStore = DataStoreFactory.CreateTestDataStore();

            bool readFromEventFired  = false;
            bool writtenToEventFired = false;

            dataStore.DataStoreWrittenTo += (obj, e) =>
            {
                writtenToEventFired = true;
                Assert.AreEqual(3, e.Data.A.Count);
                Assert.AreEqual(4, e.StartAddress);
                Assert.AreEqual(new [] { true, false, true }, e.Data.A.ToArray());
                Assert.AreEqual(ModbusDataType.Coil, e.ModbusDataType);
            };

            dataStore.DataStoreReadFrom += (obj, e) => readFromEventFired = true;

            DataStore.WriteData(dataStore, new DiscreteCollection(true, false, true), dataStore.CoilDiscretes, 4, new object());
            Assert.IsFalse(readFromEventFired);
            Assert.IsTrue(writtenToEventFired);
        }
예제 #11
0
 public void SetUp()
 {
     _testDataStore = DataStoreFactory.CreateTestDataStore();
 }
예제 #12
0
 public ModbusSlaveFixture()
 {
     _testDataStore = DataStoreFactory.CreateTestDataStore();
 }