Связь по ModBus Tcp/ip между двумя ПЛК 100 подключенными в сеть.
Добрый день.
Нужно связать несколько ПЛК 100 (пока их два) через Ethernet используя ModBus Tcp/ip. Использую сокеты "клиент" - "сервер".
Сервер:
SST_INIT:
IF m_dnServerSocket = SOCKET_INVALID THEN
m_dnServerSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
END_IF;
IF m_dnServerSocket <> SOCKET_INVALID THEN
o_eCondition := SST_SETUP;
END_IF;
SST_SETUP:
IF SysSockSetOption( m_dnServerSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR( m_dnTrue ), SIZEOF( m_dnTrue ) ) THEN (*m_dnTrue=1*)
m_ServerSAddres.sin_family := SOCKET_AF_INET;
m_ServerSAddres.sin_addr := SOCKET_INADDR_ANY;
m_ServerSAddres.sin_port := SysSockHtons( 502 );
IF NOT SysSockBind( m_dnServerSocket, ADR( m_ServerSAddres ), SIZEOF( m_ServerSAddres ) ) THEN
o_eCondition := SST_CLOSE;
ELSIF SysSockIoctl( m_dnServerSocket, SOCKET_FIONBIO, ADR( m_dnTrue ) ) <> 0 THEN
o_eCondition := SST_CLOSE;
ELSE
o_eCondition := SST_LISTEN;
END_IF;
END_IF;
SST_LISTEN:
IF SysSockListen( m_dnServerSocket, 1 ) THEN
o_eCondition := SST_ACCEPT;
ELSE
m_dnError := 0;
m_dwSize := SIZEOF( m_dnError );
m_bRes := SysSockGetOption( m_dnSocket, SOCKET_SOL, SOCKET_SO_ERROR, ADR( m_dnError ), ADR( m_dwSize ) );
IF NOT m_bRes OR m_dnError <> 0 THEN
o_eCondition := CST_CLOSE;
END_IF
END_IF;
дальше "прослушки" дело не идет. m_dnError = 0.
Клиент:
CST_INIT:
IF m_dnSocket = SOCKET_INVALID THEN
m_dnSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
END_IF;
IF m_dnSocket <> SOCKET_INVALID THEN
o_eCondition := CST_SETUP;
END_IF;
CST_SETUP:
IF SysSockIoctl( m_dnSocket, SOCKET_FIONBIO, ADR( m_dnTrue ) ) = 0 THEN
m_SAddress.sin_family := SOCKET_AF_INET;
m_SAddress.sin_addr := 16#0A000008; (* IP "сервера" 10.0.0.8 *)
m_SAddress.sin_port := SysSockHtons ( 502 );
o_eCondition := CST_CONNECT;
END_IF;
CST_CONNECT:
IF m_tonExpect.Q OR NOT m_tonExpect.IN THEN
IF SysSockConnect( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
o_eCondition := CST_EXPECT;
ELSE
m_dnError := 0;
m_dwSize := SIZEOF( m_dnError );
m_bRes := SysSockGetOption( m_dnSocket, SOCKET_SOL, SOCKET_SO_ERROR, ADR( m_dnError ), ADR( m_dwSize ) );
IF NOT m_bRes OR m_dnError <> 0 THEN
o_eCondition := CST_CLOSE;
END_IF
END_IF;
m_tonExpect( IN := FALSE );
END_IF;
m_tonExpect( IN := TRUE, PT := T#1s );
SysSockConnect TRUE не возвращает. m_dnError = 0.
манипуляторы сокетов почему то с двух сторон равны единице. SysSockCreate на "сервере" и на "клиенте" возвращает "1". может это и правильно, но связи нет. что я делаю не так? )