首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Modbus TCP-从空异常,对象引用未设置为对象的实例

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

Stack Overflow用户
提问于 2018-10-03 05:53:37
回答 1查看 598关注 0票数 0

我正在开发一个窗口表单,作为modbus tcp从模拟器。我正在尝试从modbus主接收多个线圈请求。我能够正确地接收到请求,但是当我尝试执行写操作时,它会抛出"object reference is not set to an instance of an object"异常。它说奴隶是空的,但是我已经创建了一个奴隶实例并对它进行了初始化。我正在使用NModbus库。这是我的密码

代码语言:javascript
复制
        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行,如果我试图写多个线圈。有谁能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-03 06:00:17

看起来您没有正确实例化您的slave。您正在创建一个局部变量slave,其作用域为Button1_Click

代码语言:javascript
复制
ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);

您正在访问slave中的DataStoreWrittenTo,它应该有一个类范围。

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

代码语言:javascript
复制
slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52620497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档