Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: СПК1хх & Сокеты

  1. #1

    По умолчанию СПК1хх & Сокеты

    Добрый день!

    Добрался до сокетов. Пытаюсь поднять сервер.

    Открываю сокет:
    m_hSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP, ADR( m_hRes ) );
    все ок.

    Далее SysSockBind:

    m_SAddress.sin_family := SOCKET_AF_INET;
    //m_SAddress.sin_addr := SOCKET_INADDR_ANY; - пока закоментировал так как компилятор ругается если скармливать сюда SOCKET_INADDR_ANY
    m_SAddress.sin_port := SysSockHtons( i_rOptions.wPort );
    m_hRes := SysSockBind( m_hSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) );
    IF 0 = m_hRes THEN
    o_eCondition := ST_CONNECT;
    ELSE
    o_eCondition := ST_CLOSE;
    END_IF

    SysSockBind возвращяет ERR_SOCK_ADDRINUSE 16#207 - The provided address is already in use. Куда копать? и полцарства за примерчик с сокетами на СПК.

  2. #2

    По умолчанию

    Добрый день.

    1. По фрагменту кода сложно дать комментарии - могу только предположить, что bind один раз все же отработал, а SysSocketClose после этого не вызывался.
    Проще всего перезагрузить контроллер, чтобы освободить все ресурсы, и проверить еще раз.

    2. Если нет веских причин работать именно с SysSocket - то проще использовать CAA NetBaseServices.
    Документация и примеры:
    https://ftp.owen.ru/CoDeSys3/11_Docu...ckets_v2.0.pdf

  3. #3

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Добрый день.

    могу только предположить, что bind один раз все же отработал, а SysSocketClose после этого не вызывался.
    действительно, так и есть )

    Еще вопрос по сокетам. В неблокирующий режим нужно сокеты переводить и собственно как? похоже что на SysSockAccept все вистнет.

  4. #4

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    действительно, так и есть )

    Еще вопрос по сокетам. В неблокирующий режим нужно сокеты переводить и собственно как? похоже что на SysSockAccept все вистнет.
    Вы не могли бы все же уточнить, в чем цель использования SysSocket вместо более простых вариантов?

  5. #5

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Вы не могли бы все же уточнить, в чем цель использования SysSocket вместо более простых вариантов?
    Просто написано уже для 110го М2, отлажено и работает. Как по мне, проще этот код на третий кодесис перенести, чем по новой в чем то разбирацо и с нуля ваять )

  6. #6

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    Просто написано уже для 110го М2, отлажено и работает. Как по мне, проще этот код на третий кодесис перенести, чем по новой в чем то разбирацо и с нуля ваять )
    Реализация библиотеки сильно отличается для Cds 2.3 (с учетом нюансов конкретной реализации в ПЛК) и 3.5.
    Я бы рекомендовал все же посмотреть CAA NBS - там сервер строится из 4 ФБ, которые имеют минимум входов и выходов.

    Если конкретно по вашему вопросу - то ответ есть в этой статье.

  7. #7

    По умолчанию

    ну конект уже есть )
    Оказываецо в SysSockAccept указатель на размер SOCKADDRESS а не размер )

  8. #8

    По умолчанию

    Евгений, спасибо, заработало )

    Кому вдруг интересно перевод в неблокирующий режим:
    m_dnParam := 1; // DINT
    IF 0 = SysSockIoctl( m_hSocket, SOCKET_FIONBIO, ADR( m_dnParam ) ) THEN "Ok"

    иначе все виснет на обмене, так как SysSockRecv ждет пакетов от клиентов, а их может и не быть )
    при разрыве связи SysSockRecv и(или) SysSockSend в pResult возвратит "ERR_SOCK_CLOSED 16#211 Socket has been gracefully closed. No more send/receives allowed"
    и клиентский сокет можно закрывать.
    Последний раз редактировалось lazy; 29.11.2019 в 08:54.

  9. #9

    По умолчанию

    Тестирую обмен модбаспулом и вот, что обнаружилось.

    Конект есть, обмен идет. Если отключить кабель сети (приблизительно) на пару секунд модбаспул дает ошибки таймаута (как и положено), подтыкаем кабель обратно и связь восстанавливается, при этом на СПК все проходит без ошибок, то есть SysSockRecv в pResult возвращает 0. Но если кабель отключить на дольшее время модбаспул начинает выдавать (как и всегда)writeerror или readerror, а программа на СПК просто виснет.

    Пробовал читать и писать с флагом SOCKET_MSG_DONTWAIT, SysSockRecv каждый раз в pResult возвращает: "ERR_SOCK_WOULDBLOCK 16#206 Socket is in nonblocking mode but THIS call would block", игнорирую эту ошибку - обмен идет. Отключаем кабель на пару секунд - все как и с чтением без флагов (diFlags := 0 ). Отключаем кабель дольше чем на пару секунд - СПК больше не виснет, но SysSockRecv в pResult других ошибок не возвращает, поэтому при присоединении кабеля связь восстанавливается путем новых подключений. Создаются новые клиентские сокеты, а старые не закрываются, так как о разрыве связи так ничего и не узнали.

  10. #10

    По умолчанию

    Ого. поставил в модбаспуле сканрейт в 5 сек. То есть пакеты шлюцо раз в пять секунд. У меня цикл выполнения программы на СПК стал 5 сек. Не работает SysSockRecv в неблокирующем режиме что ли? Или через SysSockSelect обмен ваять?

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. PID_Regulators - для СПК1хх
    от iia3uk в разделе Трёп (Курилка)
    Ответов: 4
    Последнее сообщение: 26.07.2019, 08:56
  2. PLC 110-30 v2 & сокеты
    от lazy в разделе ПЛК1хх [М02]
    Ответов: 50
    Последнее сообщение: 23.11.2018, 15:26
  3. ПЛК100 2.17 не работают сокеты
    от murdemon в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 02.07.2018, 21:15
  4. ПЛК100 + Сокеты
    от ribamuka в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 30.08.2017, 11:55
  5. Возможно ли в режиме эмуляции Codesys тестировать работу через сокеты TCP
    от Денис Бердяев в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 09.10.2014, 08:23

Ваши права

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