PDA

Просмотр полной версии : Панель оператора СП310Р и весовой терминал GENERAL MEASURE M02



Bone
07.09.2021, 11:26
Здравствуйте, коллеги!
Есть необходимость подключить к ПР102 весовой терминал General Measure M02 по Modbus RTU через RS485 для дальнейшей обработки сигналов с тензодатчиков в программе. Первая попытка подключения успеха не принесла: в регистрах текущего веса, которые я пытался считать ПР-кой с терминала и наблюдать в онлайн-отладке, были нули.
Затем, для пробы, подключил терминал к панели оператора, ибо там проще отследить наличие связи по интерфейсу через системное окно 60013.
Увидел, что индикатор PLC мигает.
Начал пытаться установить связь. Целый день вчера пробовал, но так и не получилось. Все провода проверены по 10 раз (в том числе, менялись местами А и В), все настройки и в терминале, и в панели испробованы. Причём, панель показывает, что связи нет, а терминал (есть там средство диагностики) - что связь есть.
Смотрел осциллографом сигналы на интерфейсе. При подключенном к панели ПР102, когда всё работало нормально и связь была, и при подключенном к панели терминале, когда не работало. Разницы не заметил, но при одном нюансе: сигналы были одинаковые, только когда я заходил в меню настройки на терминале. Когда выходил в режим взвешивания, сигнал кардинально менялся. Тогда просто проскакивала пачка импульсов примерно раз в секунду, и индикатор PLC на панели в окне диагностики мигал более коротко и через более длительные промежутки времени, чем обычно, когда просто нет связи (например, отключен разъём PLC).
В принципе, для проекта, меня бы устроил вариант подключения терминала к ПР через аналоговые выходы. Там они тоже имеются. И напряжение, и ток. Но и там всё по нулям. Хотя в меню соответствующие пункты включены, конечно.
Уважаемые коллеги, не имел ли кто-нибудь дело с таким терминалом, или не сталкивался ли кто-нибудь с подобной проблемой? Почему нет связи по интерфейсу, если провода в норме, настройки протокола (master-slave, скорость, проверка на чётность, адрес и т.д.) совпадают?
P.S. Всё это собрано на столе, проверяется в тепличных условиях, длина проводов ~40-50 см, так что помехи исключаются. Да и СП+ПР в связке работают нормально.
P.P.S. Мануал на русском, на всякий случай, прилагаю. Перевод с оригинала, местами конечно, так себе, но в целом - нормально...

petera
07.09.2021, 11:53
Здравствуйте, коллеги!
Есть необходимость подключить к ПР102 весовой терминал General Measure M02 по Modbus RTU через RS485 для дальнейшей обработки сигналов с тензодатчиков в программе. Первая попытка подключения успеха не принесла: в регистрах текущего веса, которые я пытался считать ПР-кой с терминала и наблюдать в онлайн-отладке, были нули.
Затем, для пробы, подключил терминал к панели оператора, ибо там проще отследить наличие связи по интерфейсу через системное окно 60013.
Увидел, что индикатор PLC мигает.
Начал пытаться установить связь. Целый день вчера пробовал, но так и не получилось. Все провода проверены по 10 раз, все настройки и в терминале, и в панели испробованы. Причём, панель показывает, что связи нет, а терминал (есть там средство диагностики) - что связь есть.
Смотрел осциллографом сигналы на интерфейсе. При подключенном к панели ПР102, когда всё работало нормально и связь была, и при подключенном к панели терминале, когда не работало. Разницы не заметил, но при одном нюансе: сигналы были одинаковые, только когда я заходил в меню настройки на терминале. Когда выходил в режим взвешивания, сигнал кардинально менялся. Тогда просто проскакивала пачка импульсов примерно раз в секунду, и индикатор PLC на панели в окне диагностики мигал более коротко и через более длительные промежутки времени, чем обычно, когда просто нет связи (например, отключен разъём PLC).
В принципе, для проекта, меня бы устроил вариант подключения терминала к ПР через аналоговые выходы. Там они тоже имеются. И напряжение, и ток. Но и там всё по нулям. Хотя в меню соответствующие пункты включены, конечно.
Уважаемые коллеги, не имел ли кто-нибудь дело с таким терминалом, или не сталкивался ли кто-нибудь с подобной проблемой? Почему нет связи по интерфейсу, если провода в норме, настройки протокола (скорость, проверка на чётность, адрес и т.д.) совпадают?
P.S. Всё это собрано на столе, проверяется в тепличных условиях, длина проводов ~40-50 см, так что помехи исключаются. Да и СП+ПР в связке работают нормально.
P.P.S. Мануал на русском, на всякий случай, прилагаю. Перевод с оригинала, местами конечно, так себе, но в целом - нормально...

Небось так и вбиваешь адреса регистров - 40001, как в инструкции. А надо 0, для 40002 - 1 и т.д.
И где обещанный мануал?
И приложить проект со своими настройкам регистров и портов ПР/СП

Bone
07.09.2021, 12:14
Небось так и вбиваешь адреса регистров - 40001, как в инструкции.

Да, так и делал, когда пытался считать, пока не понял, что связи по интерфейсу нет.


А надо 0, для 40002 - 1 и т.д.

Неожиданно... Это мой первый проект такого уровня (с использованием сети), поэтому опыта пока ещё нет практически.


И где обещанный мануал?

Вложил. В первый раз почему-то не отправился...


И приложить проект со своими настройкам регистров и портов ПР/СП

Разве наличие/отсутствие связи по интерфейсу зависит от настроек регистров? Когда я подключал ПР к СП, связь была сразу же, при одинаковых настройках портов, конечно. Смотрел через системное окно 60013.

Bone
07.09.2021, 13:08
Небось так и вбиваешь адреса регистров - 40001, как в инструкции. А надо 0, для 40002 - 1 и т.д.

Неожиданно... Это мой первый проект такого уровня (с использованием сети), поэтому опыта пока ещё нет практически.
petera, все (ну, или, наверно, почти все) инструкции пишут, что нужно считывать данные с регистров с теми адресами, что указаны в инструкции (опять же)) к конкретному устройству. Соответственно, я и считывал те, что указаны в колонке "Адрес контроллера PLC". А нужно, как я понял, из соседней колонки, "Адрес дисплея"? Именно там они начинаются с 0? Или по другому принципу?


