关于“守则”
我正在使用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代码。
你能告诉我为什么会发生这种事吗?
发布于 2019-09-22 22:28:48
你的问题不那么严重,你的主要问题在这一行
ser.Listen();因为您以前的服务器套接字仍然处于绑定的中。
当一个监听套接字被绑定时,让我们看一看?
显而易见的原因是,当侦听套接字发送/接收数据包时,在罕见的情况下,当OS处于不理想的状态( cpu使用率为100%等)时,释放服务器套接字可能需要一分钟的时间。在这种情况下,当您再次运行服务器时,会出现异常。
通常只允许使用每个套接字地址(协议/网络地址/端口)。
正如我在前一个服务器套接字尚未发布之前所说的那样,happens.because。
解决方案是
对不同的服务器套接字使用不同的端口
或
只使用一个只启动一次的服务器套接字,并检查它是否已连接。
// 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();发布于 2019-09-22 22:02:49
似乎您已经在端口上有了一个服务器,并且尝试添加一个服务器。试试下面的代码:
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,就会得到另一个错误。添加一个服务器,然后添加任意数量的客户端。每个客户端都写入一个持有寄存器,相关事件由如下消息触发:

https://stackoverflow.com/questions/57984190
复制相似问题