Наша задача такая чтобы уставки (например температуры) менялись во времени самостоятельно. То есть например первый час было одно значение, потом оно поменялось на другое, потом через 2 часа на 3 значение. И это чтобы делал контроллер самостоятельно.
Вид для печати
Наша задача такая чтобы уставки (например температуры) менялись во времени самостоятельно. То есть например первый час было одно значение, потом оно поменялось на другое, потом через 2 часа на 3 значение. И это чтобы делал контроллер самостоятельно.
ну и меняй в контроллере по таймеру значение переменной...
Знаете нам хотелось бы сделать это в визуализации в виде таблички, где напротив значения уставки стояло время с которое оно должно длиться. И чтобы это все можно было менять во время работы контроллера.
Возможно ли подставлять в заданиях таймера в строке t#20s вместо 20 - имя переменной или маcсива, например t#mas[i]s
Прблем нет. Присвойте значениям температур в визуализации значения в контроллере. (См. справку в среде программирования конфигурирование элементов в визуализации)
Можно прямо с экрана как вводить или присваивать выбранные из таблиц значения переменнх, так и просматривать текущие значения.
На самом деле проблема состоит не в том чтобы в визуализации менять или отображать значение переменной (это то мы сделали без проблем). А именно создать таблицу с уставками которые будут менять через интервал времени. И проблема в том чтобы можно было в визуализации меня значение длительности таймера. Потому что не понятно как подставлять в t#20s вместо 20 (ну может быть любое другое число) подставить переменную (которую можно будет задавать прямо из визуализации).
Преобразовывайте к примеру 20 из визуализации из int в time внутри программы и присваиваейте полученное значение, через косвенную адресацию полученное значение таймеру.
Например А-уставка таймера
В-значение в визуализации, пусть =20
А:=TIME_TO_INT(B)
получите время А=T#20ms
если нужны секунды, то умножте на 1000.
Спасибо большое за данный совет, так действительно мы и будем делать.
Вот еще один вопрос созрел, а как можно будет заполнять массив из визуализации.
Хотелось бы просто профиль уставок сделать с использованием массива, где каждому значению уставок соотвестововало время таймера.
А можно ли вообще поставить таймер в цикл, где с каждым новым кругом будет новое значение уставки времени взятое из массива.
Хотелось чтобы было как то вот так вот:::
ystavki [0]:=35;
ystavki [1]:=40;
ystavki [2]:=45;
Timers [0]:= t#45s
Timers [1]:= t#50s
Timers [2]:= t#55s
i:=0
While
I<=2
DO
Tim1(in:=1, PT:=Timers [i];
q:=tim.q;
IF
q=0
THEN
yst_temp:= ystavki [i];
tim1 (in:=0, PT:=Timers [i]);
ELSE
i:=i+1;
END_IF
END_WHILE
Можете сказать в чем ошибка, или так вообще делать нельзя???
Просто хотелось бы это сделать через циклы и массивы.
2 грубых ошибки.
Программа всегда выполняется в рабочем цикле ПЛК. Значения входов/выходов обновляются между циклами, аналогично имеют право работать и стандартные МЭК таймеры. Т.е. таймер в циклах while или for ждать нельзя. Это надо делать просто в рабочем цикле.
В примере внутри цикла в 1 единственный таймер засовываются все уставки сразу. Реально таймер будет работать после окончания всего этого while.
Такая конструкция имела бы право на жизнь, если бы нужно было сделать тучу таймеров работающих параллельно. Но тогда проще сразу делать массив таймеров, а не уставок.
В данном случае, я бы написал простенькую программку на SFC. В первом шаге держим время - ставим атрибут шага (см. мануал) минимальное время = соотв-й элемент таблицы. Во втором шаге делаем i+1 и идем на первый шаг. Все переходы тупо в TRUE. И все.
Либо:
Tim1(in:=1, PT:=Timers [i]);
yst_temp:= ystavki [i];
IF Tim1.q THEN
Tim1 (in:=0);
IF i >= 2 THEN i:=0; ELSE i:=i+1; END_IF
END_IF