И приложить проект со своими настройкам регистров и портов ПР/СП

Чтобы убедиться ещё раз, создал, для пробы, просто пустой проект для ПР и проект с парой кнопок с вызовом окон 60013 и 60014, плюс пара индикаторов с индикацией регистров PSB50 и PSB51 для пущей верности, настроил порты, залил, и всё. Связь есть...

petera
07.09.2021, 13:46
petera, все (ну, или, наверно, почти все) инструкции пишут, что нужно считывать данные с регистров с теми адресами, что указаны в инструкции (опять же)) к конкретному устройству. Соответственно, я и считывал те, что указаны в колонке "Адрес контроллера PLC". А нужно, как я понял, из соседней колонки, "Адрес дисплея"? Именно там они начинаются с 0? Или по другому принципу?



Чтобы убедиться ещё раз, создал, для пробы, просто пустой проект для ПР и проект с парой кнопок с вызовом окон 60013 и 60014, плюс пара индикаторов с индикацией регистров PSB50 и PSB51 для пущей верности, настроил порты, залил, и всё. Связь есть...
Для общего развития...
Значения, что указаны в колонке "Адрес контроллера PLC" означают ссылку на адресное пространство в карте распределения регистров, согласно классического ModBus устройства так, как придумал Модикон. Все адресное пространство ПЛК от 1 до 49999 согласно стандарта, включая физические входы и выходы ПЛК, распределяется на области по 9999 адресов.
MODBUS специфицирует 4 области данных:
(ссылка 0х) 00001-09999 - Discrete Output Coils - однобитовый тип, доступен на чтение и на запись
(ссылка 1х) 10001-19999 - Discrete Input Contacts - однобитовый тип, доступен только на чтение.
(ссылка 3х) 30001-39999 - Analog Input Registers - 16-битовый знаковый или без знаковый тип, доступен только на чтение.
(ссылка 4х) 40001-49999 - Analog Output Holding Registers - 16-битовый знаковый или без знаковый тип, доступен на чтение и на запись.
В каждой области адресация начинается от 0000H и заканчивается 270EH (9999). Т.е. каждый бит для областей 0х и 1х адресуется от 0 до 270E и каждое слово для областей 3х и 4х 1WORD=2Byte=16Bit также адресуется от 0 до 270E.
Это как придумали для Модикона.
Со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода (адрес 0000) соответствовал номер ячейки 30001, а первому регистру хранения (адрес 0000) — 40001. Эта разница в адресах для каждой области 1, 10001, 30001 и 40001 называется смещением.
Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.

Bone
07.09.2021, 18:49
petera, большое спасибо за информацию! Всё просто и понятно. А если ещё в совокупности с той дополнительной инфой, которая была найдена гуглопоиском по паре скопипастенных строк из Вашего сообщения, то ещё лучше:)
Инфа очень полезна ещё и в свете того, что мне предстоит подключить в этом проекте к панели еще 1 УПП и 2 ПЧ с целью вывода данных тока, частоты, и т.п. Теперь всё уже не так страшно:)
Только вот я смотрю, в ПР102 есть возможность создать всего 64 сетевых переменных, с адресом с 512 по 575. Есть опасения, что такого количества, да ещё с учётом тех, что с плавающей запятой, для всего проекта мне будет маловато. Могли бы выручить булевские, но в режиме Slave они не поддерживаются...
А по поводу моей проблемы - всё получилось! Промежуточный результат - удалось вывести на панель показания веса, а, также, продублировать на панели индикаторы положения нуля, стабилизации и кнопку обнуления, регистры которых находятся в другой области памяти. Теперь буду пробовать подключать терминал уже к ПР-ке, работающей в режиме Master, по второму интерфейсу, как и задумывалось изначально.
Смысл данной затеи в том, чтобы считывать ПР (в режиме Master) вес с терминала, записывать его в определённую сетевую переменную, а потом передавать его в режиме Slave в панель и показывать на "цифровом дисплее". Также, с панели через элемент "цифровой ввод" должно быть можно задавать определённый вес (и это число тоже передавать в ПР в режиме Slave) по достижению которого на весах, программа в ПР должна выполнять определённые действия, предварительно сравнив значения этих двух сетевых переменных. Возможно такое, вообще?
P.S. А индикатор PLC в окне диагностики обмена сначала так и продолжал мигать, даже когда уже я увидел отображение реального веса с терминала на панели, что очень меня озадачило. Но потом, пока я выводил кнопку обнуления, индикаторы нуля и стабилизации, в какой-то момент он мигать перестал (я даже не заметил, когда), и теперь горит зелёным, как положено...

petera
07.09.2021, 20:53
petera, большое спасибо за информацию! Всё просто и понятно. А если ещё в совокупности с той дополнительной инфой, которая была найдена гуглопоиском по паре скопипастенных строк из Вашего сообщения, то ещё лучше:)
Инфа очень полезна ещё и в свете того, что мне предстоит подключить в этом проекте к панели еще 1 УПП и 2 ПЧ с целью вывода данных тока, частоты, и т.п. Теперь всё уже не так страшно:)
Только вот я смотрю, в ПР102 есть возможность создать всего 64 сетевых переменных, с адресом с 512 по 575. Есть опасения, что такого количества, да ещё с учётом тех, что с плавающей запятой, для всего проекта мне будет маловато. Могли бы выручить булевские, но в режиме Slave они не поддерживаются...
А по поводу моей проблемы - всё получилось! Промежуточный результат - удалось вывести на панель показания веса, а, также, продублировать на панели индикаторы положения нуля, стабилизации и кнопку обнуления, регистры которых находятся в другой области памяти. Теперь буду пробовать подключать терминал уже к ПР-ке, работающей в режиме Master, по второму интерфейсу, как и задумывалось изначально.
Смысл данной затеи в том, чтобы считывать ПР (в режиме Master) вес с терминала, записывать его в определённую сетевую переменную, а потом передавать его в режиме Slave в панель и показывать на "цифровом дисплее". Также, с панели через элемент "цифровой ввод" должно быть можно задавать определённый вес (и это число тоже передавать в ПР в режиме Slave) по достижению которого на весах, программа в ПР должна выполнять определённые действия, предварительно сравнив значения этих двух сетевых переменных. Возможно такое, вообще?
P.S. А индикатор PLC в окне диагностики обмена сначала так и продолжал мигать, даже когда уже я увидел отображение реального веса с терминала на панели, что очень меня озадачило. Но потом, пока я выводил кнопку обнуления, индикаторы нуля и стабилизации, в какой-то момент он мигать перестал (я даже не заметил, когда), и теперь горит зелёным, как положено...

