首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一起编写ModbusClient和ModbusServer时的问题

一起编写ModbusClient和ModbusServer时的问题
EN

Stack Overflow用户
提问于 2019-09-18 02:18:15
回答 2查看 2.7K关注 0票数 6

关于“守则”

我正在使用EasyModbus Nuget在C#窗口窗体应用程序。我试图通过RTU(实时更新)获取更改后的持有寄存器的地址值,使用ModbusServer

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

代码语言:javascript
复制
void Connect() {
    ModbusClient client = null;
    client = new ModbusClient("IP Address", 502);
    client.Connect();
}

代码下面的获取持有寄存器.下面给定的地址的值。

代码语言:javascript
复制
client.ReadHoldingRegisters(10001, 1);

到目前为止,一切都很完美。--

我读到了关于在EasyModbus中实时更新的文章。我找到了这个链接,它可以将保存寄存器的更改值自动发送到偶数处理程序。

现在,我有下面的代码:

代码语言:javascript
复制
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)
{
}

当我运行它时,我会得到以下错误.

通常只允许使用每个套接字地址(协议/网络地址/端口)。

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

你能告诉我为什么会发生这种事吗?

EN

回答 2

Stack Overflow用户

发布于 2019-09-22 22:28:48

你的问题不那么严重,你的主要问题在这一行

代码语言:javascript
复制
ser.Listen();

因为您以前的服务器套接字仍然处于绑定的中。

当一个监听套接字被绑定时,让我们看一看?

显而易见的原因是,当侦听套接字发送/接收数据包时,在罕见的情况下,当OS处于不理想的状态( cpu使用率为100%等)时,释放服务器套接字可能需要一分钟的时间。在这种情况下,当您再次运行服务器时,会出现异常。

通常只允许使用每个套接字地址(协议/网络地址/端口)。

正如我在前一个服务器套接字尚未发布之前所说的那样,happens.because。

解决方案是

对不同的服务器套接字使用不同的端口

只使用一个只启动一次的服务器套接字,并检查它是否已连接。

代码语言:javascript
复制
// create the socket
public static Socket listenSocket = new Socket(AddressFamily.InterNetwork, 
                                        SocketType.Stream,
                                        ProtocolType.Tcp);

// bind the listening socket to the port
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, port);
if(!listenSocket.IsBound){
  listenSocket.Bind(ep);     
  // start listening
  listenSocket.Listen(backlog);
}
// connect client 
ModbusClient client = null;
client = new ModbusClient(hostIP , port);
client.Connect();
票数 3
EN

Stack Overflow用户

发布于 2019-09-22 22:02:49

似乎您已经在端口上有了一个服务器,并且尝试添加一个服务器。试试下面的代码:

代码语言:javascript
复制
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
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57984190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档