Просмотр полной версии : Макрос суммарного расхода
Подскажите, как можно записать в макрос для панели СП310 формулу для расчета суммарного значения числа (расхода). В ПЛК это выглядит так:
VAR
tickTock: R_TRIG;
END_VAR
tickTock(CLK := TIME_TO_UDINT(TIME()) MOD 1000 > 500);
IF tickTock.Q THEN
a := a + QF1 / 3600;
END_IF
Заранее благодарен!!!
Подскажите, как можно записать в макрос для панели СП310 формулу для расчета суммарного значения числа (расхода). В ПЛК это выглядит так:
VAR
tickTock: R_TRIG;
END_VAR
tickTock(CLK := TIME_TO_UDINT(TIME()) MOD 1000 > 500);
IF tickTock.Q THEN
a := a + QF1 / 3600;
END_IF
Заранее благодарен!!!
BOOL X, Y;
static BOOL XPrevios;
static float a = 0;
float QF1;
// DEBUG only!
*(float*)(PSW+300) = a;
QF1 = *(float*)(PSW+256);
// ALGORITM
X = GetPSBStatus(4);
Y = X & !XPrevios;
XPrevios = X;
if (Y) {
a = a + QF1/3600;
}
49421 49426
Спасибо за сотрудничество!!!Буду пробовать...
Спасибо за сотрудничество!!!Буду пробовать...
X = GetPSBStatus(4); // получить состояние системного бита PSB4 - импульсы (меандр) с периодом 1сек
Y = X & !XPrevios; // это R_TRIGGER
XPrevios = X; // ловит фронт бита X
А дальше как у Вас
Опробовал все окей.
Осталось поместить в энергонезависимую память и на ФЛЭШ, но это я пожалуй попробую сам. Помнится это было рассмотрено на Форуме не один раз.
Дальше привязал вместо панельки ввода регистр прибора, осталось сделать не стираемые после отключения панели значения, то бишь поместить в Э.Н.Память ну и придумать как сделать сброс на "0". чтобы число не выходило за заданную разрядность. Обычно дежурный КИП это делает раз в месяц. У меня это было сделано на ПЛК в ФБ. В СИ не умею поэтому и попросил помощи. Еще раз спасибо.
Да!!!petera хотел спросить а почему //Debug only...
Да!!!petera хотел спросить а почему //Debug only...
потому, что к основному алгоритму эти две строчки отношения не имеют
их назначение посмотреть работу макроса на экране.
То что не имеют я понял, меня смутило слово Debug...ну это так для поддержания разговора...
Не стираемые значения - будут в регистрах PFW500..501
BOOL X, Y;
static BOOL XPrevios;
static float a = 0;
float QF1;
static BOOL Init;
// DEBUG only!
*(float*)(PSW+300) = a;
QF1 = *(float*)(PSW+256);
//Firs run
if (!Init) {
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 0, TYPE_DWORD, &DWord_2_Float(a));
Init = TRUE;
}
// ALGORITM
X = GetPSBStatus(4);
Y = X & !XPrevios;
XPrevios = X;
if (Y) {
a = a + QF1/3600;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 0, TYPE_DWORD, Float_2_DWord(a));
}
ЗЫ
То что не имеют я понял, меня смутило слово Debug...ну это так для поддержания разговора...
Мои попытки как-то помочь в отладке макросов путем вывода диагностических сообщений на экран https://owen.ru/forum/showthread.php?t=26783&p=251022&viewfull=1#post251022
Petera , благодарствую за помощь, с экономил мне несколько дней работы, ну тогда еще вопрос, а как обнулить значения в регистрах по мере надобности кнопкой?
Заранее благодарен Валерий
Поигрался с панелькой выяснил - значения обнуляются после отключения панели...
Прошу прощения значения пропадают в программе что я сам накропал... У Петеры все работает!!!Сейчас разберу ошибки
Строчку пропустил с INIT=TRUE, ...
Petera , благодарствую за помощь, с экономил мне несколько дней работы, ну тогда еще вопрос, а как обнулить значения в регистрах по мере надобности кнопкой?
Заранее благодарен Валерий
Назначаем кнопке бит управления, например PSB256, действие при нажатии - ВКЛ.
В макрос, перед вычислением расхода, добавляем строчки
if (GetPSBStatus(256)) { // получить состояние кнопки
a = 0;
Y = TRUE; // для того, чтобы досрочно "обнулить" энергонезависимое значение"
ResetPSB(256); // сбросить бит управления кнопки
}
49452
Только будет не совсем обнуление, а фактически сброс будет до текущего значения QF1/3600
Этого вполне достаточно!!! Респект!!!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot