Добрый день .
Подскажите пожалуйста как можно с помощью имеющихся инструментов сделать индикатор сервисного обслуживания?
У меня есть адрес в ПЧ (63499) где я могу прочитать общую наработку насоса. Например в данный момент значение в адресе 36 часов.
Мне нужно чтобы когда значение достигнет заданного в определенном поле значения (например берем адрес LW700 = 50) появился индикатор (LB700 = 1). Потом я нажимаю на индикатор, он пропадает, и отсчет идет дальше. Когда набегут следующие 50 часов, индикатор загорится снова. И так далее. При этом если индикатор горит до тех пор пока на него не нажмут, даже если наработка увеличивается (51, 52, 53 и т.д.) Новый отсчет начинается только тогда, когда нажали на индикатор (например на 55 часа) и, следовательно в следующий раз индикатор выйдет на 105 часах. Не могу придумать как это сделать (
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Индикатор сервисного обслуживания
Модераторы: Глоб.модераторы, специалисты Flexem
-
- здесь недавно
- Сообщения: 32
- Зарегистрирован: 27 июн 2023, 09:11
- Имя: Дмитрий
- Страна: Россия
- город/регион: Екатеринбург / Свердловская область
- Поблагодарили: 1 раз
-
- здесь недавно
- Сообщения: 98
- Зарегистрирован: 21 мар 2023, 02:12
- Имя: Владимир
- Страна: РФ
- город/регион: Псков
- Благодарил (а): 2 раза
- Поблагодарили: 21 раз
Индикатор сервисного обслуживания
По сути, вам нужно зажигать индикатор каждые LW700 часов.
Сделайте две переменных. В одной храните общую наработку, её считайте всегда и никогда не обнуляйте. Вторую используйте для счётчика часов до ТО, инкрементируйте каждый час. Зажигайте, когда счётчикТО> LW700, обнуляйте по нажатию. Можно сделать наоборот, задать счётчик равным LW700 и вычитать по часу. Когда будет 0 - зажигать индикатор.
Ещё можно третью переменную завести, которая будет хранить количество сбросов ТО, чтобы можно было посчитать среднее время между ТО.
Сделайте две переменных. В одной храните общую наработку, её считайте всегда и никогда не обнуляйте. Вторую используйте для счётчика часов до ТО, инкрементируйте каждый час. Зажигайте, когда счётчикТО> LW700, обнуляйте по нажатию. Можно сделать наоборот, задать счётчик равным LW700 и вычитать по часу. Когда будет 0 - зажигать индикатор.
Ещё можно третью переменную завести, которая будет хранить количество сбросов ТО, чтобы можно было посчитать среднее время между ТО.
-
- здесь недавно
- Сообщения: 32
- Зарегистрирован: 27 июн 2023, 09:11
- Имя: Дмитрий
- Страна: Россия
- город/регион: Екатеринбург / Свердловская область
- Поблагодарили: 1 раз
Индикатор сервисного обслуживания
Добрый день. Получилось сделать с помощью макроса:
#include <macro.h>
int MacroMain()
{
// Условия работы индикатора сервисного обсл. насоса №1
int a1 = GetWord(@1Time1@,0);// Текущая наработка ПЧ
int b1 = GetWord(@1SetTime@,0);// Заданное время до сервиса
int c1 = GetWord(@1Time2@,0);// Остаток после деления
int d1 = GetBit(@1Indicator@,0);
int e1 = GetBit(@1Ind_reset@,0);
int f1 = GetBit(@1Ind_reset2@,0);
if ((d1 == 1) & (e1 == 1)) {
f1 = 1;
}
SetBit(@1Ind_reset2@,0,f1);
c1 = a1 % b1;
SetWord(@1Time2@,0,c1);
if(c1 == 0) {
d1 = 1;
} else e1 = 1;
SetBit(@1Indicator@,0,d1);
SetBit(@1Ind_reset@,0,e1);
if((c1 != 0) & (f1 == 0)) {
d1 = 0;
}
SetBit(@1Indicator@,0,d1);
return 0;
}
Не много не совсем то что нужно (жестко привязано к интервалу), но устраивает в полне.
Спасибо за помощь.
#include <macro.h>
int MacroMain()
{
// Условия работы индикатора сервисного обсл. насоса №1
int a1 = GetWord(@1Time1@,0);// Текущая наработка ПЧ
int b1 = GetWord(@1SetTime@,0);// Заданное время до сервиса
int c1 = GetWord(@1Time2@,0);// Остаток после деления
int d1 = GetBit(@1Indicator@,0);
int e1 = GetBit(@1Ind_reset@,0);
int f1 = GetBit(@1Ind_reset2@,0);
if ((d1 == 1) & (e1 == 1)) {
f1 = 1;
}
SetBit(@1Ind_reset2@,0,f1);
c1 = a1 % b1;
SetWord(@1Time2@,0,c1);
if(c1 == 0) {
d1 = 1;
} else e1 = 1;
SetBit(@1Indicator@,0,d1);
SetBit(@1Ind_reset@,0,e1);
if((c1 != 0) & (f1 == 0)) {
d1 = 0;
}
SetBit(@1Indicator@,0,d1);
return 0;
}
Не много не совсем то что нужно (жестко привязано к интервалу), но устраивает в полне.
Спасибо за помощь.