#222 closed задача (сделано)
Ошибка в ТЗ в формуле расчета времени хода вниз при развороте по числу качаний
Сообщил: | Art_M | Владелец: | alx |
---|---|---|---|
Приоритет: | Срочно | Этап разработки: | 1-я очередь |
Ключевые слова: | Копия: | Art_M, andrei |
Описание (последним изменил )
По мотиву #220
Ошибка заключается в том, что формула в ТЗ не учитывает задержку в верхней точке. Иными словами она действует пока задержка в ВМТ=0, в противном случае она дает ошибку, следствия которой мы и наблюдаем в #220.
Теперь о решении!
- Нужно изменить формулу на
Твниз=Твниз_пред+1-Nзад*(Твниз_пред+Твверх+ТзадВМТ+ТзадНМТ)/60
if Твниз<1 then Твниз=1
- В режиме "работы с клапанами ЭК" Твниз нужно откладывать от включения клапанов. В режиме "без клапанов ЭК" Твниз нужно откладывать от срабатывания верхнего датчика ДВ.
Вложения (3)
История изменений (25)
comment:3 by , 5 лет ago
Владелец: | установлено в |
---|---|
Копия: | added |
Приоритет: | средний → Срочно |
Состояние: | new → assigned |
Этап разработки: | 2-я очередь → 1-я очередь |
следующий: 7 comment:5 by , 5 лет ago
(Твниз_пред+Твверх+ТзадВМТ+ТзадНМТ)/60=1/Nфакт.
-> Твниз=Твниз_пред+1-Nзад/1/Nфакт.
Если записать в таком виде, то размерность выглядит правильной)).
comment:6 by , 5 лет ago
Я представлял себе формулу примерно так:
Сначала я представлял себе, что коррекция просто должна быть равна разности между желаемым и фактическим временем цикла:
Но я не учел, что если увеличить время хода вниз, то увеличится и время хода вверх. Поэтому чтобы получить правильную величину коррекции, ошибку длительности цикла E надо домножить на коэффициент K, зависящий от соотношения скоростей спуска и подъема:
Физический смысл коэффициента К - это отношение величины коррекции времени спуска к общему изменению времени цикла, получаемому за счет такой коррекции. Так, если скорость спуска равна скорости подъема, то насколько мы увеличим время спуска, настолько же увеличится и время подъема, поэтому K должен быть равен 0.5. Если скорость спуска выше скорости подъема, увеличение времени подъема будет больше увеличения времени спуска, поэтому K должен быть меньше 0.5. И наоборот, если скорость спуска ниже скорости подъема, K должен быть больше 0.5:
Так как длина хода вверх равна длине хода вниз, вместо отношения скоростей можно использовать отношение времен движения вверх и вниз:
Подставляя все в исходную формулу, получим вот что:
comment:7 by , 5 лет ago
Replying to andrei:
(Твниз_пред+Твверх+ТзадВМТ+ТзадНМТ)/60=1/Nфакт.
-> Твниз=Твниз_пред+1-Nзад/1/Nфакт.
Если записать в таком виде, то размерность выглядит правильной)).
Хорошо. Если даже предположить, что 60 - это безразмерный коэффициент (перевод из минут в секунды), то последнее слагаемое получается безразмерное. Мы добавляем к предыдущему времени спуска безразмерную величину, что тоже не выглядит правильным...
comment:8 by , 5 лет ago
Replying to Art_M:
- Нужно изменить формулу на
Твниз=Твниз_пред+1-Nзад*(Твниз_пред+Твверх+ТзадВМТ+ТзадНМТ)/60
Ага. Я понял физический смысл. Последнее слагаемое - это отношение фактической длительности цифла к требуемой. Поэтому и получается безразмерная величина - относительная ошибка (назовем ее Er). Соответственно, выражение (1 - Er) - это относительная коррекция длительности цикла. И теперь, по логике, чтобы из относительной коррекции (безразмерный коэффициент) получить абсолютную (поправка в секундах) надо домножить ее на что-то (время цикла, или время спуска - что-то, имеющее размерность и физический смысл времени)! Вот это домножение, мне кажется, потеряно...
следующий: 11 comment:10 by , 5 лет ago
Алексей, погоди, мы как раз и стартовали с
Твниз=Твниз_пред+(Nфакт-Nзад):Nфакт,
т.е. к времени спуска прибавляем безразмерную величину, затем преобразовывали
Твниз=Твниз_пред+Nфакт:Nфакт-Nзад:Nфакт
Твниз=Твниз_пред+1-Nзад:Nфакт,
где Nфакт=60:Тцикла, т.е. Nфакт=60:(Твверх+Твниз+ТзадВМТ+ТзадНМТ),
если не сложно, проверь, вроде тут нет ошибки...
В твоем предложении
E=1:Nзад-1:Nфакт=(Nфакт-Nзад):(Nфакт*Nзад), т.е.
Твниз=Твниз_пред+(Nфакт-Nзад):(Nфакт*Nзад)*К где предлагаешь К=0,5 или рассмотреть как отношение скоростей, т.е. К=Vвверх:Vвниз=Твниз:Твверх, но затем что-то у тебя поменялось и в результате К=Твниз:(Твниз+Твверх) почему?
Вот если смотреть в мою формулу Твниз=Твниз_пред+(Nфакт-Nзад):Nфакт, то я ко времени прибавляю разницу в числах качаний, деленных на фактическое число качаний , т.е. чем больше разница, тем больше шаг, чем разница меньше, тем шаг стремится к 0. Шаг я делю на величину фактического числа качаний, т.е. чем оно выше (ход меньше), тем меньше (аккуратнее) шажок.
В прогонах в экселе мы с Андреем увидели, что приближение числа качаний к заданному происходит достаточно долго около 10 ходов, поэтому я предлагал ускорить процесс, увеличением шажка умножив на 2, т.е. (Nфакт-Nзад):Nфакт * 2. Но позже Андрей меня убедил так не делать, лучше чуть подольше, но поточнее.
Если шаг (Nфакт-Nзад):Nфакт еще делить на Nзад, то мы сделаем подбор еще дольше. А далее, Алексей, еще предлагаешь умножить на отношение скоростей К=Vвверх:Vвниз=Твниз:Твверх, которое может быть, как более единицы , так и менее единицы. Но если рассматривать крайнюю формулу К=Твниз:(Твниз+Твверх), то К всегда будет менее 1, соответственно шажок еще меньше и подбор Твниз для обеспечения нужного числа качаний будет происходить еще дольше...
Так, конечно, тоже можно, но шаг получается микроскопический и это будет, как мне кажется, уже слишком долго...
comment:11 by , 5 лет ago
Replying to Art_M:
Алексей, погоди, мы как раз и стартовали с
Твниз=Твниз_пред+(Nфакт-Nзад):Nфакт,
т.е. к времени спуска прибавляем безразмерную величину,
Не совсем так. Сейчас в коде (и в ТЗ было до сегодняшнего дня) так (если пренебречь задержками в НМТ и ВМТ):
То есть сейчас никакого сложения с безразмерной величиной нет, есть умножение на относительную ошибку числа качаний.
В твоем предложении
Твниз=Твниз_пред+(Nфакт-Nзад):(Nфакт*Nзад)*К где предлагаешь К=0,5 или рассмотреть как отношение скоростей, т.е. К=Vвверх:Vвниз=Твниз:Твверх, но затем что-то у тебя поменялось и в результате К=Твниз:(Твниз+Твверх) почему?
Потому что я обнаружил ошибку в формуле (например если скорости подъема и спуска равны, K у меня получался равным 1, а не 0.5) и исправил ее.
Вот если смотреть в мою формулу Твниз=Твниз_пред+(Nфакт-Nзад):Nфакт, то я ко времени прибавляю разницу в числах качаний, деленных на фактическое число качаний , т.е. чем больше разница, тем больше шаг, чем разница меньше, тем шаг стремится к 0. Шаг я делю на величину фактического числа качаний, т.е. чем оно выше (ход меньше), тем меньше (аккуратнее) шажок.
Это все логично, но в результате к размерной величине (времени) прибавляется безразмерная величина (насколько я понял, относительная ошибка).
Давай проверим, будет ли эта формула работать, на примере. Для простоты допустим, вверх и вниз шток движется с одинаковой скоростью, время спуска составило 50 с, время подъема - тоже 50 с, и задержек в мертвых точках нет. И предположим, что требуемое число качаний 1 мин-1. Очевидно, что требуемое число качаний достигается при времени спуска равном 30 сек.
Фактическое время цикла составило 100 с, и число качаний составило (60 / 100) = 0.6 мин-1.
Новое значение времени спуска по формуле составит:
Твниз=50+(0.6-1):0.6 = 49.333 с.
Это значение далеко от требуемых 30 сек. Попробуем посчитать по предложенной мной формуле:
Твниз = 50 + (60/1 - 100) * (50 / (50 + 50)) = 50 + (-40) * 0.5 = 30 c.
Если шаг (Nфакт-Nзад):Nфакт еще делить на Nзад, то мы сделаем подбор еще дольше. А далее, Алексей, еще предлагаешь умножить на отношение скоростей К=Vвверх:Vвниз=Твниз:Твверх, которое может быть, как более единицы , так и менее единицы. Но если рассматривать крайнюю формулу К=Твниз:(Твниз+Твверх), то К всегда будет менее 1, соответственно шажок еще меньше и подбор Твниз для обеспечения нужного числа качаний будет происходить еще дольше...
Почему дольше? Если предположить, что в новом цикле шток будет двигаться вверх и вниз с теми же скоростями, что и в предыдущем, то внесенная коррекция точно скомпенсирует ошибку, и требуемое число качаний будет достигнуто ровно за один цикл, ведь мы не подбираем величину времени спуска по шагам, а сразу вычисляем точное требуемое значение!
Так, конечно, тоже можно, но шаг получается микроскопический и это будет, как мне кажется, уже слишком долго...
При микроскопической величине ошибки шаг будет микроскопическим. При больщой ошибке и шаг будет большим. Не понимаю, почему долго. Смотри пример выше - вычисленное новое значение времени спуска 30 секунд сразу дает требуемое число качаний 1 мин-1.
следующий: 13 comment:12 by , 5 лет ago
Алексей, похоже, ты прав! Давай сделаем, как ты говоришь! Не забудем добавить, что
if Твниз<1 then Твниз=1
Как учтем в ВМТ при переключении вверху и НМТ при переключении внизу?
comment:13 by , 5 лет ago
Replying to Art_M:
Как учтем в ВМТ при переключении вверху и НМТ при переключении внизу?
- При измерении Tup и Tdn должно учитываться реальное движение штока. Это значит, что время спуска определяется от включения ЭК до выключения ЭК, а время подъема - от команды старта НУ до команды выключения НУ.
- При старте таймера условия разворота (который выполняется при срабатывании верхнего датчика) к вычисленному значению времени спуска (или к 1 с если вычисленный результат меньше 1 с) необходимо добавить время задержки в ВМТ.
следующий: 15 comment:14 by , 5 лет ago
Алексей, следует учесть, что
Тф=Твниз+Твверх+ТзадВМТ+ТзадНМТ,
всё верно?
comment:15 by , 5 лет ago
Replying to Art_M:
Тф=Твниз+Твверх+ТзадВМТ+ТзадНМТ,
всё верно?
Все верно. Tф - это полное время цикла.
by , 5 лет ago
Вложение: | messages.0 added |
---|
следующий: 17 comment:16 by , 5 лет ago
Артем:
Т.е. сейчас контроллер Твниз вычисляет каким то большим значением, таким что раньше наступает максимальное время из уставки максимального времени хода вниз, которое у меня 2минуты
Соответственно при не достижении нижнего датчика он у меня всегда разворачивается через две минуты от включения клапанов
А должен согласно вставке N=4 подбирать согласно формуле Твниз, чтобы обеспечить заданное N=4
comment:17 by , 5 лет ago
Replying to Art_M:
Т.е. сейчас контроллер Твниз вычисляет каким то большим значением, таким что раньше наступает максимальное время из уставки максимального времени хода вниз, которое у меня 2минуты
Соответственно при не достижении нижнего датчика он у меня всегда разворачивается через две минуты от включения клапанов
А должен согласно вставке N=4 подбирать согласно формуле Твниз, чтобы обеспечить заданное N=4
Насколько я вижу из приложенного конфиг-файла, 2 минуты - это значение настройки "Максимальное время хода вниз". Похоже, что еще не исчерпаны все меры по повышению производительности привода, поэтому действует таймаут условия разворота, определяемый настройкой "Максимальное время хода вниз", а не вычисляемый по числу качаний.
comment:18 by , 5 лет ago
А, нет, это я виноват. Нашел ошибку. Проверяю состояние привода на "ход вверх" уже после того как его изменили на "ход вниз". Сейчас исправлю...
следующий: 21 comment:20 by , 5 лет ago
По какой-то причине в 15:00:43 после срабатывания ДВ, условие разворота возникает в ту же секунду, хотя ожидалось как минимум задержка в ВМТ+1 сек.
Jun 25 15:00:22 smarthdcd[380]: controller.cpp:1592: НУ1: запуск двигателя (20.0 Гц) Jun 25 15:00:22 smarthdcd[380]: controller.cpp:1592: НУ2: запуск двигателя (20.0 Гц) Jun 25 15:00:33 smarthdcd[380]: controller.cpp:3739: верхний датчик положения активен Jun 25 15:00:33 smarthdcd[380]: controller.cpp:1629: НУ1: останов двигателя (нормальный) Jun 25 15:00:33 smarthdcd[380]: controller.cpp:1629: НУ2: останов двигателя (нормальный) Jun 25 15:00:33 smarthdcd[380]: controller.cpp:3889: верхний датчик положения неактивен Jun 25 15:00:39 smarthdcd[380]: controller.cpp:3094: условие разворота Jun 25 15:00:39 smarthdcd[380]: controller.cpp:1592: НУ1: запуск двигателя (20.0 Гц) Jun 25 15:00:39 smarthdcd[380]: controller.cpp:1592: НУ2: запуск двигателя (20.0 Гц) Jun 25 15:00:43 smarthdcd[380]: controller.cpp:3739: верхний датчик положения активен Jun 25 15:00:43 smarthdcd[380]: controller.cpp:1629: НУ1: останов двигателя (нормальный) Jun 25 15:00:43 smarthdcd[380]: controller.cpp:1629: НУ2: останов двигателя (нормальный) Jun 25 15:00:43 smarthdcd[380]: controller.cpp:3094: условие разворота Jun 25 15:00:44 smarthdcd[380]: controller.cpp:3889: верхний датчик положения неактивен Jun 25 15:02:43 smarthdcd[380]: controller.cpp:3094: условие разворота
Думаю где-то может быть ошибка.
comment:21 by , 5 лет ago
comment:22 by , 5 лет ago
Решение: | → сделано |
---|---|
Состояние: | assigned → closed |
Думаю, что начиная с r776 новый алгоритм условия разворота можно сичтать реализованным.
Replying to Art_M:
Чисто по формальным признакам формула мне кажется странной: из Твниз_пред, имеющего размерность времени, вычитается выражение, у которого значение в скобках имеет размерность времени, которое умножается на число качаний, имеющее размерность обратной времени, и затем делится на 60 секунд, что в результате дает опять размерность, обратную времени (с-1).
Нет ли здесь ошибки?