PDA

Просмотр полной версии : DWORD + DWORD



Технос
23.08.2016, 14:52
Здравствуйте администраторы, здравствуйте Petera!!!

работаю с тензодатчиком. Результат в DWord

пытаюсь скомпенсировать 0, т.е. добавить константу, не получается.




float у ;
DWord X;

.. функция получения значения с тензодатчика в формате DWord

y=0.035;
X=X-Float_2_DWord(y);

так не работает.

petera
23.08.2016, 15:03
Я конечно чайник в Си. Но чего вы хотите добиться своим преобразованием?
Float_2_DWord(y) - инструкция преобразования из плавающей в DWord . Дробная часть округляется. Если значение превышает DWord диапазон значений, будет использоваться значение 0 или 4294967295 .
Т.е. Float_2_DWord(0.035)=0
Прибавляйте свою константу как DWord. Наверняка Ваш результат с тензодатчика в DWord предполагает фиксированную точку.

И зачем вообще Вам макрос на Си. Что в ф.области Вам не хватило вычислений?

Евгений Кислов
23.08.2016, 15:32
Дробная часть округляется. Если значение превышает DWord диапазон значений, будет использоваться значение 0 или 4294967295 .
Т.е. Float_2_DWord(0.035)=0


Вовсе нет.
Float_2_DWord(0.035)=0xf5c293d0. Это интерпретация, а не конвертация.

Технос, выложите проект, пожалуйста, с подробным пояснением, чего вы ожидаете от макроса.

Технос
23.08.2016, 15:42
Спасибо за оперативную реакцию на моё сообщение!!!



DWORD X;
float y;

X=MY_4_READ(4, 20);
//y=DWord_2_Float(X);
//X=X-Int32_2_DWord(35000);
//X=X-Float_2_DWord(0.035);
//X=X*2;
PSW[300] = LOWORD(X);
PSW[301] = HIWORD(X);

// на дисплей вывожу PSW[300] и PSW[301] как float
// вижу значение 0,035
// Хотелось бы провести арифметические операции, для примера вычесть/прибавить константу типа float
// умножил Х на 2 тоже получил странный результат.
// хотелось бы сделать калибровку датчика

Евгений Кислов
23.08.2016, 15:56
Как верно заметил Petera - вы уверены, что вашу задачу необходимо реализовывать именно через макросы?
Выкладываю пример, те же самые операции можно производить через функциональную область.

25915

Технос
23.08.2016, 16:03
меня бы так устроило, если бы можно было добавить регистр а не константу

Технос
23.08.2016, 16:05
нашёл, можно и с регистром. пробую

Технос
23.08.2016, 16:16
нет не работает

Евгений Кислов
23.08.2016, 17:45
нет не работает

Работает и с регистром. Если этот вариант вас не устраивает, то напишите, чем именно.

Технос
24.08.2016, 10:31
Евгений, не пойму как Вы убедились в том, что работает.
чисто теоретически должно, согласен, но не работает.

petera
24.08.2016, 10:48
Ёпрст:(
Хоть бы архивировали свои проекты.
578 кБ против 8.31Мб

Евгений Кислов
24.08.2016, 10:49
Евгений, не пойму как Вы убедились в том, что работает.
чисто теоретически должно, согласен, но не работает.

Я же выложил проект (Проект_edit.txp). В нем через функциональную область происходит сложение двух float значений. Насколько я понял, вам требовалось именно это.

Технос
24.08.2016, 11:05
дда если разрядность ограничить на уровне 6 знаков после запятой, то работает

petera
24.08.2016, 11:08
Я же выложил проект (Проект_edit.txp). В нем через функциональную область происходит сложение двух float значений. Насколько я понял, вам требовалось именно это.

Я думаю, что так и требуется. Но...
У него две ф.области
Одна физически читает X из модуля.
Вторая вычисляет
X=X-y
где X- полученные значения от тензодатчика
y - поправка
Обе ф.области непрерывные. И кто из них первый, а кто второй никто не скажет.
Непонятно зачем ДВЕ ф.области.
Нужно всего одна, с двумя последовательными функциями
-вызов макроса Fun1
-математика(арифметические вычисления).

Технос
24.08.2016, 11:08
Petera, не думал, что у Вас проблемы с интернетом. У меня - безлимит, на это уже не обращаю внимания

petera
24.08.2016, 11:13
Petera, не думал, что у Вас проблемы с интернетом. У меня - безлимит, на это уже не обращаю внимания

Безлимит и у меня, но если дома 50/25 Мбит/с, то на работе всего 4096/512 Кбит/с.
И на работе я не один.

Евгений Кислов
24.08.2016, 11:17
Я соглашусь с Petera, что одной функциональной области достаточно. Но при этом я до сих пор не увидел реальной необходимости в макросе - никто не мешает в одной функциональной области опрашивать датчик и производить арифметические операции. Если данные приходят в пригодном для обработки виде, то можно вообще все это делать в пределах действия Математические операции, в качестве одного из операндов выбрав регистры датчика.

Технос
24.08.2016, 11:20
да, с этим не спорю, но проблема не в этом. 25932 тип данных был DEC / Поставил float - заработало

Технос
24.08.2016, 11:23
спасибо !!!

petera
24.08.2016, 11:24
Я соглашусь с Petera, что одной функциональной области достаточно. Но при этом я до сих пор не увидел реальной необходимости в макросе - никто не мешает в одной функциональной области опрашивать датчик и производить арифметические операции. Если данные приходят в пригодном для обработки виде, то можно вообще все это делать в пределах действия Математические операции, в качестве одного из операндов выбрав регистры датчика.

Я думаю, что макрос ему нужен для чтения из модуля собственной функцией (видимо осталось от СП270).

Мне только не понятно, чего он добивается
Модуль выдает данные в формате DWord. В этом же формате можно прибавлять/вычитать поправку.
Зачем Float в вычислениях? Или в итоге, для дальнейшего использования именно Float нужен.
А так каша какая-то получается.

ЗЫ. Может все таки модуль выдает данные Float, а не DWord? Тогда зачем этот макрос вообще?