Просмотр полной версии : дополнительный код в ST
kovalich
12.03.2025, 23:41
Добрый день!
Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.
В техподдержке сказали, что при отправке целочисленного числа оно из десятичного кода конвертируется в 16 ричный и отправляется. Тут у меня проблем нет, со слейвом работаем штатно.
Но как передать отрицательное число? В ST целочисленное больше нуля, соответственно я не могу его сразу в регистр отправить.
Прочитал что работа с отрицательными целыми числами представляется в двоичном формате и потом конвертируется в 10-ричный (дополнительный код).
Вопрос!
Как работать c двоичном коде в ST?
Может у кого уже есть наработки с дополнительным кодом?
Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.
слейву := 0 - 7; //отправить -7
Сергей0308
13.03.2025, 06:05
Мне кажется там всё не просто, а очень просто, в смысле что код числа представляет отрицательное число - указывает старший бит кода числа, алгоритм вычисления модуля тоже очень простой, мне понравился как это делает Пётр из Минска, в смысле, он инвертирует все биты кода числа + 1, всё!
Вы заметили, что я ничего не пишу про тип данных, в смысле, это INT16 или INT32, короче, это и не требуется, механизм(способ) универсальный!
Да, поддержу Сергей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
возможно на ST это не так сложно выглядит = ( (65536 - abs_negativ_num) % (65536) )
Ужос. Этож надо так мозг засрать каким то дополнительным кодом.
ДОПОЛНИТЕЛЬНЫЙ до чего? До нуля!
Если к хреновине прибавить (дополнить) фиговину и получится 0, то фиговина и есть дополнительный код.
А задача:
"Хреновина + фиговина = 0
Чему равна фиговина?"
безусловно требует симпозиума ведущих умов планеты.
Ужос. Этож надо так мозг засрать каким то дополнительным кодом.
ДОПОЛНИТЕЛЬНЫЙ до чего? До нуля!
Если к хреновине прибавить (дополнить) фиговину и получится 0, то фиговина и есть дополнительный код.
А задача:
"Хреновина + фиговина = 0
Чему равна фиговина?"
безусловно требует симпозиума ведущих умов планеты.
Вы перепутали раздел, в ОЛ нет отрицательных чисел и они все 32х разрядные
Вы перепутали раздел, в ОЛ нет отрицательных чисел и они все 32х разрядные
Вы перепутали планету))
Целых отрицательных чисел в замкнутом как циферблат* круге не существует не только в ОЛ, но и вообще в текущей цифровой технике этой планеты.
И ввиду этого всё высказанное мной выше остается действительным не только в ОЛ, но и на любой цифровой технике этой планеты на текущий момент.
*Что-то не наблюдаю часов с отрицательными числами. Но так же не наблюдаю ни у кого затруднений для выяснения, во сколько нужно выехать, если матч/кино/.. начинается в 00:30, а дорога занимает 4 часа. Выехать же нужно в -3.5 часа.
Хреновина + фиговина = 0
Чему равна фиговина?
слейву := 0 - 7; //отправить -7
если Вы про этот циферблат, то в ОЛ такая запись будет 32#UDINT#0 - 32#UDINT#7 и это далеко не то что нужно слейву с его 16разрядным словом
.....
)) У меня для Вас плохие новости.
Если слейву нужно -7 (минус 7) в 16-ти разрядах, а в ОЛ внезапно 32-разряда и он не может отображать отрицательные числа, то отправить нужно.....
слейву := 0 - 7;
есно, при отправке указать 1 (один) регистр
Всё это неожиданно же))
)) У меня для Вас плохие новости.
Если слейву нужно -7 (минус 7) в 16-ти разрядах, а в ОЛ внезапно 32-разряда и он не может отображать отрицательные числа, то отправить нужно.....
есно, при отправке указать 1 (один) регистр
Всё это неожиданно же))
наглядно сможете показать как ли реально думаете что тут советы дают не зная об очевидных вещах
.... об очевидных вещах
Калькулятор - перед Вами.
Там есть режимы "программист" c hex, dec и даже QWORD/DWORD/WORD на ходу переключать можно.
Не позорьтесь
Калькулятор - перед Вами.
Там есть режимы "программист" c hex, dec
Не позорьтесь
В ОЛ покажите, не позортесь
В ОЛ покажите
для ОЛ //x y - udint
x := 1 - 100;
y := x + 100;
Если у <> 1 то с меня пиво Вам на выходные
не позортесь
В ОЛ покажите
Хе, вроде, все правильно
82418
....
Жаль что ОЛ не может отображать в hex. Было бы на порядок нагляднее.
Я, кстати, тоже люблю пиво))
Жаль что ОЛ не может отображать в hex. Было бы на порядок нагляднее.
Я, кстати, тоже люблю пиво))
пока что не зачто 82419
простой совет вычти из этого то и будет все ок, не пройдет. Дополнительных телодвижений нужно сделать слегка побольше
пока что не зачто 82419 Дополнительных телодвижений нужно сделать слегка побольше
А причем тут флоат?
....сказали, что при отправке целочисленного числа
Но как передать отрицательное число?.... В ST целочисленное больше нуля, ....
32#UDINT#0 - 32#UDINT#7
..Целых отрицательных чисел в..
не позорьтесь
А причем тут флоат?
не позорьтесь
если в ОЛ нет отрицательных чисел то их и нет смысла передавать, такой вывод что ли? Они есть в вещественном типе, от него и отталкиваются когда задают такие вопросы
..., когда задают такие вопросы
....сказали, что при отправке целочисленного числа
Но как передать отрицательное число?.... В ST целочисленное больше нуля, ....
И какая связь флоата и
...дополнительным кодом?
Не внимательны?
если в ОЛ нет отрицательных чисел то их и нет смысла передавать, такой вывод что ли?
Странный вывод, если вопрос - как.
Помогите пож передать по MODBUS отрицательное число от мастера (ПР103) слейву.
И какая связь флоата и
Не внимательны?
ну кто тут не внимательный, не я один так думаю
Да, поддержу Сергей0308 - число для отправки перед помещением в переменную подвергнуть преобразованию.
Как понимаю, в ПР работа идёт с вещественным числом и лишь для передачи по Modbus производится сжимание до одного целочисленного регистра (16 разрядное целое со знаком).
)) Ну если для отправки отрицательного целого числа FPavel нужен за каким-то флоат, то каким- боком это к
1. Теме
2. Мне
Да, поддержу Сергей0308 - число для отправки перед помещением в переменную подвергнуть преобразованию.
Как понимаю, в ПР работа идёт с вещественным числом и лишь для передачи по Modbus производится сжимание до одного целочисленного регистра (16 разрядное целое со знаком).
...
Я тоже поддержу Сергей0308, на которого ссылается FPavel на которого ссылается capzap.
но я НЕ поддержу FPavel на которого ссылается capzap, в той части где FPavel говорит про флоат, которого и рядом не было у Сергей0308, на которого FPavel ссылается, и не было в вопросе TC, которому отвечает Сергей0308
ну кто тут не внимательный))
А википедии, на которую ссылается FPavel, и на которого ссылается capzap, сказано достаточно четко
....наиболее распространённый способ представления отрицательных целых чисел в компьютерах...
как бы не про флоат.
)) Ну если для отправки отрицательного целого числа FPavel нужен за каким-то флоат, то каким- боком это к
1. Теме
2. Мне
Я тоже поддержу Сергей0308, на которого ссылается FPavel на которого ссылается capzap.
но я НЕ поддержу FPavel на которого ссылается capzap, в той части где FPavel говорит про флоат, которого не было у Сергей0308, на которого FPavel ссылается, и не было в вопросе TC, которому отвечает Сергей0308
ну кто тут не внимательный))
продолжите логические рассуждения, если у Вас только положительные целочисленные зачем их передавать по модбас переводя в отрицательные?
продолжите логические рассуждения, если у Вас только положительные целочисленные зачем их передавать по модбас переводя в отрицательные?
Зачем передавать отрицательные?
Надо (см. пост 1)
Может Вы, как и ТС, хотели спросить как передавать отрицательные имея только положительные?
Зачем передавать отрицательные?
Надо (см. пост 1)
Может Вы, как и ТС, хотели спросить как передавать отрицательные имея только положительные?
я дал подсказку как решить эту задачу, перевод отрицательного вещественного, т.к. других в ОЛ нет, в дополнительный код на ST, не устраивая истерики про какой то ужос
я дал подсказку как решить эту задачу,..
Возможно что я Вас удивлю, но я тоже. (пост 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
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot