Reputation: 23
I am developing a windows form to function as a modbus tcp slave Simuator. I am trying to recieve write multiple coil request from modbus master. I am able to recieve the request correctly, but when I try to do the write operation it's
throwing "object reference is not set to an instance of an object"
exception. It's saying slave is null, but I have created an instance of slave and initialized it. I am using NModbus Library. Here is my code
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.
}
}
I am getting the exception at line A if I try to write Multiple Holding Registers and at line B if I try to write Multiple Coils. Can any one please help me to solve this issue?
Upvotes: 0
Views: 1028
Reputation: 5141
It looks like you're not instantiating your slave
correctly. You are creating a local variable slave
with the scope of Button1_Click
.
ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);
and you are accessing slave
in DataStoreWrittenTo
which should have a class scope.
You should change the above instantiation to:
slave = ModbusTcpSlave.CreateTcp(slaveAddress, slaveTcpListener);
Upvotes: 1