PDA

Просмотр полной версии : Сравнение переменной 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, устанавливаем бит


Возможно, также стоит предусмотреть и условие сброса бита.

melky
30.06.2019, 19:52
сравнивать постоянно float ? какой в этом смысл, если при изменении даже в 8 знаке после запятой значения не будут равны...

Sulfur
01.07.2019, 08:41
В данном случае простое сравнение. Если 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, устанавливаем бит

capzap
01.07.2019, 08:43
В данном случае простое сравнение. Если 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, устанавливаем бит

про антидребезг что нибудь слышали?

Sulfur
01.07.2019, 08:52
Приходилось. Однако про дребезг не было условия у ТС.
Можно и так:
if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900)
if ((T12_temp < -11.0) & (T12_temp >101.0)) ResetPSB(900);
Будет гистерезис в 1 градус.

capzap
01.07.2019, 09:00
((T12_temp < -11.0) & (T12_temp >101.0)) это условие разве когда нибудь выполниться?

Sulfur
01.07.2019, 09:03
А в чем проблема? Допустим к качестве датчика термопара, при плохом контакте в цепи датчика показания будут завышаться, причем аномально. Т. е. по крайней мере T12_temp >101.0 сработает.
Кроме того, приборы аналогового ввода имеют встроенную диагностику датчика, нужно просто читать этот регистр.

melky
01.07.2019, 09:17
Для гистерезиза нужно ИЛИ и сам гистерезис в куда ? еще ниже или еще выше показаний датчика ?
if ((T12_temp > -9.0) & (T12_temp <99.0)) ResetPSB(900) - может так ?

capzap
01.07.2019, 09:18
Ищите ситуации которые могут возникнуть и будут напрягать конечного пользователя, а это именно нахождение значения температуры возле границ, где она будет скакать туда сюда и оператор замучается квитировать аварию. Если делать по уму, то здесь должно быть два гистерезиса, возле нижней и возле верхней границы

Т. е. по крайней мере T12_temp >101.0 сработает еще раз посмотрите внимательно на ((T12_temp < -11.0) & (T12_temp >101.0)) переведу в более понятный код ((TRUE) И (FALSE)) всегда будет FALSE

Sulfur
01.07.2019, 09:54
Понял. Просто утро тяжелое, внимательность на нуле. Там нужно условие 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. И в чем проблема?

проблема была в неправильном выборе типа данных для переменной. С работой самого условия, что включать, сбрасывать и тд вопросов не было.


Всем спасибо за участие