Страница 5 из 6 ПерваяПервая ... 3456 ПоследняяПоследняя
Показано с 41 по 50 из 57

Тема: Немного о SysLibSockets

  1. #41
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну есть же поясняющий пример работы с сокетами от S3Software, известны особенности овеновской разработки с булями, но сперва же мастерят код собственного изготовления, а потом жалуются что не работает чегойто

    ЗЫЫ ссылка на бибку
    Посмотрел. Нисколько не удивлён тому, что "бибка" "Запретная плюшка" полностью неработоспособна. По очевидным причинам, изложенным мной чуть выше. Могу пройтись по всем её функциям. Если вдруг интересно, конечно.
    Последний раз редактировалось ufaman; 10.11.2018 в 22:55.

  2. #42
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Чтобы несколько разбавить эту скучную тему, выложу код NTP-клиента. Товарищ capzap выкладывал давным-давно свою версию. Моя, пожалуй, чуть получше. Скачать проект можно здесь.

    PROGRAM PLC_PRG
    VAR
    GetTime: CurTimeEx;
    TimeAndDate: SystemTimeDate;
    Sys_Time: SysTime64;

    ntp_socket : DINT:= SOCKET_INVALID;
    ntp_sockaddr : SOCKADDRESS;

    state: DWORD;
    R_BUF: ARRAY[0..47] OF BYTE;
    i: WORD;
    received: DINT;
    NTP_TIME: SDT;
    tx, last: DWORD;
    OK, ERRORS: DWORD; (* Счётчики удачных и неудачных запросов - для справки *)
    END_VAR

    VAR CONSTANT
    S_BUF: ARRAY[0..47] OF BYTE := 27,47(0);
    TIMEOUT: TIME := t#500ms; (* Тайм-аут ожидания ответа ntp-сервера *)
    HOME: TIME := t#5h; (* UTC+5 мой часовой пояс *)
    PERIOD: TIME := t#30s; (* Время между ntp-запросами. Не менее 30 секунд! *)
    ntp_port: UINT := 123;
    ntp_addr: UDINT := 16#34B2A129; (* 52.178.161.41 time.windows.com *)
    END_VAR

    ================================================== ===============

    (* Для компиляции требуются библиотеки SYSLIBTIME, SysLibSockets и oscat_basic_333 *)

    (*Читаем текущее время - здесь только для контроля правильности работы программы *)
    TimeAndDate.Year :=0; TimeAndDate.Month :=0; TimeAndDate.Day :=0; TimeAndDate.DayOfWeek :=0;
    TimeAndDate.HOUR :=0; TimeAndDate.MINUTE :=0; TimeAndDate.SECOND :=0; TimeAndDate.Milliseconds :=0;
    TimeAndDate.dwHighMsec :=0; TimeAndDate.dwLowMSecs :=0;
    Sys_time.ulHigh :=0; Sys_time.ulLow :=0;
    GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);

    (* tx := T_PLC_MS(); *) (* Этот вариант годится, если часть программы выше отсутствует, т.е. когда нам неизвестно значение переменных структуры TimeAndDate *)
    tx := TimeAndDate.dwLowMSecs;

    CASE state OF
    0: (* Cоздание сокета *)
    ntp_socket := SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
    ntp_sockaddr.sin_family := SOCKET_AF_INET;
    ntp_sockaddr.sin_port := ntp_port;
    ntp_sockaddr.sin_addr := ntp_addr;
    FOR i:=0 TO 47 DO R_BUF[i] := 0; END_FOR (* Очистка приёмного буфера *)
    state := 1;
    1: (* Посылаем запрос на ntp-сервер *)
    SysSockSendTo(ntp_socket, ADR(S_BUF), SIZEOF(S_BUF), SOCKET_MSG_OOB, ADR(ntp_sockaddr), SIZEOF(ntp_sockaddr));
    last := tx;
    state := 2;
    2: (* Ждём ответ ntp-сервера в течение времени TIMEOUT *)
    received := SysSockRecvFrom(ntp_socket, ADR(R_BUF), SIZEOF(R_BUF), SOCKET_MSG_OOB, ADR(ntp_sockaddr), SIZEOF(ntp_sockaddr));
    IF received=48 AND R_BUF[40]<>0 THEN
    state := 3;
    ELSE
    IF tx-last>TIME_TO_DWORD(TIMEOUT) THEN
    ERRORS := ERRORS+1; (* Ошибки появляются только при обрыве связи *)
    state := 4;
    END_IF
    END_IF
    3: (* Запись полученного времени в системный таймер*)
    NTP_TIME:= DT_TO_SDT( DWORD_TO_DT(DWORD_OF_BYTE(R_BUF[40],R_BUF[41],R_BUF[42],R_BUF[43]) - DWORD#2208988800 + TIME_TO_DWORD(HOME)/1000));
    TimeAndDate.Year := NTP_TIME.YEAR; TimeAndDate.Month := NTP_TIME.MONTH; TimeAndDate.Day :=NTP_TIME.DAY;
    TimeAndDate.HOUR := NTP_TIME.HOUR; TimeAndDate.MINUTE := NTP_TIME.MINUTE; TimeAndDate.SECOND := NTP_TIME.SECOND;
    GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);
    OK := OK + 1;
    state := 4;
    4: (* Закрываем сокет *)
    SysSockClose(ntp_socket);
    state := 5;
    5: (* Ждём окончания времени между запросами *)
    IF tx-last>TIME_TO_DWORD(PERIOD) THEN
    state := 0;
    END_IF
    END_CASE
    Последний раз редактировалось ufaman; 11.11.2018 в 00:26.

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

    По умолчанию

    ну и зачем было выкладывать то непотребство из шестого поста, если можете нормально писать?
    А по этому коду, используется
    SysSockCreate
    SysSockSendTo
    SysSockRecvFrom
    зачем остальные функции?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  4. #44
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну и зачем было выкладывать то непотребство из шестого поста, если можете нормально писать?
    А по этому коду, используется
    SysSockCreate
    SysSockSendTo
    SysSockRecvFrom
    зачем остальные функции?
    "Непотребство" из 6 поста доказывало неработоспособность блокирующего режима. Со своей задачей вполне справлялось.
    Мой ntp-клиент работает именно потому, что не использует косячных функций. С udp-сокетами дела обстоят более-менее прилично.

  5. #45
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Главная мысль какая - tcp-сокеты не работают или либы несколько несоответственно описаны ?
    Работа с сокетами в неблокирующем режиме с нерабочей функцией GetLastError - это как минимум странно. Про несоответственность описания я уж и упоминать устал. Tcp-сокеты в текущей их реализации таковы, что лучше ими не пользоваться.

    ЗЫ. Особенно это касается серверного режима работы.Написать клиента ещё с грехом пополам можно, написать нормально функционирующий сервер - нереально.
    Последний раз редактировалось ufaman; 11.11.2018 в 12:46.

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

    По умолчанию

    Цитата Сообщение от ufaman Посмотреть сообщение
    Работа с сокетами в неблокирующем режиме с нерабочей функцией GetLastError - это как минимум странно. Про несоответственность описания я уж и упоминать устал. Tcp-сокеты в текущей их реализации таковы, что лучше ими не пользоваться.

    ЗЫ. Особенно это касается серверного режима работы.Написать клиента ещё с грехом пополам можно, написать нормально функционирующий сервер - нереально.
    а веб сервер статических страниц, а у меня еще и с ajax это не нормально функционирующий сервер, а слейв модбасТСР это не нормально функционирующий сервер?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

    По умолчанию

    я как раз про программный, то что выкладывал здесь на форуме, правда это было по UDP с вейнтековской панелью, зато используется на производстве уже несколько лет, а не чисто потестить
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  8. #48
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Я и задаю вопрос: "Доколе?!" А в ответ тишина.. Пардон, ответ был "никто ничего "исправлять" не будет". Потом его, правда, стыдливо потерли.
    Я с косяками "Овена" разобрался и по мере возможности могу их обходить, но это вот все нифига не нормально. Разговоры про то, что у всех косяки мне тоже абсолютно непонятны.

    А более всего непонятно, почему бы эти косяки не исправить. При наличии исходников прошивки эту работу можно выполнить максимум за день. Во всяком случае, я за день точно исправил бы большую их часть. Даже впервые увидев эти исходники.. Что уж и говорить о разработчиках? Для них это исправление вряд ли заняло бы более 15 минут. И?
    Последний раз редактировалось ufaman; 11.11.2018 в 13:37.

  9. #49
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Я за них отвечу. "Как только так сразу". Это ж Овен.
    Пойдет ?


    Это ключевое слово. Сами догадаетесь ?
    Прикол в том, что и без исходников вполне можно все поправить. Ну, за неделю максимум.

  10. #50
    Пользователь
    Регистрация
    28.11.2013
    Адрес
    Уфа
    Сообщений
    29

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Исправляйте. В чем вопрос-то ?
    Да уж начал. Сделаю 2.0.17bis для собственного употребления. Раз уж иначе никак..

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

Похожие темы

  1. Продам ПЛК OWEN + немного обвязки
    от bodjaka в разделе Трёп (Курилка)
    Ответов: 15
    Последнее сообщение: 06.11.2015, 11:14
  2. Макросы -- объясните немного....
    от tigdin в разделе Программируемые реле
    Ответов: 20
    Последнее сообщение: 28.08.2014, 15:18
  3. SysLibSockets
    от mettled в разделе ПЛК1хх
    Ответов: 36
    Последнее сообщение: 20.01.2014, 15:23
  4. Немного про библиотеку SyslibTime
    от Ильнур в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 05.11.2012, 00:19
  5. немного теории
    от Safron в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 28.01.2010, 21:45

Ваши права

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