PDA

Просмотр полной версии : Немного о SysLibSockets



ufaman
31.10.2018, 15:28
Может быть, к (https://ufa.com.ru/?q=node/1)ому-то будет интересно. Разбор работы функций библиотеки. Описание пока не закончено, но планирую доделать его в ближайшем будущем. Хотелось бы выслушать комментарии и прочие замечания-предложения.

ufaman
01.11.2018, 10:48
Любителям конструкций BOOL_TO_DINT(SysLibSocketFunction()) посвящается..:D

_Pavel_
01.11.2018, 11:40
Молодец, классно! Думаю Владислав должен прокомментировать сие..
Самое печальное то, что эту инфу нужно собирать по крупицам по форуму, что усложняет вход новичков и вызывает отторжение у некоторых.

ufaman
01.11.2018, 12:21
Самое печальное - это то, что подобное, мягко выражаясь, безобразие тиражируется из прошивки в прошивку. При том, что косяки (нет. правильнее КОСЯКИ) видны невооружённым взглядом.

ufaman
02.11.2018, 20:59
Хороший самопиар, но уже для первой функции ошибко.

Ау! Владислав!!! Хоть бы спасибо сказали за проделанную работу?

ЗЫ. Большинство этих косяков исправляется элементарно даже в обычном HEX-редакторе, безо всяких исходников. И этот тяжёлый труд в "Овене" не смогли осилить за десяток лет?

Да, кстати, все свои выводы по функциям библиотеки могу подтвердить мелкими программками на CoDeSys.

Чтобы не быть голословным, приведу пример для проверки правильности выводов по первой функции. Ну, где "ошибко":

39592

Окно telnet-сервера:
39587

Упс?

ЗЗЫ. Описание закончено.

ufaman
06.11.2018, 16:14
Ещё одна ошибка работы сокетов. Возьмём для примера самую простую программу:


VAR
tcp_adr: SOCKADDRESS;
diSocket: DINT := SOCKET_INVALID;
diParam: DINT := 0;
recv_buf: STRING[250];
res: DINT;
resIoctl: DINT;
first_run: BOOL := TRUE;
counter: DWORD;
END_VAR

IF first_run THEN
diSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
resIoctl := SysSockIoctl(diSocket, SOCKET_FIONBIO, ADR(diParam)); (* Включаем блокирующий режим - diParam<>1 *)

tcp_adr.sin_family := SOCKET_AF_INET;
tcp_adr.sin_addr := 16#C0A80135;
tcp_adr.sin_port := 23;

SysSockBind(diSocket, ADR(tcp_adr), SIZEOF(tcp_adr));
SysSockListen(diSocket, 1);

first_run := FALSE;
END_IF

res := SysSockRecv(diSocket, ADR(recv_buf), SIZEOF(recv_buf), 0);

counter := counter +1; (* просто счётчик. посмотреть, работает ли программа *)


Как Вы думаете, что произойдёт при соединении с этим сервером? Правильный ответ - ничего хорошего. Данные через SysSockRecv не принимаются, ПЛК через примерно 5 секунд после установки соединения уходит в reboot (видимо, по тайм-ауту соединения). Если закомментировать строку с установкой блокирующего режима, то данные через SysSockRecv принимаются, но если в сокет ничего не посылать, то соединение закроется по тайм-ауту (хотя бы без reboot'а - и то хорошо) и повторно с ним соединиться уже не получится.

Обнаружил я это при изучении неблокирующего режима. Выяснилось, что сокеты работают по умолчанию в неблокирующем режиме, а при попытке его отключения видим то, что видим.

В дальнейшем попробую разобраться, почему это происходит.

monteg
06.11.2018, 16:21
Вот это заклинание переводит ПЛК110 М02 в неблокирующий режим


SysSockSetOption( handle, SOCKET_SOL, 16#1014, 0, 0 );

А зачем Вам вообще блокирующий режим?
Какой у Вас ПЛК?

Трофимов Артем
06.11.2018, 16:45
замечательное видео разбора полётов с сокетами на примере кодесис 3. отлично описано различие блокирующего и неблокирующего режимов. станет понятно, почему у вас срабатывает ватчдог при работе указанного сервера в блокирующем режиме
https://www.youtube.com/watch?v=ThVLXygHnnU&t=29s

capzap
06.11.2018, 16:49
ну есть же поясняющий пример работы с сокетами от S3Software, известны особенности овеновской разработки с булями, но сперва же мастерят код собственного изготовления, а потом жалуются что не работает чегойто
Как уже выше писалось, только ради самопиара поднимает тему в верх списка, чтоб больше народу увидело какой он молодец, дизасемблировал закрытую библиотеку
ЗЫ бибку я тоже выкладывал, повторно загружать не буду

ЗЫЫ ссылка на бибку (http://www.owen.ru/forum/showthread.php?t=10555&p=278623&viewfull=1#post278623)

ufaman
06.11.2018, 17:04
Вот это заклинание переводит ПЛК110 М02 в неблокирующий режим


SysSockSetOption( handle, SOCKET_SOL, 16#1014, 0, 0 );

А зачем Вам вообще блокирующий режим?
Какой у Вас ПЛК?

М02, может, и переводит. Для версий с прошивками 2.17.0 SysSockSetOption не делает ровно ничего.

ufaman
06.11.2018, 17:25
ну есть же поясняющий пример работы с сокетами от S3Software, известны особенности овеновской разработки с булями, но сперва же мастерят код собственного изготовления, а потом жалуются что не работает чегойто
Как уже выше писалось, только ради самопиара поднимает тему в верх списка, чтоб больше народу увидело какой он молодец, дизасемблировал закрытую библиотеку
ЗЫ бибку я тоже выкладывал, повторно загружать не буду

Почему бы и не молодец? Народ вот уже лет 10 пытается добиться от производителя вменяемой документации по не самой немаловажной библиотеке. А ещё лучше вменяемой работы этой библиотеки. И? Результат-то где? Ваш example демонстрирует только то, что встроенными функциями пользоваться невозможно. О чём, собственно, я и веду речь.

Да. За "особенности овеновской разработки с булями" отдельное спасибо. Поржал от души.

ЗЫ. "Бибку" тоже хрен где найдёшь. С сайта она уже давно не грузится. А жаль. Хотелось посмотреть..

monteg
06.11.2018, 17:31
М02, может, и переводит. Для версий с прошивками 2.17.0 SysSockSetOption не делает ровно ничего.
Наверно потому, что не надо ничего делать.
Какой у Вас ПЛК?

monteg
06.11.2018, 17:34
Почему бы и не молодец? Народ вот уже лет 10 пытается добиться от производителя вменяемой документации по не самой немаловажной библиотеке. А ещё лучше вменяемой работы этой библиотеки. И? Результат-то где? Ваш example демонстрирует только то, что встроенными функциями пользоваться невозможно. О чём, собственно, я и веду речь.

Поймите, все косяки Овена заложены в его цену. Чудес не бывает.

ufaman
06.11.2018, 17:51
замечательное видео разбора полётов с сокетами на примере кодесис 3. отлично описано различие блокирующего и неблокирующего режимов. станет понятно, почему у вас срабатывает ватчдог при работе указанного сервера в блокирующем режиме
https://www.youtube.com/watch?v=ThVLXygHnnU&t=29s

Хорошее видео. Ничего нового из него не узнал, но спасибо.

Вачдог отключен. Собственно, поэтому я и не ожидал reboot'а. Видимо, я неправильно понимаю смысл этой галочки.
39671
Вы правы в том, что с момента подключения и до перезагрузки ПЛК Counter уже не считает. Только ещё раз уточню - данные в сокет тоже не принимаются. Вообще. Т.е. блокирующий режим работы полностью неработоспособен.

И, согласитесь, сокеты работают по умолчанию в неблокирующем режиме. Что несколько расходится с их стандартным поведением. И с документацией.

ufaman
06.11.2018, 18:01
Поймите, все косяки Овена заложены в его цену. Чудес не бывает.

Это я даже комментировать не хочу. Давайте ещё косяков добавим?

Филоненко Владислав
06.11.2018, 19:14
М02, может, и переводит. Для версий с прошивками 2.17.0 SysSockSetOption не делает ровно ничего.

Потому что там уже в неблокирующем всегда!

ufaman
06.11.2018, 19:18
Потому что там уже в неблокирующем всегда!

Угу. И где это написано? И при чём здесь SysSockSetOption?

Филоненко Владислав
06.11.2018, 19:19
Хорошее видео. Ничего нового из него не узнал, но спасибо.

Вачдог отключен. Собственно, поэтому я и не ожидал reboot'а. Видимо, я неправильно понимаю смысл этой галочки.
39671
Вы правы в том, что с момента подключения и до перезагрузки ПЛК Counter уже не считает. Только ещё раз уточню - данные в сокет тоже не принимаются. Вообще. Т.е. блокирующий режим работы полностью неработоспособен.

И, согласитесь, сокеты работают по умолчанию в неблокирующем режиме. Что несколько расходится с их стандартным поведением. И с документацией.

1. Ради Вашей безопасности Вы никак не можете отключить аппаратный WatchDog. Только програмный.
2. Да, на старой линейке ПЛК блокирующий режим 100% неработоспособен. На новой он работает 5 секунд до ватчдога. Успеет произойти обмен - программа проживёт еще 5 секунд :D Системы реального времени и блокирующие функции несовместимы от слова совсем.
3. Сокеты на embedded реализации ну никак не могут 100% соответствовать стандарту, Вы небось на linux/Windows ориентируетесь? Особенности известны, примеры есть, на ОШИБКИ мы оперативно реагируем. Так что не надо паники!

ufaman
06.11.2018, 19:22
1. Ради Вашей безопасности Вы никак не можете отключить аппаратный WatchDog. Только програмный.
2. Да, на старой линейке ПЛК блокирующий режим 100% неработоспособен. На новой он работает 5 секунд до ватчдога. Успеет произойти обмен - программа проживёт еще 5 секунд :D Системы реального времени и блокирующие функции несовместимы от слова совсем.
3. Сокеты на embedded реализации ну никак не могут 100% соответствовать стандарту, Вы небось на linux/Windows ориентируетесь? Особенности известны, примеры есть, на ОШИБКИ мы оперативно реагируем. Так что не надо паники!

Да я не паникую. Я разбираюсь в том, как работает ваша техника. Недавно (уже упоминал) убил полтора месяца на то, за что в принципе даже не брался бы, зная то, что знаю сейчас. Хочу вот уберечь других программистов от повторения моих ошибок.

ЗЫ. В оперативность реагирования, простите, не верю. Как и в то, что ошибки бережно сохраняются в новых прошивках для сохранения совместимости с ранее написанным для ПЛК софтом. По мне так нормальной реакцией была бы новая прошивка с правильно функционирующей библиотекой и объявление о том, что обновление прошивки не рекомендуется тем-то и тем-то по таким-то причинам. Вместо этого мы годами читаем на форуме о том, как правильно делать BOOL_TO_DINT при полном отсутствии документации.

alexx751
07.11.2018, 16:47
Пять раз Владислава спросили про документацию. Пять раз он не ответил:)

ufaman
07.11.2018, 18:00
Озвучили. Только смысл ответа от меня ускользает. Что значит "никто не будет их "исправлять"? Это почему? Некому? Давайте я исправлю?

И почему "исправлять" в кавычках? Т.е. вас в (https://ufa.com.ru/?q=node/1)от это все устраивает? Всех всё устраивает? Один я никак не врублюсь в "особенности овеновской разработки с булями" (с) ?

Ладно бы всё это касалось древних приборов, давно ушедших в прошлое. Так ведь нет - половина производимых сегодня ПЛК идёт с такими вот "особенностями" (с).

ЗЫ. Есть ещё один вариант выхода из положения. Выпускайте 2 прошивки - одну для любителей мазохизма, вторую - соответствующую документации.

ufaman
09.11.2018, 15:26
Как я понял, пока единственная реакция со стороны "Овена" - это забота о том, как бы я не получил излишнее количество самопиара.:D

Ну, да я не гордый. Повторю вкратце выводы здесь.

Для всех ПЛК с прошивкой 2.17.0 из 25 функций библиотеки SysLibSockets:

Функции, возвращающие свой аргумент (не скажу, что это ненормально, но применять их в проектах только для ПЛК "Овен" смысла нет):

SysSockHtonl
SysSockHtons
SysSockNtohl
SysSockNtohs



Полностью неработоспособные функции:

SysSockAccept
SysSockGetHostByName
SysSockGetHostName
SysSockGetLastError
SysSockGetOption
SysSockInetAddr
SysSockInetNtoa
SysSockSelect
SysSockSetIPAddress
SysSockSetOption
SysSockShutdown



Работают, но не так, как заявлено в документации:

SysSockClose - возвращает TRUE вместо FALSE и наоборот;
SysSockConnect - возвращает всегда FALSE;
SysSockIoctl - расхождение с документацией, причём разное для разных команд;
SysSockListen - возвращает всегда FALSE. Примечание: BOOL_TO_DINT от результата возвращает всегда 0.


Работают как заявлено в документации:

SysSockBind
SysSockCreate
SysSockRecv
SysSockRecvFrom
SysSockSend
SysSockSendTo

capzap
09.11.2018, 16:42
Вывод то какой? Если что, у меня два плк100 между собой в быки-коровы играли по Ethernet, им ни чего не мешает, неужто потому что яичек нет?

ufaman
09.11.2018, 18:54
Вывод то какой? Если что, у меня два плк100 между собой в быки-коровы играли по Ethernet, им ни чего не мешает, неужто потому что яичек нет?

Вывод простой. Производителю, как ни странно, почему-то не нужно, чтобы ПЛК определённых серий нормально поддерживали сетевые функции. Тот детский лепет, который мы услышали от уважаемого Владислава, тому подтверждение.

capzap
09.11.2018, 19:20
а зачем, еще раз повторяю не пользуюсь я всеми функциями, которые Вы забраковали как не рабочие, тех которые работают вполне достаточно для обмена информацией. ПЛК программируется для конкретных задач, а не поддерживать весь функционал стека на всякий случай

ufaman
09.11.2018, 22:17
А вы можете хоть 50 раз повторять. Вы не пользуетесь нерабочими функциями, потому что они нерабочие. ;) (Интересен ещё вопрос, а как вы догадались, что они нерабочие и сколько ушло на это понимание времени?) И вопрос отнюдь не в полной или неполной поддержке сетевого функционала. Вопрос в том, что всё это никак не отражено в документации.

ЗЫ. Попробую попроще объяснить. Я покупаю ПЛК отнюдь не подвального изготовления, читаю всю прилагающуюся к нему документацию, пишу (опираясь на эту документацию) программу и... ну да - программа не работает. Это нормально?

capzap
09.11.2018, 22:44
А я попробую тогда в открытую сказать, раз не поняли намека: плохому танцору ... => ищите подсказку в предыдущих постах

ufaman
09.11.2018, 22:46
А я попробую тогда в открытую сказать, раз не поняли намека: плохому танцору ... => ищите подсказку в предыдущих постах

Рад за ваши танцорские умения. Развивайте талант и дальше...

PS. Уважаемые модераторы! (здесь же бывают модераторы?) Конечно, товарищ capzap обладает невероятными талантами - великолепный танцор и обладатель чёрного пояса по программированию без правил (уверен, что он может заставить играть в "быки и коровы" хоть арифмометры "Феликс"), но я не уверен в том, что эти яркие достоинства дают ему право нарушать правила форума. Нет?

monteg
10.11.2018, 02:15
Овену надо было поступить с SysLibSockets также, как SysLibCom. Сделать дополнительную библиотеку ( или библиотеки ) с функциональными блоками ( например TcpClient, TcpServer, UdpClient и т.д. ), снабдить все это описанием и примерами. И разработчикам было бы проще и матов на форуме было бы меньше.

capzap
10.11.2018, 07:21
Овену надо было поступить с SysLibSockets также, как SysLibCom. Сделать дополнительную библиотеку ( или библиотеки ) с функциональными блоками ( например TcpClient, TcpServer, UdpClient и т.д. ), снабдить все это описанием и примерами. И разработчикам было бы проще и матов на форуме было бы меньше.

ну не совсем так, но овеновцы изменили работу с сокетами в М02 для большего соответствия стандартам и что, ругани стало еще больше. Ответ уже дали, ни чего меняться не будет

ufaman
10.11.2018, 10:15
Овену надо было поступить с SysLibSockets также, как SysLibCom. Сделать дополнительную библиотеку ( или библиотеки ) с функциональными блоками ( например TcpClient, TcpServer, UdpClient и т.д. ), снабдить все это описанием и примерами. И разработчикам было бы проще и матов на форуме было бы меньше.

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

monteg
10.11.2018, 10:43
SysLibCom работает вроде точно так же, как и SysLibSockets. Так же функции библиотеки реализованы в прошивке.
Вынос библиотечных функций наружу подразумевает необходимость предоставления пользователю доступа непосредственно к железу контроллера - вряд ли это правильно.

ВЫ меня не так поняли. Я о SyslibCom.lib и ComService.lib

monteg
10.11.2018, 10:48
ну не совсем так, но овеновцы изменили работу с сокетами в М02 для большего соответствия стандартам и что, ругани стало еще больше. Ответ уже дали, ни чего меняться не будет

Ну не знаю. Мне кажется, что ComService.lib была хорошая идея.

capzap
10.11.2018, 12:22
Ну не знаю. Мне кажется, что ComService.lib была хорошая идея.

ComService насколько я знаю, разработка пользователя а не овеновское предложение, просто это удобно, но какой смысл что то предлагать с сокетами, когда есть http://www.owen.ru/forum/showthread.php?t=29703&p=291852&viewfull=1#post291852 вложение от КДС, остается переделать преобразование типов в нужных местах и всё, все мои примеры которые я на форуме выкладывал написаны через этот код

monteg
10.11.2018, 12:33
ComService насколько я знаю, разработка пользователя а не овеновское предложение, просто это удобно, но какой смысл что то предлагать с сокетами, когда есть http://www.owen.ru/forum/showthread.php?t=29703&p=291852&viewfull=1#post291852 вложение от КДС, остается переделать преобразование типов в нужных местах и всё, все мои примеры которые я на форуме выкладывал написаны через этот код

Я не знаю чья именно разработка ComService.lib, но сейчас она входит в "стандартный набор" библиотек, который можно скачать с сайта owen.ru.
Я не настаиваю на создании дополнительных библиотек для сокетов. Просто с ними тоже было бы удобно, и скрыло бы некоторые нюансы реализации сокетов в ПЛК Овен. И разработчикам на стороне клиента, и техподдержке на стороне производителя было бы удобней.

capzap
10.11.2018, 12:37
TcpUdpLib этим и занимается, сама бибка открытая, поправить в двух-трех местах и Вы в шоколаде

monteg
10.11.2018, 12:40
TcpUdpLib этим и занимается, сама бибка открытая, поправить в двух-трех местах и Вы в шоколаде

А вот автор этой темы другого мнения

capzap
10.11.2018, 12:58
так то он и код свой выкладывал, который не похож на то что я показал и тоже не рабочий, может дело не в бибке

monteg
10.11.2018, 13:20
так то он и код свой выкладывал, который не похож на то что я показал и тоже не рабочий, может дело не в бибке

ПЛК - это важный компонент промышленной автоматики.
Понимаете, одно дело когда используешь библиотеки скачанные с официального сайта, например отсюда
https://www.owen.ru/product/programmiruemij_logicheskij_kontroller_oven_plk110
и другое когда используешь код, который кто-то выложил на форуме. Вы же в Овене не работаете.

capzap
10.11.2018, 13:46
ПЛК - это важный компонент промышленной автоматики.
Понимаете, одно дело когда используешь библиотеки скачанные с официального сайта, например отсюда
https://www.owen.ru/product/programmiruemij_logicheskij_kontroller_oven_plk110
и другое когда используешь код, который кто-то выложил на форуме. Вы же в Овене не работаете.

смешно, а не прочли ли Вы на что я ссылался, если Вы зарегестрированы на сайте КДС, то тоже можете получить из официальных рук эту библиотеку, я тут плюшки запретные выкладываю, а они еще ерепеняться

ufaman
10.11.2018, 21:38
ну есть же поясняющий пример работы с сокетами от S3Software, известны особенности овеновской разработки с булями, но сперва же мастерят код собственного изготовления, а потом жалуются что не работает чегойто

ЗЫЫ ссылка на бибку (http://www.owen.ru/forum/showthread.php?t=10555&p=278623&viewfull=1#post278623)

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

ufaman
10.11.2018, 21:45
Чтобы несколько разбавить эту скучную тему, выложу код NTP-клиента. Товарищ capzap выкладывал давным-давно (http://www.owen.ru/forum/showthread.php?t=14056&p=126715&viewfull=1#post126715) свою версию. Моя, пожалуй, чуть получше. Скачать проект можно здесь (https://ufa.com.ru/files/ntp.pro).

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

capzap
11.11.2018, 09:08
ну и зачем было выкладывать то непотребство из шестого поста, если можете нормально писать?
А по этому коду, используется
SysSockCreate
SysSockSendTo
SysSockRecvFrom
зачем остальные функции?

ufaman
11.11.2018, 12:00
ну и зачем было выкладывать то непотребство из шестого поста, если можете нормально писать?
А по этому коду, используется
SysSockCreate
SysSockSendTo
SysSockRecvFrom
зачем остальные функции?

"Непотребство" из 6 поста доказывало неработоспособность блокирующего режима. Со своей задачей вполне справлялось.
Мой ntp-клиент работает именно потому, что не использует косячных функций. С udp-сокетами дела обстоят более-менее прилично.

ufaman
11.11.2018, 12:35
Главная мысль какая - tcp-сокеты не работают или либы несколько несоответственно описаны ?

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

ЗЫ. Особенно это касается серверного режима работы.Написать клиента ещё с грехом пополам можно, написать нормально функционирующий сервер - нереально.

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

ЗЫ. Особенно это касается серверного режима работы.Написать клиента ещё с грехом пополам можно, написать нормально функционирующий сервер - нереально.
а веб сервер статических страниц, а у меня еще и с ajax (https://ru.wikipedia.org/wiki/AJAX) это не нормально функционирующий сервер, а слейв модбасТСР это не нормально функционирующий сервер?

capzap
11.11.2018, 13:08
я как раз про программный, то что выкладывал здесь на форуме, правда это было по UDP с вейнтековской панелью, зато используется на производстве уже несколько лет, а не чисто потестить

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

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

ufaman
11.11.2018, 13:54
Я за них отвечу. "Как только так сразу". Это ж Овен.
Пойдет ?


Это ключевое слово. Сами догадаетесь ?

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

ufaman
11.11.2018, 14:13
Исправляйте. В чем вопрос-то ?

Да уж начал. Сделаю 2.0.17bis для собственного употребления. Раз уж иначе никак..

ufaman
11.11.2018, 14:22
Вот щас повозился с tcp. Программный tcp-сервер на плк (30-МО2) ответил делфийскому стандартному tcp-клиенту на пк..

У М02 прошивка другая.

ufaman
11.11.2018, 14:33
Может, там и нет такого безобразия. Кто его знает?

Валенок
11.11.2018, 14:50
Может, там и нет такого безобразия. Кто его знает?
Овен же......

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

ЗЫ. Особенно это касается серверного режима работы.Написать клиента ещё с грехом пополам можно, написать нормально функционирующий сервер - нереально.

Ну не знаю. Вроде делал ModbusTcp сервер, вроде проверил и вроде работает. Для М01 на одно подключение, на М02 на 4. Правда в реальных проектах еще не использовал.

ufaman
11.11.2018, 15:28
Долго тестировали? У меня тоже сервер будто бы работал. Но обычно не более суток. И да - про М02 ничего сказать не могу. Другой процессор, другая прошивка.

monteg
11.11.2018, 16:03
Долго тестировали? У меня тоже сервер будто бы работал. Но обычно не более суток. И да - про М02 ничего сказать не могу. Другой процессор, другая прошивка.

Где-то сутки, может на пару часов меньше меньше. Клиент был тоже ПЛК. Пробовал на ПЛК110-30 М01, ПЛК110-30 М02 и ПЛК100.

monteg
11.11.2018, 16:17
Пример рабочего кода выложить несколько проблематично. Просто все это существует в виде библиотеки для modbus, делал для себя. Если хотите могу выложить, но нет ни описаний и ни примеров. Есть только тесты.
Оно Вам надо?

saminc
20.01.2023, 13:55
Всем доброго дня!
У меня такой вопрос, есть owen ПЛК110-30, программа написана на функциональных блоках, работаем с ним по TCP отправляя регистры
Сама программа отрабатывает претензий к ней нет, но эпизодически при переподключении не можем подключиться к контроллеру.

почитав документацию выяснилось что есть ограничение по количеству созданных сокетов, а проверка их если и есть, то она по таймингам совсем не вписывается.

Собственно вопрос: есть ли возможно пример или сможете подсказать как осуществлять контроль за неиспользуемыми сокетами, в проекте который написан на ФБ.
возможно есть какая-то возможность получить список открытых сокетов, пробежаться по ним и закрыть неактивные, или что то в таком духе
я видел пример клиент\сервер, но если честно не могу сообразить как его применить в текущей программе

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