Страница 7 из 13 ПерваяПервая ... 56789 ... ПоследняяПоследняя
Показано с 61 по 70 из 130

Тема: Универсальный диспетчер для Modbus.lib

  1. #61

    По умолчанию

    Цитата Сообщение от Спорягин Кирилл Посмотреть сообщение
    2. На 2-м шаге, если нужно опрашиваем другие регистры этого же модуля, если нужно другой функцией. Когда функция завершила работу (Complete = true) анализируем результат и либо повторяем шаг или идем на следующий.
    Да, но судя по коду (в примерах), насколько я понял, эти шаги исполняются один за другим, за одну итерацию - если это так, то смысла в Step не вижу. Это же не оператор Case. Следуя примеру, я так и сделал для описания своего модуля (реле с управлением), использовал Step. В результате модуль опрашивался реже и реже, .пока вообще перестал опрашиваться, причём опрос происходил только по первой описываемой функции, вторая и третья по очереди (были разнесены на разные Step) не опрашивались Read у них висел всё время в False. После чего я описал модуль оператором Case, параметр для оператора передавал из основной программы - так опрос пошёл по всем трём функциям, только пришлось подобрать тайминги выполнения каждой из них, поскольку, к примеру, срабатывание реле не происходило, если обращение функции происходило меньше 1 сек.

    Хотя... смысл в Step понятен, но тогда получается, что ещё нужно описать задержки между опросами разных функций. Т.к. мой модуль отказывается опрашиваться...Причём, в моём случае эти задержки различны по времени.
    Последний раз редактировалось Sergeba; 09.12.2019 в 09:55.

  2. #62
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    Цитата Сообщение от Sergeba Посмотреть сообщение
    Возможно есть другой способ опроса... Для опроса по трём функциям сделал в основном цикле такую конструкцию:

    текст сообщения:
    Код:
    CASE i OF
    	0: (*функция 01*)
    		IF RL1.FUN<>1 THEN
    			T1:=TIME();
    		END_IF
    		RL1.FUN:=1;
    		 IF (TIME()-T1)>T#200ms THEN i:=1; END_IF (*время адержки перехода на следующую функцию*)
    	1: (*функция 02*)
    		IF RL1.FUN<>2 THEN
    			T2:=TIME();
    		END_IF
    		RL1.FUN:=2;
    		 IF (TIME()-T2)>T#500ms THEN i:=2; END_IF (*время задержки перехода на следующую функцию*)
    	2: IF V<>V_bak THEN (*функция 05*)
    		V_bak:=V;
    		RL1.wrDO:= NOT RL1.wrDO;
    		T3:=TIME();
    		RL1.FUN:=5;
    	   END_IF
    	  IF (TIME()-T3)>T#1s THEN i:=0; END_IF (*время задержки перехода на следующую функцию*)
    END_CASE
    В соответсвующей функции опрашиваю модуль также оператором case - передаю из основной программы посредством RL1.FUN.
    Так теперь работает.

    Столкнулся с такой же проблемой при опросе частотника, пишет, но не читает, при чтении выдаёт ошибку таймаута. до того, как концовку переделал, диспетчер ещё после каждого неудачного чтения увеличивал время опроса.
    Мне вот такой костыль не подходит, особенно задержки такие страшные, тк желаемый период опроса не более 100мс. если так и не получится в одном модуле и управлять и считывать, то разделю, можно будет поставить 50мс и 200мс соответственно. Но такой себе вариант дробить функцию.
    * но диспетчер хитрый, не даёт две функции с одним адресом использовать. попробую это устранить.
    Вложения Вложения
    Последний раз редактировалось Alexlyu; 09.12.2019 в 13:31.

  3. #63
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

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

  4. #64
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Цитата Сообщение от Sergeba Посмотреть сообщение
    Да, но судя по коду (в примерах), насколько я понял, эти шаги исполняются один за другим, за одну итерацию - если это так, то смысла в Step не вижу. Это же не оператор Case. Следуя примеру, я так и сделал для описания своего модуля (реле с управлением), использовал Step. В результате модуль опрашивался реже и реже, .пока вообще перестал опрашиваться, причём опрос происходил только по первой описываемой функции, вторая и третья по очереди (были разнесены на разные Step) не опрашивались Read у них висел всё время в False. После чего я описал модуль оператором Case, параметр для оператора передавал из основной программы - так опрос пошёл по всем трём функциям, только пришлось подобрать тайминги выполнения каждой из них, поскольку, к примеру, срабатывание реле не происходило, если обращение функции происходило меньше 1 сек.

    Хотя... смысл в Step понятен, но тогда получается, что ещё нужно описать задержки между опросами разных функций. Т.к. мой модуль отказывается опрашиваться...Причём, в моём случае эти задержки различны по времени.
    Что значит за одну итерацию?
    Мы переходим на следующий Step, только, когда получили ответ, что опрос закончен, т.е. Complete = true.
    Если ваш модуль неповоротливый и не может сразу после обработки одного запроса, тут же отвечать на другой, тогда сделайте "пустой" шаг, на котором просто ждите определенное время (100, 200 мс).

    А вот параметр для case передавать из основной программы - это идеологически неверно! Модуль сам решает, как опрашивать свои регистры! Зачем еще что-то писать в основной программе!???

  5. #65
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Цитата Сообщение от Alexlyu Посмотреть сообщение
    Столкнулся с такой же проблемой при опросе частотника, пишет, но не читает, при чтении выдаёт ошибку таймаута. до того, как концовку переделал, диспетчер ещё после каждого неудачного чтения увеличивал время опроса.
    Скорее всего или ошибка в запросе чтения или частотник у вас неповоротливый (см. пост выше).
    Увеличивает время опроса не диспетчер, а сам модуль (в функции fcModuleBase). Это механизм для устранения отказавших модулей из сети, чтобы сеть не подвисала.
    Если не хотите, что бы время опроса для данного модуля при ошибках увеличивалось просто сделайте настройку MaxPollingTime равной pollingTime и все.


    Цитата Сообщение от Alexlyu Посмотреть сообщение
    Мне вот такой костыль не подходит, особенно задержки такие страшные, тк желаемый период опроса не более 100мс. если так и не получится в одном модуле и управлять и считывать, то разделю, можно будет поставить 50мс и 200мс соответственно. Но такой себе вариант дробить функцию.
    * но диспетчер хитрый, не даёт две функции с одним адресом использовать. попробую это устранить.
    Диспетчер специально не допускает 2-х модулей с разными адресами. Можно, конечно, убрать эту проверку из диспетчера, но идеологически правильно делать по-другому. А именно, когда модуль получил право на опрос он сам решает, как опрашивать физический модуль. Например, он может после записи сделать паузу (например, с помощью "пустого" шага), перед опросом.
    Можно сделать так, что модуль получив право на опрос один раз пишет, в другой раз читает. И он (модуль!) сам запоминает, что он делал в предыдущий раз - читал или писал.

  6. #66
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Цитата Сообщение от Alexlyu Посмотреть сообщение
    Даже разделение функций не помогает.
    Если только читать - всё чётко и без ошибок. Если только писать - всё чётко и без ошибок. если и читать и писать, то только пишет, но частые ошибки таймаута, а чтение постоянно висит в ошибке таймаута.
    Может подскажете, где искать проблему?
    Попробую другой модели частотник помучить, вдруг что-то изменится.
    Ответил в предыдущих 2-х постах.

  7. #67
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    Цитата Сообщение от Спорягин Кирилл Посмотреть сообщение
    Ответил в предыдущих 2-х постах.
    Спасибо! Помогло!
    Несколько часов пробовал разнести функции во вызовам, пришлось в структуру модуля переменную добавить и научиться ей управлять.
    Так же пришлось понять, какие команды подавать, чтоб каждый вызов правильно начинался и завершался. По циклам смотрел происходящее, чтоб понять, почему диспетчер клинит. Жаль, что функции нельзя мониторить.

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

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

    * вопрос на засыпку: могу ли я менять скорость работы порта при вызове модуля? например одно устройство опрашивать на скорости 9600, другое на 19200 с одного порта?
    Вложения Вложения
    Последний раз редактировалось Alexlyu; 10.12.2019 в 18:05.

  8. #68

    По умолчанию

    Цитата Сообщение от Alexlyu Посмотреть сообщение
    * вопрос на засыпку: могу ли я менять скорость работы порта при вызове модуля? например одно устройство опрашивать на скорости 9600, другое на 19200 с одного порта?
    Хороший вопрос!

  9. #69

    По умолчанию

    Цитата Сообщение от Спорягин Кирилл Посмотреть сообщение
    Если ваш модуль неповоротливый и не может сразу после обработки одного запроса, тут же отвечать на другой, тогда сделайте "пустой" шаг, на котором просто ждите определенное время (100, 200 мс).
    Не получается сделать задержку. Испольую Time(), но время не сохраняется. Пробовал в описании типа функции задать переменную и в неё передавать время - тоже 0.

  10. #70
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    Цитата Сообщение от Sergeba Посмотреть сообщение
    Не получается сделать задержку. Испольую Time(), но время не сохраняется. Пробовал в описании типа функции задать переменную и в неё передавать время - тоже 0.
    Тогда стоит попробовать чтение и запсись делать при разных вызовах. У меня работает прекрасно. Частотники со скоростью 9600 опрашиаваются каждые 25мс (общий опрос получается 50мс), работает чётко.

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

Страница 7 из 13 ПерваяПервая ... 56789 ... ПоследняяПоследняя

Похожие темы

  1. Универсальный блок питания ПР114
    от sea в разделе Программируемые реле
    Ответов: 12
    Последнее сообщение: 13.10.2013, 22:56
  2. PCLogger - универсальный логгер для CDS v3
    от Mikhail Shvetsov в разделе ПЛК3хх
    Ответов: 0
    Последнее сообщение: 23.11.2012, 14:39
  3. Универсальный Modbus Сервер Инсат и 200 контроллеров ПЛК-100
    от lomtik в разделе Сетевые технологии
    Ответов: 17
    Последнее сообщение: 08.11.2012, 23:42
  4. Универсальный конфигурируемый регулятор
    от ОООСА в разделе Разработки
    Ответов: 32
    Последнее сообщение: 09.12.2009, 22:12
  5. Ответов: 7
    Последнее сообщение: 04.05.2009, 10:42

Ваши права

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