我正在开发一个窗口表单,作为modbus tcp从模拟器。我正在尝试从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行,如果我试图写多个线圈。有谁能帮我解决这个问题吗?
发布于 2018-10-03 06:00:17
看起来您没有正确实例化您的slave。您正在创建一个局部变量slave,其作用域为Button1_Click。
ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);您正在访问slave中的DataStoreWrittenTo,它应该有一个类范围。
您应该将上面的实例化更改为:
slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);https://stackoverflow.com/questions/52620497
复制相似问题