PDA

Просмотр полной версии : вывод отрицательного значения



urik446
22.08.2019, 20:42
Здравствуйте!
Я использую сторонний прибор и через шлюз вывожу температуру.
С положительными значениями проблем нет.
А вот как вывести отрицательное значение?
Можно выбрать формат данных только unsigned.

Алексеев
22.08.2019, 22:05
Число в формате INT будет выводится отрицательные значения если оно имеет отрицательные значения
в дополнительном коде . Смотри в картинках .
Но есть подводный камень ФИЧА ( может уже исправили ) двойное преобразование --получает нормально , а из архива опять преобразует и результат иногда -1 получается 65535 (FFFF или 1111 1111 1111 1111) и т.д..
44253 44254
Пока не проверял исправили или нет ---- температуры положительные на улице.

urik446
23.08.2019, 12:43
спасибо разобрался , пришлось добавить 11111111 в старшие разряды

Сергей0308
23.08.2019, 18:10
спасибо разобрался , пришлось добавить 11111111 в старшие разряды

Это в прямом коде положительные и отрицательные числа отличаются только значением бита в старшем разряде! В дополнительном коде, что там присутствует, это не так, там как бы, в отличии от прямого кода, отрицательные значения в "перевёрнутом" виде!
Можно Овен попросить в настройки добавить дополнительно к знаковым целочисленным типам данных применяемый код(дополнительный, прямой, обратный), надеюсь понятно рассказал!
https://ru.wikipedia.org/wiki/Дополнительный_код
https://ru.wikipedia.org/wiki/Прямой_код
https://ru.wikipedia.org/wiki/Обратный_код
https://ru.wikipedia.org/wiki/Целое_(тип_данных)

Алексеев
23.08.2019, 20:02
Это в прямом коде положительные и отрицательные числа отличаются только значением бита в старшем разряде! В дополнительном коде, что там присутствует, это не так, там как бы, в отличии от прямого кода, отрицательные значения в "перевёрнутом" виде!
Можно Овен попросить в настройки добавить дополнительно к знаковым целочисленным типам данных применяемый код(дополнительный, прямой, обратный), надеюсь понятно рассказал!
https://ru.wikipedia.org/wiki/Дополнительный_код
Не совсем . Если вы хоть раз начали пользоваться двоичной арифметикой ( а не десятичной как мы пользуемся ) вы бы осознали
что -1 это 1111 1111 1111 1111 , а 1 это 0000 0000 0000 0001 --- а теперь сложите .
и получите 0000 0000 0000 0000 . Как и должно быть . И нечего мудрить . Во многих системах и языках очень много форматов данных,
но это лишь для оптимизации памяти хранения и скорости вычисления . Мне так кажется . :)

urik446
23.08.2019, 20:03
Да понятно, я считывал температуру с датчика ds18b20 ,получался обратный код но 8 разрядов . К примеру -3 получалось 1111 1100 .Я и передавал 0x00FC . И отображалось число 252 . А сейчас передаю 0xFFFC и теперь отображается всё правильно -3.

Сергей0308
23.08.2019, 20:13
Не совсем . Если вы хоть раз начали пользоваться двоичной арифметикой ( а не десятичной как мы пользуемся ) вы бы осознали
что -1 это 1111 1111 1111 1111 , а 1 это 0000 0000 0000 0001 --- а теперь сложите .
и получите 0000 0000 0000 0000 . Как и должно быть . И нечего мудрить . Во многих системах и языках очень много форматов данных,
но это лишь для оптимизации памяти хранения и скорости вычисления . Мне так кажется . :)

Мудрить не стоит, но я же даже ссылку дал, можете почитать, зачем применяют тот или иной код, его преимущества и недостатки тоже можно изучить, этого никто не запрещает, а я даже советую, для этого и ссылку дал!
Речь шла, во всяком случае до этого, об отображении, Вы говорите, по сути, к чёрту отображение, давайте лучше отнимем(сложим), найдём разность или сумму, какая здесь связь?

Сергей0308
23.08.2019, 20:16
Да понятно, я считывал температуру с датчика ds18b20 ,получался обратный код но 8 разрядов . К примеру -3 получалось 1111 1100 .Я и передавал 0x00FC . И отображалось число 252 . А сейчас передаю 0xFFFC и теперь отображается всё правильно -3.

У Вас наверно обратный код, надо переделать в дополнительный, тогда должно всё правильно отображаться!

Предположу и другой вариант, на мой взгляд, более предпочтительный: возможно Вы не совсем точно посмотрели и "-3" в двоичном виде выглядит так: 1111 1101, тогда у вас дополнительный код и надо всего лишь преобразовать для 16 битной переменной, если нет такого типа данных(такой размерности) в облаке!

Ранее в разговоре с представителями Овен они заверяли, что там(в облаке) есть все необходимые типы данных, что меня очень удивило, но я поспорить не мог, так как никогда не имел дела с ихним облачным сервисом, есть надежда, что практика это поправила и не всё у них(как обычно) предусмотрено!

Если второй вариант, то так можно преобразовать:

44285

44286

Алексеев
24.08.2019, 07:31
Если второй вариант, то так можно преобразовать:

44285

44286
Ранее было сказано что у коллеги устройство не фирмы овен . И как Я понял Он работал с одним байтом .
А нужно было работать с двумя байтами то есть регистр или слово ( два байта ) , мне так это представляется,
что произошло у коллеги .

Сергей0308
24.08.2019, 07:58
Ранее было сказано что у коллеги устройство не фирмы овен . И как Я понял Он работал с одним байтом .
А нужно было работать с двумя байтами то есть регистр или слово ( два байта ) , мне так это представляется,
что произошло произошло у коллеги .

