Страница 3 из 6 ПерваяПервая 12345 ... ПоследняяПоследняя
Показано с 21 по 30 из 51

Тема: PLC 110-30 v2 & сокеты

  1. #21

    По умолчанию

    Цитата Сообщение от _Pavel_ Посмотреть сообщение
    Выложите свой код может удастся помочь...
    Вот этот код работает на старых ПЛК и не работает на м2. Не работает сервер, клиента не проверял. Переход в неблокирующий режим новым способом в код добавлял. Сервер кагбэ поднимаецо но чтение/запись возвращает -1. В старом варианте бибки это говорит об обрыве связи.

    http://www.owen.ru/forum/showthread....143#post122143

    Цитата Сообщение от Трофимов Артем Посмотреть сообщение
    Прикладываю modbusTCP клиент.
    Спасибо! Просто мне ОВЕН обещал пример сервера но чота тихо. )

  2. #22

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    Вот этот код работает на старых ПЛК и не работает на м2. Не работает сервер, клиента не проверял. Переход в неблокирующий режим новым способом в код добавлял. Сервер кагбэ поднимаецо но чтение/запись возвращает -1. В старом варианте бибки это говорит об обрыве связи.

    http://www.owen.ru/forum/showthread....143#post122143



    Спасибо! Просто мне ОВЕН обещал пример сервера но чота тихо. )
    Прикладываю пример обмена одного сокета ПЛК110_М02 клиента и сервера ниже.
    Client_server_ONESocket_M02.rar

  3. #23

    По умолчанию

    Цитата Сообщение от Masteri. Посмотреть сообщение
    Прикладываю пример обмена одного сокета ПЛК110_М02 клиента и сервера ниже.
    Правильно ли я понимаю, что теперь к серверу может подключаться до четырех клиентов? или все осталось по старому один сокет -одно подключение? И из кода непонятно следующее:

    2:
    (*готовы "слушать"*)
    listen:=SysSockListen(sock,diMaxConnections);
    IF listen<0 THEN
    state:=0;
    ELSE state:=3;
    END_IF

    то есть, если listen<0 идем создавать новый сокет, а старый закрыть?
    Последний раз редактировалось lazy; 17.04.2017 в 13:54.

  4. #24

    По умолчанию

    Теперь может подключаться несколько клиентов. Accept работает.
    Однако, т.к. ресурсы не резиновые, если есть 2 разных сервера, свободные сокеты между ними распределяются в конкурентном режиме и если на один сервер зайдёт много клиентов - другому ничего не достанется.

    Да, если ошибки - всё закрываем и по новой
    Тролль-наседка, добрый, нежный и ласковый

  5. #25

    По умолчанию

    Клиент работает, но непонятно, почему SysSockRecv и SysSockSend так часто возвращают -1. На старых ПЛК это однозначно говорило об разрыве связи и при получении -1 во время чтения/записи сокет можно было переоткрывать чтобэ связь восстановить.

  6. #26

    По умолчанию

    Они и должны возвращать -1 при отсутствии данных.
    Варианта 2 - либо считать код посл ошибки, либо таймаут на обрыв связи.
    Лучше и то и другое
    Тролль-наседка, добрый, нежный и ласковый

  7. #27

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Они и должны возвращать -1 при отсутствии данных.
    Варианта 2 - либо считать код посл ошибки, либо таймаут на обрыв связи.
    Лучше и то и другое
    Аллилуйя, сервер заработал )

    Тем не менее, можно поподробнее о SysSockGetLastError? Что там за значения в wErrorId и dwLastError могут быть?

  8. #28

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    Аллилуйя, сервер заработал )

    Тем не менее, можно поподробнее о SysSockGetLastError? Что там за значения в wErrorId и dwLastError могут быть?
    Покажи сервер плииииз.

  9. #29

    По умолчанию

    смотрите msdn.com - хелп оп сокетам
    Тролль-наседка, добрый, нежный и ласковый

  10. #30

    По умолчанию

    Цитата Сообщение от Андрей Шатохин Посмотреть сообщение
    Покажи сервер плииииз.
    CASE o_eCondition OF

    ST_EXPECT:
    IF i_pOptions^.bEnable THEN
    IF m_dnSocket = SOCKET_INVALID THEN
    m_dnSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_IP );
    ELSE
    IF SysSockSetOption( m_dnSocket, SOCKET_SOL, SOCK_NBIO, 0, 0 ) THEN
    o_eCondition := ST_SETUP;
    ELSE
    o_eCondition := ST_CLOSE;
    END_IF
    END_IF
    END_IF

    ST_SETUP:
    m_y := 255;
    o_eCondition := ST_CONECT;
    m_SAddress.sin_family := SOCKET_AF_INET;
    IF i_pOptions^.bServer THEN
    m_SAddress.sin_addr := SOCKET_INADDR_ANY;
    m_SAddress.sin_port := SysSockHtons( i_pOptions^.wMyPort );
    IF NOT SysSockBind( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
    o_eCondition := ST_CLOSE;
    END_IF
    ELSE
    m_SAddress.sin_port := SysSockHtons( i_pOptions^.wOutPort );
    m_SAddress.sin_addr := SysSockHtonl( SHL( SHL( SHL(
    BYTE_TO_DWORD( i_pOptions^.yOutAddr1 ), 8 )
    OR BYTE_TO_DWORD( i_pOptions^.yOutAddr2 ), 8 )
    OR BYTE_TO_DWORD( i_pOptions^.yOutAddr3 ), 8 )
    OR BYTE_TO_DWORD( i_pOptions^.yOutAddr4 ) );
    END_IF

    ST_CONECT:
    m_y := m_y + 1;
    IF ( m_y MOD 50 ) = 0 THEN
    IF i_pOptions^.bServer THEN
    o_dnRes := BOOL_TO_DINT( SysSockListen( m_dnSocket, 1 ) );
    IF i_pOptions^.ePCL = OVEN_110_v2 THEN
    IF o_dnRes < 0 THEN
    o_eCondition := ST_CLOSE;
    ELSE
    o_eCondition := ST_ACCEPT;
    END_IF
    ELSE
    IF o_dnRes = 0 THEN
    o_eCondition := ST_WORK;
    END_IF
    END_IF
    ELSIF NOT SysSockConnect( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
    o_eCondition := ST_WORK;
    END_IF
    END_IF

    ST_ACCEPT:
    m_dnClient := SysSockAccept( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) );
    IF NOT i_pOptions^.bEnable THEN
    o_eCondition := ST_CLOSE;
    ELSIF m_dnClient <> SOCKET_INVALID THEN
    o_eCondition := ST_WORK;
    END_IF

    ST_WORK:
    IF NOT i_pOptions^.bEnable THEN
    o_eCondition := ST_BREAK;
    END_IF

    ST_BREAK:
    o_dnRes := BOOL_TO_DINT ( SysSockShutdown( m_dnSocket, 2 ) );
    CASE i_pOptions^.ePCL OF
    OVEN_100: m_b := o_dnRes = 1;
    OVEN_110: m_b := o_dnRes = 1;
    OVEN_110_v2: m_b := o_dnRes = 0;
    END_CASE
    IF m_b THEN
    o_eCondition := ST_CLOSE;
    END_IF

    ST_CLOSE:
    o_bLink := FALSE;
    m_tonExpet( IN := o_bLink );
    IF m_dnClient <> SOCKET_INVALID THEN
    IF SysSockClose( m_dnClient ) = 1 THEN
    m_dnClient := SOCKET_INVALID;
    END_IF
    END_IF
    o_dnRes := BOOL_TO_DINT( SysSockClose ( m_dnSocket ) );
    CASE i_pOptions^.ePCL OF
    OVEN_100: m_b := o_dnRes = 1;
    OVEN_110: m_b := o_dnRes = 0;
    OVEN_110_v2: m_b := o_dnRes = 1;
    END_CASE
    IF m_b
    AND m_dnClient = SOCKET_INVALID THEN
    m_dnSocket := SOCKET_INVALID;
    o_eCondition := ST_EXPECT;
    END_IF

    END_CASE

    здесь и сервер и клиент для всех ПЛК. Но на новом 110 все еще остаюцо траблы. после программного сброса сокеты не работают. это не так страшно, но неудобно.

Страница 3 из 6 ПерваяПервая 12345 ... ПоследняяПоследняя

Похожие темы

  1. ПЛК100 2.17 не работают сокеты
    от murdemon в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 02.07.2018, 21:15
  2. ПЛК100 + Сокеты
    от ribamuka в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 30.08.2017, 11:55
  3. Возможно ли в режиме эмуляции Codesys тестировать работу через сокеты TCP
    от Денис Бердяев в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 09.10.2014, 08:23

Ваши права

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