Просмотр полной версии : Сравнение переменной DWORD со значением
Metamorphogenesis
30.06.2019, 18:12
Доброго дня. Я находил похожие вопросы и ознакамливался с предложенными там решениями, однако решить свою задачу не удалось. Возможно, чуть другой случай.
Имеется панель СП307, она считывает из модуля ввода в два регистра аналоговое значение температуры. Моя задача - отследить, находится ли данное значение в допустимых пределах, чтобы оповестить о неисправности датчика (обрыв, КЗ и тд).
Каждую секунду фнкц.область вызывает макрос с таким содержимым:
DWORD T12_temp; // объявляем переменную
T12_temp = MAKEDWORD(PSW[700], PSW[701]); // собираем ее из регистров
if ((T12_temp > -10) & (T12_temp <100)) SetPSB(900); // если переменная в диапазоне -10 .. 100, устанавливаем бит
Я не могу понять, почему не устанавливается бит PSB900, тогда как температура находится в данном диапазоне. Сама температура отображается корректно в дисплее - 2 градуса выше нуля.
43381 43382 43379
Пробовал переставлять регистры в настройках проекта, но, кажется, собака зарыта в другом месте:
43380
Подскажите, где я промахнулся? Спасибо
Евгений Кислов
30.06.2019, 19:26
Добрый день.
Вам надо тип float в макросе использовать:
float T12_temp; // объявляем переменную
T12_temp = *(float*)(PSW+700); // собираем ее из регистров
if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900); // если переменная в диапазоне -10 .. 100, устанавливаем бит
Возможно, также стоит предусмотреть и условие сброса бита.
сравнивать постоянно float ? какой в этом смысл, если при изменении даже в 8 знаке после запятой значения не будут равны...
В данном случае простое сравнение. Если T12_temp=-10.00000000000, то условие в IF будет false, если Если T12_temp=-9.999999999999, то уже true. И в чем проблема?
И да, отсутствует условие сброса бита. Если это требуется в цикле, то можно сделать так:
T12_temp = *(float*)(PSW+700); // собираем ее из регистров
ResetPSB(900); // сбрасываем флаг диапазона
if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900); // если переменная в диапазоне -10 .. 100, устанавливаем бит
В данном случае простое сравнение. Если T12_temp=-10.00000000000, то SetPSB(900)будет false, если Если T12_temp=-9.999999999999, то уже true. И в чем проблема?
И да, отсутствует условие сброса бита. Если это требуется в цикле, то можно сделать так:
T12_temp = *(float*)(PSW+700); // собираем ее из регистров
SetPSB(900) = false; // сбрасываем флаг диапазона
if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900); // если переменная в диапазоне -10 .. 100, устанавливаем бит
про антидребезг что нибудь слышали?
Приходилось. Однако про дребезг не было условия у ТС.
Можно и так:
if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900)
if ((T12_temp < -11.0) & (T12_temp >101.0)) ResetPSB(900);
Будет гистерезис в 1 градус.
((T12_temp < -11.0) & (T12_temp >101.0)) это условие разве когда нибудь выполниться?
А в чем проблема? Допустим к качестве датчика термопара, при плохом контакте в цепи датчика показания будут завышаться, причем аномально. Т. е. по крайней мере T12_temp >101.0 сработает.
Кроме того, приборы аналогового ввода имеют встроенную диагностику датчика, нужно просто читать этот регистр.
Для гистерезиза нужно ИЛИ и сам гистерезис в куда ? еще ниже или еще выше показаний датчика ?
if ((T12_temp > -9.0) & (T12_temp <99.0)) ResetPSB(900) - может так ?
Ищите ситуации которые могут возникнуть и будут напрягать конечного пользователя, а это именно нахождение значения температуры возле границ, где она будет скакать туда сюда и оператор замучается квитировать аварию. Если делать по уму, то здесь должно быть два гистерезиса, возле нижней и возле верхней границы
Т. е. по крайней мере T12_temp >101.0 сработает еще раз посмотрите внимательно на ((T12_temp < -11.0) & (T12_temp >101.0)) переведу в более понятный код ((TRUE) И (FALSE)) всегда будет FALSE
Понял. Просто утро тяжелое, внимательность на нуле. Там нужно условие OR.
Metamorphogenesis
01.07.2019, 09:59
Добрый день.
Вам надо тип float в макросе использовать:
float T12_temp; // объявляем переменную
T12_temp = *(float*)(PSW+700); // собираем ее из регистров
if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900); // если переменная в диапазоне -10 .. 100, устанавливаем бит
Возможно, также стоит предусмотреть и условие сброса бита.
Вопрос решен. Спасибо большое. Условия установки и сброса - это мелочи, я еще не решил, чем и как именно я буду реагировать на результат сравнения, важно было получить сам результат.
сравнивать постоянно float ? какой в этом смысл, если при изменении даже в 8 знаке после запятой значения не будут равны...
Вы не поняли вопроса
В данном случае простое сравнение. Если T12_temp=-10.00000000000, то условие в IF будет false, если Если T12_temp=-9.999999999999, то уже true. И в чем проблема?
проблема была в неправильном выборе типа данных для переменной. С работой самого условия, что включать, сбрасывать и тд вопросов не было.
Всем спасибо за участие
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot