Modbus TCP-Slave Null Exception, ссылка на объект не установлена ​​для экземпляра объекта - PullRequest
0 голосов
/ 03 октября 2018

Я разрабатываю форму окна, которая будет функционировать как Modbus Tcp Slave Simuator.Я пытаюсь получить запрос на запись нескольких катушек от мастера Modbus.Я могу правильно получить запрос, но когда я пытаюсь выполнить операцию записи, возникает исключение "object reference is not set to an instance of an object".Он говорит, что раб - ноль, но я создал экземпляр раба и инициализировал его.Я использую библиотеку 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, если я пытаюсь написать несколько катушек.Может ли кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 03 октября 2018

Похоже, вы неправильно создаете экземпляр slave.Вы создаете локальную переменную slave с областью действия Button1_Click.

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

и получаете доступ к slave в DataStoreWrittenTo, которая должна иметь область действия класса.

Вы должны изменить вышеуказанный экземпляр на:

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