Modbus TCP 远程端口

问题描述

我将 freemodbus 库用于 stm32f4 的 modbus 从设备。

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

当我拔下电缆并再次连接到 PC 时。 PC每次都改变远程端口,所以slave不知道prvxMBTCPPortAccept回调,调用每个异常端口请求比,我分析了pxPCBClient因为之前连接不为空,并且它在master端口改变后不清除所以每次 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;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)