PDA

Просмотр полной версии : дополнительный код в ST



kovalich
12.03.2025, 23:41
Добрый день!
Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.
В техподдержке сказали, что при отправке целочисленного числа оно из десятичного кода конвертируется в 16 ричный и отправляется. Тут у меня проблем нет, со слейвом работаем штатно.
Но как передать отрицательное число? В ST целочисленное больше нуля, соответственно я не могу его сразу в регистр отправить.
Прочитал что работа с отрицательными целыми числами представляется в двоичном формате и потом конвертируется в 10-ричный (дополнительный код).
Вопрос!
Как работать c двоичном коде в ST?
Может у кого уже есть наработки с дополнительным кодом?

Валенок
13.03.2025, 01:18
Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.
слейву := 0 - 7; //отправить -7

Сергей0308
13.03.2025, 06:05
Мне кажется там всё не просто, а очень просто, в смысле что код числа представляет отрицательное число - указывает старший бит кода числа, алгоритм вычисления модуля тоже очень простой, мне понравился как это делает Пётр из Минска, в смысле, он инвертирует все биты кода числа + 1, всё!
Вы заметили, что я ничего не пишу про тип данных, в смысле, это INT16 или INT32, короче, это и не требуется, механизм(способ) универсальный!

FPavel
13.03.2025, 06:44
Да, поддержу Сергей0308 - число для отправки перед помещением в переменную подвергнуть преобразованию.
Как понимаю, в ПР работа идёт с вещественным числом и лишь для передачи по Modbus производится сжимание до одного целочисленного регистра (16 разрядное целое со знаком).

Язык ST в OL на данный момент не поддерживает побитовые операции с целыми числами, поэтому преобразование сделаете на FBD.
Если число положительное, то просто преобразуете F -> I.
Если число отрицательное, то по порядку ABS, F -> I, NOT поразрядное, +1.
При помощи SEL поместите результат ветвления в переменную.

Преобразования для получения дополнительного кода описаны в статье Wikipedia - это как раз NOT и +1.

kondor3000
13.03.2025, 07:42
Добрый день!
Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.
В техподдержке сказали, что при отправке целочисленного числа оно из десятичного кода конвертируется в 16 ричный и отправляется. Тут у меня проблем нет, со слейвом работаем штатно.
Но как передать отрицательное число? В ST целочисленное больше нуля, соответственно я не могу его сразу в регистр отправить.
Прочитал что работа с отрицательными целыми числами представляется в двоичном формате и потом конвертируется в 10-ричный (дополнительный код).
Вопрос!
Как работать c двоичном коде в ST?
Может у кого уже есть наработки с дополнительным кодом?

Вот макросы и функц. блоки (ФБ) на ST.
Функции FLOAT_TO_INT и INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php?t=22915&page=311&p=429821#post429821

capzap
13.03.2025, 07:43
возможно на ST это не так сложно выглядит = ( (65536 - abs_negativ_num) % (65536) )

Валенок
13.03.2025, 09:08
Ужос. Этож надо так мозг засрать каким то дополнительным кодом.
ДОПОЛНИТЕЛЬНЫЙ до чего? До нуля!
Если к хреновине прибавить (дополнить) фиговину и получится 0, то фиговина и есть дополнительный код.
А задача:
"Хреновина + фиговина = 0
Чему равна фиговина?"
безусловно требует симпозиума ведущих умов планеты.

capzap
13.03.2025, 09:14
Ужос. Этож надо так мозг засрать каким то дополнительным кодом.
ДОПОЛНИТЕЛЬНЫЙ до чего? До нуля!
Если к хреновине прибавить (дополнить) фиговину и получится 0, то фиговина и есть дополнительный код.
А задача:
"Хреновина + фиговина = 0
Чему равна фиговина?"
безусловно требует симпозиума ведущих умов планеты.
Вы перепутали раздел, в ОЛ нет отрицательных чисел и они все 32х разрядные

Валенок
13.03.2025, 09:56
Вы перепутали раздел, в ОЛ нет отрицательных чисел и они все 32х разрядные
Вы перепутали планету))
Целых отрицательных чисел в замкнутом как циферблат* круге не существует не только в ОЛ, но и вообще в текущей цифровой технике этой планеты.
И ввиду этого всё высказанное мной выше остается действительным не только в ОЛ, но и на любой цифровой технике этой планеты на текущий момент.

*Что-то не наблюдаю часов с отрицательными числами. Но так же не наблюдаю ни у кого затруднений для выяснения, во сколько нужно выехать, если матч/кино/.. начинается в 00:30, а дорога занимает 4 часа. Выехать же нужно в -3.5 часа.



Хреновина + фиговина = 0
Чему равна фиговина?

capzap
13.03.2025, 10:02
слейву := 0 - 7; //отправить -7

если Вы про этот циферблат, то в ОЛ такая запись будет 32#UDINT#0 - 32#UDINT#7 и это далеко не то что нужно слейву с его 16разрядным словом

Валенок
13.03.2025, 10:41
.....

)) У меня для Вас плохие новости.
Если слейву нужно -7 (минус 7) в 16-ти разрядах, а в ОЛ внезапно 32-разряда и он не может отображать отрицательные числа, то отправить нужно.....

слейву := 0 - 7;
есно, при отправке указать 1 (один) регистр
Всё это неожиданно же))

capzap
13.03.2025, 10:51
)) У меня для Вас плохие новости.
Если слейву нужно -7 (минус 7) в 16-ти разрядах, а в ОЛ внезапно 32-разряда и он не может отображать отрицательные числа, то отправить нужно.....

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