1.
Могли бы выручить булевские, но в режиме Slave они не поддерживаются...

Еще как поддерживаются!
ПР поддерживает все функции ModBus для работы с битами - 01, 02, 05, 0F
56891
Но есть особенность, адреса бит находятся в той же памяти что и регистры. Т.е. каждому биту от 8192 до 9215 соответствует какой-либо разряд регистра 512...575. См. картинку.
Таким образом булевских переменных в слейве ПР будет до 64 х 16 = 1024.
Панель(мастер), например, может читать /писать отдельные биты в ПР или сразу группу из 16 бит, если рассматривать их как один регистр.
Смотрите ссылку, там примеры на все случаи жизни! Обмен битовыми (BOOL) переменными с ПР Slave (https://owen.ru/forum/showthread.php?t=32194)
Если честно, то я уже устал давать эту ссылку!

2. Я думаю, что нет смысла передавать на панель переменные с плавающей точкой, ведь это не для мат вычислений, а только для отображения значений. Вполне можно обойтись значениями с фиксированной точкой. Макросы для ОЛ по переводу float-int-float давно изобретены, могу поделиться.
Таким образом и здесь можно уменьшить требуемое количество регистров в слейве ПР - в два раза .

Bone
08.09.2021, 21:51
1.
Еще как поддерживаются!
ПР поддерживает все функции ModBus для работы с битами - 01, 02, 05, 0F
56891
Но есть особенность, адреса бит находятся в той же памяти что и регистры. Т.е. каждому биту от 8192 до 9215 соответствует какой-либо разряд регистра 512...575. См. картинку.
Таким образом булевских переменных в слейве ПР будет до 64 х 16 = 1024.
Панель(мастер), например, может читать /писать отдельные биты в ПР или сразу группу из 16 бит, если рассматривать их как один регистр.
Смотрите ссылку, там примеры на все случаи жизни! Обмен битовыми (BOOL) переменными с ПР Slave (https://owen.ru/forum/showthread.php?t=32194)
Если честно, то я уже устал давать эту ссылку!

Спасибо за идею! Буду внедрять её позже. Я видел эту карту регистров, когда изучал тонны информации по этому вопросу, но как-то не придал ей значения. Зациклился на том, что ПР не поддерживает булевские переменные в режиме Slave и точка.
А пока решаю следующую промежуточную задачу: вывести на панель вес на "цифровой дисплей", кнопку обнуления и индикаторы нуля и стабилизации веса . Пока получается, что если просто выводить вес и кнопку обнуления, то всё работает. Если выводить кнопку, индикаторы нуля и стабилизации веса, то работает. А если выводить всё сразу, то ОЛ ругается, что обнаружено использование сетевых переменных с совпадающими Modbus регистрами.
Для считывания состояния индикаторов я прописываю в таблице переменных регистр 0 и его биты 0 и 2, как по инструкции от терминала. Тип переменных - булевские. А для считывания веса - тоже регистр 0, как в прошлый раз. Тип переменной - с плавающей запятой. Не понятно, куда прописывать смещение 4х или 0х, как это можно было сделать в настройках элементов на панели. Но без индикаторов показания веса отображались. А если я меняю в таблице переменных биты для считывания для индикатора 0 на, например, 1, то тоже всё работает. Но в первом бите отображается другой параметр. В общем, запутался немного. Прилагаю оба проекта. Если не трудно, посмотрите, пожалуйста, что я делаю не так?


2. Я думаю, что нет смысла передавать на панель переменные с плавающей точкой, ведь это не для мат вычислений, а только для отображения значений. Вполне можно обойтись значениями с фиксированной точкой.

Планирую выводить на панель показания с двух датчиков температуры. А для них, насколько мне известно, должны использоваться FLOATы, нет?


Макросы для ОЛ по переводу float-int-float давно изобретены, могу поделиться.
Таким образом и здесь можно уменьшить требуемое количество регистров в слейве ПР - в два раза .

Блин... Я полагал, что простого преобразователя "TO INT" будет достаточно...:(

petera
09.09.2021, 04:42
Для считывания состояния индикаторов я прописываю в таблице переменных регистр 0 и его биты 0 и 2, как по инструкции от терминала. Тип переменных - булевские. А для считывания веса - тоже регистр 0, как в прошлый раз. Тип переменной - с плавающей запятой. Не понятно, куда прописывать смещение 4х или 0х, как это можно было сделать в настройках элементов на панели.
т.к. функции записи или чтения однозначно определяют области регистров 4х или 0х, 3х или 1х
https://owen.ru/forum/attachment.php?attachmentid=12621&d=1397777586
То в настройках переменных мастера ПР нужно руководствоваться кодом функции для чтения и записи
56904 56905
Соответствующие поля есть в ОЛ
56906

Если выводить кнопку, индикаторы нуля и стабилизации веса, то работает. А если выводить всё сразу, то ОЛ ругается, что обнаружено использование сетевых переменных с совпадающими Modbus регистрами.
Я полагал, что проблему уже решили
56907
Оказывается, что нет... Печально!

Причем, если не использовать сетевые переменные второго интерфейса(слейва), а взять обычные переменные, то проблем нет
56908

Ну и далее
Если не использовать чтение 0 бита 0 регистра мастера для записи в сетевую переменную слейва то проблемы тоже нет
56909

Как только "цепляю" сюда выходную сет.переменную слейва, даже через переменную - капут
56910

Вижу единственный способ решения
Добавить в мастер еще одно устройство, с тем же адресом
56911

Где и "поселить" только булевские переменные

Результат
56912 56913

petera
09.09.2021, 04:46
Блин... Я полагал, что простого преобразователя "TO INT" будет достаточно...
А как же это

Планирую выводить на панель показания с двух датчиков температуры. А для них, насколько мне известно, должны использоваться FLOATы, нет?


Вот именно для случаев вывода(или ввода) на панель значений с точкой и(или) со знаком нужны Макросы для ОЛ по переводу float-int-float

Bone
09.09.2021, 22:37
т.к. функции записи или чтения однозначно определяют области регистров 4х или 0х, 3х или 1х

Вот теперь пасьянс сложился.:)


Ну и далее
Если не использовать чтение 0 бита 0 регистра мастера для записи в сетевую переменную слейва то проблемы тоже нет


Немного добавлю: или если использовать для этой цели чтение любого бита, кроме нулевого, в нулевом регистре в данном случае. Тогда тоже работает.


Вижу единственный способ решения
Добавить в мастер еще одно устройство, с тем же адресом

Где и "поселить" только булевские переменные


Очередное открытие для новичка...
Был уверен, что в сети нельзя в принципе создавать устройства с одинаковым адресом, а вот оказалось, что очень даже можно...
Всё гениальное просто! Спасибо!


Вот именно для случаев вывода(или ввода) на панель значений с точкой и(или) со знаком нужны Макросы для ОЛ по переводу float-int-float

Не совсем понятно, зачем в данном случае их конвертировать, если можно гнать FLOATы напрямую. Только нужно настроить масштабирование в настройках "цифрового дисплея". Я попробовал с весами и у меня получилось. На панели я видел вес, практически совпадающий (очень точно не делал, ибо сейчас в этом смысла нет) с цифрами на самОм терминале. В том числе, и отрицательный...



Планирую выводить на панель показания с двух датчиков температуры.

С датчиками температуры (и не только с ними. Будут ещё датчики тока с выходом 4-20 мА) я хотел проделать ту же процедуру по настройке масштабирования. Ну, или как-нибудь использовать макрос соответствующего датчика из менеджера компонентов. Только пока ещё не знаю, как...
Не получится?



Макросы для ОЛ по переводу float-int-float давно изобретены, могу поделиться.


Был бы очень признателен. Лишними точно не будут.

petera
10.09.2021, 09:59
Не совсем понятно, зачем в данном случае их конвертировать, если можно гнать FLOATы напрямую. Только нужно настроить масштабирование в настройках "цифрового дисплея". Я попробовал с весами и у меня получилось. На панели я видел вес, практически совпадающий (очень точно не делал, ибо сейчас в этом смысла нет) с цифрами на самОм терминале. В том числе, и отрицательный...

https://owen.ru/forum/attachment.php?attachmentid=56952&d=1631257420
Патамушта, такая загогулина понимаш !
https://owen.ru/forum/showthread.php?t=35321&p=363793&viewfull=1#post363793

...Только вот я смотрю, в ПР102 есть возможность создать всего 64 сетевых переменных, с адресом с 512 по 575. Есть опасения, что такого количества, да ещё с учётом тех, что с плавающей запятой, для всего проекта мне будет маловато. Могли бы выручить булевские, но в режиме Slave они не поддерживаются...

Bone
10.09.2021, 11:14
petera, те опасения были ещё до того, как Вы дали мне подсказку по использованию битов регистров для работы с дискретными сигналами. А их в моём проекте будет подавляющее большинство. Поэтому теперь проблема с недостатком сетевых переменных для работы с булевскими (ну, и со всеми остальными) данными потеряла актуальность...

Bone
10.09.2021, 11:17
Хотел пострелять из пушки по воробьям, но Вам спасибо, что наставили на путь истинный.:)

Bone
13.10.2021, 21:18
Здравствуйте, уважаемые коллеги!
Столкнулся ещё с одной проблемой.
Сделал в проекте на панели таблицу отображения данных (начало здесь (https://owen.ru/forum/showthread.php?t=22915&page=216&p=361288&viewfull=1#post361288)) с целью занесения туда количества выпущенной продукции в килограммах и даты выпуска. Данные в ячейки будут заноситься по кнопке на панели или автоматически, по достижению заданного веса и его стабилизации.
Проблема заключается в том, что я не могу получить в регистре 4х*** ("архивирования в панель" и "цифрового дисплея") более-менее достоверные показания веса с терминала, чтобы занести их в таблицу. В принципе, на "цифровом дисплее" этого регистра точности можно добиться масштабированием в его настройках, но в таблице такого масштабирования нет.
Пробовал масштабировать в ПР-ке макросом SCALE, но толку мало.
Пробовал разные настройки и в панели, и в ПР-ке (и целочисленные, и с плавающей запятой, и WORD, и DWORD, и формат отображения), и порядок следования менял (старшим регистром/байтом вперёд/назад) - ничего толком не получается. В регистре бегают какие-то дикие 7-8-9-значные числа, да ещё бывает, с хаотично меняющимся знаком.
Максимум, чего смог добиться - это, когда преобразовав сетевую переменную, по которой транслируется вес с терминала в панель через ПР-ку, с типа с плавающей запятой в тип целочисленный и при соответствующих настройках "архивирования в панель" и "цифрового дисплея" увидел вес более-менее соответствующий реальному. Но в таком случае я не смогу получить отрицательный вес, а он тоже нужен...
Уважаемые коллеги, подскажите, пожалуйста, в чём тут может быть загвоздка и есть ли выход из данной ситуации?

kondor3000
14.10.2021, 09:58
Здравствуйте, уважаемые коллеги!
Столкнулся ещё с одной проблемой.
Сделал в проекте на панели таблицу отображения данных (начало здесь (https://owen.ru/forum/showthread.php?t=22915&page=216&p=361288&viewfull=1#post361288)) с целью занесения туда количества выпущенной продукции в килограммах и даты выпуска. Данные в ячейки будут заноситься по кнопке на панели или автоматически, по достижению заданного веса и его стабилизации.
Проблема заключается в том, что я не могу получить в регистре 4х*** ("архивирования в панель" и "цифрового дисплея") более-менее достоверные показания веса с терминала, чтобы занести их в таблицу. В принципе, на "цифровом дисплее" этого регистра точности можно добиться масштабированием в его настройках, но в таблице такого масштабирования нет.
Пробовал масштабировать в ПР-ке макросом SCALE, но толку мало.
Пробовал разные настройки и в панели, и в ПР-ке (и целочисленные, и с плавающей запятой, и WORD, и DWORD, и формат отображения), и порядок следования менял (старшим регистром/байтом вперёд/назад) - ничего толком не получается. В регистре бегают какие-то дикие 7-8-9-значные числа, да ещё бывает, с хаотично меняющимся знаком.
Максимум, чего смог добиться - это, когда преобразовав сетевую переменную, по которой транслируется вес с терминала в панель через ПР-ку, с типа с плавающей запятой в тип целочисленный и при соответствующих настройках "архивирования в панель" и "цифрового дисплея" увидел вес более-менее соответствующий реальному. Но в таком случае я не смогу получить отрицательный вес, а он тоже нужен...
Уважаемые коллеги, подскажите, пожалуйста, в чём тут может быть загвоздка и есть ли выход из данной ситуации?

Проблема в ПР, для хорошей точности, надо было брать ПЛК сразу. И всё делать через Float, а ПР криво пересчитывает Float в INT и обратно. Можно конечно делать +0.5 в пересчёте, и использовать INT для отрицательных значений, но точности хорошей не получите из за маленького диапазона значений INT.

petera
14.10.2021, 10:03
Пробовал разные настройки и в панели, и в ПР-ке (и целочисленные, и с плавающей запятой, и WORD, и DWORD, и формат отображения), и порядок следования менял (старшим регистром/байтом вперёд/назад) - ничего толком не получается. В регистре бегают какие-то дикие 7-8-9-значные числа, да ещё бывает, с хаотично меняющимся знаком.
В ПРке настройки старшим регистром/байтом вперёд/назад в слейве есть, но НЕ РАБОТАЮТ. Эти настройки только для мастера ПРки

Там у Вас целый клубок проблем,
Вы сначала в ПР мастером читаете регистры терминала, затем копируете значения в переменную слейва ПР
57444
Вот здесь и зарыта собака - Мастер читает регистры терминала не в том порядке.
Нужно поиграть настройками - старшим байтом в перед
Мне так кажется, что должно быть так
57445

Максимум, чего смог добиться - это, когда преобразовав сетевую переменную, по которой транслируется вес с терминала в панель через ПР-ку, с типа с плавающей запятой в тип целочисленный и при соответствующих настройках "архивирования в панель" и "цифрового дисплея" увидел вес более-менее соответствующий реальному. Но в таком случае я не смогу получить отрицательный вес, а он тоже нужен...
Я же писал, что для случаев вывода(или ввода) на панель целых значений с точкой и(или) со знаком нужны Макросы для ОЛ по переводу float-int-float

ЗЫ
В любом случае
СНАЧАЛА нужно добиться правильного чтения регистров терминала в ПРку

petera
14.10.2021, 13:56
Хочу внести ясность
1. Запомните раз и на всегда
Если ПР слейв, а панель мастер, то ВСЕГДА включайте в настройках порта панели
Переставить Word..
57456
Для отображения значений с плавающей точкой никакого масштабирования использовать не нужно!
57458 57459

ВСЁ!
С этими настройками панель должна читать (записывать тоже) сетевые переменные ПРки с плавающей точкой!

Если у Вас неправильно отображаются сетевые переменные ПРки с плавающей точкой, то ищите причину в другом, только не в этих настройках.

Например, как я предполагаю, мастер ПРки неверно читает (не в том порядке байты или регистры) вес из терминала.

Т.к. ПР у Вас без дисплея, то нужно воспользоваться онлайн отладкой в среде ОЛ и посмотреть какой вес получается в сетевой переменной от терминала.
Менять порядок регистров или байт и добиться правильных значение в регистрах ПРки.

После положительных результатов, при желании можно в ПРке сделать преобразования значений с плавающей точкой в целые со знаком и фиксированной точкой.
Отрицательные значения целых со знаком передаются в дополнительном коде.Таким значениям в панели соответствует формат DEC
Как я и говорил ранее, для такого преобразования в ПРке нужен специальный макрос, например мой
57460 57461

Пример использования макроса
57463

Только при выборе кол.знаков после точки учтите, что диапазон результата преобразования, без учета точки, ограничен от -32768 до 32767.
Т.е возможны варианты
N=0 от -32768 до 32767
N=1 от -3276.8 до 3276.7
N=2 от -327.68 до 327.67
N=3 от -32.768 до 32.767
N=4 от -3.2768 до 3.2767

Если нужно отображать вес от -100.00 до 100.00 кг, то N=2

Пример загружен в ПРку
в ОЛ запущена онлайн отладка

ПРка по RS485 подключена к ПК где запущен онлайн эмулятор панели
Результат прогона в реальном масштабе времени
https://owen.ru/forum/attachment.php?attachmentid=57464&d=1634208447

kondor3000
14.10.2021, 15:31
petera, про маленький диапазон INT, я коротко уже написал. Хорошо если ему надо до 32 кг взвешивать, с точностью до грамма. Но тут весовой терминал, может там идёт речь о 50 тоннах, и какая тогда точность будет? +_ сотни килограмм, про граммы я молчу даже.

petera
14.10.2021, 15:43
petera, про маленький диапазон INT, я коротко уже написал. Хорошо если ему надо до 32 кг взвешивать, с точностью до грамма. Но тут весовой терминал, может там идёт речь о 50 тоннах, и какая тогда точность будет? +_ сотни килограмм, про граммы я молчу даже.
В принципе можно расширить до DWord, но смысл теряется, т.к. Float тоже два регистра.

kondor3000
14.10.2021, 19:04
В принципе можно расширить до DWord, но смысл теряется, т.к. Float тоже два регистра.

Тогда уж до DINT, ему отрицательные нужны. Но опять же нет смысла, проще Float сразу.
Кстати тут нашёл макрос чей-то, ТО_DINT, но там только положительные значения выходят, с отрицательными не работает. На самом деле он ТО_DWORD.

Bone
14.10.2021, 20:39
petera, kondor3000, большое спасибо! Смогу добраться до проекта и попробовать не ранее, чем послезавтра.

Bone
15.10.2021, 19:54
petera, kondor3000, не ранее, чем послезавтра.

... а сейчас пока напишу немного по теме, по памяти.


Хочу внести ясность
1. Запомните раз и на всегда
Если ПР слейв, а панель мастер, то ВСЕГДА включайте в настройках порта панели
Переставить Word..
57456

petera, я поставил эту галку в числе самых первых изменений в настройках в процессе своих опытов, и она стоит до сих пор. Где-то читал тут на форуме, что это как раз влияет на корректность отображения данных, и не только. Сейчас уже точно не вспомню, на что конкретно это влияло у меня, но помню, что стало лучше.)
Правда, у меня этот пункт называется немного по-другому, но это не важно, наверно, и зависит, как я понял, от версии конфигуратора.


В ПРке настройки старшим регистром/байтом вперёд/назад в слейве есть, но НЕ РАБОТАЮТ. Эти настройки только для мастера ПРки

Там у Вас целый клубок проблем,
Вы сначала в ПР мастером читаете регистры терминала, затем копируете значения в переменную слейва ПР
57444
Вот здесь и зарыта собака - Мастер читает регистры терминала не в том порядке.
Нужно поиграть настройками - старшим байтом в перед
Мне так кажется, что должно быть так
57445

Да, и эти настройки я тоже перепробовал. Остановился на обеих установленных галках, как наиболее оптимальном варианте.
При настройках по умолчанию был такой эффект: постепенно нагружал датчик, смотрел в онлайн-отладке ОЛ на содержимое соответствующей сетевой переменной с весов и видел там число, плавно увеличивающееся от (примерно) 2,7Е-35 до 3,5+Е37. И по достижении определённого усилия (около условных 12 кг на дисплее весового терминала. "Условных" - потому что откалибрована эта весовая система сейчас пока совершенно от балды, на условные 15 кг максимального веса) содержимое сетевой переменной обнулялось (появлялся "0") и, при дальнейшем увеличении нагрузки на весовой датчик, начинало расти по новой, от 2,7Е-35 до сигнала перегруза с терминала, т.е., циклично. Полагаю, что, если откалибровать систему на больший вес, чтобы не было сигнала перегруза, то эти циклы повторялись бы снова и снова, как раз из-за неправильного порядка следования старших/младших регистров/байт.
Все остальные варианты снятия/установки этих галок, кроме установок по умолчанию, обеспечивали линейность изменения сигнала по всему диапазону. Менялся только показатель степени.


Я же писал, что для случаев вывода(или ввода) на панель целых значений с точкой и(или) со знаком нужны Макросы для ОЛ по переводу float-int-float

На данный момент пользуюсь макросом SCALE из Менеджера компонентов ОЛ. Очень удобная штука. Позволяет конвертировать любой диапазон FLOATов в любой диапазон FLOATов же. И в онлайн-отладке я вижу, как он работает, т.е., чётко переводит данные с сетевой переменной весов (от 3,59Е-43 до 5,7Е-41) в число от 0 до 15 на своём выходе (в соответствии с его настройками и максимальным весом терминала), и это число через сетевую переменную уходит в панель на "цифровой дисплей". НО! Проблема в том, что показания на "цифровом дисплее" не соответствуют показаниям в сетевой переменной.
Более того - я могу в онлайн-отладке записать в эту сетевую переменную любое значение.
Пишу 0 - на "цифровом дисплее" панели тоже 0. Пишу 1 - на "цифровом дисплее" что-то типа 758439057 или 3,9Е+19 (при соответствующих настройках формата отображения DEC или FLOAT), например. Пишу 2 - на "цифровом дисплее" что-то типа 3584947822 или , например, 2,4Е-12...



ЗЫ
В любом случае
СНАЧАЛА нужно добиться правильного чтения регистров терминала в ПРку
Этого как раз добился. Линейно изменяется от - от 3,59Е-43 до 5,7Е-41 перед появлением сигнала перегруза. Завтра буду рыть в сторону настройки "цифрового дисплея" по Вашим советам и по образцу. Если у Вас работает, то и у меня должно заработать. Но мне кажется, я перепробовал ВСЕ настройки, какие только можно...:(


petera, про маленький диапазон INT, я коротко уже написал. Хорошо если ему надо до 32 кг взвешивать, с точностью до грамма. Но тут весовой терминал, может там идёт речь о 50 тоннах, и какая тогда точность будет? +_ сотни килограмм, про граммы я молчу даже.

kondor3000, будут взвешиваться грузы массой 300-500 кг. Точность даже +- 1 кг (0,2-0,3%) устроила бы. А уж если было бы



N=1 от -3276.8 до 3276.7


то вообще, просто шикарно...

petera
15.10.2021, 21:33
При настройках по умолчанию был такой эффект: постепенно нагружал датчик, смотрел в онлайн-отладке ОЛ на содержимое соответствующей сетевой переменной с весов и видел там число, плавно увеличивающееся от (примерно) 2,7Е-35 до 3,5+Е37. И по достижении определённого усилия (около условных 12 кг на дисплее весового терминала. "Условных" - потому что откалибрована эта весовая система сейчас пока совершенно от балды, на условные 15 кг максимального веса) содержимое сетевой переменной обнулялось (появлялся "0") и, при дальнейшем увеличении нагрузки на весовой датчик, начинало расти по новой, от 2,7Е-35 до сигнала перегруза с терминала, т.е., циклично. Полагаю, что, если откалибровать систему на больший вес, чтобы не было сигнала перегруза, то эти циклы повторялись бы снова и снова, как раз из-за неправильного порядка следования старших/младших регистров/байт.

На данный момент пользуюсь макросом SCALE из Менеджера компонентов ОЛ. Очень удобная штука. Позволяет конвертировать любой диапазон FLOATов в любой диапазон FLOATов же. И в онлайн-отладке я вижу, как он работает, т.е., чётко переводит данные с сетевой переменной весов (от 3,59Е-43 до 5,7Е-41) в число от 0 до 15 на своём выходе (в соответствии с его настройками и максимальным весом терминала),
2,7Е-35 до 3,5+Е37 ???
Я просто обалдел от таких чисел
И решил почитать руководство на терминал..
Однако, с чего Вы взяли, что вес у вас в формате с плавающей точкой?
57505
Русскими буквами написано

Текущее значение веса (4 бита, включая символы знака, высший бит спереди)
Т.е. это формат DINT - целое со знаком
и судя по всему - 19 регистр,
57506
с фиксированной точкой

Так, что использование SCALE из Менеджера компонентов ОЛ для перевода с сетевой переменной весов (от 3,59Е-43 до 5,7Е-41) в число от 0 до 15
это чистый мазохизм.

kondor3000
15.10.2021, 21:52
... а сейчас пока напишу немного по теме, по памяти.
petera, я поставил эту галку в числе самых первых изменений в настройках в процессе своих опытов, и она стоит до сих пор.
При настройках по умолчанию был такой эффект: постепенно нагружал датчик, смотрел в онлайн-отладке ОЛ на содержимое соответствующей сетевой переменной с весов и видел там число, плавно увеличивающееся от (примерно) 2,7Е-35 до 3,5+Е37. И по достижении определённого усилия (около условных 12 кг на дисплее в


Весь смысл в том, что вам надо расставить байты в правильной последовательности Float, для получения веса как на терминале, без всяких +-37 степени, если не получается правильно вывести вес в ПР, может получится правильно расставить байты в Панели. Проблема в том, что каждая передача по модбасу, опять переворачивает байты. Поэтому, может получится вывести правильный вес в самой панели. Пробуйте последовательно, убирать или ставить все возможные галки по одной. Опять же в ПЛК всё можно было бы сделать без проблем. Но пробуйте.
А вообще в вашем случае, лучше было сделать ПР мастером, что бы работали и галки в OWL.

Ну вот petera оказывается выяснил, что у вас там не Float вовсе, а вы сами себе проблему создали)))

petera
15.10.2021, 22:44
SCALE из Менеджера компонентов ОЛ. Очень удобная штука. Позволяет конвертировать любой диапазон FLOATов в любой диапазон FLOATов же. И в онлайн-отладке я вижу, как он работает, т.е., чётко переводит данные с сетевой переменной весов (от 3,59Е-43 до 5,7Е-41) в число от 0 до 15 на своём выходе (в соответствии с его настройками и максимальным весом терминала),
С точки зрения DINT, число 3,59Е-43 Очень похоже на ноль http://www.binaryconvert.com/result_float.html?decimal=051046053057069045052051
57507
или близко к нулю
здесь 4 HEX цифры 00 00 01 00, если предположить, что порядок байт другой то может быть и такой вариант прочтения 00 00 00 01
значение 5,7Е-41 трактовать пока нет смысла, "потому что откалибрована эта весовая система сейчас пока совершенно от балды, на условные 15 кг максимального веса"

kondor3000
15.10.2021, 22:59
petera, получается надо просто считать вес не флоатом, а целочисленной переменной и перевести её в DINT и выкинуть все скалеры. Целочисленная считается без переворота байт. А из 19 регистра считать смещение точки. Так?
Я плохо знаю как в Лоджике считываются целочисленные из 2 регистров. Вроде по описанию целочисленные это DWORD.

petera
15.10.2021, 23:20
petera, получается надо просто считать вес не флоатом, а целочисленной переменной и перевести её в DINT и выкинуть все скалеры. Целочисленная считается без переворота байт. А из 19 регистра считать смещение точки. Так?
Я плохо знаю как в Лоджике считываются целочисленные из 2 регистров. Вроде по описанию целочисленные это DWORD.

Мастер может читать 32битные переменные, просто выбирать 2 регистра в настройках
https://owen.ru/forum/attachment.php?attachmentid=57509&d=1634329130

Вот только прядок байт / регистров будет влиять

petera
15.10.2021, 23:27
Я вот это

Более того - я могу в онлайн-отладке записать в эту сетевую переменную любое значение.
Пишу 0 - на "цифровом дисплее" панели тоже 0. Пишу 1 - на "цифровом дисплее" что-то типа 758439057 или 3,9Е+19 (при соответствующих настройках формата отображения DEC или FLOAT), например. Пишу 2 - на "цифровом дисплее" что-то типа 3584947822 или , например, 2,4Е-12...
Хоть убей, воспроизвести не могу...


https://www.youtube.com/watch?v=R4U_lbZbm9M

Еще раз адреса и в ПР и в панели должны быть четными и одинаковыми, без смещения, например, в ПР - 522, в панели 4х522 DWord
Ваш пример - В студию!

Bone
16.10.2021, 15:52
Чьорд побьери!(С)
Каналья!!(С)
Тысяча чертей!!!(С)
Всё заработало...

Теперь по порядку.

petera, я сразу оговорился, что воспроизвожу процесс по памяти

... а сейчас пока напишу немного по теме, по памяти.

...от (примерно) 2,7Е-35 до 3,5+Е37.

Пишу 0 - на "цифровом дисплее" панели тоже 0. Пишу 1 - на "цифровом дисплее" что-то типа 758439057 или 3,9Е+19 (при соответствующих настройках формата отображения DEC или FLOAT), например. Пишу 2 - на "цифровом дисплее" что-то типа 3584947822 или , например, 2,4Е-12...


поэтому, наверно, не стоило Вам воспринимать эти числа буквально. Смысл упоминания мной этих чисел был лишь в том, чтобы показать, что индикация на дисплее сильно не соответствует содержимому переменной и при его изменении индикация изменяется совершенно хаотично. Что, теперь вижу, при кривых настройках, конечно же, неудивительно. И аналогичную ситуацию с десятичным форматом отображения в виде многозначного числа можно наблюдать на Вашем видео на левом верхнем дисплее.
А вот что касается отображения чисел в формате чисел с плавающей запятой, то тут, похоже, память меня совсем подвела.:(
Мне тоже не удалось воспроизвести описанную мной же ситуацию. К своему стыду, даже не знаю, откуда я это взял. Скорее всего, когда пробовал различные варианты, то наблюдал на цифровом дисплее такие числа, но при воздействии на тензодатчик, а не при принудительной записи значения в переменную. И что-то такое отложилось в памяти в виде каши. И перед написанием своего сообщения я ещё раз проверил проблему с отображением чисел в DECe, но не проверил в FLOATe, ибо уже не осталось моральных сил поменять настройку. Моя ошибка. И, вообще, моя ошибка в том, что нужно было пробовать все настройки по порядку, записывая, что сделал, а не так, как это делал я...

petera, приношу свои извинения за то, что ввёл Вас в заблуждение.

В итоге, сегодня с утра выяснилось (утро вечера мудренее), что я остановился всего лишь в шаге от победы, т.к., нужно было поменять в настройках отображения цифрового дисплея DEC на FLOAT, и всё стало отображаться корректно. Ума не приложу, как так получилось, что я это пропустил. Я был в полнейшей уверенности, что перепробовал все настройки и в панели, и в ПР-ке...:(

Дальше...

Однако, с чего Вы взяли, что вес у вас в формате с плавающей точкой?

До сегодняшнего дня был уверен, что данные, занимающие 2 ячейки подряд, являются FLOATами, и никак иначе...


Русскими буквами написано

Текущее значение веса (4 бита, включая символы знака, высший бит спереди)

Для меня, при данном моём уровне познаний в сетях, протоколах и интерфейсах эта информация не совсем понятна. А вернее, совсем не понятна... Как запихать "текущее значение веса", да ещё "включая символы знака", всего в 4 бита (может, байта? опечатка?).


Т.е. это формат DINT - целое со знаком


А о существовании на свете этого формата я впервые узнал только пару дней назад:


Тогда уж до DINT, ему отрицательные нужны.

Поискал в мануале и справке от ОЛ, не нашёл. Только вскользь упоминается о том, что целочисленная переменная может занимать 2 регистра. Но мне от этой информации раньше было ни холодно, ни жарко, и как она может пригодиться мне на практике, я не знал. Теперь узнал..


С точки зрения DINT, число 3,59Е-43 Очень похоже на ноль
или близко к нулю

Так и есть. Оно появляется сразу же, как только я начинаю воздействовать на датчик. Если он просто лежит на столе, то дисплей терминала показывает "-OFL" (недогрузка)


Мастер может читать 32битные переменные, просто выбирать 2 регистра в настройках
Вот только прядок байт / регистров будет влиять

Вот эта информация всё расставила на свои места. Сделал в настройках этой переменной количество регистров 2, поменял на целочисленную, и вот оно - счастье. Теперь и данные с весов стали адекватные. При установленных обеих галках в настройках в ПР-ке "старшим регистром вперёд" и "старшим байтом вперёд" (как самые оптимальные) данные в переменной стали изменяться от 0 до (примерно) 40000 перед сигналом перегруза.


Так, что использование SCALE из Менеджера компонентов ОЛ для перевода с сетевой переменной весов (от 3,59Е-43 до 5,7Е-41) в число от 0 до 15
это чистый мазохизм.

Догадываюсь, но всё равно спрошу: это из-за низкой точности при обработке такой маленькой величины?
А вообще, была надежда, что у меня просто не хватает здоровья создать голыми руками достаточное воздействие на датчик, который рассчитан на 1 тонну. И в реальных условиях, когда на весы поместили бы груз в несколько сотен кг, то эта величина стала бы побольше. И обработка такого диапазона уже была бы точнее...


Опять же в ПЛК всё можно было бы сделать без проблем. Но пробуйте.

kondor3000, мне бы дай бог, с этим разобраться))
До ПЛК пока не дорос, да и до кодесиса тоже. Хотя, не исключаю, что когда-нибудь и замахнусь.
Тогда ждите новых вопросов.:)


А вообще в вашем случае, лучше было сделать ПР мастером, что бы работали и галки в OWL.

Так она и так мастер по отношению к терминалу (слейв к панели). И галки работают...


...вы сами себе проблему создали)))

