Просмотр полной версии : Релиз библиотеки OwenModbusSlave для CODESYS v2.3
Осинский Алексей
19.06.2018, 11:13
Как Вы знаете, во всех контроллерах ОВЕН под управлением CODESYS 2.3 есть возможность настроить обмен по сети в качестве Modbus-Slave’a через конфигурацию ПЛК
37730
и для большинства случаев этого достаточно.
Но бывают следующие ситуации:
Необходимо поддерживать программу на разных типах ПЛК (например, на ПЛК100 и ПЛК154);
Необходимо организовать доступ к данным по 2м интерфейсам сразу (например, по RS232 подключена панель, которая может как записывать, так и считывать данные из ПЛК, а по RS485 ПЛК подключен к облаку, которое может только вычитывать данные);
И все было бы хорошо – 1 раз сделал конфигурацию и забыл. Но, как вы знаете, клиенты имеют неприятную привычку изменять требования к ПО уже в процессе разработки. И приходится вручную поддерживать актуальность конфигурации в разных ПЛК, либо на разных интерфейсах одного ПЛК.
Чтобы облегчить Вам жизнь в вышеперечисленных ситуациях мы разработали библиотеку OwenModbusSlave_v2.3.9.4.
В библиотеке всего 1 пользовательский ФБ, которому для работы требуется минимум обвязки:
№ COM-порта
Сетевые настройки
Область, в которой хранятся данные, доступные по сети
Размер области данных
Работа библиотеки тестировалась на ПЛК100, ПЛК150, ПЛК154, ПЛК110, ПЛК110 [m02]
Примечание: библиотека не поддерживается на контроллерах ПЛК63/73
Скачать последнюю версию:
37728
Версия
Дата
Список изменений
2.3.9.4
19.06.2018
Первая версия библиотеки
Документация
37729
Библиотека OwenModbusSlave работает только на плк овен или на плк любого производителя поддерживающего кодесис 2.3 ?
Осинский Алексей
20.06.2018, 08:25
Библиотека OwenModbusSlave работает только на плк овен или на плк любого производителя поддерживающего кодесис 2.3 ?
На ПЛК других производителей мы не проверяли.
Эдуард_Н
20.06.2018, 15:45
Так и примерчик бы выложили.
Осинский Алексей
20.06.2018, 16:40
Так и примерчик бы выложили.
Я не подумал, что может быть полезен пример программы из одного блока.
В документации (рисунок 3.3) есть пример на CFC.
Его не достаточно?
Осинский Алексей
21.06.2018, 08:44
Добрый день.
Спасибо за Ваш отзыв.
Отвечу по порядку.
1) а что за buffer_tools ?
В ней реализованы функции побитового сдвига буфера.
2) а чего не автоматический rtu/ascii ?
Как часто вы подключаете к ПЛК устройства, которые являются Modbus ASCII Master?
3) а где стартовый регистр ?
Стартовый регистр = 0. Согласен, стоило указать.
Если Вы имели в виду возможность задать номер первого регистра, то опишите пожалуйста, для каких задач это Вам понадобиться?
4) а где разные области ? нужно и 0й и 60000й регистр - целиком штоли массив юзать ?
Для какой задачи может потребоваться в Slave-устройстве хранить данные не последовательно, а с разрывами?
Как часто Вы с этим сталкиваетесь?
5) а как определить событие и направление текущей произведенной операции // типа OnRead/Write ?
В текущей реализации библиотеки этого нет.
Опишите пожалуйста задачи, для которых Вам это может понадобиться, и в каком виде Вам бы хотелось видеть эту информацию.
Возможно структура на выходе ФБ, которая после запроса на 1 цикл ПЛК содержит
признак чтение\запись
признак операции с регистрами \ битами
№ первого регистра \ бита
Количество регистров \ битов, участвующих в запросе?
6) а акромя литл/биг концов бывают какие-то перестановки слов - как в ваших модулях, и ?
Бывает и такое. Но, поскольку используется одна область для хранения данных отследить что именно по этому адресу находится - переменная из 2х регистров (и нужно применять перестановку) или переменная из 1 регистра (и перестановка не нужна) не представляется возможным.
Подготовка данных для передачи по сети ложиться на пользователя библиотеки.
7) а надо несколько девайсов поддерживать как дебаг или прокладку ?
Прошу прощения, не понял вопрос. Уточните пожалуйста, что Вы имеете в виду.
Осинский Алексей
23.06.2018, 13:32
Добрый день.
Немного не по порядку, но думаю ответ на последнее замечание будет исчерпывающим и дальше можно будет не читать.
Итак:
Бибка должна быть шире и/или гибче, иначе это шило на мыло
Как сказал автор одной замечательной книги: "Опасайтесь вопроса: «Эту функцию реализовать легко — почему бы этого не сделать?»".
Библиотека должна решать поставленные перед ней задачи, которые я обозначил в первом посте.
Если по отзывам окажется, что есть реальная потребность в каком-либо дополнительном функционале - мы добавим.
Но заметьте, потребность должна быть РЕАЛЬНОЙ, поэтому я и спрашиваю "на сколько часто?" и "для каких задач?".
Простейший пример применения - отладка сети с кучей девайсов БЕЗ этих девайсов.
Логика с мастером на rs-1 + слейвы-имитаторы на rs-2. Этакий localhost
А полистав чужие карты частотников, измерителей .. сразу отпадут вопросы про разрывы и т.п.
При разработке библиотеки цель "сэмулировать набор Slave'ов при помощи этой библиотеки" не ставилась.
Касаемо ASCII - странный вопрос.
Цена вопроса копейки, а жизнь облегчит
Не понятно, только, кому это облегчит жизнь?
За последние года 3 я с Modbus-ASCII ни сталкивался ни как программист, ни как сотрудник техподдержки.
А зачем в местных модулях есть выбор протокола ?
Не могу утверждать со 100% гарантией, но, вероятно, в то время, когда разрабатывались эти устройства Modbus-ASCII использовался чаще.
Осинский Алексей
24.06.2018, 09:50
По поводу начальный регистр с нуля а как быть панели ИП320, она же читает только то что добавлено на экран, которых может быть несколько
Если я правильно понял, то мой ответ "Стартовый регистр = 0." Вы поняли как "всегда 1й регистр в запросе должен быть 0".
Но это не так.
Имеется в виду, что № первого регистра массива данных всегда 0, и его нет возможности изменить. Как указано на рисунке 4.1 "Пользовательское описание OwenModbusSlave.pdf"
когда панель слейв я так и делаю, по номеру экрана отправляю соответствующие заготовленные данные, но когда панель мастер это избыточная трата времени, причем с хаосом на панели, потому что слейв в данной теме не самописный и когда панелька переключит экран она хоть и выдаст номер экрана, но как мне кажется за это время успеют "улететь" данные для чтения не относящиеся к нему, пока идет обработка экрана и заполнение слейва
На сколько я понял, то Вы используете следующий подход:
На каждом экране ИП320 расположены элементы, которые читают (пишут) определенный диапазон регистров и на разных экранах один и тот же регистр может содержать различную информацию
(например на экране 1 регистр 0 содержит температуру, а на экране 2 регистр 0 содержит влажность);
ИП320 передает в контроллер № активного экрана;
ПЛК подготавливает данные для передачи в зависимости от № текущего экрана.
Если это так, то опишите пожалуйста, какой от этого выигрыш перед следующим вариантом:
На экране 1 находятся 2 регистра:
температура в комнате (регистр №0)
влажность в комнате (регистр №1)
На экране 2 находятся 2 регистра:
температура в комнате (регистр №0)
температура на улице (регистр №2)
В зависимости от выбранного экрана ИП320 сама читает нужные ей данные.
Единственное, что приходит на ум - создание "виртуальных" экранов, т.е. когда в системе несколько однотипных устройств (условно, задвижек) и мы не хотим делать отдельные экраны под каждую задвижку
тогда
на экране ИП есть регистр, отвечающий за то, информацию о какой задвижке пользователь хочет получить;
ПЛК по значению этого параметра передает информацию об указанной задвижке.
Если Вы действительно делаете "виртуальные" экраны, то да, согласен с
Ну тут нужно будет пасти регистр куда ИП пришлет экран, и переписывать данные если они "параллельные".
А вот у меня стандартные шаблоны для панели и в одном проекте юзаются экраны 1 2 9, а в другом - 1 2 50 - накой мне 10000 байт ? А на вопрос про лёгкость копирования экрана я отвечу - а у меня Единый проект панели для всего.
Самое смешное, что если у Вас единый проект панели для всего -> во всех проектах у Вас назначение каждого регистра остается неизменным.
И объявив структуру, которая содержит описание всех данных для всех экранов Вы смело можете переносить ее из проекта в проект без изменений, но использовать только те данные, которые нужны.
Эту структуру можно даже вынести в библиотеку, чтобы копипастом не заниматься.
Это проще, чем каждый раз добавлять конфигурацию в ПЛК. (помните, в первом сообщении темы, я именно это и обозначал как задачу, решаемую при помощи библиотеки?)
накой мне 10000 байт
Как часто Вы упираетесь в ограничение ПЛК по памяти?
У меня удавалось использовать 100% доступной памяти только в ПЛК73\63. Если Вы разрабатываете не программы для ПЛК63\73, то есть ли смысл жертвовать удобством ради экономии байт?
Унификация такая. Как пример.
Я тоже радею за унификацию, и рад пообщаться на эту тему.
Я 11.09 буду на Ежегодной конференции пользователей CODESYS 2018 (http://www.prolog-plc.ru/conference2018) в Москве.
Если Вы планируете посетить - сможем пообщаться на эту тему в живую.
Это были вопросы-предложения исходя из моих реальных потребностей
На сколько я понял задавать № первого регистра и устраивать "разрывы" в хранимых данных Вам нужно для целей тестирования.
Я для целей тестирования использую другой подход. Постараюсь на днях описать его и рассказать, какими инструментами я пользуюсь для тестирования, эмуляции устройств и установок.
т.к. Вы не ответили на этот вопрос в сообщении #7 (http://www.owen.ru/forum/showthread.php?t=28996&p=281488&viewfull=1#post281488) продублирую его сюда:
как Вам было бы удобно видеть вот эту информацию:
событие и направление текущей произведенной операции // типа OnRead/Write ?
У меня все это есть.
Если у Вас все это есть - поделитесь, возможно Ваш вариант реализации подойдет нашим пользователям больше.
Возможно с Вашей помощью мне удастся создать универсальную библиотеку, которая будет решать все возникающие проблемы и, при этом, быть простой в использовании.
livethreads
29.06.2018, 09:55
Добрый день.
Не понятно, только, кому это облегчит жизнь?
За последние года 3 я с Modbus-ASCII ни сталкивался ни как программист, ни как сотрудник техподдержки.
Не могу утверждать со 100% гарантией, но, вероятно, в то время, когда разрабатывались эти устройства Modbus-ASCII использовался чаще.
RTU режим корректно работает только если RS485 представляет собой физическую пару от отправителя до получателя. Если же RS485 "пробрасывается" через преобразователи интерфейсов (например, через оптическую линию), где есть буферизация, то получатель не сможет корректно определить конец фрейма (по паузе, как заведено в RTU). В этом случае - только ASCII.
Осинский Алексей
02.07.2018, 09:27
Спасибо за полезную библиотеку. Хотелось бы иметь такую для режима Modbus Slave TCP.
Спасибо за отзыв. Ваш вопрос по SysLibCallback выделил в отдельную тему (http://www.owen.ru/forum/showthread.php?t=29059).
RTU режим корректно работает только если RS485 представляет собой физическую пару от отправителя до получателя. Если же RS485 "пробрасывается" через преобразователи интерфейсов (например, через оптическую линию), где есть буферизация, то получатель не сможет корректно определить конец фрейма (по паузе, как заведено в RTU). В этом случае - только ASCII.
Согласен.
Как считаете, в описанной выше ситуации автоопределение протокола нужно?
Или же предпочтительнее, чтобы программист в явном виде указывал, что хочет использовать ASCII?
livethreads
02.07.2018, 10:28
Как считаете, в описанной выше ситуации автоопределение протокола нужно?
Или же предпочтительнее, чтобы программист в явном виде указывал, что хочет использовать ASCII?
Я не сильный специалист в CoDeSys, сталкиваться с этим приходится раз в пару лет :) Думаю, надо подходить с точки зрения унификации: если в большинстве процедур, которые используют MODBUS по UART присутствует автоопределение, то да, нужно.
Осинский Алексей
02.07.2018, 10:52
Я не сильный специалист в CoDeSys, сталкиваться с этим приходится раз в пару лет :) Думаю, надо подходить с точки зрения унификации: если в большинстве процедур, которые используют MODBUS по UART присутствует автоопределение, то да, нужно.
В большинстве решений с которыми мне приходилось работать - пользователь напрямую указывает версию протокола.
Осинский Алексей
02.07.2018, 12:13
По либе.
За деревьями лес просто теряется. Зачем такие тяжелые имена, столько промежуточных структур и т.п. ? Понимаю что совсем без них - тяжело, но в таком количестве 8(. Похоже на что-то учебно/отладочное.
Постоянно таскаются данные туда-cюда. Автор фанат функций ? Он хоть отличает массив-переменную от массива-параметра ? Это сильно утяжеляет исполнение. В большинстве случаев и program подошел бы.
Умиляет буквальное следование фразе "очистить буффер" )) Ну накой ?
и т.п.
Спасибо за отзыв. Обязательно учту в своих будущих проектах.
livethreads
05.07.2018, 18:08
Здравствуйте.
Несколько вопросов по работе предлагаемого ФБ:
1. В каких ситуациях поднимаются/опускаются флаги xDone и xBusy?
2. В каком месте цикла ПЛК происходит обработка полученного запроса?
3. В каком месте цикла ПЛК формируется буфер ответа и начинается передача ответа мастеру?
4. Можно ли рассчитывать на появление в обозримом будущем подобного ФБ для TCP Slave?
Спасибо.
livethreads
06.07.2018, 11:12
Здравствуйте.
Извиняюсь за поспешность предыдущих вопросов, вопросы 2 и 3 снимаются. Более детально ознакомился с ваши ФБ и рискнул сделать свои предложения, которые позволят более гибко использовать данный ФБ.
Бывают ситуации, когда до выполнения запроса от Master требуются дополнительные действия со стороны Slave. Самая типичная из них это когда необходимо сделать доступным для записи не весь буфер данных Slave, а лишь конкретный регион. Если пытаться подобные нюансы реализовывать внутри вашего ФБ, это сильно усложнит и логику работы блока, и понимание, как этим всем пользоваться. Извиняюсь за свои поспешные вопросы, связанные с процедурами обратного вызова, в среде CoDeSys это можно решить более естесственным способом.
Slave может находиться в следующих длительных состояниях:
- ожидание запроса;
- получение запроса;
- задержка перед отправкой ответа;
- отправка ответа.
Вероятнее всего, в вашем ФБ в том цикле ПЛК, когда вы получаете признак того, что чтение запроса завершено, сперва производится предварительная обработка (свой ли адрес устройства, проверка CRC), и если запрос по адресу, то включается таймер задержки ответа, выполняется запрос, формируется ответ. Предлагаю сделать следующее.
1. Сделать видимой снаружи структуру типа <OMB_SlaveRecievedFrameDescription> (сделать её выходной переменной).
2. Добавить выходную переменную, например, <xReqReady : BOOL>.
3. Добавить входную переменную, например, <eCustomErr : OMB_Slave_SLAVE_BLOCK_ERROR>, которая по-умолчанию имеет значение <NO_FRAME_ERROR>.
4. После того, как сформирована структура (1), выставить флаг (2) и уйти в следующий цикл ПЛК.
5. В следующем цикле ПЛК сбросить флаг (2), проверить значение (3) и в зависимости от него выполнять/не выполнять запрос, формировать ответ.
Такой механизм позволит пользовательской программе, по признаку (2) проверить, возможно ли выполнение поступившего запроса в её частном случае, а также выполнить необходимые действия в буфере Slave непосредственно перед формированием ответа. При этом, если в данных действиях нет необходимости, то вышеуказанные переменные просто не будут им использованы при обращении к ФБ. Никаких изменений в уже написанных программах не потребуется.
Осинский Алексей
08.07.2018, 12:13
Добрый день!
Спасибо за хорошие вопросы и предложения по модернизации.
1. В каких ситуациях поднимаются/опускаются флаги xDone и xBusy?
Действительно не раскрыл этого в описании библиотеки:
xBusy = TRUE до тех пор, пока xEnable = TRUE;
xDone = not xBusy.
4. Можно ли рассчитывать на появление в обозримом будущем подобного ФБ для TCP Slave?
На текущий момент в планах такого нет.
Уточните пожалуйста, почему использование Modbus-TCP через конфигурацию не подходит?
Нужно дублировать данные для нескольких мастер-устройств?
Вероятнее всего, в вашем ФБ в том цикле ПЛК, когда вы получаете признак того, что чтение запроса завершено, сперва производится предварительная обработка (свой ли адрес устройства, проверка CRC), и если запрос по адресу, то включается таймер задержки ответа, выполняется запрос, формируется ответ. Предлагаю сделать следующее.
1. Сделать видимой снаружи структуру типа <OMB_SlaveRecievedFrameDescription> (сделать её выходной переменной).
2. Добавить выходную переменную, например, <xReqReady : BOOL>.
3. Добавить входную переменную, например, <eCustomErr : OMB_Slave_SLAVE_BLOCK_ERROR>, которая по-умолчанию имеет значение <NO_FRAME_ERROR>.
4. После того, как сформирована структура (1), выставить флаг (2) и уйти в следующий цикл ПЛК.
5. В следующем цикле ПЛК сбросить флаг (2), проверить значение (3) и в зависимости от него выполнять/не выполнять запрос, формировать ответ.
Такой механизм позволит пользовательской программе, по признаку (2) проверить, возможно ли выполнение поступившего запроса в её частном случае, а также выполнить необходимые действия в буфере Slave непосредственно перед формированием ответа. При этом, если в данных действиях нет необходимости, то вышеуказанные переменные просто не будут им использованы при обращении к ФБ. Никаких изменений в уже написанных программах не потребуется.
Если я правильно понял идею, то цель следующая: сделать некое подобие "событий" (ниже буду называть так), обработку которого пользователь сможет запретить.
Идея мне нравится. Но есть несколько уточняющих вопросов:
2. Добавить выходную переменную, например, <xReqReady : BOOL>.
Я правильно понимаю, что эту переменную мы должны взводить только в случае, если получен корректный запрос (корректный CRC, адрес совпадает и т.д.)?
А в остальных случаях ФБ сам отвечает мастеру об ошибке (или не сообщает, если адрес не тот) не уведомляя об этом пользователя.
1. Сделать видимой снаружи структуру типа <OMB_SlaveRecievedFrameDescription> (сделать её выходной переменной).
Если я прав с вопросом о <xReqReady : BOOL>, то эта структура содержит "лишние" данные (адрес устройства мы и так знаем, CRC проверен и корректен, количество байт в запросе для обработки события пользователем не нужно).
Итого получим структуру
usiFunctionNumber : USINT; (* Номер функции *)
udiFirstAddress : UDINT; (* Номер первого регистра или бита (в зависимости от функции) *)
uiDataCount : UINT; (* Количество регистров или бит (в зависимости от функции) *)
Upd: хотя адрес в этой структуре может быть нужен, например, в случае, если мы хотим написать универсальную функцию реакции на запрос для всех SLAVE'ов проекта.
На сколько я понимаю при обработке события записи нам бы хотелось иметь возможность проверить данные, которые пытаются нам записать (например если диапазон корректных значений ограничен 0-3, а пытаются записать значение 4), поэтому в ту же структуру добавим
awWrittenData : ARRAY [1..125] OF WORD; (* Записываемые данные, если запрос на чтение - заполнено нулями *)
Но, на сколько мне известно, стандартной ошибки Modbus для такого случая нет (ILLEGAL_DATA_VALUE возвращается в случае, если № первого регистра в диапазоне допустимых значений, а № последнего - выходит за него).
Как Вы считаете, как себя должен повести Slave в таком случае?
Пока что в голову приходит 2 варианта:
Вернуть ответ "запрос обработан", но не записывать данные в буфер SLAVE'а (в таком случае пользователь может быть обескуражен тем, что запросы проходят, но данные не меняются);
Вернуть код ошибки (например, тот же ILLEGAL_DATA_VALUE), а в документации на библиотеку указать в каком случае может возникнуть эта ошибка (в таком случае пользователь опять же может быть удивлен тем, что запрашивает явно корректные регистры, но ошибка указывает, что нет).
Я запланировал эту доработку на следующую версию библиотеки.
Но, думаю, это будет отдельный ФБ:
MB_RTU_SLAVE останется для тех, кому нужно "попроще",
новый ФБ - для тех, кому нужна гибкость.
livethreads
08.07.2018, 19:43
Здравствуйте.
На текущий момент в планах такого нет.
Уточните пожалуйста, почему использование Modbus-TCP через конфигурацию не подходит?
Нужно дублировать данные для нескольких мастер-устройств?
С дублированием данных для разных Master в Modbus-TCP как раз проблем нет: Достаточно добавить в Modbus[FIX] ещё один подмодуль TCP и указать в параметрах другой порт. Я пару лет назад так делал, у меня работало. Проблемы в другом:
1. Необходимо запретить выполнение команд записи в определённые адреса (регионы адресов).
2. Необходима проверка (кастомная) записываемых величин на корректность. Например, целое по адресу 444 может быть исключительно в диапазоне, определяемом значениями в адресах 222 и 223.
3. Бывают ситуации, когда данные, выставляемые в Slave могут быть результатом достаточно тяжёлых вычислений (например, сумма медленносходящегося ряда). В таких случаях готовить их каждый цикл не слишком здорово, хотелось бы выполнять подобные операции только тогда, когда на них есть запрос от Master.
Если я правильно понял идею, то цель следующая: сделать некое подобие "событий" (ниже буду называть так), обработку которого пользователь сможет запретить.
Идея мне нравится. Но есть несколько уточняющих вопросов:
В принципе, можно это назвать обработкой события. Смысл в том, чтобы дать возможность пользовательской программе сделать дополнительные действия непосредственно перед выполнением запроса вашим ФБ.
Я правильно понимаю, что эту переменную мы должны взводить только в случае, если получен корректный запрос (корректный CRC, адрес совпадает и т.д.)?
А в остальных случаях ФБ сам отвечает мастеру об ошибке (или не сообщает, если адрес не тот) не уведомляя об этом пользователя.
Да.
Если я прав с вопросом о <xReqReady : BOOL>, то эта структура содержит "лишние" данные
Я предложил сделать видимой структуру <OMB_SlaveRecievedFrameDescription> потому что это упрощает как вашу задачу, так и работу модернизированного ФБ, нет необходимости создавать новые структуры и в них что-то копировать. Если же вы решите создать отдельную структуру, то перечисленного вами достаточно.
Кстати, в вашей структуре <pRequestData> это указатель на буфер целиком или же только на данные запроса?
Но, на сколько мне известно, стандартной ошибки Modbus для такого случая нет (ILLEGAL_DATA_VALUE возвращается в случае, если № первого регистра в диапазоне допустимых значений, а № последнего - выходит за него).
Как Вы считаете, как себя должен повести Slave в таком случае?
Пока что в голову приходит 2 варианта:
Вернуть ответ "запрос обработан", но не записывать данные в буфер SLAVE'а (в таком случае пользователь может быть обескуражен тем, что запросы проходят, но данные не меняются);
Вернуть код ошибки (например, тот же ILLEGAL_DATA_VALUE), а в документации на библиотеку указать в каком случае может возникнуть эта ошибка (в таком случае пользователь опять же может быть удивлен тем, что запрашивает явно корректные регистры, но ошибка указывает, что нет).
Я предложил добавить входную переменную <eCustomErr : OMB_Slave_SLAVE_BLOCK_ERROR> для того, чтобы пользователь сам решил, какой код ошибки должен быть передан, если запрашиваемая операция по его мнению невозможна (естесственно, в пределах значений от 0..3). Ваш ФБ получает данное значение в следующем цикле ПЛК и продолжает как ни в чём не бывало (0) или же формирует ответ об ошибке (1..3). Всё остальное исключительно на совести пользователя. Если значение за пределами (0..3) то можно поступить на ваше усмотрение: либо считать это (0), либо просто не отвечать мастеру. Мне же встречались устройства, которые на попытку записать в адреса, предназначенные только для чтения возвращали как ILLEGAL_FUNCTION так и ILLEGAL_DATA_ADDRESS.
Спасибо, что откликнулись на предложение.
-=Vovka=-
07.11.2018, 14:14
Панель СП270(мастер) подключена к RS485-1 ПЛК110-30. Связь была уже проверена с вариантом без использования OwenModbusSlave_v2.3.9.4.lib.
Согласно описания подключил библиотеки OwenModbusSlave_v2.3.9.4.lib и BufferTools_v2.3.9.01.lib и написал следующее:
В Типы данных объявляю:
TYPE SLAVE_DATA :
STRUCT
nagr1 : WORD;
obor1 : WORD;
set1 : WORD;
END_STRUCT
END_TYPE
В основной программе:
PROGRAM PLC_PRG
VAR
stComSettings : COMSETTINGS;
stSlaveData : SLAVE_DATA;
fbRtuSlave : MB_RTU_SLAVE;
rxBuf : SLAVE_DATA
END_VAR
stComSettings.Port := 0;
stComSettings.dwBaudRate := 115200;
stComSettings.byParity := 0;
stComSettings.byStopBits := 0;
fbRtuSlave.stComSettings := stComSettings;
fbRtuSlave.usiSlaveAddress := 1;
fbRtuSlave.pSlaveBuffer := ADR(rxBuf);
fbRtuSlave.uiSlaveBufferSize := SIZEOF(rxBuf); <- это правильно? Пробовал SIZEOF(SLAVE_DATA) - ошибка
fbRtuSlave.xForbidRemoteWrite := 0;
fbRtuSlave.xLowerByteForward := 0;
fbRtuSlave.timResponseDelay := gc_timDafaultResponceDelay;
fbRtuSlave.xEnable := TRUE;
В итоге панель пишет, что нет соединения.
Что я делаю не так?
Осинский Алексей
08.11.2018, 16:46
В итоге панель пишет, что нет соединения.
Что я делаю не так?
Вероятно не вызываете сам блок fbRtuSlave так:
fbRtuSlave();
это правильно?
да, правильно
Andrew_Stranger
23.11.2018, 09:04
Добрый день. На ПЛК160 библиотека будет работать?
Осинский Алексей
23.11.2018, 09:44
Добрый день. На ПЛК160 библиотека будет работать?
Да, будет.
Serhioromano
31.03.2019, 07:35
У меня пара вопросов.
1. Использование этой библотеки ускорит обмен данными? Как я понял часто ссылаются что при использовании конфигурации ПЛК работает медленно, и что нужно использовать код, что бы ускорить работу. Или это каксается только мастера? У меня примерно 200 регистров всего но скорость с заметным запозданием.
2. Разумно будет вынести работу этой бибилиотеки в отдельную программу и подуключить ее отедльно в задачу по отдельному циклу? У меня все передаваемые переменные все равно глобальные.
3. Уберет ли эта библиотека ограничение по памяти L или M? Как я понял ограничение именно на окличество регистров в конфигурации, а если их передавать библиотекой то ограничения нет. Правильно?
Осинский Алексей
31.03.2019, 11:58
Добрый день!
1. Использование этой библотеки ускорит обмен данными? Как я понял часто ссылаются что при использовании конфигурации ПЛК работает медленно, и что нужно использовать код, что бы ускорить работу. Или это каксается только мастера? У меня примерно 200 регистров всего но скорость с заметным запозданием.
Скорость обмена по Modbus зависит (в порядке уменьшения влияния):
1) Время передачи запроса\ответа
Зависит от скорости обмена. Чем выше скорость - тем быстрее идет опрос.
Выбранная скорость должна поддерживаться во всех устройствах сети.
Приборы ОВЕН поддерживают скорости от 9600 до 115200 бод.
2) Количество запросов на устройство.
Предпочтительнее опрашивать все необходимые регистры групповым запросом, чем по одному регистру за раз.
3) Таймаут ожидания ответа (сколько времени ПЛК ждет ответа от модуля до того, как посчитает, что модуль не ответил);
При хорошем качестве сети
3.1) для скорости обмена 9600 бод стоит задавать не менее 500мс
3.2) для скорости обмена 115200 бод стоит задавать не менее 50мс
4) Время между фреймами
Пауза между получением ответа на предыдущий запрос и отправкой следующего
Перепроверьте, возможно Вам стоит поднять скорость обмена или объединить единичные запросы в групповой.
2. Разумно будет вынести работу этой бибилиотеки в отдельную программу и подуключить ее отедльно в задачу по отдельному циклу? У меня все передаваемые переменные все равно глобальные.
Поскольку в CODESYS 2.3 многозадачность невытесняющая (задачи выполняются последовательно) то особого смысла в этом нет.
Более подробно о задачах, приоритетах и порядке их выполнения в CODESYS 2.3 можно почитать в справке.
К сожалению у меня только англоязычная версия установлена, поэтому выдержка на английском:
For the execution, the following rules apply:
•That task isexecuted, whose condition has been met; i.e., if its specified time hasexpired, or after its condition (event) variable exhibits a rising edge.
•If severaltasks have a valid requirement, then the task with the highest prioritywill be executed.
•If severaltasks have valid conditions and equivalent priorities, then the task thathas had the longest waiting time will be executed first.
•The processingof the program calls will be done according to their order (top down)in the task editor.
•Dependingon the target system PLC_PRG might get processed in any case as a free-wheelingtask, without being inserted in the task configuration tree.
3. Уберет ли эта библиотека ограничение по памяти L или M? Как я понял ограничение именно на окличество регистров в конфигурации, а если их передавать библиотекой то ограничения нет. Правильно?
Да, лицензия ограничивает объем памяти ввода\вывода и не распространяется на обмен из кода программы.
Serhioromano
01.04.2019, 08:24
Спасибо за ответы. Я наверно не правильно выразился. Да я понимаю что влияет на скорость обмена. Вопрос был по скорости работы самого ПЛК. Есть темы которые говорят что ПЛК медленно читает данные или передает, и поддержка ОВЕН советует делать опросы из кода а не через конфигурацию и ссылаются что конфигурация работает медленне. То есть речь идет не о самой скорости передачи данных, а о скорости работы ПЛК. Видимо обработка данных занимает больше времени если это конфигурация.
Осинский Алексей
01.04.2019, 15:15
Спасибо за ответы. Я наверно не правильно выразился. Да я понимаю что влияет на скорость обмена. Вопрос был по скорости работы самого ПЛК. Есть темы которые говорят что ПЛК медленно читает данные или передает, и поддержка ОВЕН советует делать опросы из кода а не через конфигурацию и ссылаются что конфигурация работает медленне. То есть речь идет не о самой скорости передачи данных, а о скорости работы ПЛК. Видимо обработка данных занимает больше времени если это конфигурация.
Эта рекомендация относится только к Modbus-Master'у. Т.к. ПЛК (при настройке обмена через конфигурацию) не умеет отправлять групповые запросы.
Поэтому время опроса всех регистров (не скорость работы ПЛК) больше по сравнению с обменом через библиотеки (библиотеки умеют работать с групповыми запросами).
прошу прощения за возможный офф-топ.
А есть или были ли попытки сделать на TCP/IP?
Осинский Алексей
24.05.2019, 13:32
прошу прощения за возможный офф-топ.
А есть или были ли попытки сделать на TCP/IP?
Добрый день.
Сейчас работа в режиме Modbus TCP Slave в наших ПЛК поддержана только через конфигурацию.
Библиотека для работы в этом режиме в CODESYS 2.3 пока что не планируется.
На форуме можно найти библиотеки, реализованные другими пользователями, возможно они подойдут. Но их придется поискать.
Нормально модбас-tcp-сервер работает. И программный тоже без проблем
а какой? где,что искать?
ДаниилСПб
13.12.2019, 16:22
Написал в личку, дублирую сюда.
Панель СП310 мастер отправляет скриптом:
void send() {
WORD setpoints[3];
setpoints[0]=PSW[500];
setpoints[1]=PSW[501];
setpoints[2]=PSW[502];
Writes(PLC, 1, MODBUS_RTU_REGS_4X, 0, 3, setpoints);
}
ПЛК154 принимает(через конфигуратор все ОК), через библиотеку корректно не работает, вот код:
TYPE SLAVE_DATA :
STRUCT
v1: WORD;
v2: WORD;
v3: WORD;
END_STRUCT
END_TYPE
PROGRAM PLC_PRG
VAR
stComSettings: COMSETTINGS;
stSlaveData: SLAVE_DATA;
fbRtuSlave: MB_RTU_SLAVE;
END_VAR
stComSettings.Port := 4;
stComSettings.dwBaudRate := 115200;
stComSettings.byParity := 0;
stComSettings.byStopBits := 0;
fbRtuSlave(xEnable := TRUE, stComSettings := stComSettings, usiSlaveAddress:= 1, pSlaveBuffer := ADR(stSlaveData), uiSlaveBufferSize := SIZEOF(stSlaveData));
Serhioromano
13.12.2019, 17:25
Сначала проверьте через библиотеку читает панель данные с ПЛК или нет. Потом пробуйте писать.
Raikkonen
20.07.2020, 10:13
Можно поинтересоваться, а почему было не сделать разные массивы данных для разных функций?
Использую библиотеку с целью возможности оперативного изменения параметров связи с панели управления (Параметры связи опускаются с панели СП307Б на ПЛК160[М02] по RS232 через конфигурацию, опрос ПЛК160 выполняется по RS485 через библиотеку. При смене любого параметра связи в программе "передергивается" на 3с вход xEnable для применения новых параметров) Обмен с параметрами "Адрес, скорость, 8, N, 1" есть, в том числе при изменении любых параметров, кроме четности. Но стоит только задать (на мастере и, соответственно, в библиотеке) вместо параметра N (т.е 0) - ODD или EVEN (1 или 2), как порт тут же замолкает. Мастер "вываливается" по таймауту. Библиотека флаг xError не выставляет, то есть вообще никак не реагирует на поступающий запрос. Стоит выставить снова N вместо E или O, как связь тут же появляется. Опрашиваю с ноутбука через АС-4М.
OwenModbusSlave 2.3.9.4 поддерживает параметры "Адрес, скорость, 8, E, 1" и "Адрес, скорость, 8, O, 1"? Кому-нибудь удавалось установить связь с указанными параметрами через библиотеку? Может есть какие особенности?
Привожу фрагмент реализации:
50558
Добрый день. Получится ли реализовать несколько слейв устройств на одном интерфейсе с помощью этой библиотеки?
Попытался через конфигуратор создать несколько слейвов с одним интерфейсом RS232 - работает пару минут, потом сброс по watchdog.
На старом 110 это прокатывало.
Евгений Кислов
30.08.2020, 16:54
Добрый день. Получится ли реализовать несколько слейв устройств на одном интерфейсе с помощью этой библиотеки?
Добрый день. Нет, не получится.
Как в принципе - без проблем на любом плк.
К автору.
Вероятно руки подводят. Проект где ?
Это какие должны быть руки, что бы добавить 5 слейвов в пустой проект и где то про**ться
Ответ тех.поддержки: На одном физическом интерфейсе - один физический slave.
Так что если это работало - это была случайность))
Добрый день.
Необходимо передавать данные разных областей. Как это можно организовать с помощью данной библиотеки,
если физически показан один функциональный блок?
Спасибо.
Евгений Кислов
29.06.2021, 08:52
Добрый день.
Необходимо передавать данные разных областей. Как это можно организовать с помощью данной библиотеки,
если физически показан один функциональный блок?
Спасибо.
Добрый день.
Если вам нужна модель данных с отдельными областями памяти (т.е., например, чтобы input- и holding-регистры были независимы друг от друга) - то эта библиотека вам не подойдет.
Готовых средств для решения такой задачи у нас нет.
Я имел ввиду разброс адресов пространства. То есть, одна область, допустим, данные рецепта, другая область RealTime.
Евгений Кислов
29.06.2021, 10:07
Я имел ввиду разброс адресов пространства. То есть, одна область, допустим, данные рецепта, другая область RealTime.
А чем должны отличаться эти области?
А чем должны отличаться эти области?
Структурой и количеством данных.
Евгений Кислов
29.06.2021, 11:22
Структурой и количеством данных.
На вход блока передается указатель на данные - можно передать туда указатель на структуру, элементами который будут являться другие структуры и т.д.
Надо только внимательно следить за выравниванием (хотя, по-моему, в CoDeSys V2.3, данные в структурах располагаются вплотную без разрывов - так что достаточно обеспечить выравнивание по регистрам).
На вход блока передается указатель на данные - можно передать туда указатель на структуру, элементами который будут являться другие структуры и т.д.
Надо только внимательно следить за выравнивниванием (хотя, по-моему, в CoDeSys V2.3, данные в структурах располагаются вполотную без разрывов - так что достаточно обеспечить выравнивание по регистрам).
А какой максимальный размер может быть?
Евгений Кислов
29.06.2021, 11:37
А какой максимальный размер может быть?
65536 регистров - т.е. 131072 байт
65536 регистров - т.е. 131072 байт
То есть можно обращаться к части этой области? - со 2-ого регистра по 10, с 25 по 100 отдельно?
Евгений Кислов
29.06.2021, 12:20
То есть можно обращаться к части этой области? - со 2-ого регистра по 10, с 25 по 100 отдельно?
Да, можно.
Да, можно.
Спасибо. Только тогда это ничем не отличается от обмена в конфигурации.
Добрый день.
Второй день уже бьюсь с библиотекой, так и не понял чего она хочет: после загрузки программы первый раз стартует, но если сделать сброс то выдает ошибку INVALID_COM_SETTINGS
59905
Начинает работать только при при перезаливке измененной программы программы
ПЛК160-220.И-М
Евгений Кислов
26.03.2022, 08:48
Добрый день.
Второй день уже бьюсь с библиотекой, так и не понял чего она хочет: после загрузки программы первый раз стартует, но если сделать сброс то выдает ошибку INVALID_COM_SETTINGS
59905
Начинает работать только при при перезаливке измененной программы программы
ПЛК160-220.И-М
Добрый день.
Попробуйте перед сбросом xEnable переводить в FALSE.
Добрый день.
Попробуйте перед сбросом xEnable переводить в FALSE.
Пробовал, та же реакция.
Но в самом ПЛК работает вроде нормально
65536 регистров - т.е. 131072 байт
Я могу сделать доступными 65 тысяч регистров в ПЛК110 для устройств?
Для HMI и SCADA.
В документации сказано
Поддерживается до 125 регистров в запросе.
Это про что-то другое?
Добрый день!
На текущий момент в планах такого нет.
Уточните пожалуйста, почему использование Modbus-TCP через конфигурацию не подходит?
Нужно дублировать данные для нескольких мастер-устройств?
Да. Ещё и с учётом того, что максимальное количество регистров, которое можно сконфигугировать через Конфигурацию ПЛК, 500 (так мне ответили в тех.поддержке). И очень неудобно это делать через конфигурацию.
Евгений Кислов
04.10.2022, 15:46
Я могу сделать доступными 65 тысяч регистров в ПЛК110 для устройств?
Для HMI и SCADA.
В документации сказано
Это про что-то другое?
Можете.
Общий размер карты регистров и максимальное число регистров в запросе - это разные вещи.
В магазине может быть 100 кг картошки, но за раз вы вряд ли унесете больше 20-ти.
Так и здесь.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot