Тема: Разделение параметра на несколько виртуальных датчиков.
Добрый день, от терминала приходит сообщение например param 705010.
Можно ли разделить его на три датчика что бы получилось
sens1 10
sens2 50
sens3 70
?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Добрый день, от терминала приходит сообщение например param 705010.
Можно ли разделить его на три датчика что бы получилось
sens1 10
sens2 50
sens3 70
?
Evgen51 почитайте эту страницу руководства, думаю вам нужен побитовый контроль
http://docs.gurtam.com/ru/hosting/cms/u … sors/param
Спасибо, но побитовый он для цифровых датчиков, а тут нужно в одно сообщение уместить показания трех цифровых термодатчиков.
То есть выделить 1,2 и 3 байты.
Evgen51 так побитовый контроль как раз позволяет выделить из параметра нужные биты
Побитно/побайтно поможет, если это HEX. А если десятичное? Нужна команда отброса дробной части в математику датчика.
Для того, чтобы разобрать число 705010 на три 70 50 и 10 нужно сделать две вещи:
- первое, нам необходимо добиться округления.
Для этого можно воспользоваться таблицей расчета - просто добавить для каждой единицы точку
X=1 a=0 b=1
X=2 a=0 b=2
и так далее до нужного вам количества. По итогу график будет выглядеть примерно как в аттаче. Для каждого такого датчика соответственно нужно добавить такую же таблицу.
- второе - нам необходимо настроить выделение нужных разрядов в передаваемых таблице параметрах Х (она в свою очередь будет бороться с дробной частью)
Допустим нам нужны три датчика sens1, sens2 и sens3 а наименование параметра у нас param
Из исходного числа 70 - это 705010/10000 = 70,5010
соответственно для первого датчика формула param/const10000
для второго уже (param-[sens1]*const10000)/const100
а для третьего param-[sens1]*const10000-[sens2]*const100
В итоге все три датчика получат корректные округленные значения.
Кстати - примерно такой же подход используется при разборе параметров по can-log, с той лишь разницей, что там в одном числе может быть сразу несколько событий, а деление не по числам, кратным 10, а по своим.
Для того, чтобы разобрать число 705010 на три 70 50 и 10 нужно сделать две вещи:
- первое, нам необходимо добиться округления.
Для этого можно воспользоваться таблицей расчета - просто добавить для каждой единицы точку
X=1 a=0 b=1
X=2 a=0 b=2
и так далее до нужного вам количества. По итогу график будет выглядеть примерно как в аттаче. Для каждого такого датчика соответственно нужно добавить такую же таблицу.- второе - нам необходимо настроить выделение нужных разрядов в передаваемых таблице параметрах Х (она в свою очередь будет бороться с дробной частью)
Допустим нам нужны три датчика sens1, sens2 и sens3 а наименование параметра у нас param
Из исходного числа 70 - это 705010/10000 = 70,5010
соответственно для первого датчика формула param/const10000
для второго уже (param-[sens1]*const10000)/const100
а для третьего param-[sens1]*const10000-[sens2]*const100В итоге все три датчика получат корректные округленные значения.
Кстати - примерно такой же подход используется при разборе параметров по can-log, с той лишь разницей, что там в одном числе может быть сразу несколько событий, а деление не по числам, кратным 10, а по своим.
Сергей, здравствуйте. А не можете подсказать точнее, как разобрать параметр can_a1, в котором по описанию следующее:
Младший байт: уровень топлива, значение
надо умножить на 0,4.
Второй байт: температура охлаждающей
жидкости, из значения надо вычесть 40.
Третий и четвёртый байты: обороты
двигателя, значение надо умножить на 0,125.
Пример данных из шины в порядке
получения: FA 72 50 25.
Уровень топлива: 100%.
Температура 74C
Обороты: 1194 об/мин.
К примеру, ко мне прилетает значение 10240 в десятичной системе.
Разбираете значение побитово, как написано в документации. Из битов собираете нужный байт и делаете с ним операции приведения к значению.
Разбираете значение побитово, как написано в документации. Из битов собираете нужный байт и делаете с ним операции приведения к значению.
Подниму тему, чтобы не создавать новую.
Не подскажете, как именно из битов собрать нужный байт?
То есть, меня интересует не отдельный бит, а параметр, который передаётся, например, 3-мя битами. Как получить его значение? И каким образом потом в десятичную перевести?
То есть, меня интересует не отдельный бит, а параметр, который передаётся, например, 3-мя битами. Как получить его значение? И каким образом потом в десятичную перевести?
Пример для трехбитного параметра (передаваемого 6-ым, 5-ым и 4-ым битом):
const4*param:6+const2*param:5+param:4