В этом и проблема, что число однобайтовое, для двухбайтового в облачном сервисе есть тип данных INT16, а для однобайтовых знаковых чисел(INT8) нет такого типа данных в облачном сервисе Овена, хотя в природе существует! Вероятно такое будет редко встречаться, поэтому Овен счёл это ненужным!

И невозможно с INT8(числа от "-128" до 127) обращаться как с INT16 даже уже потому, что весь его диапазон кодов(0-255) будет лежать в области положительных значений INT16!

batur
27.04.2022, 10:02
В этом и проблема, что число однобайтовое, для двухбайтового в облачном сервисе есть тип данных INT16, а для однобайтовых знаковых чисел(INT8) нет такого типа данных в облачном сервисе Овена, хотя в природе существует! Вероятно такое будет редко встречаться, поэтому Овен счёл это ненужным!

И невозможно с INT8(числа от "-128" до 127) обращаться как с INT16 даже уже потому, что весь его диапазон кодов(0-255) будет лежать в области положительных значений INT16!

что делать если с пр на пр по 485 нужно передать переменную (уличная температура) когда на улице минус?

kondor3000
27.04.2022, 10:10
что делать если с пр на пр по 485 нужно передать переменную (уличная температура) когда на улице минус?

Самое простое передать температуру как Флоат ( 2 регистра), либо использовать макросы с передачей отрицательных значений в дополнительном коде.

Алексеев
27.04.2022, 10:31
Самое простое передать температуру как Флоат ( 2 регистра), либо использовать макросы с передачей отрицательных значений в дополнительном коде.

Много раз об этом говорил ,что есть проблема передачи
отрицательного числа в дополнительном коде 60493 https://owen.ru/forum/showthread.php?t=31760&p=312641&viewfull=1#post312641

batur
27.04.2022, 10:34
Самое простое передать температуру как Флоат ( 2 регистра), либо использовать макросы с передачей отрицательных значений в дополнительном коде.

в овен лоджик нельзя вроде флоат передать?
ПС тут с поиском форма что то , не ищет по ключевым словам

Сергей0308
27.04.2022, 10:46
что делать если с пр на пр по 485 нужно передать переменную (уличная температура) когда на улице минус?

Здесь макросы есть для преобразования в инт16: https://owen.ru/forum/showthread.php?t=13106&page=3

kondor3000
27.04.2022, 11:16
в овен лоджик нельзя вроде флоат передать?
ПС тут с поиском форма что то , не ищет по ключевым словам

Почему нельзя, флоат передаётся спокойно в Лоджике. Единственное правильно переставить регистры (снять, поставить галку в мастере)

Алексеев, читайте пост автора, ему надо с ПР передать на другой ПР.

batur
27.04.2022, 11:58
Здесь макросы есть для преобразования в инт16: https://owen.ru/forum/showthread.php?t=13106&page=3

Да эту тему я читал, там данные макросы не помогут, например нужно передать переменную с датчика уличной температуры, а именно зимой когда температура может упасть ниже 0.

batur
27.04.2022, 12:00
Почему нельзя, флоат передаётся спокойно в Лоджике. Единственное правильно переставить регистры (снять, поставить галку в мастере)

Алексеев, читайте пост автора, ему надо с ПР передать на другой ПР.

есть инфа как переставить регистры для того чтобы передать числа с минусом?

Сергей0308
27.04.2022, 12:08
Да эту тему я читал, там данные макросы не помогут, например нужно передать переменную с датчика уличной температуры, а именно зимой когда температура может упасть ниже 0.

И, почему не помогут?
Эти макросы как раз и созданы для этих целей, в смысле, чтобы передавать отрицательные значения целочисленной переменной!

batur
27.04.2022, 12:14
Здесь макросы есть для преобразования в инт16: https://owen.ru/forum/showthread.php?t=13106&page=3

прокатит ли, если я буду переменную флоат сравнивать на значение меньше 0, потом преобразовывать в инт и передавать по rs485, и если у меня переменная будет меньше 0 то значение будет умножаться на -1?

batur
27.04.2022, 12:18
И, почему не помогут?
Эти макросы как раз и созданы для этих целей, в смысле, чтобы передавать отрицательные значения целочисленной переменной!

там из отрицательного числа флоат преобразую в инт, и у меня на выходе 0, че дальше делать хз

Сергей0308
27.04.2022, 12:23
прокатит ли, если я буду переменную флоат сравнивать на значение меньше 0, потом преобразовывать в инт и передавать по rs485, и если у меня переменная будет меньше 0 то значение будет умножаться на -1?

Вы хотите создать какой-то свой тип данных?
В этом нет разумного смысла, всё уже придумали до нас! Макрос преобразования флоат в инт16 Вам дал, не понятно, что Вы хотите, что Вас не устраивает?
Пока я понимаю одно, что Вас не устраивает, что не Вы это придумали и хотите придумать какой-то свой вариант?

kondor3000
27.04.2022, 14:02
там из отрицательного числа флоат преобразую в инт, и у меня на выходе 0, че дальше делать хз

Вот скрин передачи числа -12,3 через макросы ( доп. код 65413) с умножением и делением на 10 и просто как флоат. Всё работает 60498

batur
27.04.2022, 15:05
Вот скрин передачи числа -12,3 через макросы ( доп. код 65413) с умножением и делением на 10 и просто как флоат. Всё работает 60498

все получилось, в прошлый раз у меня просто 0 на выходе, сам себя запутал, спасибо за помошь.