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

2024-01-14

关于本准则

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

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

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

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

client.ReadHoldingRegisters(10001, 1);

到目前为止,一切都很顺利。

我正在阅读有关 EasyModbus 中实时更新的内容。我发现这个链接可以将保持寄存器的更改值自动发送到偶数处理程序。 http://easymodbustcp.net/net-modbusserver-events

现在,我有以下代码:

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 代码。

您能说明为什么会发生这种情况吗?


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

ser.Listen();

因为你以前的服务器套接字仍然在bound.

让我们看一下侦听套接字何时处于绑定状态?

明显的原因是当您的侦听套接字发送/接收数据包时,但在极少数情况下,当操作系统不处于理想状态(100% cpu 使用率等)时,就会发生这种情况,然后释放服务器套接字可能需要一分钟才能释放。在这种情况下,当您再次运行服务器时,会出现异常

每个套接字地址(协议/网络地址/端口)只能使用一次 通常是允许的

发生。因为,正如我之前所说,之前的服务器套接字尚未释放。

解决办法是

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

or

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

// 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一起编写 ModbusClient 和 ModbusServer 时出现问题 的相关文章

随机推荐