Задать вопрос
@hexelder

Лишних условий не бывает?

Добрый день. Помогите начинающему АСУТПшнику.

Суть вопроса будет понятней на абстрактной задачке.
Допустим, у нас есть двигатель которым нужно управлять: включение — при открытии 3-х клапанов и достижении темп. в помещении 10.0'C; отключение — если хотя бы один клапан закроется или температура воздуха опустится ниже 5.0'C.

Ниже 2-а варианта реализации. Оба они рабочие, но в чужом коде мне чаще встречается 1-й. Почему и зачем нужны лишние условия? Есть ли этому объяснение и какие-нибудь рекомендации?

Вариант 1
LoopFunc()
{
    if (Valve1.IsOpen && Valve2.IsOpen && Valve3.IsOpen && Sensor.Value >= 10.0)
        Motor.OnCmd = true;

    if (!Valve1.IsOpen || !Valve2.IsOpen || !Valve3.IsOpen || Sensor.Value <= 5.0)
        Motor.OnCmd = false;
}

Вариант 2
LoopFunc()
{
    if (Sensor.Value >= 10.0)
        Motor.OnCmd = true;

    if (!Valve1.IsOpen || !Valve2.IsOpen || !Valve3.IsOpen || Sensor.Value <= 5.0)
        Motor.OnCmd = false;
}


Подозреваю, что у 2-го варианта будут проблемы с многопоточностью (если она конечно появится), но даже в таком случае мне кажется код лучше доработать так (особенно если условий будет много):

// Global variables
bool TmpOnCmd = false;
TSensor Sensor;
TValve Valve1;
TValve Valve2;
TValve Valve3;
TMotor Motor;

LoopFunc()
{
    if (Sensor.Value >= 10.0)
        TmpOnCmd = true;

    if (!Valve1.IsOpen || !Valve2.IsOpen || !Valve3.IsOpen || Sensor.Value <= 5.0)
        TmpOnCmd = false;

    Motor.OnCmd = TmpOnCmd;
}
  • Вопрос задан
  • 2448 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@xandox
Из первого варианта проста сразу видно при каких условиях мы включаем мотор, в при каких выклюаем. Единственное, что я бы проверку клпонов в отдельную переменную вынес бы, что бы копипстой не заниматься.
bool IsValvesOpen = Valve1.IsOpen && Valve2.IsOpen && Valve3.IsOpen;
if (IsValvesOpen && Sensor.Value > 10.0) {
     Motor.Cmd = true;
} 
 
if (!IsVelvesOpen || Sensor.Value < 5.0) {
     Motor.Cmd = false;
}


Можно еще и по хардкорному без if-ов (но за такое могут и от материть (и если состояния сохраняются))
Motor.Cmd = (Valve1.IsOpen && Valve2.IsOpen && Valve3.IsOpen) && (Sensor.Value > 10 || (Motor.Cmd && Sensor.Value >= 5))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы