一起编写ModbusClient和ModbusServer时出现问题

Pan*_*kaj 6 c# modbus-tcp easy-modbus

关于守则

EasyModbus Nuget在C#窗口表单应用程序中使用。我正在尝试使用RTU(实时更新)来获取更改的保持寄存器的地址值ModbusServer

下面的代码连接到服务器。

void Connect() {
    ModbusClient client = null;
    client = new ModbusClient("IP Address", 502);
    client.Connect();
}
Run Code Online (Sandbox Code Playgroud)

下面的代码获取保持寄存器下面给出的地址值。

client.ReadHoldingRegisters(10001, 1);
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切正常。

我正在阅读有关在EasyModbus中阅读实时更新的信息。我发现此链接可以将保持寄存器的更改后的值自动发送到偶数处理程序。

现在,我有以下代码:

void Connect() {
    ModbusServer ser = new ModbusServer();
    ser.Port = Convert.ToInt32(Settings.Default.Port);
    ser.Listen();
    ser.HoldingRegistersChanged += Ser_HoldingRegistersChanged;

    ModbusClient client = null;
    client = new ModbusClient("IP Address", 502);
    client.Connect();
}


private void Ser_HoldingRegistersChanged(int register, int numberOfRegisters)
{
}
Run Code Online (Sandbox Code Playgroud)

运行它时,出现以下错误。

通常,每个套接字地址(协议/网络地址/端口)只能使用一种

发生此错误是因为我添加了ModbusServer代码。

您能否说明为什么会这样?

Ale*_*lex 1

看来您的端口上已经有一台服务器,并且您尝试再添加一台服务器。尝试下面的代码:

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>();

    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
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您单击AddServer多次,您会收到您所描述的错误。顺便说一句,如果您在收到另一个错误AddClient之前单击。AddServer添加一台服务器,然后添加任意数量的客户端。每个客户端都会写入一个保持寄存器,并使用如下消息触发相关事件:

在此输入图像描述