1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Проблема с регистрами Signed и Unsigned 16-32 бит

Модератор: специалисты Weintek

Ответить
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

Добрый день всем!
Возник вопрос по поводу отображения регистров на панели (подобытная панель Weintek MT8071iP, ПЛК Mitsubishi FX1S-14MT).
Начал делать один тестовый проект и столкнулся с непонятками, в течении недели мучил панель и ПЛК, в итоге кое что понял, но не все проблемы удалось разрулить, решил спросить совета у опытных :)
Проблема заключалась в странном отображении регистов (как 16 так и 32 битных).

Для того чтобы во всем разобраться создал простейший проект с 16 битными:

Проект в ПЛК - Берем регистр D128 и прибавляем (М0) или отнимаем (М1) единичку от него.
Меркер М2 осуществляет сброс - то есть записывание нуля в регистр.

Проект в панели - берем выводим эти три кнопки с моментальным режиом нажатия - М0, М1, М2.
Добавляем два объёкта "цифровой". Обоим объектам прописываем регистр D128.
Слева ранее делал табличку на 12 пунктов, с подписями типов настроек параметров отображения этого объекта. Тут оставил только два интересующих - 16 бит беззнаковый (unsigned - от 0 до 65535) и 16 бит знаковый (signed -32768 до +32767).

