Modbus TCP 远程端口
Modbus TCP Remote Port
我正在将 stm32f4 的 freemodbus 库用于 modbus 从设备。
我的 Modbus TCP 远程端口连接有问题,当我启动从属设备并连接到 Modbus 主控 PC 时,它们通信成功,然后我从 modbus 主控端拔下以太网电缆,它们无法与彼此,当我分析问题时,我得到了非常有趣的信息。
当我拔下数据线并再次连接 PC 时。 PC 每次都更改远程端口,所以从机不知道 prvxMBTCPPortAccept
回调,调用每个异常端口请求比,我分析 pxPCBClient
not null 因为之前的连接,并且在主端口更改后它不清除所以每次 pxPCBClient != NULL 比 modbus TCP 状态更有趣,当我比较时 pxPCB 信息有新的连接请求信息
pxPCBClient->remote_port
和 pxPCB->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;
}
主机连接到从机。 (看来你想反其道而行之)
master为client,slave为server
服务器通常在 Modbus 端口 502 上侦听连接,客户端连接到此服务器端口
客户端连接的端口号无所谓,一般都是高端口号,一般大于10000,由操作系统自动分配,每次连接都会改变.
服务器不应该按客户端端口号过滤,它应该接受任何客户端端口号
我正在将 stm32f4 的 freemodbus 库用于 modbus 从设备。
我的 Modbus TCP 远程端口连接有问题,当我启动从属设备并连接到 Modbus 主控 PC 时,它们通信成功,然后我从 modbus 主控端拔下以太网电缆,它们无法与彼此,当我分析问题时,我得到了非常有趣的信息。
当我拔下数据线并再次连接 PC 时。 PC 每次都更改远程端口,所以从机不知道 prvxMBTCPPortAccept
回调,调用每个异常端口请求比,我分析 pxPCBClient
not null 因为之前的连接,并且在主端口更改后它不清除所以每次 pxPCBClient != NULL 比 modbus TCP 状态更有趣,当我比较时 pxPCB 信息有新的连接请求信息
pxPCBClient->remote_port
和 pxPCB->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;
}
主机连接到从机。 (看来你想反其道而行之)
master为client,slave为server
服务器通常在 Modbus 端口 502 上侦听连接,客户端连接到此服务器端口
客户端连接的端口号无所谓,一般都是高端口号,一般大于10000,由操作系统自动分配,每次连接都会改变.
服务器不应该按客户端端口号过滤,它应该接受任何客户端端口号