Изменение величины с помощью рампы.

Ответить
ivan bratanov
Сообщения: 195
Зарегистрирован: 31 авг 2019, 13:12

Изменение величины с помощью рампы.

Сообщение ivan bratanov »

Всем привет! Имею следующее оборудование - DVP-12SE и DVP06XA-S. Связь через FROM/ТО. Значение аналогового выхода модуля должно иметь возможность плавного изменения (например, от 0V до 7V за 5 секунд), и эти значения можно установить в настройках. Поскольку аналоговый модуль, очевидно, не имеет такой функции, цифровое значение необходимо увеличить рампой в контроллере и записать в модуль.
Единственная инструкция, которую я нашел для рампы — это RAMP. Но он использует время сканирования для измерения времени увеличения значения (через D1039).

1) Не повлияет ли изменение времени сканирования на performance контроллера (не говоря уже о том, что если программа станет слишком большой и время сканирования превысит установленное, то время сканирования станет равным реальному, т.е. если например я задаю D1039=20 мс, но контроллеру нужно 22 мс, он будет сканировать за 22 мс)?

2) Есть ли другой способ сделать рампу величины не используя времени сканирования?


Спасибо!

pkl
Сообщения: 1489
Зарегистрирован: 23 ноя 2010, 10:08

Re: Изменение величины с помощью рампы.

Сообщение pkl »

Я делал в виде кусочно-линейной функции с фиксированной дискретностью задания времени с шагом 0,1 секунда. Блок аналогового выхода достаточно медленный. Для моих задач хватило.

ivan bratanov
Сообщения: 195
Зарегистрирован: 31 авг 2019, 13:12

Re: Изменение величины с помощью рампы.

Сообщение ivan bratanov »

в виде кусочно-линейной функции с фиксированной дискретностью
Подскажите, пожалуйста, как это сделать в моем случае? Какие инструкции для этого используются?

Nomad
Сообщения: 130
Зарегистрирован: 23 янв 2012, 16:38

Re: Изменение величины с помощью рампы.

Сообщение Nomad »

Приведите вашу линию к виду kX+b
где k=(конечное_значение - начальное_значение)/время_нарастания
X - значение таймера
b - начальное_значение
включаем таймер нарастания (например Т200) до время_нарастания и подставляем его значение в формулу.
Единственный момент - придётся переводить всё во float и результат потом обратно в int

pkl
Сообщения: 1489
Зарегистрирован: 23 ноя 2010, 10:08

Re: Изменение величины с помощью рампы.

Сообщение pkl »

Использовал инструкцию TO. Записывал нужное значение каждые 0,1 сек. Значение вычислял при помощи математических функций.
Грубо говоря есть массив например из 10 точек. У каждой точки два параметра Скорость ( пропорциональная аналоговому выходу) и Время.
Между двумя точками вычисляется значение y=KX+B. К = (Y2-Y1)/(X2-X1), B=Y1. X служит время которое изменяется приращением 0.1 сек к Х1, до тех пор пока Х не станет>= X2. Как то так.

Олег
Сообщения: 822
Зарегистрирован: 18 янв 2011, 23:06

Re: Изменение величины с помощью рампы.

Сообщение Олег »

sim_Скорость - это то что подаётся на аналоговый выход
Предел - это то что нужно на аналоговый выход подать
Тик - 10 мсек таймер, подбирать его задание под нужные условия.

Можно и без таймера, засунуть эти строки в прерывание по таймеру.
Вложения
1.PNG
1.PNG (14.46 КБ) 322 просмотра

ivan bratanov
Сообщения: 195
Зарегистрирован: 31 авг 2019, 13:12

Re: Изменение величины с помощью рампы.

Сообщение ivan bratanov »

Спасибо всем за ответы! Дело обстоит следующим образом. Освещение на птицефабрике необходимо отрегулировать. Восход и закат солнца должны быть смоделированы. Он имеет регулируемое светодиодное освещение, которое контролируется SSR. Его входной сигнал составляет 4–20 мА. Он получает сигнал с аналогового выхода DVP04DA-S. Условие – смоделировать рампу по 2 параметрам – времени и конечному значению. Например, достичь 70% освещенности за 30 минут, при этом оба параметра выбираются произвольно – проценты от 0 до 100 и время от 1 до 60 минут.

Сейчас я работаю над двумя проектами одновременно, и у меня мало времени.




Последний вариант является самым простым, но шаг таймера необходимо рассчитывать для каждого отдельного случая, чтобы конечное значение достигалось через установленное время.
Приведите вашу линию к виду kX+b
где k=(конечное_значение - начальное_значение)/время_нарастания
X - значение таймера
b - начальное_значение
включаем таймер нарастания (например Т200) до время_нарастания и подставляем его значение в формулу.
Линейная функция — это было очень давно, и мне пришлось вернуться на 30 лет назад, чтобы вспомнить это. Кажется, я понял, как это применимо здесь. По оси X отложено время, за которое цифровое значение должно измениться от нуля до желаемого значения (его максимальное значение составляет 4000 или 20 мА на аналоговом выходе модуля). По оси Y находится числовое значение, которое должно увеличиваться в течение заданного времени (в моем случае от 1 до 60 минут).

Если:
Y2 – конечное значение цифровой величины
Y1 – начальное значение цифровой величины
X2 – конечное значение времени
Y - текущее значение цифровой величины
X - текущее значение времени
Затем:
3.jpg
3.jpg (163.3 КБ) 301 просмотр
Если задано начальное значение цифровой величины Y1=0, то формула еще больше упрощается и сводится только к Y=(Y2/X2)*X.
Величина X является своего рода временем квантования. Здесь предлагается таймер шага 1 мс или 10 мс. Учитывая, что в моем случае 1мин<Х2<60мин, думаю, таймер с шагом в 1 секунду можно легко поставить.

На рисунке показан пример, в котором конечное значение цифровой величины Y2=2000 достигается за время X2=3 секунды.
В X=1 секунда -> Y=666,7
В X=2 секунды -> Y=1333,3
В X=3 секунды -> Y=2000
что является целью расчета.



В программе думаю использовать такой способ отсчета времени:
1.JPG
1.JPG (27.72 КБ) 301 просмотр
где D0=X в формуле расчета функции.
Единственный момент - придётся переводить всё во float и результат потом обратно в int
Предполагаю, это сделано из-за того, что при делении Y2/X2 можно получить числа с остатком. Здесь я подумываю использовать инструкцию FLT для поиска целых чисел в числах с плавающей запятой, инструкции EDIV и EADD для вычислений и инструкцию INT для преобразования результата обратно в целое число.

Поскольку необходимо также выключить свет, Х можно уменьшить таким же образом, но с помощью инструкции DEC:
2.JPG
2.JPG (23.56 КБ) 301 просмотр
Так как железа сейчас у меня нет, то напишу только программу и попробую позже.


Спасибо, вы мне очень помогли!

Ответить