1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Как собрать значения расходомера из пакета байт

PLC, прочие контроллеры, промышленные компьютеры, операторские панели
Ответить

Автор темы
Maksim Nevmer
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 04 июл 2018, 03:27
Имя: Максим Невмержицкий
Страна: Россия
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Как собрать значения расходомера из пакета байт

Сообщение Maksim Nevmer »

Расходомер US800 присылает пакет данных 19 байт, состоящий из данных о расходе, накопленном расходе, времени наработки, состоянии расходомера и др.
Значения переменных закодированы в шестнадцатеричном формате и занимают по 4 байта.
В документации к расходомеру есть пометка "что младшие байты помещены вперёд".

Какими функциями склеить 4 байта, принадлежащие каждой переменной для дальнейшей конвертации, и перекодировать значение переменных в формат Real?

В приложении пример получаемых данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

MuadDib
частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Как собрать значения расходомера из пакета байт

Сообщение MuadDib »

Насколько я понимаю формулировку "закодированы в шестнадцатеричном формате", данные передаются в виде целых чисел. Первый байт - младший.

Ваша среда разработки мне неизвестна поэтому конкретные функции я подсказать не могу, но в 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;
Операция "<<" - сдвиг влево.
Аватара пользователя

izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

Как собрать значения расходомера из пакета байт

Сообщение izhidkov »

MuadDib писал(а): 17 июл 2018, 05:47 Ваша среда разработки мне неизвестна
Так сименс же там, значит TIA

Разберитесь сначала как закодированы, если там аналог BCD это одно, если real в формате float просто передается 4 байтами в порядке байтов 1,2,3,4 то это другое.., если там fixed point это другое
Компилятор - лучший друг человека!

winb
освоился
освоился
Сообщения: 248
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Страна: Россия
город/регион: Нижегородская обл., Выкса
Благодарил (а): 14 раз
Поблагодарили: 59 раз

Как собрать значения расходомера из пакета байт

Сообщение winb »

Ничего там склеивать не нужно, и так всё нормально. Берите значения из переменных с абсолютными адресами db6.dbd3, db6.dbd7, db6.dbd11, db6.dbd16 и раскладывайте куда нужно. Если значения неадекватны, значит расходомер передаёт их в интеловском формате и нужно привести их в формат моторолловский (BigEndian), но скорее всего это не понадобится
Аватара пользователя

MuadDib
частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Как собрать значения расходомера из пакета байт

Сообщение MuadDib »

winb писал(а): 17 июл 2018, 15:16 Ничего там склеивать не нужно, и так всё нормально. Берите значения из переменных с абсолютными адресами db6.dbd3, db6.dbd7, db6.dbd11, db6.dbd16 и раскладывайте куда нужно. Если значения неадекватны, значит расходомер передаёт их в интеловском формате и нужно привести их в формат моторолловский (BigEndian), но скорее всего это не понадобится
Maksim Nevmer писал(а): 16 июл 2018, 10:04 В документации к расходомеру есть пометка "что младшие байты помещены вперёд".
"Младшие байты вперед" - это и есть "интеловский формат". В своем посте выше я привел код, как сделать преобразование из байтов в целое платформенно независимым способом.

winb
освоился
освоился
Сообщения: 248
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Страна: Россия
город/регион: Нижегородская обл., Выкса
Благодарил (а): 14 раз
Поблагодарили: 59 раз

Как собрать значения расходомера из пакета байт

Сообщение winb »

Контроллер - S7-1200. Зачем использовать "платформенно независимый способ"?
Аватара пользователя

MuadDib
частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Как собрать значения расходомера из пакета байт

Сообщение MuadDib »

winb писал(а): 18 июл 2018, 12:50 Контроллер - S7-1200. Зачем использовать "платформенно независимый способ"?
Платформа в вопросе не указана. Вопрос в разделе "Средний уровень автоматизации", а не в спец разделе "Сименс". Вопрос в общем виде, поэтому в ответе описание принципа того, что нужно сделать, а не конкретная реализация.

Автор темы
Maksim Nevmer
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 04 июл 2018, 03:27
Имя: Максим Невмержицкий
Страна: Россия
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Как собрать значения расходомера из пакета байт

Сообщение Maksim Nevmer »

Спасибо за ответы!
Подключаю к S7-1212. Когда начал разбираться с задачей, прибор был "из коробки" без времени наработки вообще, поэтому я получил пустой пакет байт. На данный момент я доступа к расходомеру не имею, его увезли накапливать значения расхода на объект.

Сделал в проекте пока так - одному адресу присвоил разные типы данных:
MD100 - Real, которое я хочу получить
MB100 - байт 1 из расходомера (младший)
MB101 - байт 2 из расходомера
MB102 - байт 3 из расходомера
MB103 - байт 4 из расходомера
Хочу поиграться с порядком присвоения адресов байтам, думаю, что всё получится.
Аватара пользователя

MuadDib
частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Как собрать значения расходомера из пакета байт

Сообщение MuadDib »

Maksim Nevmer писал(а): 19 июл 2018, 15:48 Спасибо за ответы!
Подключаю к S7-1212. Когда начал разбираться с задачей, прибор был "из коробки" без времени наработки вообще, поэтому я получил пустой пакет байт. На данный момент я доступа к расходомеру не имею, его увезли накапливать значения расхода на объект.

Сделал в проекте пока так - одному адресу присвоил разные типы данных:
MD100 - Real, которое я хочу получить
MB100 - байт 1 из расходомера (младший)
MB101 - байт 2 из расходомера
MB102 - байт 3 из расходомера
MB103 - байт 4 из расходомера
Хочу поиграться с порядком присвоения адресов байтам, думаю, что всё получится.
Это сработает только если расходомер передает данные прямо в формате real (32-битный float, IEEE 754). Это крайне маловероятно из-за ограничений точности этого формата, но не исключено.

Фраза "закодированы в шестнадцатеричном формате", скорее всего, подразумевает что число целое.
Ответить

Вернуться в «Средний уровень автоматизации (управляющий)»