首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Modbus TCP远程端口

Modbus TCP远程端口
EN

Stack Overflow用户
提问于 2021-01-13 07:23:59
回答 1查看 379关注 0票数 0

我使用stm32f4的共济会总线库作为modbus从设备。

我有一个与Modbus TCP远程端口连接的问题,当我启动从设备,连接到Modbus主PC时,他们的通信比他们成功地通信要好,我从modbus主机端拔出以太网电缆,他们无法相互通信,当我分析这个问题时,我得到了非常有趣的信息。

当我拔掉电缆,重新连接到PC上时。PC每次改变远程端口,所以从机不知道prvxMBTCPPortAccept回调,调用每个可异常端口请求比,我分析pxPCBClient不为零,因为以前的连接,并且它不干净后,主端口更改,所以每次pxPCBClient != null比modbus TCP状态很有趣,pxPCB信息有新的连接请求信息当我比较。

pxPCBClient->remote_portpxPCB->remote_port客户端远程端口在成功之前就拥有永久的端口信息,而pxPCB-> remote _port改变了每个PC的更改端口。

我该如何解决这个问题?当我拔掉电缆和重新连接时,如何再从连接?请帮帮我

当我输入modbus TCP接受回调时,我使用了如下行:

代码语言:javascript
复制
tcp_accept( pxPCBListenNew, prvxMBTCPPortAccept );

和prvxMBTCPPortAccept函数:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-13 17:30:09

主程序

  • 连接到从服务器。(似乎你试图做相反的事情)

  • 主服务器是客户端,从服务器是服务器。

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

  • 客户机用来连接的端口并不重要,它通常是一个高端口号,通常大于10000,它由操作系统自动分配,每次连接时都会更改。

  • 服务器不应按客户端端口号进行筛选,它应该接受任何客户端端口号

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65697320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档