c# - 一起编写 ModbusClient 和 ModbusServer 时出现问题
问题描述
关于守则
我EasyModbus Nuget
在 C# 窗口窗体应用程序中使用。我正在尝试使用 RTU(实时更新)获取更改后的保持寄存器的地址值ModbusServer
。
下面的代码连接到服务器。
void Connect() {
ModbusClient client = null;
client = new ModbusClient("IP Address", 502);
client.Connect();
}
下面的代码获取保持寄存器下面给出的地址值。
client.ReadHoldingRegisters(10001, 1);
到目前为止,一切正常。
我正在阅读有关 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)
{
}
当我运行它时,我得到以下错误。
每个套接字地址(协议/网络地址/端口)通常只允许使用一次
发生此错误是因为我添加了 ModbusServer 代码。
你能建议为什么会这样吗?
解决方案
你的问题不是那么严重,你的主要问题在这一行
ser.Listen();
因为您以前的服务器套接字仍在绑定中。
让我们看看监听套接字何时绑定?
明显的原因是当您的侦听套接字发送/接收数据包时,但在极少数情况下,当操作系统不处于理想状态(100 % cpu 使用率等)时会发生这种情况,然后释放服务器套接字可能需要一分钟才能释放。在这种情况下,当您再次运行服务器时,异常
每个套接字地址(协议/网络地址/端口)通常只允许使用一次
发生。因为,正如我之前所说的,之前的服务器套接字还没有发布。
解决方案是
为不同的服务器套接字使用不同的端口
或者
仅使用一个仅启动一次的服务器套接字并检查它是否已连接。
// 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();
推荐阅读
- javascript - 在 Snowflake 中使用不区分大小写的列名解析 JSON 数据
- amazon-web-services - golangs *ecr.ECR 和 *ecs.ECS 的常见类型是什么?
- linux - 如何查找包含一组单词中的至少一个作为前缀的所有行
- mysql - ERROR 1215 (HY000): 无法添加外键约束错误
- node.js - 我不能通过 node.js 中的“file:///……”检查存在吗?
- python - 多处理和数据传输到流程
- python - 使用按钮插入数据库会创建 TypeError: argument 1 must be str, not tuple
- python - 在 python 中使用 Selenium webdriver 单击 onclick 元素
- module - 错误:模块 xport 没有属性 XportReader,python xport 文件阅读器
- xaml - 如何在 Xamarin 中创建顶部的滚动视图和底部的三个按钮?