C# 如何在同一网络中具有不同ip的设备和计算机上使用tcplistener和tcpclient?

C# 如何在同一网络中具有不同ip的设备和计算机上使用tcplistener和tcpclient?,c#,tcpclient,tcplistener,modbus-tcp,C#,Tcpclient,Tcplistener,Modbus Tcp,我正在尝试与ip 192.168.1.76的网络中的modbus设备通信。我的主机地址是192.168.1.132。我无法连接或侦听设备ip 基本上我使用的是NModbus4库。我已经创建了一个ModbusTCPSlave并将tcp侦听器连接到它。然后我将ModbusSlaveRequestReceived事件分配给该从机。但当我试图直接从Modscan软件更改寄存器值时,它并没有给出任何回报 Main() { var masterEndpoint = new IPEndPoint(IP

我正在尝试与ip 192.168.1.76的网络中的modbus设备通信。我的主机地址是192.168.1.132。我无法连接或侦听设备ip

基本上我使用的是NModbus4库。我已经创建了一个ModbusTCPSlave并将tcp侦听器连接到它。然后我将
ModbusSlaveRequestReceived
事件分配给该从机。但当我试图直接从Modscan软件更改寄存器值时,它并没有给出任何回报

Main()
{
    var masterEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.132"), 502);
    var listener = new TcpListener(IPAddress.Any, 502);
    listener.Start();

    var slave = ModbusTcpSlave.CreateTcp(255, new TcpListener(masterEndpoint), 10);
    slave.ModbusSlaveRequestReceived += Modbus_Request_Event;
    slave.Listen();
}
private static void Modbus_Request_Event(object sender, Modbus.Device.ModbusSlaveRequestEventArgs e)
{
    //disassemble packet from master
    byte fc = e.Message.FunctionCode;
    byte[] data = e.Message.MessageFrame;
    byte[] byteStartAddress = new byte[] { data[3], data[2] };
    byte[] byteNum = new byte[] { data[5], data[4] };
    Int16 StartAddress = BitConverter.ToInt16(byteStartAddress, 0);
    Int16 NumOfPoint = BitConverter.ToInt16(byteNum, 0);
    Console.WriteLine(fc.ToString() + "," + StartAddress.ToString() + "," + NumOfPoint.ToString());

}

当任何寄存器值更改时,我希望在控制台应用程序中获得函数代码、起始地址和点数

我复制了您的代码。将IP地址更改为我的“服务器”,它就工作了。 因此,您遇到的问题要么是在“服务器”的设置中,要么是在PLC程序中

我想我必须在我的路由器上做一些端口转发。我没有。这没什么区别

服务器设置:

您的“服务器”的IP地址必须是静态的。无论您的“服务器”是否是您的开发系统。不要忘记在部署时。。。服务器的IP地址也必须是静态的(并不是说它不会…只是说)

添加入站防火墙规则以允许连接到端口,在本例中为502,否则每次启动/启动测试时都必须允许访问

PLC程序

我正在使用高雄的Click PLC。不确定这是否是所有PLC的规则;但是,我们必须添加一行代码来“写入”我们想要从TCP流中获取的值。如果没有写入,PLC不会发出加入TcpListener的请求

最后一个: 启动侦听器的代码只需如下所示:

        var listener = new TcpListener(IPAddress.Parse("192.168.1.244"), 502);
        listener.Start();

        var slave = ModbusTcpSlave.CreateTcp(255, listener, 10);
        slave.ModbusSlaveRequestReceived += Modbus_Request_Event;
        slave.Listen();

首先使用cmd.exe和>PING IP。请同时尝试计算机名和IP地址。有时,当两台电脑配置了相同的IP地址时,会发生此错误。@jdweng我两个IP都试过了。机器以及设备的IP。ping正确。也用过telenet,但没用,里面一切都很好。在提供IP地址时我是否做错了什么?侦听器/服务器需要首先使用:var listener=new TcpListener(IPAddress.Any,502);然后,客户端应使用服务器名称或IP连接到服务器。服务器应该只有侦听器代码,客户端应该只有客户端代码。我认为您不应该自己创建
TcpListener
ModbusTcpSlave
在发动机罩下创建一个
TcpListener
)。因此,您的第一个侦听器可能会阻止从机使用相同的端口。此外,您的控制台应用程序会立即完成。在Main方法的末尾添加一个
Console.Readline()
,以确保它一直在侦听。@JessedeWit好的,我试试看。