Страница 1 из 8 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 75

Тема: SysSockCreate

  1. #1

    По умолчанию SysSockCreate

    Добрый День
    Вот такой вопрос.
    Необходимо поднять tcp сервер на плк 150
    Создаю проект
    Кидаю туда строку
    diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
    (тут просто udp, не важно)
    так вот diSocket всегда -1, тоесть как я понимаю Ложь.
    В обратном случаи все должно быть 0 или больше нуля.
    diSocket нужен для других функций, не пойму почему он всегда -1.
    И в эмуляторе и в контроллере?
    В чем может быть дело?

    Спасибо.

  2. #2

    По умолчанию

    в ПЛК может быть открыто только 15 сокетов (соединений) соотв. SysSockCreate возвращает номер сокета (от 1 до 15). Открыв 15 штук будет всегда возвращать -1. Уже открытые сокеты нужно обязательно закрывать либо ресетнуть ПЛК.
    Попробуй чонть типа:

    diSocket : DINT := SOCKET_INVALID;

    IF diSocket = SOCKET_INVALID THEN
    diSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
    END_IF

  3. #3

    По умолчанию

    DINT := SOCKET_INVALID

    В примере видел это но не понимаю dint это число причем тут SOCKET_INVALID?

    Объясните плиз, я програмист но этого не пойму, все примеры перекурил все одно.

    Допустим в BECK там все тоже самое но справлялся числом 0 или более нуля.

    Спасибо.

    (новичек)

  4. #4

    По умолчанию

    SOCKET_INVALID - константа уже объявленная в SysLibSockets.lib :
    SOCKET_INVALID: DINT:=-1;
    так что все ок )

  5. #5

    По умолчанию

    Неподумал - Спасибо.
    Так ну как я понимаю делать надо так при загрузке,старте и.т.д навсяк случай убиваем все сокеты.
    потом уж создаем новый.
    Но допустим такая ситуация: Мы создали экземпляр сокета все ок, а потом он у нас слетел не известно по каким причинам.
    Был экземпляр с di = 1, создали новый он уже получился с di = 2, потом и этот слетел ну и так до 15.
    Что будет после 15 ого создания т.е на 16ом di опять станет = 1 или будет глюк?
    Или что-то еще надо прикрутить?

    Cgfcb,j

  6. #6

    По умолчанию

    при старте делаю так CloseSocket:= SysSockClose(0);
    plc отваливается напрочь, надо сбрасывать.
    ну да ладно
    дальше так CloseSocket:= SysSockClose(1); до CloseSocket:= SysSockClose(15);
    diSocket становиться = 16.
    Интересно почему 16 а не в пределах от 1 до 15
    если закрыть при старте от 1 до 16 diSocket = 16 возможно 16 экземпляров? или 1 не считается?

  7. #7

    По умолчанию

    Ну вроде все нормально.
    Дошел до
    lResult:=SysSockListen(diSocket, 1);

    Код
    (* Начинаем запускать сокет сервер *)
    (* Если diSocket = -1 = SOCET_INVALID т.е сокета нет то поднимаем сокет *)
    IF diSocket = SOCKET_INVALID THEN
    diSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
    (* SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP) = UDP *)
    (* SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP) = TCP *)
    (* SysSockCreate(SOCKET_AF_INET,SOCKET_DGRAM,SOCKET_I PPROTO_ICMP) = ICMP *)
    END_IF

    (* Если сокет поднят *)
    IF diSocket <> SOCKET_INVALID THEN
    (* Че-то тут настраиваем *)
    oResult:=SysSockSetOption(diSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR(dwValue), SIZEOF(dwValue));
    diSockAddrSize.sin_family:=SOCKET_AF_INET;
    diSockAddrSize.sin_addr:=SOCKET_INADDR_ANY;
    diSockAddrSize.sin_port:=SysSockHtons(uiPort);
    (* Связываем с сокетом локальным адресом *)
    bResult:=SysSockBind(diSocket, ADR(diSockAddrSize), SIZEOF(diSockAddrSize));

    IF bResult = FALSE THEN
    diSocket:=SOCKET_INVALID;
    END_IF
    (* Объявляем о желании принять запросы на соединение *)
    lResult:=SysSockListen(diSocket, 1); (* Максимальное кол-во клиентов в очереди *)
    END_IF

    Все TRUE а вот lResult:=SysSockListen(diSocket, 1); всегда FALSE.

    В чем может быть беда?

    Спасибо

  8. #8

    По умолчанию

    Есть что путное ответить? Или так на форуме сидишь, да воздух сотрясаешь?
    Посмотри сколько у меня сообщений, контроллер второй день на руках!
    Не можешь помочь или ссылку кинуть – иди покури, расслабься, жене позвони!
    Че писать то попусту, время много?
    Может я не нашел, или не понял, потому и пишу, для этого форумы в общем и создают!
    Извини за резкость, готовность неделя – нужна помощь а не бабкины семечки на скамеечки.

  9. #9

    По умолчанию

    Еще раз извиняюсь за резкость.

    Эту тему я прочел, и все остальные, перекурил все исходники НО.
    Начиная от того что я не понимаю зачем валить все сокеты в начале, - это бред согласитесь, их еще нет.
    Как здравому человеку в голову придет такая мысль?
    А объяснять что это не виндовоз, и тут все ограничено это глупость.
    Тем более если контроллер сетевой, и сетевой обмен есть, да и функции есть наверное это должно работать
    нормально а не через …. Думаю это не трудно – совсем не трудно.

    В хелпах нет ничего – описания slibsocket вообще нет как такового.
    Вот из темы
    Вообще на ПЛК 100.K-M можно создать 15 сокетов и SysSockCreate последовательно будет возвращать числа (манипуляторы или дескрипторы) от 1 до 15.
    Супер наблюдал уже 16!?

    Вот ваше сообщение:

    думаю пример докажет, что соединение ТСР можно устанавливать и оно работает, без глубоких знаний работы сокетов, весь пример собран на библиотеках OSCAT и S3 в свободном доступе, есть нюансы касательно овен-овских контроллеров, но они были озвучены техподдержкой на форуме уже давно

    Ну и что? Работать то она работает, содрана по чуть-чуть и все. А ход процесса не объясняет. В общем пусть работает
    как есть просто хочется чтобы мой продукт работал нормально – просто отлично, и я его мог поддерживать и понимал
    где косяки(особенности) плк, чтоб хот как-то их обойти.

    “нюансы касательно овен-овских контроллеров, но они были озвучены техподдержкой на форуме уже давно”
    А не подскажете где эти нюансы? Может они решили бы все мои проблемы, а то по заявлению овна – можно все,
    блин – точно можно? А мультикаст работает?

    Вот если прочесть это:

    я делал веб-сервер и пять компов подключалось к ПЛК, получал на каждом нужную информацию и меня не заботила реализация. Такие организации как oscat и S3 не самоучки, которые выложили свои примеры, этот код протестирован и раз уж они его представили, значит он будет работать в среде CoDeSys

    Для меня это не понятно, меня заботит реализация, и как это работает. Чтоб понимал лично я и отвечал лично я за свою работу.

    Ну это все лирика говорящая о том что на форуме я не нашел ни какой идеи описания что работает как должно, а на что надо закрывать глаза.

    Вот код который есть во всех примерах

    IF diSocket <> SOCKET_INVALID THEN
    SysSockSetOption(diSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR(dwValue), SIZEOF(dwValue));
    sa.sin_family:=SOCKET_AF_INET;
    sa.sin_addr:=SOCKET_INADDR_ANY;
    sa.sin_port:=SysSockHtons(uiPort);
    bResult:=SysSockBind(diSocket, ADR(sa), SIZEOF(sa));
    IF bResult = FALSE THEN
    diSocket:=SOCKET_INVALID;
    ELSE
    bResult:=SysSockListen(diSocket, diMaxConnections);
    IF bResult = FALSE THEN Так у меня всегда FALSE!!!!!!!!!!!!!!!!!!!
    diSocket:=SOCKET_INVALID; Тут мы что получим вечно поднимающийся сокет!!???
    END_IF
    END_IF
    END_IF

    Вот и весь вопрос – почему так а не иначе?

    А вот еще кусочек кода с темы

    res:=SysSockBind(sock,paddr,SIZEOF(tcp_adr));
    res:=SysSockListen(sock,1);

    Да не хочу я делать так! Мне принципиально знать на каком этапе что отвалилась. А то глупость получается
    Ой программка то не работает..

    Наверное мой вопрос должен был звучать так
    Почему у меня SysSockListen(diSocket, diMaxConnections); все время FALSE (-1).
    Что-то делаю я не правильно или это особенность.
    Если я косячу, если можно подскажите где копать.
    Если особенность – как себя ведет, как с ней бороться.

    На форуме к сожалению не нашел ответ на мой вопрос, нашел только то что все кто пытался что-то сделать просто
    забивал на то или иное или перестраивал концепцию – вот и все. Возможно я плохо ищу или читаю с право на лево.

    Спасибо.

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    IF bResult = FALSE THEN Так у меня всегда FALSE!!!!!!!!!!!!!!!!!!!
    в овеновских плк1хх должно быть не так, у меня это выглядит таким образом
    bResult:=SysSockListen(diSocket, diMaxConnections);
    IF bResult < 0 THEN
    diSocket:=SOCKET_INVALID;
    END_IF
    почему у Вас всегда -1, ну незнаю, при тестировании этих соединений ни при каких обстоятельствах нельзя останавливать плк не закрыв открытые сокеты, лимит в количестве 15 быстро заканчивается в таких случаях. К тому же когда говориться о пятнадцати это совсем неозначает, что они должны быть от единицы до 15. Кто то предлагает по включению контроллера закрыть теоретически открытые сокеты, я в это неверю. Так же еще один миф, плк это не ПК поэтому один сокет - одно соединение, обойти это можно но в развлекательных целях, в пром.автоматике на это лучше не надеятся. По поводу уверенности, я допускаю что где то могут хорошо преподавать вычислительные системы и телекоммуникации, поэтому появляются дотошные пользователи-теоретики, тут я помочь ни чем немогу, я практик у меня всё работает

Страница 1 из 8 123 ... ПоследняяПоследняя

Ваши права

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