I want to write a c# application using EasyModbusTCP lib. My target is to have multiple modbus server on same pc using different tcp port( ex. 3001 for mbServer[0] and 3002 for mbServer[1]).
I want to use the code posted by @Alex (https://stackoverflow.com/questions/57984190/issue-while-writing-modbusclient-and-modbusserver-together/62361088?noredirect=1#comment110292993_62361088) but I have a problem to identify witch server is allocated the Ser_HoldingRegistersChanged method.
When change the holding registers the function Ser_HoldingRegistersChanged is started but not how know witch server called this function.
With code I read back the holding register value only for one server.
You have a solution for me to send on runtime the z indentifier? Thanks to all.
public static void holdingRegistersChanged(int startingAddress, int quantity)
{
Console.WriteLine(startingAddress);
Console.WriteLine(quantity);
int z=0;
Console.WriteLine(mbServer[z].holdingRegisters[startingAddress]);
}
//============Code from Alex on stackoverflow
public partial class Form1 : Form
{
private int register = 0;
private readonly int port = 502;
private readonly List<modbusserver> servers = new List<modbusserver>();
private readonly List<modbusclient> clients = new List<modbusclient>();</modbusclient></modbusclient></modbusserver></modbusserver>
publicForm1()
{
InitializeComponent();AppDomain.CurrentDomain.FirstChanceException+=(sender, e)=>MessageBox.Show(e.Exception.Message);
}
privatevoidFoo(objectsender, ThreadExceptionEventArgse)
{
MessageBox.Show(e.Exception.Message);
}
privatevoidSer_HoldingRegistersChanged(intregister, intnumberOfRegisters)=>MessageBox.Show($"register: {register}, numberOfRegisters: {numberOfRegisters}");privatevoidAddServer_Click(objectsender, EventArgse)=>AddServerMethod();privatevoidAddClient_Click(objectsender, EventArgse)=>AddClientMethod();privatevoidAddServerMethod()
{
varserver=newModbusServer { Port=port };server.Listen();server.HoldingRegistersChanged+=Ser_HoldingRegistersChanged;servers.Add(server);MessageBox.Show("Server added.");server.holdingRegisters[0] =11; // register is changed, but no event is fired
}
privatevoidAddClientMethod()
{
varclient=newModbusClient("127.0.0.1", port);client.Connect();clients.Add(client);MessageBox.Show("Client added.");client.WriteSingleRegister(register++, 11); // event is fired
}
}
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi, I din't try that, but if you write a register to the Server listening on port 3001 it should update the Registers of that Server instance and call the appropriate callback function, the same with the Server instance listening on port 3002
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi,
I want to write a c# application using EasyModbusTCP lib. My target is to have multiple modbus server on same pc using different tcp port( ex. 3001 for mbServer[0] and 3002 for mbServer[1]).
I want to use the code posted by @Alex (https://stackoverflow.com/questions/57984190/issue-while-writing-modbusclient-and-modbusserver-together/62361088?noredirect=1#comment110292993_62361088) but I have a problem to identify witch server is allocated the Ser_HoldingRegistersChanged method.
When change the holding registers the function Ser_HoldingRegistersChanged is started but not how know witch server called this function.
With code I read back the holding register value only for one server.
You have a solution for me to send on runtime the z indentifier? Thanks to all.
public static void holdingRegistersChanged(int startingAddress, int quantity)
{
Console.WriteLine(startingAddress);
Console.WriteLine(quantity);
int z=0;
Console.WriteLine(mbServer[z].holdingRegisters[startingAddress]);
}
//============Code from Alex on stackoverflow
public partial class Form1 : Form
{
private int register = 0;
private readonly int port = 502;
private readonly List<modbusserver> servers = new List<modbusserver>();
private readonly List<modbusclient> clients = new List<modbusclient>();</modbusclient></modbusclient></modbusserver></modbusserver>
}
Hi, I din't try that, but if you write a register to the Server listening on port 3001 it should update the Registers of that Server instance and call the appropriate callback function, the same with the Server instance listening on port 3002