Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Сравнение переменной DWORD со значением

  1. #1

    Unhappy Сравнение переменной DWORD со значением

    Доброго дня. Я находил похожие вопросы и ознакамливался с предложенными там решениями, однако решить свою задачу не удалось. Возможно, чуть другой случай.

    Имеется панель СП307, она считывает из модуля ввода в два регистра аналоговое значение температуры. Моя задача - отследить, находится ли данное значение в допустимых пределах, чтобы оповестить о неисправности датчика (обрыв, КЗ и тд).

    Каждую секунду фнкц.область вызывает макрос с таким содержимым:

    Код:
    DWORD T12_temp;						// объявляем переменную
    T12_temp = MAKEDWORD(PSW[700], PSW[701]);		// собираем ее из регистров
    if ((T12_temp > -10) & (T12_temp <100)) SetPSB(900);	// если переменная в диапазоне -10 .. 100, устанавливаем бит
    Я не могу понять, почему не устанавливается бит PSB900, тогда как температура находится в данном диапазоне. Сама температура отображается корректно в дисплее - 2 градуса выше нуля.
    screenshot_2019-06-30.jpg screenshot_2019-06-30 (1).jpg photo5244525380952501020.jpg

    Пробовал переставлять регистры в настройках проекта, но, кажется, собака зарыта в другом месте:
    photo5244525380952501021.jpg

    Подскажите, где я промахнулся? Спасибо

  2. #2

    По умолчанию

    Добрый день.
    Вам надо тип float в макросе использовать:

    Код:
    float T12_temp;						// объявляем переменную
    T12_temp = *(float*)(PSW+700);		// собираем ее из регистров
    if ((T12_temp > -10.0) & (T12_temp <100.0)) SetPSB(900);	// если переменная в диапазоне -10 .. 100, устанавливаем бит
    Возможно, также стоит предусмотреть и условие сброса бита.

  3. #3
    Banned
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    5,903

    По умолчанию

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

  4. #4
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    517

    По умолчанию

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

  5. #5
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,307

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    В данном случае простое сравнение. Если 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, устанавливаем бит
    про антидребезг что нибудь слышали?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  6. #6
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    517

    По умолчанию

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

  7. #7
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,307

    По умолчанию

    ((T12_temp < -11.0) & (T12_temp >101.0)) это условие разве когда нибудь выполниться?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  8. #8
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    517

    По умолчанию

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

  9. #9
    Banned
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    5,903

    По умолчанию

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

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,307

    По умолчанию

    Ищите ситуации которые могут возникнуть и будут напрягать конечного пользователя, а это именно нахождение значения температуры возле границ, где она будет скакать туда сюда и оператор замучается квитировать аварию. Если делать по уму, то здесь должно быть два гистерезиса, возле нижней и возле верхней границы
    Т. е. по крайней мере T12_temp >101.0 сработает
    еще раз посмотрите внимательно на ((T12_temp < -11.0) & (T12_temp >101.0)) переведу в более понятный код ((TRUE) И (FALSE)) всегда будет FALSE
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Вопрос DWORD
    от a_gricaj в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 05.02.2017, 11:22
  2. Операции с DWORD
    от Технос в разделе Панели оператора (HMI)
    Ответов: 1
    Последнее сообщение: 24.10.2016, 17:53
  3. DWORD + DWORD
    от Технос в разделе Панели оператора (HMI)
    Ответов: 19
    Последнее сообщение: 24.08.2016, 11:24
  4. ПЛК 63 - DWORD в конфигурации
    от melky в разделе ПЛК63/73
    Ответов: 3
    Последнее сообщение: 13.10.2015, 18:12
  5. сравнение в Ld
    от Alr в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 04.08.2010, 19:54

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •