- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Проблема с регистрами Signed и Unsigned 16-32 бит
Модераторы: Глоб.модераторы, специалисты Weintek
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Добрый день всем!
Возник вопрос по поводу отображения регистров на панели (подобытная панель 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. А показания на панели не всегда им соответствуют.
Возник вопрос по поводу отображения регистров на панели (подобытная панель 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. А показания на панели не всегда им соответствуют.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- специалист по WEINTEK
- Сообщения: 120
- Зарегистрирован: 05 фев 2014, 12:22
- Имя: Иван Николаевич
- Поблагодарили: 21 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Добрый день.
Претензии ка панели не понятны, прибавляет/убавляет единицу программа контроллера, панель только дает команду ПЛК.
Кстати, эту же функцию можно поручить панели, если добавить кнопку с режимом JOG+(-).
1. Не так. 0 - это 0 и со знаком и без знака. И панель тут ни при чем, погуглите про дополнительный код представления чисел.
2. Видимо ПЛК прибавляет 1 к числу со знаком и он это учитывает.
3. Именно число 65535 - это в дополнительном коде "-1".
Претензии ка панели не понятны, прибавляет/убавляет единицу программа контроллера, панель только дает команду ПЛК.
Кстати, эту же функцию можно поручить панели, если добавить кнопку с режимом JOG+(-).
1. Не так. 0 - это 0 и со знаком и без знака. И панель тут ни при чем, погуглите про дополнительный код представления чисел.
2. Видимо ПЛК прибавляет 1 к числу со знаком и он это учитывает.
3. Именно число 65535 - это в дополнительном коде "-1".
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
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?
1. Ок, посмотрю про этот код.
2. Вот у меня тоже такие мысли были, так как в таблице регистров есть ручной ввод значения и я там пробовал в различных форматах вводить, так вот больше 32767 он не даёт ввести, пишет ошибку что значение больше допустимого (что в 16 битном, целые числа, что в HEX, и даже в двоичном пробовал.), а минусовые вводятся, до -32768 включительно. В мониторе тоже они меняются от -32768 до +32767, но на панели то нет....
3. Интересно...
Я не говорю что есть претензии именно к панели, я хочу понять, разобраться, что не так в данной простой задаче - или мне нужно что-то в проекте HMI настроить правильно (может есть какие-то подводные камни, о которых не знаю) или что-то с программой ПЛК сделать.
То что панель только даёт команду для плк понимаю, но суть в том, что если мониторить регистр в ПЛК то там значения бегают от -32768 до +32767. То есть имеется диапазон 65535 чисел.
А панель в любом случае отображает либо от 0 до 32767, либо от 32768 до 65535, либо от -32768 до 0. То есть диапазон получается 32767 чисел.
Вопрос, как организовать от 0 до 65535 или от -32768 до 32767?
-
- специалист по WEINTEK
- Сообщения: 120
- Зарегистрирован: 05 фев 2014, 12:22
- Имя: Иван Николаевич
- Поблагодарили: 21 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Панель все правильно отображает.
Сейчас у Вас работает диапазон от -32768 до 32767, на нижнем индикаторе это видно, правильно отображаются и положительные и отрицательные числа.
Если нужен диапазон от 0 до 65535, укажите и в ПЛК и в панели тип данных unsigned.
Сейчас у Вас работает диапазон от -32768 до 32767, на нижнем индикаторе это видно, правильно отображаются и положительные и отрицательные числа.
Если нужен диапазон от 0 до 65535, укажите и в ПЛК и в панели тип данных unsigned.
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Почти так, да, но он коряво работает - когда доходит до максимального 32767, то переходит в 0 на панели, а не в -32768.. а при этом в ПЛК находится число -32768, а на панели 0. Если сбросить на ноль и отсчитать кнопкой "-1" до -32768, тогда и в ПЛК и на панели будет это число. Вот в этом вопрос. Если рассматривать только Signed например.
В плк пробовал ставить Unsigned, картина не меняется
-
- специалист по WEINTEK
- Сообщения: 120
- Зарегистрирован: 05 фев 2014, 12:22
- Имя: Иван Николаевич
- Поблагодарили: 21 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Тут какая-то путаница, не может же панель одно и то же значение регистра отображать по-разному - либо как 0, либо как -32768.
Проверил, у меня все правильно, сразу после 0x7fff(32767) идет 0x8000(-32768).
Проверил, у меня все правильно, сразу после 0x7fff(32767) идет 0x8000(-32768).
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Ага, в этом и дело! У меня может... То есть если вручную вводишь значение положительное или отрицательное, всё отображает, и в ПЛК соответствующие значения, а когда счётчик "+1" работает, то после 32767 идет 0 на панели, а в ПЛК -32768... Вы как проверяли симуляцией или имеется под рукой панель? Заливали тот проект который я скидывал или свой? Может я что-то где-то упустил в настройках изибилдера...
Отправлено спустя 6 минут 47 секунд:
Настройки объекта у меня такие -
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- специалист по WEINTEK
- Сообщения: 120
- Зарегистрирован: 05 фев 2014, 12:22
- Имя: Иван Николаевич
- Поблагодарили: 21 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Я проверял в симуляции. Добавьте на экран еще один объект привязанный к тому же регистру в формате HEX.
Снимите видео. Если при одном и том же значении HEX может быть разное значение DEC, есть смысл обратиться к разработчикам.
Снимите видео. Если при одном и том же значении HEX может быть разное значение DEC, есть смысл обратиться к разработчикам.
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Даже не знаю в каком форуме задать вопрос... про ПЛК или тут.. Одну часть загадки нашёл.. так как посмотреть, что записано в ПЛК при подключенной панели невозможно (разъём один, или комп или панель), оказывается ошибся по поводу значений, всё таки в ПЛК тоже ноль, а дело в том что, при прибавлении 1-цы к числу 32767 значение регистра становится не -32768, а 0. И также, при вычитании 1-цы после -32768 становится ноль. То есть он два раза как бы переходит через ноль... Хотя ожидаемо было бы возвращение в последнюю точку отсчёта как тут -
Запускаю монитор... вроде опять всё работает, на первом скрине значение 32767, оно больше 15, и выход Y1 включен. На втором значение 12. Оно меньше 15, и выход отключен, все верно.
А вот теперь странное - сбрасывается в ноль, и если отнять 1-цу, то получается справа -1, а слева 65535, в одном регистре!.. и при этом инструкция сравнения не работает, число у нас "-1", оно меньше константы 15, а сигнал на выход Y1 проходит, как быть в такой ситуации? Получается ПЛК выдаёт значение в двух типах одновременно или как? Панель-то как настроить для этого безобразия, чтобы нормально был реализован счёт с диапазоном около 65000 (уже не важно со знаком или без, главное чтобы не 32 тыщи).
Решил добавить переключение контактами на Х0 и Х1, добавил инструкцию сравнения и посмотреть состояния в мониторе на компе. Программа на скрине, как видно имеется условие - если значение регистра D128 больше или равно константе 15, то включается выход Y1.
Запускаю монитор... вроде опять всё работает, на первом скрине значение 32767, оно больше 15, и выход Y1 включен. На втором значение 12. Оно меньше 15, и выход отключен, все верно.
А вот теперь странное - сбрасывается в ноль, и если отнять 1-цу, то получается справа -1, а слева 65535, в одном регистре!.. и при этом инструкция сравнения не работает, число у нас "-1", оно меньше константы 15, а сигнал на выход Y1 проходит, как быть в такой ситуации? Получается ПЛК выдаёт значение в двух типах одновременно или как? Панель-то как настроить для этого безобразия, чтобы нормально был реализован счёт с диапазоном около 65000 (уже не важно со знаком или без, главное чтобы не 32 тыщи).
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- завсегдатай
- Сообщения: 544
- Зарегистрирован: 19 мар 2012, 20:04
- Имя: Павел
- Страна: Россия
- Благодарил (а): 6 раз
- Поблагодарили: 59 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Видимо потому что MOV это 16 битная инструкция а D>= 32 битная инструкция.
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Блин! А ведь в этом и может быть дело! Не подскажете как записать 16 битную для сравнения чисел? Сейчас читаю мануал по программированию на 800 стр.. и не могу найти этот момент никак(
-
- здесь недавно
- Сообщения: 35
- Зарегистрирован: 02 авг 2019, 17:53
- Имя: Михаил
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
pkl58, Заработало! Спасибо) Я искал всякие буквенные комбинации в поиске, оказывается вообще нужно было букву удалить всего-то.. Теперь буду знать. Значения одинаковые стали. Буду разбираться теперь как сдвигуть диапазон в ПЛК с Signed до Unsigned, видимо там не поменялось и работает по умолчанию от -32768 до +32767.
-
- завсегдатай
- Сообщения: 544
- Зарегистрирован: 19 мар 2012, 20:04
- Имя: Павел
- Страна: Россия
- Благодарил (а): 6 раз
- Поблагодарили: 59 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
В ПЛК только 0 и 1. Все остальное в панели. Используйте 32 разрядные команды и будет вам счастье.
-
- знаток Eplan
- Сообщения: 1457
- Зарегистрирован: 17 окт 2012, 11:24
- Имя: Виталий
- Страна: Беларусь
- город/регион: Минск
- Благодарил (а): 61 раз
- Поблагодарили: 182 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Все дело в отображении. По факту внутри слова разницы нет, что unsigned, что signed. Это как в ПЛК задумано вам отобразить, так HMI вам и показывает. Просто старший 16-й бит знаковый. Отсюда и вместо ожидаемого +32768 появляется -32768, на самом деле это одно и то же число в двоичном представлении для 16-ти бит.
-
- почётный участник форума
- Сообщения: 1181
- Зарегистрирован: 09 фев 2011, 11:32
- Имя: Дитрих Евгений Линусович
- город/регион: Донецк
- Благодарил (а): 351 раз
- Поблагодарили: 241 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Ой-ли! 32767+1 => -1, дополнительном коде. Обратный код (±32767) - уже забытая древность и в нем были фокусы: +0 и -0.
Проблемы в отображении на панели.
_______________________________________________
Узкая специализация в широком смысле этого слова ведет к широкой идиотизации в узком смысле этого слова . (С) Бернард Шоу
Узкая специализация в широком смысле этого слова ведет к широкой идиотизации в узком смысле этого слова . (С) Бернард Шоу
-
- почётный участник форума
- Сообщения: 1181
- Зарегистрирован: 09 фев 2011, 11:32
- Имя: Дитрих Евгений Линусович
- город/регион: Донецк
- Благодарил (а): 351 раз
- Поблагодарили: 241 раз
Проблема с регистрами Signed и Unsigned 16-32 бит
Каюсь, все таки 32767+1 => -32768. Подвела "соображалка" вечером.
_______________________________________________
Узкая специализация в широком смысле этого слова ведет к широкой идиотизации в узком смысле этого слова . (С) Бернард Шоу
Узкая специализация в широком смысле этого слова ведет к широкой идиотизации в узком смысле этого слова . (С) Бернард Шоу
-
- знаток Eplan
- Сообщения: 1457
- Зарегистрирован: 17 окт 2012, 11:24
- Имя: Виталий
- Страна: Беларусь
- город/регион: Минск
- Благодарил (а): 61 раз
- Поблагодарили: 182 раза
Проблема с регистрами Signed и Unsigned 16-32 бит
Я на встроенном калькуляторе Windows проверяю ))). В панели как-раз думаю проблем нет, там можно выбрать знаковое или беззнаковое, а вот в контроллере часто нельзя выбрать и он работает исключительно со знаковыми числами.