Modbus TCP-Slave 空异常,对象引用未设置为对象的实例

Modbus TCP-Slave Null Exception,Object reference not set to an instance of an object

我正在开发一个 windows 形式来充当 modbus tcp 从站模拟器。我正在尝试从 modbus 主机接收写入多个线圈的请求。我能够正确接收请求,但是当我尝试执行写操作时,它是 抛出 "object reference is not set to an instance of an object" 异常。它说 slave 为空,但我已经创建了一个 slave 实例并对其进行了初始化。我正在使用 NModbus 库。这是我的代码

        private void Button1_Click(object sender, EventArgs e)
        {

              try
              {

                byte slaveAddress = Convert.ToByte(textBox3.Text);

                IPAddress address = IPAddress.Parse(textBox1.Text);
                int port = Convert.ToInt32(textBox2.Text);

                // create and start the TCP slave
                TcpListener slaveTcpListener = new TcpListener(address, port);
                slaveTcpListener.Start();


                ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);


                slave.Listen();
                slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
                DataStore dataStore = slave.DataStore;


                slave.ModbusSlaveRequestReceived += new EventHandler<ModbusSlaveRequestEventArgs>(Modbus_Request_Event);

                slave.DataStore.DataStoreWrittenTo += new EventHandler<DataStoreEventArgs>(DataStoreWrittenTo);



                // prevent the main thread from exiting
                listBox1.Items.Clear();

                Thread.Sleep(Timeout.Infinite);
                //slaveTcpListener.Stop();


              }
              catch
              {
                MessageBox.Show("Error in connection");
              }
        }


 private void DataStoreWrittenTo(object sender, DataStoreEventArgs e)
        {

            switch (e.ModbusDataType)
            {

                case ModbusDataType.HoldingRegister:


                    for (int i = 1; i < e.Data.B.Count; i++)
                    {

               //Line A         slave.DataStore.HoldingRegisters[e.StartAddress + i + 1] = e.Data.B[i];
                    }

                    break;
                case ModbusDataType.Coil:

                    for (int i = 1; i < e.Data.A.Count; i++)
                    {
 //Line B                       slave.DataStore.CoilDiscretes[e.StartAddress + i + 1] = e.Data.A[i];
                    }
                    break;
                    //case Modbus.


            }


        }   

如果我尝试写入多个保持寄存器,我会在 A 行收到异常,如果我尝试写入多个线圈,则会在 B 行收到异常。 谁能帮我解决这个问题?

您似乎没有正确实例化 slave。您正在创建一个范围为 Button1_Click.

的局部变量 slave
ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);

并且您正在访问 DataStoreWrittenTo 中的 slave,它应该具有 class 范围。

您应该将上面的实例化更改为:

slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);