PDA

Просмотр полной версии : Накопительный счетчик НА ПЛК100.30.M02



WELL
25.06.2019, 09:32
Добрый день! Пишу программу учета тепла на CFC с использованием ФБ HEAT_METER из библиотеки oscat building и ФБ FLOW_METER из библиотеки oscat basic. Все бы хорошо, но после сброса питания накопительное значение джоулей в ФБ HEAT_METER сбрасывается на 0. Как мне сделать какой либо накопительный счетчик, в который записывается значение выхода ФБ HEAT_METER, которое не обнуляется при обнулении входа, сбросе питания, и которое продолжает накапливать цифру, прибавлять к остаточному значению данные с выхода HEAT_METER.

То есть накрутил счетчик тепла на выходе ФБ HEAT_METER 300 000 джоулей, эти 300 000 джоулей так же на выходе отдельного счетчика, при сбросе питания ФБ HEAT_METER свой счетчик обнуляет и начинает считать заново, и нужно чтобы на отдельном счетчике цифра продолжала расти, складывая свою остаточную с данными счетчика ФБ HEAT_METER.

Надеюсь понятно объяснил. Всю голову сломал, не могу понять как это сделать.

Sulfur
25.06.2019, 11:16
Ну вот примерно так:
43279

WELL
25.06.2019, 12:35
Ну вот примерно так:
43279

Так..прописал это дело себе в программу, пока что оно удваивает значение на выходе и после сброса питания не сохраняется... что не так?

Sulfur
25.06.2019, 12:41
В моем блоке семантическая ошибка. Должно быть вот так

Trig(CLK:=Tact , Q=> );
IF Trig.Q
THEN OldHeat:=InHeat-OldHeat; (**)
Heat:=Heat+OldHeat; (**)
END_IF;
OutHeat:=Heat; (**)


Иначе трансляция сохраненных значений будет только по сигналу Tact.
На счет удвоения не совсем понятно. В приложенном файле не нашел переменной enb.
И да, я постоянно путаю R_TRIG и F_TRIG. Сорри. В данной задаче должен быть R_TRIG
Кроме того, намудрил с алгоритмом подсчета.
Исправленный вариант.

WELL
25.06.2019, 13:02
Иначе трансляция сохраненных значений будет только по сигналу Tact.
На счет удвоения не совсем понятно. В приложенном файле не нашел переменной enb.
И да, я постоянно путаю R_TRIG и F_TRIG. Сорри. В данной задаче должен быть R_TRIG[/QUOTE]

Поправил все. Но ведь в любом случае после восстановления питания на выходе OutHeat должно быть оставшееся значение, так? А у меня 0..

Sulfur
25.06.2019, 13:04
Выше приложил исправленный вариант, добавлена еще одна переменная.
Переменная Heat точно сделана глобальной и ретайн? После перезаливки программы ретайн слетает.

WELL
25.06.2019, 13:12
[QUOTE=Sulfur;308298]Выше приложил исправленный вариант, добавлена еще одна переменная.
А как часто в такт надо сигнал гнать?

WELL
25.06.2019, 13:22
Выше приложил исправленный вариант, добавлена еще одна переменная.
Переменная Heat точно сделана глобальной и ретайн? После перезаливки программы ретайн слетает.

Вот теперь работает! Буду тестировать) Спасибо..поклон до земли!

Sulfur
25.06.2019, 13:43
А как часто в такт надо сигнал гнать?
Можно хоть секундный BLINK на вход повесить, физическая запись во внутренний ретайн все равно будет выполнена в момент снятия питания с ПЛК.
В принципе можно убрать Tact и сделать обновление Heat по изменению InHeat:

IF OldHeat <> InHeat THEN далее по тексту. Тогда и триггер R_TRIG не нужен.

petera
25.06.2019, 14:55
Я бы сделал без БЛИНКа
43296