Всё казалось бы просто, 16 битный регистр позволяет хранить 65535 значений, если беззнаковый формат, то от 0 до 65535,
а если знаковые числа, то от -32768 до +32767.
При нажатии на "+1" значание должно расти как на калькуляторе.. и аналогичо при нажатии "-1".
Всроде бы работает, но не всегда!
Первая проблема - сброс работает, но независимо от того какое там число, при нажатии М2 везде ставятся нули. В теории на unsigned так и должно быть, но на signed-то должно быть -32768, разве не так? Или я что-то упускаю в принципе работы панели..
Далее. Когда жму +1, то всё правильно прибавляется по единичке. Можно досчитать например до 45, и кнопкой "-1" откатиться на 42, или 15.
Далее. Вторая проблема - если дохожу до +32767, то при следующем нажатии на "+1" на обоих экранчиках становится НОЛЬ!!! Хотя в теории на unsigned должно быть +32768, потом +32769, +32770 и т.д., вплоть до +65535, а потом сброситься на ноль и начать считать сначала.
Далее. Третья проблема. Если на экране ноль, или пускай 10, и начать отнимать единичку, то всё будет работать, пойдёт 9, 8, 7, 6 и т.д. Но когда дойдёт до нуля, то следующие показания меня просто удивили! На unsigned стало моё необходимое 65535 (это норм и вроде как так и должно быть), а вот на нижнем экранчике, на signed стало -1 !! ну и соответственно стало далее отниматься по единице -
65564 / -2.
65563 / -3.
65562 / -4.
65561 / -5. и т.д.
То есть, когда мы доходим до 32770 в unsigned, то signed показывает -32766. А следующие отнимания единицы приводят к такому -
32770 / -32766.
32769 / -32767.
32768 / -32768.
0 / 0.
65535 / -1.
65564 / -2.
65563 / -3.
65562 / -4. ну и т.д., как я уже показывал выше,
то есть начинает опять считать с 65535 и его уменьшать, хотя должен продолжить уменьшать число 32768. Уже мозг сломал с этих сдвигов, гуглил кучу инфы, но про такую особенность преобразования я нигде не нашел((
Могу даже видео снять. Всё-таки снял чтобы более наглядно было видно.. https://youtu.be/x8lfDNdomoY
На скрине программа для ПЛК. В архиве проект для изибилдера-про и также для джиикс-девелопера-эф икс.
Ну и забыл добавить - если включить монитор в плк, то там значения регистра бегают от -32768 до +32767. А показания на панели не всегда им соответствуют.
16-бит.jpg
Проект02.rar
У вас нет необходимых прав для просмотра вложений в этом сообщении.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение VanMo »

Добрый день.
Претензии ка панели не понятны, прибавляет/убавляет единицу программа контроллера, панель только дает команду ПЛК.
Кстати, эту же функцию можно поручить панели, если добавить кнопку с режимом JOG+(-).
1. Не так. 0 - это 0 и со знаком и без знака. И панель тут ни при чем, погуглите про дополнительный код представления чисел.
2. Видимо ПЛК прибавляет 1 к числу со знаком и он это учитывает.
3. Именно число 65535 - это в дополнительном коде "-1".
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

VanMo, Приветствую! Спасибо за ответ)
1. Ок, посмотрю про этот код.
2. Вот у меня тоже такие мысли были, так как в таблице регистров есть ручной ввод значения и я там пробовал в различных форматах вводить, так вот больше 32767 он не даёт ввести, пишет ошибку что значение больше допустимого (что в 16 битном, целые числа, что в HEX, и даже в двоичном пробовал.), а минусовые вводятся, до -32768 включительно. В мониторе тоже они меняются от -32768 до +32767, но на панели то нет....
3. Интересно...
Я не говорю что есть претензии именно к панели, я хочу понять, разобраться, что не так в данной простой задаче - или мне нужно что-то в проекте HMI настроить правильно (может есть какие-то подводные камни, о которых не знаю) или что-то с программой ПЛК сделать.
То что панель только даёт команду для плк понимаю, но суть в том, что если мониторить регистр в ПЛК то там значения бегают от -32768 до +32767. То есть имеется диапазон 65535 чисел.
А панель в любом случае отображает либо от 0 до 32767, либо от 32768 до 65535, либо от -32768 до 0. То есть диапазон получается 32767 чисел.
Вопрос, как организовать от 0 до 65535 или от -32768 до 32767?

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение VanMo »

Панель все правильно отображает.
Сейчас у Вас работает диапазон от -32768 до 32767, на нижнем индикаторе это видно, правильно отображаются и положительные и отрицательные числа.
Если нужен диапазон от 0 до 65535, укажите и в ПЛК и в панели тип данных unsigned.
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

VanMo писал(а): 23 сен 2019, 15:05 Сейчас у Вас работает диапазон от -32768 до 32767, на нижнем индикаторе это видно
Почти так, да, но он коряво работает - когда доходит до максимального 32767, то переходит в 0 на панели, а не в -32768.. а при этом в ПЛК находится число -32768, а на панели 0. Если сбросить на ноль и отсчитать кнопкой "-1" до -32768, тогда и в ПЛК и на панели будет это число. Вот в этом вопрос. Если рассматривать только Signed например.
В плк пробовал ставить Unsigned, картина не меняется :ges_no:

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение VanMo »

Тут какая-то путаница, не может же панель одно и то же значение регистра отображать по-разному - либо как 0, либо как -32768.
Проверил, у меня все правильно, сразу после 0x7fff(32767) идет 0x8000(-32768).
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

VanMo писал(а): 23 сен 2019, 16:49 не может же панель одно и то же значение регистра отображать по-разному - либо как 0, либо как -32768
Ага, в этом и дело! У меня может... То есть если вручную вводишь значение положительное или отрицательное, всё отображает, и в ПЛК соответствующие значения, а когда счётчик "+1" работает, то после 32767 идет 0 на панели, а в ПЛК -32768... Вы как проверяли симуляцией или имеется под рукой панель? Заливали тот проект который я скидывал или свой? Может я что-то где-то упустил в настройках изибилдера...

Отправлено спустя 6 минут 47 секунд:
Настройки объекта у меня такие -
изи1.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение VanMo »

Я проверял в симуляции. Добавьте на экран еще один объект привязанный к тому же регистру в формате HEX.
Снимите видео. Если при одном и том же значении HEX может быть разное значение DEC, есть смысл обратиться к разработчикам.
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

Даже не знаю в каком форуме задать вопрос... про ПЛК или тут.. Одну часть загадки нашёл.. так как посмотреть, что записано в ПЛК при подключенной панели невозможно (разъём один, или комп или панель), оказывается ошибся по поводу значений, всё таки в ПЛК тоже ноль, а дело в том что, при прибавлении 1-цы к числу 32767 значение регистра становится не -32768, а 0. И также, при вычитании 1-цы после -32768 становится ноль. То есть он два раза как бы переходит через ноль... Хотя ожидаемо было бы возвращение в последнюю точку отсчёта как тут -
VanMo писал(а): 23 сен 2019, 16:49 у меня все правильно, сразу после 0x7fff(32767) идет 0x8000(-32768)
Решил добавить переключение контактами на Х0 и Х1, добавил инструкцию сравнения и посмотреть состояния в мониторе на компе. Программа на скрине, как видно имеется условие - если значение регистра D128 больше или равно константе 15, то включается выход Y1.
Запускаю монитор... вроде опять всё работает, на первом скрине значение 32767, оно больше 15, и выход Y1 включен.
плк1.jpg
На втором значение 12. Оно меньше 15, и выход отключен, все верно.
плк2.jpg

А вот теперь странное - сбрасывается в ноль, и если отнять 1-цу, то получается справа -1, а слева 65535, в одном регистре!.. и при этом инструкция сравнения не работает, число у нас "-1", оно меньше константы 15, а сигнал на выход Y1 проходит, как быть в такой ситуации?
плк3.jpg
Получается ПЛК выдаёт значение в двух типах одновременно или как? Панель-то как настроить для этого безобразия, чтобы нормально был реализован счёт с диапазоном около 65000 (уже не важно со знаком или без, главное чтобы не 32 тыщи).
У вас нет необходимых прав для просмотра вложений в этом сообщении.

pkl58
частый гость
частый гость
Сообщения: 428
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 5 раз
Поблагодарили: 50 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение pkl58 »

Видимо потому что MOV это 16 битная инструкция а D>= 32 битная инструкция.
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

pkl58 писал(а): 24 сен 2019, 08:01D>= 32 битная
Блин! А ведь в этом и может быть дело! Не подскажете как записать 16 битную для сравнения чисел? Сейчас читаю мануал по программированию на 800 стр.. и не могу найти этот момент никак(

pkl58
частый гость
частый гость
Сообщения: 428
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 5 раз
Поблагодарили: 50 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение pkl58 »

>=
Аватара пользователя

Автор темы
Fotonus
здесь недавно
здесь недавно
Сообщения: 35
Зарегистрирован: 02 авг 2019, 17:53
Имя: Михаил
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Fotonus »

pkl58, Заработало! Спасибо) Я искал всякие буквенные комбинации в поиске, оказывается вообще нужно было букву удалить всего-то.. Теперь буду знать. Значения одинаковые стали. Буду разбираться теперь как сдвигуть диапазон в ПЛК с Signed до Unsigned, видимо там не поменялось и работает по умолчанию от -32768 до +32767.

pkl58
частый гость
частый гость
Сообщения: 428
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 5 раз
Поблагодарили: 50 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение pkl58 »

В ПЛК только 0 и 1. Все остальное в панели. Используйте 32 разрядные команды и будет вам счастье.

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1455
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 60 раз
Поблагодарили: 181 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Madwolf »

Все дело в отображении. По факту внутри слова разницы нет, что unsigned, что signed. Это как в ПЛК задумано вам отобразить, так HMI вам и показывает. Просто старший 16-й бит знаковый. Отсюда и вместо ожидаемого +32768 появляется -32768, на самом деле это одно и то же число в двоичном представлении для 16-ти бит.
Аватара пользователя

Looker
эксперт
эксперт
Сообщения: 1105
Зарегистрирован: 09 фев 2011, 11:32
Имя: Дитрих Евгений Линусович
город/регион: Донецк
Благодарил (а): 255 раз
Поблагодарили: 184 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Looker »

Madwolf писал(а): 29 сен 2019, 19:52Отсюда и вместо ожидаемого +32768 появляется -32768, на самом деле это одно и то же число в двоичном представлении для 16-ти бит.
Ой-ли! 32767+1 => -1, дополнительном коде. Обратный код (±32767) - уже забытая древность и в нем были фокусы: +0 и -0.
Проблемы в отображении на панели.
_______________________________________________
Узкая специализация в широком смысле этого слова ведет к широкой идиотизации в узком смысле этого слова . (С) Бернард Шоу
Аватара пользователя

Looker
эксперт
эксперт
Сообщения: 1105
Зарегистрирован: 09 фев 2011, 11:32
Имя: Дитрих Евгений Линусович
город/регион: Донецк
Благодарил (а): 255 раз
Поблагодарили: 184 раза

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Looker »

Looker писал(а): 29 сен 2019, 20:42Ой-ли! 32767+1 => -1, дополнительном коде.
Каюсь, все таки 32767+1 => -32768. Подвела "соображалка" вечером.
_______________________________________________
Узкая специализация в широком смысле этого слова ведет к широкой идиотизации в узком смысле этого слова . (С) Бернард Шоу

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1455
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 60 раз
Поблагодарили: 181 раз

Проблема с регистрами Signed и Unsigned 16-32 бит

Сообщение Madwolf »

Я на встроенном калькуляторе Windows проверяю ))). В панели как-раз думаю проблем нет, там можно выбрать знаковое или беззнаковое, а вот в контроллере часто нельзя выбрать и он работает исключительно со знаковыми числами.
Ответить

Вернуться в «WEINTEK (операторские панели)»