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

Сложение байтов

Модераторы: Глоб.модераторы, специалисты Weintek

Ответить

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Доброй ночи. Пытаюсь сложить 2 байта, но все безуспешно, почему то он удаляет последний старший бит младшего байта. Допустим я пытаюсь сложить 0х13 и 0хEB:

Код: Выделить всё

char response[30]
short hex_sum

response[0] = 0x13
response[1] = 0xEB
hex_sum = (response[0]<<8) + response[1]	//выводит 0х12EB вместо 0х13ЕВ
Если старший бит младшего байта 0, то такого не происходит, например в случае 0х10 и 0х3Е. Что не так?

pkl58
завсегдатай
завсегдатай
Сообщения: 544
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 6 раз
Поблагодарили: 59 раз

Сложение байтов

Сообщение pkl58 »

Видимо дело в типе short.
Снимок.PNG
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Но вроде как 0x13EB это 0001 0011 1110 1011, то есть я вмещаюсь. Поправьте меня, коль я ошибаюсь

pkl58
завсегдатай
завсегдатай
Сообщения: 544
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 6 раз
Поблагодарили: 59 раз

Сложение байтов

Сообщение pkl58 »

Виноват, проблема не в short а в char. Попробуйте объявить тип unsigned char.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 30 раз
Поблагодарили: 165 раз

Сложение байтов

Сообщение aranea »

Dron_Tat писал(а): 11 ноя 2019, 23:22 почему то он удаляет последний старший бит младшего байта
//выводит 0х12EB вместо 0х13ЕВ
0x13EB это 0001 0011 | 1110 1011
0x12EB это 0001 0010 | 1110 1011
возможно, в WEINTEK как-то по-другому, но мне кажется тут в обоих случаях перепутаны понятия "старший" и младший", что к байтам, что к битам
Изображение
char - это 8 бит, response[0]<<8 - возможно, приводит к переполнению, хотя вряд ли
еще понятно было бы, если бы затирал знаковый старший бит старшего байта

а до сложения сколько получается? hex_sum = (response[0]<<8)
Изображение

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

возможно, в WEINTEK как-то по-другому, но мне кажется тут в обоих случаях перепутаны понятия "старший" и младший"
работал ночью, перепутал=)
char - это 8 бит, response[0]<<8 - возможно, приводит к переполнению, хотя вряд ли
еще понятно было бы, если бы затирал знаковый старший бит старшего байта
Вот где истина, перевел на short response и все нормализовалось. Спасибо ограмное

Отправлено спустя 3 минуты 14 секунд:
а до сложения сколько получается? hex_sum = (response[0]<<8)
кстати, вспомнил, что он правильно сдвигает при char, проблемы начинаются именно при склеивании
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 30 раз
Поблагодарили: 165 раз

Сложение байтов

Сообщение aranea »

попробуйте склеивать побитово
hex_sum = (response[0]<<8) OR response[1];
Или | если поддерживаются
Можно ли использовать типы byte и word, чтобы не было недопонимания в формате данных?
Изображение

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Рано радовался :ges_no:
В общем я принимаю эти данные из com порта, протокол Modbus. Но вот начиная с 4 байта данные идут по 2 байта.
Из документации:
Формат ответа: 01 03 18 0A 09 27 9A 00 1E 00 00 FF F5 00 00 01 64 00 01 01 60 01 5A 00 5B FF 73 A3 2E
1 байт – сетевой адрес
2 байт – функция (0х03 – чтение)
3 байт – количество читаемых байтов (0х18 – 24 байта)
4:27 байты данных (HEX, пример 0А09hex = 2569dec)
28,29 – CRC16 принимаемого пакета
Поэтому данные записываю в byte(char) и пытаюсь их склеить.

Код: Выделить всё

char response[30]
INPORT(response[1], "Free Protocol", 29, return_value)
В голову приходит только ручное изменение бита в старшем байте младшего бита, то есть
0х13ЕВ это 0001 0011 1110 1011
0х12ЕВ это 0001 0010 1110 1011
проверять 7 бит на 1, если да, то 8 бит изменить на противоположное. Но неужели нет более простого способа...

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Сложение байтов

Сообщение VanMo »

Добрый день.
А зачем Вы изобретаете велосипед?
Почему не используете один из драйверов протокола Modbus? :ges_hmm:

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Скорее всего из-за незнания панели, потому как не понял как реализовать:
Что бы получить данные из устройства, я ему должен отправить запрос
01 03 00 00 00 0C 45 CF
где 0С - количество читаемых байт
45 СА - CRC
и получаю эти данные

PS Пробовал сегодня на C# все это сделать, так там проблем таких нет, код примерно такой же. Сложение проходит идеально :ges_hmm:

pkl58
завсегдатай
завсегдатай
Сообщения: 544
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 6 раз
Поблагодарили: 59 раз

Сложение байтов

Сообщение pkl58 »

А что за устройство? Протокол стандартный?
Dron_Tat писал(а): 13 ноя 2019, 11:49 Что бы получить данные из устройства, я ему должен отправить запрос
В каком виде вы хотите получить эти данные на экран? Как числовой индикатор?

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Метеостанция СОКОЛ-М1. Да, хочу что бы как числа были, он сразу передает пакетом данные(температура, влажность и т.д.) Вечером попробую отдельно каждое значение считать, а не пакетом

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Сложение байтов

Сообщение VanMo »

В самом простом варианте никаких макросов писать не нужно. Просто в объекте отображения, например, "числа" указывается адрес регистра Modbus и тип данных. Панель автоматически сформирует необходимые запросы, в том числе - пакетные, для извлечения этих данных.
Если есть действительная необходимость считать в макросе определенное количество регистров, то это делается одной функцией:

Код: Выделить всё

short array[10]
GetData(array[0], "MODBUS RTU", 4x, 33, 10)

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1457
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 61 раз
Поблагодарили: 182 раза

Сложение байтов

Сообщение Madwolf »

Если нужно получить данные из двух слов (double), то в настройках контроллера сразу есть возможность настроить "перевороты" байтов. Типа ABCD > CDAB, и др. варианты.

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Добрый вечер. Пробую стандартными методами считать данные. Выбрал объект "Числа", выбрал устройство, адрес 3х, 0. Но данные не приходят, пишет "Нет связи". Пробовал через терминальную программу считать отдельно 1 байт данных, нормально все. Скорости и адрес правильный
Setting.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Сложение байтов

Сообщение VanMo »

Тип регистра 3x - это InputRegister, он читается командой 4.
Судя по команде 3, которую Вы использовали, считать нужно HoldingRegister, а это тип 4x.
Чтобы проанализировать обмен данными, лучше всего воспользоваться каким нибудь порт-монитором, например, Bus Hound.

Автор темы
Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сложение байтов

Сообщение Dron_Tat »

Разобрался, спасибо всем!!

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1457
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 61 раз
Поблагодарили: 182 раза

Сложение байтов

Сообщение Madwolf »

С незнакомым девайсом проще подружиться сначала каким-нибудь Modbus Pool, а потом, когда все мели и броды известны, начинать коннектить панель.
Ответить

Вернуться в «WEINTEK (операторские панели)»