Так мне нужно один конкретный столбик обнулить в один момент, не трогая остальные, а в другой момент другой.
Вид для печати
Так мне нужно один конкретный столбик обнулить в один момент, не трогая остальные, а в другой момент другой.
Ну и? где подвох?
Да это я понимаю, вопрос то был что можно ли диапазону от 1 до MaxQuantityAlert присвоить допустим 0 одним действием, кроме варианта создавать обнуляющий массив
После подачи питания на ПЛК100 программа в нем выполняется , скада вроде видит ОРС ( codesys ) , но не видит переменные . Действительно ли проблема плк100 с ОРС от codesys ? Напомню про видео . https://www.youtube.com/watch?v=Es3c2e8GwvI
Или попробовать другой ОРС . Какой посоветуете для новичка ?
Подскажите мне не грамотному могу ли я писать вот так?
IF Gate_1 =0
THEN Input_1 :=1;
ELSE Input_1 :=0 AND Input_2 :=1;
END_IF;
Вопрос в том как я могу написать условие для переменной Gate_1 по состояниям? Gate_1=0 в таких условиях и Gate_1=1 в таких условиях?
Что то я не совсем понял... условия кода((
Щас попробую расписать условие:
Gate_1:BOOL :=0; (* Выход. Принимает значение 1/0, начальное состояние 0*)
Input_1 :BOOL; (* Вход *)
Input_2 :BOOL; (* Вход *)
Input_3 :BOOL; (* Вход *)
Задание простое что бы переменная Gate_1 принимало значение 0 или 1 по условию.
Допустим вот такое:
* На синтаксис не обращать внимания! Пример задания:
(Gate_1=0) := (Input_1=1) AND (Input_3=0)
(Gate_1=1) := (Input_1=0) AND (Input_2=1) AND (Input_3=1)
Вот как то так ))
даже интересно стало, какой у Вас базовый язык программирования (ну то что в школе изучали/те). По поводу как писать код см.скрин, а лучше документ целиком прочтите
по поводу нового условия с добавлением третьего элемента всёравно ни чего не меняется
Gate_1 := NOT (Input_1 AND NOT Input_3) AND (Input_2 OR Gate_1);
Задачу сначала самому себе постарайтесь четко объяснить, потом сюда ее написать простыми понятными словами. У вас три входа, стало быть всего возможно восемь комбинаций на входах. Каждой комбинации на входах будет соответствовать какое-то значение выхода. Вы описали две комбинации, в первой из них значение второго входа не учитывается, то есть получается, что мы знаем, как себя должен вести выход в тех случаях из восьми возможных. А что с остальными?
почитайте http://grishnan.ru/books/lections/22...cture/lec2.pdf
ну, а если, в лоб, тогда будет так:
IF Input_1 AND NOT Input_3 then
Gate_1:=FALSE;
ELSIF NOT Input_1 AND Input_2 AND Input_3 THEN
Gate_1:=TRUE;
END_IF;
Добрый день!
пишу в SFС, разбитом на блоки LD (ну вот так мне удобно)
хочу сделать присвоение константы (Word) регистру модбас (аналоговый вывод)
как это можно сделать в LD?
конечно, не вопрос, ввести промежуточный блок (IL, ST или SFC) но я как-то привык к LD...
А Вы точно пишите на LD?
Элементарно обозвать катушку.
Просто нужно использовать "Элемент с EN"
В качестве элемента - MOVE
Вложение 33983
Таким способом можно и вычисления делать, там где MOVE писать ADD, SUB, ... Или условия проверять.
Или ФБ вызывать
Скрытый текст:
Граждане! Помогите. Не работает таймер в функциональном блоке.
Вложение 34004
FUNCTION_BLOCK gws_upr_pumps
VAR_INPUT
auto1: BOOL; (*Переключатель 1 насоса в автомате*)
man1: BOOL; (*Переключатель 1 насоса в ручном*)
auto2: BOOL; (*Переключатель 2 насоса в автомате*)
man2: BOOL; (*Переключатель 1 насоса в ручном*)
num: BOOL; (*Основной насос false - 1, true - 2*)
k1: BOOL; (*Контакт пускателя 1 насоса*)
k2: BOOL; (*Контакт пускателя 2 насоса*)
rdd: BOOL; (*Перепад на насосной группе*)
END_VAR
VAR_OUTPUT
out1: BOOL; (*Насос 1*)
out2: BOOL; (*Насос 2*)
al1: BOOL; (*Авария насоса 1*)
al2: BOOL; (*Авария насоса 2*)
END_VAR
VAR
g: BYTE;
gp1: pump;
gp2: pump;
t1: TON := (pt := t#10s);
g1, g2: BOOL;
END_VAR
IF man1 OR man2 THEN g := 0; (*Если хоть один насос включен в ручном режиме*)
ELSIF auto1 AND NOT auto2 THEN g := 1; (*Если включен в работу только 1 насос*)
ELSIF NOT auto1 AND auto2 THEN g := 2; (*Если включен в работу только 2 насос*)
ELSIF auto1 AND auto2 AND NOT num THEN g := 12; (*Если включены насосы 1 и 2 и 1 основной*)
ELSIF auto1 AND auto2 AND num THEN g := 21; (*Если включены насосы 1 и 2 и 2 основной*)
ELSE
g := 0;
END_IF;
CASE g OF
0: g1 := FALSE;
g2 := FALSE;
t1.IN := FALSE;
1: g1 := auto1 AND NOT al1;
g2 := FALSE;
t1.IN := FALSE;
2: g2 := auto2 AND NOT al2;
g1 := FALSE;
t1.IN := FALSE;
12: g1 := auto1 AND NOT al1;
t1.IN := al1;
g2 := auto2 AND NOT al2 AND t1.Q;
21: g2 := auto2 AND NOT al2;
t1.IN := al2;
g1 := auto1 AND NOT al1 AND t1.Q;
ELSE
out1 := FALSE;
out2 := FALSE;
END_CASE;
gp1(en := g1, res_alarm := NOT auto1 AND NOT man1, k := k1, rdd := rdd, out=> out1, alarm=> al1);
gp2(en := g2, res_alarm := NOT auto2 AND NOT man2, k := k2, rdd := rdd, out=> out2, alarm=> al2);
Так он, таймер, нигде не вызывается. Зачем ему работать. ему и так хорошо.
В кейсах входу IN таймера присваивается некое значение, но сам таймер не вызывается.
Почему тогда здесь работает?
VAR
p1: pump;
p2: pump;
p3: pump;
t1: TON := (pt := t#10s);
t2: TON := (pt := t#10s);
pp1, pp2, pp3: BOOL;
END_VAR
CASE num OF
0: (*Не включен ни один насос*)
pp1 := FALSE;
pp2 := FALSE;
pp3 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
1: (*Работает только сетевой-1*)
pp1 := NOT al1;
pp2 := FALSE;
pp3 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
2: (*Работает только сетевой-2*)
pp2 := NOT al2;
pp1 := FALSE;
pp3 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
3: (*Работает только сетевой-3*)
pp3 := NOT al3;
pp1 := FALSE;
pp2 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
12: (*Включены 1 и 2*)
pp1 := NOT al1;
t1.IN := al1;
pp2 := NOT al2 AND t1.Q;
pp3 := FALSE;
(************************************************* ************************************************** *)
23: (*Включены 2 и 3*)
pp2 := NOT al2;
t1.IN := al2;
pp3 := NOT al3 AND t1.Q;
pp1 := FALSE;
(************************************************* ************************************************** *)
13: (*Включены 1 и 3*)
pp1 := NOT al1;
t1.IN := al1;
pp3 := NOT al3 AND t1.Q;
pp2 := FALSE;
(************************************************* ************************************************** *)
31: (*Включены 3 и 1*)
pp3 := NOT al3;
t1.IN := al3;
pp1 := NOT al1 AND t1.Q;
pp2 := FALSE;
(************************************************* ************************************************** *)
123: (*Включены 1 и 2 и 3*)
pp1 := NOT al1;
t1.IN := al1;
pp2 := NOT al2 AND t1.Q;
t2.IN := al1 AND al2;
pp3 := NOT al3 AND t2.Q;
(************************************************* ************************************************** *)
132: (*Включены 1 и 3 и 2*)
pp1 := NOT al1;
t1.IN := al1;
pp3 := NOT al3 AND t1.Q;
t2.IN := al1 AND al3;
pp2 := NOT al2 AND t2.Q;
(************************************************* ************************************************** *)
213: (*Включены 2 и 1 и 3*)
pp2 := NOT al2;
t1.IN := al2;
pp1 := NOT al1 AND t1.Q;
t2.IN := al1 AND al2;
pp3 := NOT al3 AND t2.Q;
(************************************************* ************************************************** *)
231: (*Включены 2 и 3 и 1*)
pp2 := NOT al2;
t1.IN := al2;
pp3 := NOT al3 AND t1.Q;
t2.IN := al2 AND al3;
pp1 := NOT al1 AND t2.Q;
(************************************************* ************************************************** *)
312: (*Включены 3 и 1 и 2*)
pp3 := NOT al3;
t1.IN := al3;
pp1 := NOT al1 AND t1.Q;
t2.IN := al3 AND al1;
pp2 := NOT al2 AND t2.Q;
(************************************************* ************************************************** *)
321: (*Включены 3 и 2 и 1*)
pp3 := NOT al3;
t1.IN := al3;
pp2 := NOT al2 AND t1.Q;
t2.IN := al3 AND al2;
pp1 := NOT al1 AND t2.Q;
ELSE
out1 := FALSE;
out2 := FALSE;
out3 := FALSE;
END_CASE;
p1 (en:= pp1, res_alarm:= res1, k:= k1, rdd:= rdd, out=> out1, alarm=> al1);
p2 (en:= pp2, res_alarm:= res2, k:= k2, rdd:= rdd, out=> out2, alarm=> al2);
p3 (en:= pp3, res_alarm:= res3, k:= k1, rdd:= rdd, out=> out3, alarm=> al3);
Вложение 34006 Пожалуйста. С тремя насосами работает, с двумя нет.
Все разобрался. Переделал конструкцию с t1.in на t1(in := bool, pt := t#10s) и все заработало
Осталось только понять, как работало с тремя насосами.
Так работает же. Вот в чем вопрос?
И что, в онлайн можно увидеть работающие таймеры с бегущими циферками?
Да и переключение насосов при аварии предыдущего
Дык на отопление стоят разные по мощности насосы (и только не спрашивайте почему? это гл.инженеру видней) Приходящий оператор их включает по усмотрению по погоде. вот такую байду и приходится лепить. Желания начальства не обсуждаются.
Боюсь переключаться будут часто. На кубани погода такая, что утром по колено в снегу а вечером по уши в грязи. уж лучше пенсионер время от времени переключает сам (по распоряжению начальника).
Добрый день! Есть несколько расходомеров подключенных к ПЛК, считаю мгновенный расход и накопленный. Задача накопленный расход разбить на Расход за час, за сутки, за месяц. ПЛК подключен к панели, архив находится в ней же. Единственное что пришло в голову, считать расход в течении часа, затем по истечении часа по управляющему биту писать в архив панели, обнулять часовой расход и считать заново. Заморочился с часами ПЛК получил реальное время, но как зафиксировать изменение часа что-то не соображу. В ST не силен, пишу на CFS. Понимаю что нужно сравнивать текущий час H с H+1 (как 100 лет назад в школе на Паскале учили), но чего-то зациклился. Буду признателен за помощь!