+100500...

petera, kondor3000, спасибо вам огромнейшее за помощь и поддержку!!! Не знаю, что бы я без вас делал...

kondor3000
16.10.2021, 16:28
Чьорд побьери!(С)
Каналья!!(С)
Тысяча чертей!!!(С)
Всё заработало...
petera, kondor3000, спасибо вам огромнейшее за помощь и поддержку!!! Не знаю, что бы я без вас делал...
Осталось проверить есть ли в 19 регистре положение точки 0,1,2,3 и делить целочисленное на 1, 10, 100, 1000 и т. д. в зависимости от диапазона. И адекватно отобразить всё в панели. В вашем случае можно просто делить на 10. А в панели задать постоянно 1 знак после запятой, формат DEC.
Хотя у вас DINT и можно сделать и 2 и 3 знака после запятой.
Датчик на тонну и будет в итоге от -1000 до 1000 Кг и знаков сколько поставите.

Bone
16.10.2021, 18:01
Осталось проверить есть ли в 19 регистре положение точки 0,1,2,3

kondor3000, проверил. Есть. И даже меняется положение точки на дисплее терминала, когда я пишу туда соответствующее число. Магия! (для меня, во всяком случае):D


и делить целочисленное на 1, 10, 100, 1000 и т. д. в зависимости от диапазона.
Хотя у вас DINT и можно сделать и 2 и 3 знака после запятой.
Датчик на тонну и будет в итоге от -1000 до 1000 Кг и знаков сколько поставите.

Уверен, никаких других диапазонов там не нужно будет. Как сделаю с одной цифрой после запятой, так и останется. Даже не уверен, что не попросят и её убрать. Были случаи, когда просили убрать цифру после запятой там, где не требуется высокая точность. Убирал там, где есть такая возможность(ТРМ, ПЧ). Редко, но бывало, что персонал раздражала эта постоянно прыгающая цифра. Некоторые даже умудрялись её заклеивать подручными средствами (изолентой, скотчем с бумажкой, и т.п.)