А как их можно не разделять?
Например, мы получили код числа "65535", в INT16 это будет число "-1", а в INT32 это будет число "65535".
В смысле, без знания диапазона, правильное преобразование не возможно!
Вид для печати
Ну, это "плата" за универсальность, в смысле никто не запрещает создать отдельные макросы для каждого диапазона!
В моём варианте это минимальная плата, всего один SEL:
Вложение 74867
Что сводит к минимуму необходимость в отдельных макросах!
Мне кажется один из самых универсальных вариантов для расчёта отрицательной части диапазона Пётр из Минска предлагал, в смысле, инверсия(кода числа) + 1, получается значение отрицательного числа по модулю, я свой вариант предложил, мне он проще показался!
в моем варианте это приведение внешних i16 в i32.Цитата:
В моём варианте это минимальная плата, всего один SEL:
и в моем варианте не нужно создавать отдельные макросы для каждого диапазона. Он 1.Цитата:
в смысле никто не запрещает создать отдельные макросы для каждого диапазона!
0 - uЦитата:
инверсия(кода числа) + 1
Если есть функции для 32 битных, типа DINT, то как сказал Валенок, для 16 битных они не нужны. Скрин Вложение 74868
Вы передаёте 1 регистр если число меньше 65535 и через 2 регистра если больше и 32 битными функциями работаете с любыми переменными.
На скрине передан 1 регистр, а функции 32 битные. На ST функции универсальные, выложил выше. Переключатель делать не стал, хотя это возможно.
Я то это в принципе рассматриваю, без привязки к конкретному случаю, в смысле, к сетевым переменным!
ОЛ в принципе не умеет работать с 32 -х битными целочисленными сетевыми переменными в режиме слейв(подчинённого устройства), в смысле, в любом случае, их придётся разделять на два соседних регистра. Может со временем это поправят, но это не точно!
Вроде понял, что Вы хотите! В смысле всегда использовать один макрос DINT(INT32)_TO_FLOAT. Если надо преобразовать INT(INT16), то предварительно преобразовываете его в DINT(INT32).
Короче, мне кажется это не очень логичным, в смысле, чаще всё-таки INT(INT16) встречается, а DINT(INT32) намного реже. Вам надо всё равно знать, что это INT(INT16), иначе правильное преобразование невозможно, уже писал об этом, даже пример приводил! И, мне кажется в FBD проще значение INT(INT16) сразу преобразовать во FLOAT, чем ваше промежуточное преобразование в DINT(INT32). Если Вы говорите в ST это проще, поверю Вам на слово(я в ST не шарю), но это получается частный случай, не более!