【问题标题】:Modbus TCP Remote PortModbus TCP 远程端口
【发布时间】:2021-04-18 04:39:00
【问题描述】:

我正在为 modbus 从设备使用 stm32f4 的 freemodbus 库。

我的 Modbus TCP 远程端口连接有问题,当我给从设备加电并连接到 Modbus 主 PC 时,它们通信成功,然后我从 Modbus 主端拔下以太网电缆,它们无法相互通信, 当我分析问题时,我得到了非常有趣的信息。

当我拔下电缆并再次连接 PC 时。 PC每次都更改远程端口,所以slave不知道prvxMBTCPPortAccept回调,调用每个异常端口请求比,我分析pxPCBClient不为空,因为之前的连接,并且每次更改主端口后它都不会清理pxPCBClient! = NULL 比 modbus TCP 状态 contunie 很有趣,当我比较 pxPCB 信息时有新的连接请求信息

pxPCBClient->remote_portpxPCB->remote_port 客户端远程端口永远拥有成功之前的端口信息,并且pxPCB->remote_port 更改每个PC 更改端口。

我该如何解决这个问题?当我拔下电缆并再次连接时,如何再次从属连接?请帮帮我

当我初始化 modbus TCP 接受回调时,我使用如下行:

tcp_accept( pxPCBListenNew, prvxMBTCPPortAccept );

和prvxMBTCPPortAccept函数:

err_t prvxMBTCPPortAccept( void *pvArg, struct tcp_pcb *pxPCB, err_t xErr )
{
    err_t           error;

    if( xErr != ERR_OK )
    {
        return xErr;
    }
     SerialPrint("\nPCBClient Port : %d\n",pxPCBClient->remote_port);
     SerialPrint("pxPCB Port : %d\n",pxPCB->remote_port);

    /* We can handle only one client. */
    if( pxPCBClient == NULL )
    {
        /* Register the client. */
        pxPCBClient = pxPCB;

        /* Set up the receive function prvxMBTCPPortReceive( ) to be called when data
         * arrives.
         */
        tcp_recv( pxPCB, prvxMBTCPPortReceive );

        /* Register error handler. */
        tcp_err( pxPCB, prvvMBTCPPortError );

        /* Set callback argument later used in the error handler. */
        tcp_arg( pxPCB, pxPCB );

        /* Reset the buffers and state variables. */
        usTCPBufPos = 0;

#ifdef MB_TCP_DEBUG
        vMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Accepted new client %d.%d.%d.%d\r\n",
                    ip4_addr1( &( pxPCB->remote_ip ) ),
                    ip4_addr2( &( pxPCB->remote_ip ) ),
                    ip4_addr3( &( pxPCB->remote_ip ) ), ip4_addr4( &( pxPCB->remote_ip ) ) );
#endif

        error = (int8_t)ERR_OK;
    }
    else
    {
        prvvMBPortReleaseClient( pxPCB );
        error = (int8_t)ERR_OK;
    }
    return error;
}

【问题讨论】:

    标签: tcp port ethernet modbus


    【解决方案1】:
    • 主机连接到从机。 (看来你试图做相反的事情)

    • master 是客户端,slave 是服务器。

    • 服务器通常在 Modbus 端口 502 上侦听连接,客户端连接到此服务器端口

    • 客户端用来连接的端口无所谓,一般都是大端口号,一般大于10000,由操作系统自动分配,每次连接都会改变。

    • 服务器不应该按客户端端口号过滤,它应该接受任何客户端端口号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2020-06-10
      • 1970-01-01
      • 2011-06-22
      • 2011-01-23
      相关资源
      最近更新 更多