1 2 3 4 5 6 7 8 9 10 8.5/10 8,30оценок: 10

Мой CCU 825 - 3 часть

Тема в разделе "Охрана дачных поселков. Безопасность", создана пользователем Deep, 30.10.17.

  1. EIKA_inc
    Регистрация:
    25.11.17
    Сообщения:
    87
    Благодарности:
    9

    EIKA_inc

    Живу здесь

    EIKA_inc

    Живу здесь

    Регистрация:
    25.11.17
    Сообщения:
    87
    Благодарности:
    9
    Адрес:
    Москва
    Чуть-чуть глаза поднимите - это некорректная команда, я об этом только что написал.
     
  2. Esin112
    Регистрация:
    05.09.12
    Сообщения:
    642
    Благодарности:
    251

    Esin112

    Живу здесь

    Esin112

    Живу здесь

    Регистрация:
    05.09.12
    Сообщения:
    642
    Благодарности:
    251
    7.3.5.
    Запрос состояния входов или выходов "?"
    /ПАРОЛЬ ИМЯ_ОБЪЕКТА ?[ ИМЯ_ОБЪЕКТА ?]
    ИМЯ_ОБЪЕКТА – имя-псевдоним датчика или выхода.
    ? – признак запроса состояния.
    Пример запроса:
    /123456 ПРИХОЖАЯ ? ДВЕРЬ ? ОКНО ? НАГРЕВАТЕЛЬ ? ТЕМПЕРАТУРА ?
     
  3. EIKA_inc
    Регистрация:
    25.11.17
    Сообщения:
    87
    Благодарности:
    9

    EIKA_inc

    Живу здесь

    EIKA_inc

    Живу здесь

    Регистрация:
    25.11.17
    Сообщения:
    87
    Благодарности:
    9
    Адрес:
    Москва
    Все понял - заканчивать вопрос знаком ?. Спасибо, это помогло. Очень удобно!
     
  4. andreev__aa
    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6

    andreev__aa

    Участник

    andreev__aa

    Участник

    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6
    Адрес:
    СПб + Хотнежа
    Доброго всем дня!
    Имеется CCU825 + PLC, прошивка 02.12 и следующая проблема.

    Вызываю get_sensor_value (3,2) для термодатчика RTD-03.2 и пытаюсь в зависимости от значения управлять выходом. Температура на выходе 6,7 градуса, но при сравнении ее начинаются проблемы.
    if temp < MIN_TEMP {
    enable_heat();
    }
    else if temp > MAX_TEMP {
    disable_heat();
    }

    Методом научного тыка убедился, что при температуре 6,6 - 6,7 значение выдаваемое функцией лежит в диапазоне от 10 до 50.

    Есть у кого-нибудь опыт использования функции $get_sensor_value, в каких попугаях она температуру отдает?

    UPD: загрузил код программы
     

    Вложения:

  5. Ян 11
    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616

    Ян 11

    Живу здесь

    Ян 11

    Живу здесь

    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616
    Адрес:
    Moscow, Russia
    @andreev_aa, в радселовских примерах размер дробной части в битах - и ставят 8. У Вас стоит 2
    var temp = $get_sensor_value (3,2);
    можно 8 поставить?
    и. там в константах забавно написан битовый сдвиг, видели?

    PS: сам написал фигню, но эта часть мне была пофиг, моя фигня связана с get_input_value и там очевидно источник - число 0-4096.
     
  6. andreev__aa
    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6

    andreev__aa

    Участник

    andreev__aa

    Участник

    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6
    Адрес:
    СПб + Хотнежа
    @Ян 11, пробовал ставить восьмерку, там вообще огромные числа лезут и это укладывает в логику описанную ТП.

    Вот что мне ответила техподдержка (не ожидал такого быстрого ответа):
    Функция $get_sensor_value возвращает скорректированное
    значение в единицах измерения датчика в формате с фиксированной точкой.
    В своем примере Вы задали точность 2 разряда. Поэтому число 6.6 в данном
    формате будет выглядеть как int (6.6 * 2^2) = 26.

    Подробнее про данное представление чисел можно почитать в этой статье.

    https://tqfp.org/programming/chisla-s-fiksirovannoy-zapyatoy.html

    Сейчас поробовал использовать конструкцию var temp = $get_sensor_value (3,0) - работает, но это округление до целого, судя по наблюдением за изменением состояния выхода.

    То есть по этой логике надо писать var temp = $get_sensor_value (3,-2), чтобы получить точность 2 знака после запятой, но это сделать не получится т. к. значение может быть от 0 до 31.
    Попробовал иполучил ошибку при выполнении, что логично.

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

    PS: хотел использовать $get_input_value, но надо как-то это целое число в градусы пересчитывать или в вольты + скорей всего в этой функции не учитывается калибровка датчика температуры...
     
  7. Ян 11
    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616

    Ян 11

    Живу здесь

    Ян 11

    Живу здесь

    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616
    Адрес:
    Moscow, Russia
    @andreev_aa, да нет, всё проще. Там где задаются константы как границы зоны нужно просто сделать тот же битовый сдвиг
    const T1 = 20 < FRACT; # первая граница в градусах (fixed-point)
    const T2 = 30 < FRACT; # вторая граница в градусах (fixed-point)

    В результате этого действия в T1 - какая-то фигня, но эта фигня соответствует возращаемому get_sensor_value с таким же битовым сдвигом. А будет там 26, 50 или скажем 785 уже неважно - сравниваются уже одноразмерные T1 (соответствующие 20 градусам по цельсию) и get_sensor_value в том же формате.

    А пересчет из getinput в Т простой. Но да, без учета калибровки. формулу для любого датчика можно увидеть в uGuard.
     
  8. andreev__aa
    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6

    andreev__aa

    Участник

    andreev__aa

    Участник

    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6
    Адрес:
    СПб + Хотнежа
    @Ян 11, вот блин, это ж надо так извратиться...
    Мне кажется я такой ерундой, как битовый сдвиг на информатике последний раз занимался, видимо надо вернуться к истокам. :)
    Вот если бы они в инструкции про это написали, было бы хорошо!
    Спасибище ОГРОМНОЕ! Пошел двигать биты. :aga:
     
  9. DSerov
    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640

    DSerov

    Живу здесь

    DSerov

    Живу здесь

    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640
    Адрес:
    Не москва
    Пугаться сдвига не надо. Сдвиг бит на n влево это точно то же самое, что умножение на 2 в степени n (2^n). Тех поддержка дала формулу int (6.6 * 2^2) = 26. Можно константы умножить как Ян советует или в проверке границ "if temp < MIN_TEMP * 4".
     
  10. Ян 11
    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616

    Ян 11

    Живу здесь

    Ян 11

    Живу здесь

    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616
    Адрес:
    Moscow, Russia
    @DSerov, не нужно блин. Есть пример как с этим работать - радсел выложил примеры скриптов.

    const FRACT = 8; # размер дробной части fixed-point в битах
    const T1 = 20 < FRACT; # первая граница в градусах (fixed-point)
    const T2 = 30 < FRACT; # вторая граница в градусах (fixed-point)

    if t >= T1 && t < T2 && state != ST_ACTIVE1 {

    fun get_temp()
    {
    return $get_sensor_value (INPUT_N, FRACT);
    }

    Вот так и работать. Пофиг на битовый сдвиг - даже если это черный ящик - это неважно. И вспоминать про них не нужно.

    PS: зато хорошо, что тут это всплыло. Я в своих скриптах учитывал температуру и неправильно. Но писал просто для разного поведения лето/зима и просто не дошел до ошибки :))
     
  11. DSerov
    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640

    DSerov

    Живу здесь

    DSerov

    Живу здесь

    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640
    Адрес:
    Не москва
    @Ян 11, а у них сдвиг "20 < FRACT" точно с одной скобкой? Диковатый язык. Почему то в одном случае это сдвиг, а в другом "t < T2" это сравнение. %)

    Предложенный вариант хорош только для случая, когда T1,T2 константы. А если надо, чтобы пользователь их смской устанавливал, тогда я бы выбрал второй вариант - в сравнении сдвигать (умножать) правую часть.
     
  12. Ян 11
    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616

    Ян 11

    Живу здесь

    Ян 11

    Живу здесь

    Регистрация:
    14.06.14
    Сообщения:
    7.870
    Благодарности:
    10.616
    Адрес:
    Moscow, Russia
    @DSerov, сорри, с двумя. Делал copy-paste, фигня вышла... с трудом понимаю где, а не проверил.

    Ммм. По-моему в их языке нет ничего о получении СМС и о изменении уставок.

    Но аналогичный битовый сдвиг можно делать прям перед сравнением вообще :)
     
  13. DSerov
    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640

    DSerov

    Живу здесь

    DSerov

    Живу здесь

    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640
    Адрес:
    Не москва
    Аа, ясно, это подарок от ФХ. Двойные символы форум удаляет и « превратились в <.

    Да просто выше чел испугался сдвига. Поэтому я предложил умножать. Что такое сдвиг? Это приписывание 0 справа от числа. Что такое приписывание 0? Это умножение на 10. А что такое 10 в двоичной системе? Это 2. Вот и получается сдвинуть на 3 разряда это приписать три нуля справа и это же умножить три раза на 2 (на 2^3, на 8).

    Можно еще попробовать задавать числа как (6,10) и писать температуру 20 как 20000. Это потому что 2^10=1024 или примерно 1000. Это кому совсем лень вникать в нюансы двоичных вычислений. ;)
     
  14. andreev__aa
    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6

    andreev__aa

    Участник

    andreev__aa

    Участник

    Регистрация:
    13.05.16
    Сообщения:
    37
    Благодарности:
    6
    Адрес:
    СПб + Хотнежа
    @DSerov, да не я не пугался, просто подзабыл что это такое.

    @Ян 11, спасибо, нашел примеры скриптов на сайте, сделал как в примере.
     
  15. DSerov
    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640

    DSerov

    Живу здесь

    DSerov

    Живу здесь

    Регистрация:
    23.03.12
    Сообщения:
    6.303
    Благодарности:
    4.640
    Адрес:
    Не москва
    "вскрыл" Rtd03.2. Внутри BLA9, что вероятно есть TC1047. И операц усилитель 2904.
    TC1047 по даташиту как раз выдает напряжение линейно от температуры 0.01*Т+0.5. эта же формула с точностью до множителя 5, написана на ртд под термоусадкой. С помощью 2904 наверное усиливают до 5в.
    А теперь вопрос. Если ссю нужна линейная зависимость V от Т, то как две страницы назад к ссю прицепили NTC?