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

Тема: ошибки в примерах ...

  1. #1

    По умолчанию ошибки в примерах ...

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

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

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

    ... мне становиться страшно от мысли что софтина самого плк написана в том же стиле что и примеры применения (((((

  2. #2

    По умолчанию

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

    Может быть Вы можете поправить пример и выложить свой вариант? Однако дело это не благодарное и могу поспорить, что найдется куча людей, у которых он не заработает. Спасибо не скажет никто (99%), а материть будут (это 100%)…

  3. #3

    По умолчанию

    Кхм, кто спорит что в программах бывают ошибки. Однако хотелось бы уточнить, где действительно ошибка и что за пример с сокетами?

  4. #4

    По умолчанию

    W3S_RCV: (* Прием из сокета*)
    rcv_buf_cnt_tmp:=SysSockRecv(sock_acc,rcv_snd_buf+ rcv_bytes_cnt,1024,SOCKET_MSG_OOB);


    IF rcv_buf_cnt_tmp<>16#FFFFFFFF THEN
    rcv_bytes_cnt:=rcv_buf_cnt_tmp+rcv_bytes_cnt;
    ELSE
    IF rcv_buf_cnt_tmp=0 THEN
    RETURN;
    END_IF
    END_IF
    full_get(in:=(rcv_bytes_cnt>0) ,pt:=t#500ms); (* Ждем 200 мс на всякий случай*)


    ... ну например, что вы имели ввиду в ветке ELSE , выполняя проверку на ноль переменной, которая заведомо = -1 ? return каким образом выполняется???

    кстати, по докам функция чтения возвращает результат DINT а не DWORD ... разница не велика, но читабельность программ ухудшается и очень станно что компилятор не ругается на такую подмену...
    про то что функции возращают не нули а FF -ы все уже привыкли ))))

    а как отнесутся ваши лицензиаты к распространению подобного кода на вашем форуме? ведь использование сокетов позволяет вытаскивать из ПЛК значительные объемы переменных с весьма приличной скоростью и уменьшает востребованность контроллеров с литерой "М"
    Последний раз редактировалось Дмитрий Артюховский; 12.01.2009 в 21:57. Причина: дополнение

  5. #5

    По умолчанию

    Ясно, это просто кусок не исполняемого кода, который остался от другого алгоритма. Ну если Вы считаете это ошибкой, пусть так и будет. Я спорить не буду, но придержусь иного мнения. Поскольку код не закрыт - предлагаю выкладывать все свои исправления.
    Насчет DINT и DWORD не совсем к нам претензия...

    Не понятно в чем проблема лицензий M,L и примера web сервера. Примерно как теплое и мягкое сравнивать.
    Вы наверное имели 3SSoftware - наших Лицензиаров - мы лицензиаты. Маленький скромный писанный на коленке пример не может конкурировать с web визуализацией.

  6. #6

    По умолчанию

    Ребзы, вы не обижайтесь! Огребать недовольство пользователей - это судьба тех. поддержки, сам в таком же положении поэтому знаю не по наслышке )))
    Все ж понимают что ПЛК как объект купли-продажи возникает только когда выполнена разработка, без программы он никому не нужен. Ваш контроллер уникален по набору железных вкусняшек и цене, поэтому хочется его использовать. И использовать в применениях, мягко говоря не тривиальных для ПЛК. Типовые цели пользования ПЛК понятны и давно описаны, и под них есть более гладкие контроллеры.... скажем Сименс Пур ... и просто и дешево и .... Сименс )))) та задача, которую пытаюсь двигать решается набором Compact-RIO от National Instruments c плисом в ядре и циклом в микросекундах ... стоимость которой, особенно сегодня, заоблачна. Вроде, получается с несущественными потерями поднять на ПЛК, но для этого приходиться лезть в области программирования ранее не копанные .... ну не занимался я никогда обменом с помощью юзернета ))) поэтому ошибки и малейшие неточности в примерах гробят много времени. Вот, например, в теме про пример Веб сервера появилось уточнение, что в ИЕ он не работает ( 80% пользователей - ИЕ! ), а ведь теме даже не месяц!!! ... и вот ситуация : начинаешь новую тему - ищешь инфу - о! заботливый саппрорт выложил пример, здорово! скачиваешь его, и .... не работает, почему? не совпал таргет? нет нужной библиотеки? сработал файрволл? программная ошибка? поврежден порт хаба? несовместимость с установленным броузером??? да только для того чтобы определить круг возможных проблем уже надо быть докой )))
    ... да лан ))) проблема решилась, пример подправили ))) значит работаем дружно и в нужном направлении )))
    А проблем с примером веб сервера и лицензиями M L нет, я имел в виду другое .... сделав функциональный блок с сокетом и dll на компьютере можно перегонять любые объемы данных из ( в ) ПЛК обходя ограничения версии L ( которые на самом деле жесткие, когда нужны вещественные переменные )

  7. #7

    По умолчанию

    По стандарту МЭК DWORD – это строка из 32 бит, c которой можно делать только логические операции и работать с отдельными битами (адресуется номером бита через точку после имени переменной). Математические вычисления делать с этим типом нельзя, для этого есть UDINT. Но на практике оказалось, что очень уж часто надо и то и другое. С точки зрения процессора эти типы не отличаются. Показалось разумным не забивать голову прикладным программистом этими тонкостями, не усложнять им жизнь, заставляя делать явные преобразования. На данный случай в CoDeSys сделано послабление. Потери данных при таком преобразовании не происходит, поэтому нет смысла пугать людей (не всем понятными) предупреждениями. Бесспорно, лучше использовать типы данных, не смешивая их предназначение. Однако при разработке CoDeSys есть цель сделать инструмент простым в освоении. В этом ключе данное послабление есть плюс.

    Понятно, что всякими хитрыми приемами можно обходить ограничения. Не для кого это не секрет. Можно и ПЛК вообще не покупать, а слепить самому на базе IPC чипа. Кто-то любит проковыривать дырки гвоздем (как говорила моя покойная бабушка 'вдовий метод'), другие предпочитают купить сверло. Есть свобода выбора. Это еще один плюс для ПЛК Овен.

  8. #8

    По умолчанию

    Дмитрий Артюховский, расскажите пожалуйста про конечный результат - оно работает? Я сейчас пытаюсь сделать нечто подобное через модем, но пока успехи невелики. В данном примере меня смущают не мелкие погрешности (уже привык ), а то, что SysLibSocket работает не так, как того ожидаешь (у Овна вообще все библиотеки с "национальными особенностями" - классический пример SysLibTime - вместо добавления доп. ф-ции SetTime сделали сами знаете что).

    Сокеты вообще-то работают так (в POSIX системах, т.е. в UNIX/Linux, откуда они родом, а также в Windows, где они скопированы "1 в 1"):
    socket();
    bind(); Задаем IP-адрес (редко) и порт (всегда).
    listen(); Задаем ограничение на число соединений, ожидаем соединения.
    accept(); Создается дубликат сокета, однако они не равноценны - дубликат уже соединен (ESTABLISHED), а исходный сокет ждет следующего соединения (LISTEN).
    Теперь дубликат используется для обмена данными - read()/write()/send()/recv() и затем соединение закрывается - сlose(). Для распараллеливания это обычно делается в дочернем процессе или thread. А основная программа возвращается к listen().

    У Овена сразу создается несколько сокетов, слушающих один порт (в других реализациях это ошибка!). Что делает listen() - непонятно, но он не сообщает о поступившем соединении. А accept(), похоже, вообще нет. В результате о том, что соединение установлено, можно узнать только по возврату recv(). Также, по тексту примера, соединение и не закрывается. Как сокет возвращается вновь в состояние LISTEN? По таймауту? По закрытию клиентом? А если он не закроет (может для этого и 3 сокета)? У меня по Ethernet вроде работает, но иногда выдает ахинею, как будто склеиваются несколько ответов, может как раз из-за нечеткой фиксации конца транзакции?

    Также, на мой взгляд, пример расточителен по ресурсам процессора. Зачем повсюду искать "спецтег" <OWEN> для подстановки переменных - это же ПЛК, а не ПК (как любит говорить техподдержка ). Постоянно перезагружать страницу для обновления все равно неразумно - для этого есть AJAX. Также странно реализована SymLib - если бы вместо ф-ций Read/Write можно было бы получить адрес по имени, то a) это можно было бы делать один раз и б) легко можно было бы передать массив (а сейчас только по элементам?).

  9. #9

    По умолчанию

    0. Господин Петров тут подробно всё объяснил с библиотеками. Вот поотрубал бы все библиотеки - и проблем бы не было. А то, почему у Вас штаны не уставного цвета?! Другие производители, видимо обжёгшись на техподдержке, обрубают всё под корень.

    1. Некоторые особенности ПЛК (а именно отсутствие пары Гб ОЗУ) и нежелание использовать heap для динамического выделения (т.к.) фрагментируется память, а ПЛК должен работать годами (это не винда) и привели к "особенностям". listen - просто заглушка. Как и accept. 1 сокет - 1 соединение. Полный контроль за ресурсами.
    А закрывается либо вызовом функции close, либо по таймауту, либо по желанию 2-го участника соединения. Какие ещё бывают варианты?

    Если в буфере сокета, к примеру, 3 ответа, то при чтении они и будут выданы один за другим. Какие между ними должны быть разделители?

    И ещё дочерних процессов хочется - это в оборудование классом за 2000$, пожалуйста.

    2. SymLib - А указатель на озу в возвращаемой структуре Вы не заметили? Возьмите его, сохраните и используйте!

    3) "легко можно было бы передать массив (а сейчас только по элементам?)" - напишите коллективную петицию в CoDeSys пожалуйста, чтобы они каждый элемент массива не объявляли отдельной строкой в символьном файле. Будем очень благодарны.
    И заодно поинтересуйтесь, на каком из ПЛК есть вообще доступ к символам.

    AJAX — это не самостоятельная технология, а концепция использования нескольких смежных технологий. AJAX базируется на двух основных принципах:

    * использование технологии динамического обращения к серверу «на лету», без перезагрузки всей страницы полностью, например:

    * с использованием XMLHttpRequest (основной метод);
    * через динамическое создание дочерних фреймов;
    * через динамическое создание тега <script>.

    * использование DHTML для динамического изменения содержания страницы;

    И ЭТО вы назваете разумной альтернативой вместо перезагрузки малюсенькой страницы.


    Люди, критиковать - самое простое. Понять почему так сделано - уже труднее. А самое трудное - участвовать в разработке.
    ПЛК состоялся как прибор и обсуждать его особенности бессмысленно. Никто не пойдёт на из изменения (тем более что это не ошибки), используется уже слишком много кода, чтобы менять что-либо.

    А вот поучаствовать в обсуждении новых приборов (в т.ч. и ПЛК) - вот тут все ваши пожелания, замечания и предложения будут очень актуальны.

  10. #10

    По умолчанию


    * через динамическое создание тега <script>.

    * использование DHTML для динамического изменения содержания страницы;

    И ЭТО вы назваете разумной альтернативой вместо перезагрузки малюсенькой страницы.


    Люди, критиковать - самое простое. Понять почему так сделано - уже труднее. А самое трудное - участвовать в разработке.
    ПЛК состоялся как прибор и обсуждать его особенности бессмысленно. Никто не пойдёт на из изменения (тем более что это не ошибки), используется уже слишком много кода, чтобы менять что-либо.

    А вот поучаствовать в обсуждении новых приборов (в т.ч. и ПЛК) - вот тут все ваши пожелания, замечания и предложения будут очень актуальны.

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

Ваши права

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