Валенок
13.03.2025, 10:57
.... об очевидных вещах
Калькулятор - перед Вами.
Там есть режимы "программист" c hex, dec и даже QWORD/DWORD/WORD на ходу переключать можно.

Не позорьтесь

capzap
13.03.2025, 10:59
Калькулятор - перед Вами.
Там есть режимы "программист" c hex, dec

Не позорьтесь
В ОЛ покажите, не позортесь

Валенок
13.03.2025, 11:08
В ОЛ покажите

для ОЛ //x y - udint
x := 1 - 100;
y := x + 100;

Если у <> 1 то с меня пиво Вам на выходные

не позортесь

Dimensy
13.03.2025, 11:11
В ОЛ покажите

Хе, вроде, все правильно
82418

Валенок
13.03.2025, 11:16
....
Жаль что ОЛ не может отображать в hex. Было бы на порядок нагляднее.


Я, кстати, тоже люблю пиво))

capzap
13.03.2025, 11:27
Жаль что ОЛ не может отображать в hex. Было бы на порядок нагляднее.


Я, кстати, тоже люблю пиво))
пока что не зачто 82419
простой совет вычти из этого то и будет все ок, не пройдет. Дополнительных телодвижений нужно сделать слегка побольше

Валенок
13.03.2025, 11:37
пока что не зачто 82419 Дополнительных телодвижений нужно сделать слегка побольше
А причем тут флоат?



....сказали, что при отправке целочисленного числа
Но как передать отрицательное число?.... В ST целочисленное больше нуля, ....

32#UDINT#0 - 32#UDINT#7

..Целых отрицательных чисел в..

не позорьтесь

capzap
13.03.2025, 11:45
А причем тут флоат?




не позорьтесь
если в ОЛ нет отрицательных чисел то их и нет смысла передавать, такой вывод что ли? Они есть в вещественном типе, от него и отталкиваются когда задают такие вопросы

Валенок
13.03.2025, 11:49
..., когда задают такие вопросы


....сказали, что при отправке целочисленного числа
Но как передать отрицательное число?.... В ST целочисленное больше нуля, ....

И какая связь флоата и

...дополнительным кодом?

Не внимательны?



если в ОЛ нет отрицательных чисел то их и нет смысла передавать, такой вывод что ли?
Странный вывод, если вопрос - как.


Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.

capzap
13.03.2025, 11:52
И какая связь флоата и
Не внимательны?


ну кто тут не внимательный, не я один так думаю

Да, поддержу Сергей0308 - число для отправки перед помещением в переменную подвергнуть преобразованию.
Как понимаю, в ПР работа идёт с вещественным числом и лишь для передачи по Modbus производится сжимание до одного целочисленного регистра (16 разрядное целое со знаком).

Валенок
13.03.2025, 12:50
)) Ну если для отправки отрицательного целого числа FPavel нужен за каким-то флоат, то каким- боком это к
1. Теме
2. Мне


Да, поддержу Сергей0308 - число для отправки перед помещением в переменную подвергнуть преобразованию.
Как понимаю, в ПР работа идёт с вещественным числом и лишь для передачи по Modbus производится сжимание до одного целочисленного регистра (16 разрядное целое со знаком).
...

Я тоже поддержу Сергей0308, на которого ссылается FPavel на которого ссылается capzap.
но я НЕ поддержу FPavel на которого ссылается capzap, в той части где FPavel говорит про флоат, которого и рядом не было у Сергей0308, на которого FPavel ссылается, и не было в вопросе TC, которому отвечает Сергей0308

ну кто тут не внимательный))

А википедии, на которую ссылается FPavel, и на которого ссылается capzap, сказано достаточно четко

....наиболее распространённый способ представления отрицательных целых чисел в компьютерах...
как бы не про флоат.

capzap
13.03.2025, 13:02
)) Ну если для отправки отрицательного целого числа FPavel нужен за каким-то флоат, то каким- боком это к
1. Теме
2. Мне



Я тоже поддержу Сергей0308, на которого ссылается FPavel на которого ссылается capzap.
но я НЕ поддержу FPavel на которого ссылается capzap, в той части где FPavel говорит про флоат, которого не было у Сергей0308, на которого FPavel ссылается, и не было в вопросе TC, которому отвечает Сергей0308

ну кто тут не внимательный))
продолжите логические рассуждения, если у Вас только положительные целочисленные зачем их передавать по модбас переводя в отрицательные?

Валенок
13.03.2025, 13:16
продолжите логические рассуждения, если у Вас только положительные целочисленные зачем их передавать по модбас переводя в отрицательные?
Зачем передавать отрицательные?
Надо (см. пост 1)

Может Вы, как и ТС, хотели спросить как передавать отрицательные имея только положительные?

capzap
13.03.2025, 13:20
Зачем передавать отрицательные?
Надо (см. пост 1)

Может Вы, как и ТС, хотели спросить как передавать отрицательные имея только положительные?
я дал подсказку как решить эту задачу, перевод отрицательного вещественного, т.к. других в ОЛ нет, в дополнительный код на ST, не устраивая истерики про какой то ужос

Валенок
13.03.2025, 13:33
я дал подсказку как решить эту задачу,..
Возможно что я Вас удивлю, но я тоже. (пост 2)

0 - 7


перевод отрицательного вещественного,
о котором вроде и не спрашивали

kovalich
14.03.2025, 23:15
Вот макросы и функц. блоки (ФБ) на ST.
Функции FLOAT_TO_INT и INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php?t=22915&page=311&p=429821#post429821

Спасибо большое! Очень элегантное решение, сам бы не когда не додумался!


if In >= 0 then
FLOAT_TO_DINT := real_to_udint(In);
else
FLOAT_TO_DINT:= 0 - real_to_udint(-In); // Для DINT
end_if