Показано с 1 по 10 из 13

Тема: Связь по ModBus Tcp/ip между двумя ПЛК 100 подключенными в сеть.

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию Связь по 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". может это и правильно, но связи нет. что я делаю не так? )
    Последний раз редактировалось lazy; 24.05.2012 в 12:42.

Похожие темы

  1. Датчики с двумя ЧЭ
    от energohran в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 07.04.2012, 13:46
  2. Подключение приборов Owen в сеть ModBus
    от alex_sinjawin в разделе Сетевые технологии
    Ответов: 10
    Последнее сообщение: 01.04.2010, 10:02
  3. Ответов: 9
    Последнее сообщение: 05.11.2009, 09:40
  4. Сеть ModBus верхнего и нижнего уровня
    от dani1978 в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 09.02.2009, 07:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •