【问题标题】:How to use tcplistener and tcpclient on device and computer with different ip in same Network?如何在同一网络中具有不同 ip 的设备和计算机上使用 tcplistener 和 tcpclient?
【发布时间】:2020-11-07 01:10:26
【问题描述】:

我正在尝试与我网络中 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());

}

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

【问题讨论】:

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

标签: c# tcpclient tcplistener modbus-tcp


【解决方案1】:

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

我认为我必须在路由器上进行一些端口转发。我没有。并没有什么不同。

服务器设置:

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

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

PLC程序

我正在使用 Koyo 的 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2014-12-29
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多