- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Как собрать значения расходомера из пакета байт
-
- здесь недавно
- Сообщения: 13
- Зарегистрирован: 04 июл 2018, 03:27
- Имя: Максим Невмержицкий
- Страна: Россия
- Благодарил (а): 2 раза
- Поблагодарили: 1 раз
Как собрать значения расходомера из пакета байт
Расходомер US800 присылает пакет данных 19 байт, состоящий из данных о расходе, накопленном расходе, времени наработки, состоянии расходомера и др.
Значения переменных закодированы в шестнадцатеричном формате и занимают по 4 байта.
В документации к расходомеру есть пометка "что младшие байты помещены вперёд".
Какими функциями склеить 4 байта, принадлежащие каждой переменной для дальнейшей конвертации, и перекодировать значение переменных в формат Real?
В приложении пример получаемых данных.
Значения переменных закодированы в шестнадцатеричном формате и занимают по 4 байта.
В документации к расходомеру есть пометка "что младшие байты помещены вперёд".
Какими функциями склеить 4 байта, принадлежащие каждой переменной для дальнейшей конвертации, и перекодировать значение переменных в формат Real?
В приложении пример получаемых данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Как собрать значения расходомера из пакета байт
Насколько я понимаю формулировку "закодированы в шестнадцатеричном формате", данные передаются в виде целых чисел. Первый байт - младший.
Ваша среда разработки мне неизвестна поэтому конкретные функции я подсказать не могу, но в C преобразование можно выполнить так:
Операция "<<" - сдвиг влево.
Ваша среда разработки мне неизвестна поэтому конкретные функции я подсказать не могу, но в C преобразование можно выполнить так:
Код: Выделить всё
uint32_t Q = Q_m_h_11;
Q = Q << 8;
Q = Q + Q_m_h_10;
Q = Q << 8;
Q = Q + Q_m_h_9;
Q = Q << 8;
Q = Q + Q_m_h_8;
float fltQ = (float)Q;
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
Как собрать значения расходомера из пакета байт
Так сименс же там, значит TIA
Разберитесь сначала как закодированы, если там аналог BCD это одно, если real в формате float просто передается 4 байтами в порядке байтов 1,2,3,4 то это другое.., если там fixed point это другое
Компилятор - лучший друг человека!
-
- освоился
- Сообщения: 248
- Зарегистрирован: 31 янв 2017, 08:44
- Имя: Маркушин Андрей Геннадьевич
- Страна: Россия
- город/регион: Нижегородская обл., Выкса
- Благодарил (а): 19 раз
- Поблагодарили: 64 раза
Как собрать значения расходомера из пакета байт
Ничего там склеивать не нужно, и так всё нормально. Берите значения из переменных с абсолютными адресами db6.dbd3, db6.dbd7, db6.dbd11, db6.dbd16 и раскладывайте куда нужно. Если значения неадекватны, значит расходомер передаёт их в интеловском формате и нужно привести их в формат моторолловский (BigEndian), но скорее всего это не понадобится
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Как собрать значения расходомера из пакета байт
winb писал(а): ↑17 июл 2018, 15:16 Ничего там склеивать не нужно, и так всё нормально. Берите значения из переменных с абсолютными адресами db6.dbd3, db6.dbd7, db6.dbd11, db6.dbd16 и раскладывайте куда нужно. Если значения неадекватны, значит расходомер передаёт их в интеловском формате и нужно привести их в формат моторолловский (BigEndian), но скорее всего это не понадобится
"Младшие байты вперед" - это и есть "интеловский формат". В своем посте выше я привел код, как сделать преобразование из байтов в целое платформенно независимым способом.Maksim Nevmer писал(а): ↑16 июл 2018, 10:04 В документации к расходомеру есть пометка "что младшие байты помещены вперёд".
-
- освоился
- Сообщения: 248
- Зарегистрирован: 31 янв 2017, 08:44
- Имя: Маркушин Андрей Геннадьевич
- Страна: Россия
- город/регион: Нижегородская обл., Выкса
- Благодарил (а): 19 раз
- Поблагодарили: 64 раза
Как собрать значения расходомера из пакета байт
Контроллер - S7-1200. Зачем использовать "платформенно независимый способ"?
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Как собрать значения расходомера из пакета байт
Платформа в вопросе не указана. Вопрос в разделе "Средний уровень автоматизации", а не в спец разделе "Сименс". Вопрос в общем виде, поэтому в ответе описание принципа того, что нужно сделать, а не конкретная реализация.
-
- здесь недавно
- Сообщения: 13
- Зарегистрирован: 04 июл 2018, 03:27
- Имя: Максим Невмержицкий
- Страна: Россия
- Благодарил (а): 2 раза
- Поблагодарили: 1 раз
Как собрать значения расходомера из пакета байт
Спасибо за ответы!
Подключаю к S7-1212. Когда начал разбираться с задачей, прибор был "из коробки" без времени наработки вообще, поэтому я получил пустой пакет байт. На данный момент я доступа к расходомеру не имею, его увезли накапливать значения расхода на объект.
Сделал в проекте пока так - одному адресу присвоил разные типы данных:
MD100 - Real, которое я хочу получить
MB100 - байт 1 из расходомера (младший)
MB101 - байт 2 из расходомера
MB102 - байт 3 из расходомера
MB103 - байт 4 из расходомера
Хочу поиграться с порядком присвоения адресов байтам, думаю, что всё получится.
Подключаю к S7-1212. Когда начал разбираться с задачей, прибор был "из коробки" без времени наработки вообще, поэтому я получил пустой пакет байт. На данный момент я доступа к расходомеру не имею, его увезли накапливать значения расхода на объект.
Сделал в проекте пока так - одному адресу присвоил разные типы данных:
MD100 - Real, которое я хочу получить
MB100 - байт 1 из расходомера (младший)
MB101 - байт 2 из расходомера
MB102 - байт 3 из расходомера
MB103 - байт 4 из расходомера
Хочу поиграться с порядком присвоения адресов байтам, думаю, что всё получится.
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Как собрать значения расходомера из пакета байт
Это сработает только если расходомер передает данные прямо в формате real (32-битный float, IEEE 754). Это крайне маловероятно из-за ограничений точности этого формата, но не исключено.Maksim Nevmer писал(а): ↑19 июл 2018, 15:48 Спасибо за ответы!
Подключаю к S7-1212. Когда начал разбираться с задачей, прибор был "из коробки" без времени наработки вообще, поэтому я получил пустой пакет байт. На данный момент я доступа к расходомеру не имею, его увезли накапливать значения расхода на объект.
Сделал в проекте пока так - одному адресу присвоил разные типы данных:
MD100 - Real, которое я хочу получить
MB100 - байт 1 из расходомера (младший)
MB101 - байт 2 из расходомера
MB102 - байт 3 из расходомера
MB103 - байт 4 из расходомера
Хочу поиграться с порядком присвоения адресов байтам, думаю, что всё получится.
Фраза "закодированы в шестнадцатеричном формате", скорее всего, подразумевает что число целое.