PDA

Просмотр полной версии : программа на ST



Ronnie008
03.03.2018, 23:33
Всем здравствуйте. Прошу помочь с программой на ST. Только начал изучать язык. Допустим есть некий бункер с тензодатчиком (и преобраз. 4-20 мА). В бункер поступает крахмал, до достижению определенного веса (пусть будет 500кг) задвижка внизу открывается до тех пор пока весь крахмал не уйдет. Затем цикл начинается заново. Заранее спасибо:)

alex55
04.03.2018, 08:11
Здесь подобное обсуждалось может чем поможет http://www.owen.ru/forum/showthread.php?t=16468&highlight=%EF%EE%EB%F3%F7%E8%F2%FC+%EE%E1%F9%E8%E9 +%F0%E5%E7%F3%EB%FC%F2%E0%F2

Ronnie008
04.03.2018, 09:08
Мне непонятно как реализовать полную выгрузку из бункера по достижению 500 кг. Если использовать конструкцию IF *показания датчика* <500 THAN *задвижка на выгрузку закрыта* ELSE задвижка открыта. Но в таком случае как только вес достигнет 500, задвижка на выгрузку откроется, начнет убывать и станет допустим 499 кг задвижка тут же начнет закрываться и бункер дальше заполняться, а мне нужно дождаться полного опустошения бункера, то есть уменьшить вес в бункере до 0 :confused: и начать загрузку до 500 заново.

lara197a
04.03.2018, 09:12
по фронту. как =500 выставляйте флаг бункер наполнен.
как =0, по фронту этот флаг сбрасывайте.
тригер RS вам в помощь.

Eugene.A
04.03.2018, 09:18
А почему не
"использовать конструкцию IF *показания датчика* <5 THEN *задвижка на выгрузку закрыта* ELSE задвижка открыта."?
5 кГ на налипание крахмала на стенки бункера.
Иначе можно никогда нуля не дождаться.

Ronnie008
06.03.2018, 10:28
но тогда как только вес станет 6 кг задвижка откроется, а мне нужно забить бункер до 500 кг, или я что то не так понял?

melky
06.03.2018, 10:41
Посмотрите как работают триггера

_Mikhail
06.03.2018, 10:46
но тогда как только вес станет 6 кг задвижка откроется, а мне нужно забить бункер до 500 кг, или я что то не так понял?
Вам же написали : используйте RS-триггер

Ronnie008
06.03.2018, 11:09
Хорошо, спасибо

ferret_maybe
06.03.2018, 12:24
Попробуй...одно из решений для управления. Для обработки аналогового сигнала можешь пока сам пиши.
FUNCTION_BLOCK tank
VAR_INPUT
Full:BOOL; (*Sensors*)
empty:BOOL;
EN: BOOL;
END_VAR
VAR_OUTPUT
CmdValveOpen:BOOL; (*Control of valves*)
CmdValveClose:BOOL;

ENO: BOOL;
END_VAR
VAR
State:INT:=0; (*states of tank*)
END_VAR

IF EN=TRUE THEN
ENO:=TRUE;
CASE State OF
0:
IF Full AND Empty THEN
State:=1;
END_IF;
CmdValveOpen:=FALSE;
CmdValveClose:=TRUE;

1:
IF Full=FALSE AND empty=TRUE THEN
State:=2;
END_IF;
CmdValveOpen:=TRUE;
CmdValveClose:=FALSE;

2: (*valves is opened*)
IF Full=FALSE AND empty=FALSE THEN
State:=0;
END_IF;
CmdValveOpen:=FALSE;
CmdValveClose:=FALSE;
ELSE
State:=0;
END_CASE;
ELSE
ENO:=FALSE;
END_IF;

Gans
06.03.2018, 14:03
Здравствуйте, Ронни008.

Мне непонятно как реализовать полную выгрузку из бункера по достижению 500 кг.

Во время выгрузки каждые 2-10 сек проверяйте массу бункера, если текущая масса бункера отличается от предыдущей менее чем на 5% значит бункер пуст)
Само собой подбираем время и выше указанный процент по месту на реальном объекте.

Sulfur
07.03.2018, 07:59
IF Бункер=>499.9кг AND Задвижка=FALSE THEN
Остановить загрузку бункера;
Выдержать паузу;
Открыть задвижку выгрузки;
Задвижка:=TRUE;
END_IF;
IF Бункер=<0.1кг AND Задвижка=TRUE THEN
Закрыть задвижку выгрузки;
Выдержать паузу;
Включить загрузку бункера;
Задвижка:=FALSE;
END_IF;


Как-то так.

Эдуард_Н
11.03.2018, 12:15
Подскажите как это: 35976 выразить в ST.

lara197a
11.03.2018, 13:15
Подскажите как это: 35976 выразить в ST.
искользуйте функцию SEL или IF или CASE

Евгений Кислов
11.03.2018, 13:29
Можно и дословно перенести:


TH:=MUX(SELECT, T#1s, T#1m, T#1h, T#1d);

Эдуард_Н
11.03.2018, 15:54
искользуйте функцию SEL или IF или CASE
Как с IF сделать?
Пробовал так:
IF SELECT: = 0 THEN TH: = T#1s;
IF SELECT: = 1 THEN TH: = T#1m;
IF SELECT: = 2 THEN TH: = T#1h;
IF SELECT: = 3 THEN TH: = T#1d;

ASo
11.03.2018, 16:25
Можно и так, но для ускорения работы (исключения заведомо не используемых условий) сделайте через IF ... ELSE

lara197a
11.03.2018, 16:27
IF SELECT=0 THEN
TH:= T#1s;
ELSIF SELECT=1 THEN
TH:= T#1m;
ELSIF SELECT=2 THEN
TH:= T#1h;
ELSIF SELECT =3
THEN TH:= T#1d;
END_IF

лучше через CASE
А вообще в справке КДС есть примеры

Эдуард_Н
11.03.2018, 16:48
Спасибо, все примеры интересны. Будем пробовать.

Эдуард_Н
11.03.2018, 16:54
IF SELECT: = 0 THEN
TH: = T#1s;
ELSIF SELECT: = 1 THEN
TH: = T#1m;
ELSIF SELECT: = 2 THEN
TH: = T#1h;
ELSIF SELECT: = 3 THEN
TH: = T#1d;
END_IF

лучше через CASE
А вообще в справке КДС есть примеры
Пишет ошибки:
Для "IF" или "ELSIF" в качестве условия необходимо логическое выражение
Должно быть THEN перед ";"

lara197a
11.03.2018, 17:06
исправил.
уберите двоеточие в условиии
(извиняюсь не заметил при копипасте из вашего)

Эдуард_Н
11.03.2018, 17:23
исправил.
уберите двоеточие в условиии
(извиняюсь не заметил при копипасте из вашего)

Спасибо.
Все эти пробелы и т.п. когда их ставит когда не надо, голова кругом.

tagor4444
19.04.2018, 14:14
case select of
0: th := t#1s;
1: th := t#1m:
2: th := t#1h;
3: th := t#1d;
end_case;

Rake Runner
19.04.2018, 14:29
th := mux(select, t#1s, t#1m, t#1h, t#1d);

Так ведь уже было - см. #15.

_Mikhail
19.04.2018, 19:35
case select of
0: th := t#1s;
1: th := t#1m:
2: th := t#1h;
3: th := t#1d;
end_case;

что будет если select >3 ?