Всем привет! Имею следующее оборудование - DVP-12SE и DVP06XA-S. Связь через FROM/ТО. Значение аналогового выхода модуля должно иметь возможность плавного изменения (например, от 0V до 7V за 5 секунд), и эти значения можно установить в настройках. Поскольку аналоговый модуль, очевидно, не имеет такой функции, цифровое значение необходимо увеличить рампой в контроллере и записать в модуль.
Единственная инструкция, которую я нашел для рампы — это RAMP. Но он использует время сканирования для измерения времени увеличения значения (через D1039).
1) Не повлияет ли изменение времени сканирования на performance контроллера (не говоря уже о том, что если программа станет слишком большой и время сканирования превысит установленное, то время сканирования станет равным реальному, т.е. если например я задаю D1039=20 мс, но контроллеру нужно 22 мс, он будет сканировать за 22 мс)?
2) Есть ли другой способ сделать рампу величины не используя времени сканирования?
Спасибо!
Изменение величины с помощью рампы.
-
- Сообщения: 195
- Зарегистрирован: 31 авг 2019, 13:12
Re: Изменение величины с помощью рампы.
Я делал в виде кусочно-линейной функции с фиксированной дискретностью задания времени с шагом 0,1 секунда. Блок аналогового выхода достаточно медленный. Для моих задач хватило.
-
- Сообщения: 195
- Зарегистрирован: 31 авг 2019, 13:12
Re: Изменение величины с помощью рампы.
Подскажите, пожалуйста, как это сделать в моем случае? Какие инструкции для этого используются?в виде кусочно-линейной функции с фиксированной дискретностью
Re: Изменение величины с помощью рампы.
Приведите вашу линию к виду kX+b
где k=(конечное_значение - начальное_значение)/время_нарастания
X - значение таймера
b - начальное_значение
включаем таймер нарастания (например Т200) до время_нарастания и подставляем его значение в формулу.
Единственный момент - придётся переводить всё во float и результат потом обратно в int
где k=(конечное_значение - начальное_значение)/время_нарастания
X - значение таймера
b - начальное_значение
включаем таймер нарастания (например Т200) до время_нарастания и подставляем его значение в формулу.
Единственный момент - придётся переводить всё во float и результат потом обратно в int
Re: Изменение величины с помощью рампы.
Использовал инструкцию TO. Записывал нужное значение каждые 0,1 сек. Значение вычислял при помощи математических функций.
Грубо говоря есть массив например из 10 точек. У каждой точки два параметра Скорость ( пропорциональная аналоговому выходу) и Время.
Между двумя точками вычисляется значение y=KX+B. К = (Y2-Y1)/(X2-X1), B=Y1. X служит время которое изменяется приращением 0.1 сек к Х1, до тех пор пока Х не станет>= X2. Как то так.
Грубо говоря есть массив например из 10 точек. У каждой точки два параметра Скорость ( пропорциональная аналоговому выходу) и Время.
Между двумя точками вычисляется значение y=KX+B. К = (Y2-Y1)/(X2-X1), B=Y1. X служит время которое изменяется приращением 0.1 сек к Х1, до тех пор пока Х не станет>= X2. Как то так.
Re: Изменение величины с помощью рампы.
sim_Скорость - это то что подаётся на аналоговый выход
Предел - это то что нужно на аналоговый выход подать
Тик - 10 мсек таймер, подбирать его задание под нужные условия.
Можно и без таймера, засунуть эти строки в прерывание по таймеру.
Предел - это то что нужно на аналоговый выход подать
Тик - 10 мсек таймер, подбирать его задание под нужные условия.
Можно и без таймера, засунуть эти строки в прерывание по таймеру.
- Вложения
-
- 1.PNG (14.46 КБ) 322 просмотра
-
- Сообщения: 195
- Зарегистрирован: 31 авг 2019, 13:12
Re: Изменение величины с помощью рампы.
Спасибо всем за ответы! Дело обстоит следующим образом. Освещение на птицефабрике необходимо отрегулировать. Восход и закат солнца должны быть смоделированы. Он имеет регулируемое светодиодное освещение, которое контролируется SSR. Его входной сигнал составляет 4–20 мА. Он получает сигнал с аналогового выхода DVP04DA-S. Условие – смоделировать рампу по 2 параметрам – времени и конечному значению. Например, достичь 70% освещенности за 30 минут, при этом оба параметра выбираются произвольно – проценты от 0 до 100 и время от 1 до 60 минут.
Сейчас я работаю над двумя проектами одновременно, и у меня мало времени.
Последний вариант является самым простым, но шаг таймера необходимо рассчитывать для каждого отдельного случая, чтобы конечное значение достигалось через установленное время.
Если:
Y2 – конечное значение цифровой величины
Y1 – начальное значение цифровой величины
X2 – конечное значение времени
Y - текущее значение цифровой величины
X - текущее значение времени
Затем:
Если задано начальное значение цифровой величины 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
что является целью расчета.
В программе думаю использовать такой способ отсчета времени:
где D0=X в формуле расчета функции.
Поскольку необходимо также выключить свет, Х можно уменьшить таким же образом, но с помощью инструкции DEC:
Так как железа сейчас у меня нет, то напишу только программу и попробую позже.
Спасибо, вы мне очень помогли!
Сейчас я работаю над двумя проектами одновременно, и у меня мало времени.
Последний вариант является самым простым, но шаг таймера необходимо рассчитывать для каждого отдельного случая, чтобы конечное значение достигалось через установленное время.
Линейная функция — это было очень давно, и мне пришлось вернуться на 30 лет назад, чтобы вспомнить это. Кажется, я понял, как это применимо здесь. По оси X отложено время, за которое цифровое значение должно измениться от нуля до желаемого значения (его максимальное значение составляет 4000 или 20 мА на аналоговом выходе модуля). По оси Y находится числовое значение, которое должно увеличиваться в течение заданного времени (в моем случае от 1 до 60 минут).Приведите вашу линию к виду kX+b
где k=(конечное_значение - начальное_значение)/время_нарастания
X - значение таймера
b - начальное_значение
включаем таймер нарастания (например Т200) до время_нарастания и подставляем его значение в формулу.
Если:
Y2 – конечное значение цифровой величины
Y1 – начальное значение цифровой величины
X2 – конечное значение времени
Y - текущее значение цифровой величины
X - текущее значение времени
Затем:
Если задано начальное значение цифровой величины 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
что является целью расчета.
В программе думаю использовать такой способ отсчета времени:
где D0=X в формуле расчета функции.
Предполагаю, это сделано из-за того, что при делении Y2/X2 можно получить числа с остатком. Здесь я подумываю использовать инструкцию FLT для поиска целых чисел в числах с плавающей запятой, инструкции EDIV и EADD для вычислений и инструкцию INT для преобразования результата обратно в целое число.Единственный момент - придётся переводить всё во float и результат потом обратно в int
Поскольку необходимо также выключить свет, Х можно уменьшить таким же образом, но с помощью инструкции DEC:
Так как железа сейчас у меня нет, то напишу только программу и попробую позже.
Спасибо, вы мне очень помогли!