Menu

Controliing multiple Modbus Server on same pc

Anonymous
2020-06-14
2020-08-11
  • Anonymous

    Anonymous - 2020-06-14

    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>

    public Form1()
    {
        InitializeComponent();
        AppDomain.CurrentDomain.FirstChanceException +=
            (sender, e) => MessageBox.Show(e.Exception.Message);
    }
    
    private void Foo(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message);
    }
    
    private void Ser_HoldingRegistersChanged(int register, int numberOfRegisters) =>
        MessageBox.Show($"register: {register}, numberOfRegisters: {numberOfRegisters}");
    
    private void AddServer_Click(object sender, EventArgs e) =>
        AddServerMethod();
    
    private void AddClient_Click(object sender, EventArgs e) =>
        AddClientMethod();
    
    private void AddServerMethod()
    {
        var server = new ModbusServer { 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
    }
    
    private void AddClientMethod()
    {
        var client = new ModbusClient("127.0.0.1", port);
        client.Connect();
        clients.Add(client);
        MessageBox.Show("Client added.");
        client.WriteSingleRegister(register++, 11); // event is fired
    }
    

    }

     
    • Rossmann Engineering

      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

       

Anonymous
Anonymous

Add attachments
Cancel





Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.