PDA

Просмотр полной версии : Прошу дать пример реализации на CDS2.3 MODBUS RTU485 мастер.(или помочь разобраться)



apushashkov
18.11.2013, 21:57
Работаю с контроллером управления ДГУ DSE, мастер ПЛК100. Сколько не работал с ними(DSE), ни разу не было проблем с модбасом. С ОВЕНом столкнулся первый раз. И что-то не могу осилить. Делаю как в скаченных примерах. Что-то получается, а что то нет. Потом нахожу какие то другие способы работы с модбасом, через конфигуратор, но действия приминимые для TCP не применимы к RTU. Библиотеки modbusa изучил.

Задача условно говоря. Есть устройство с адресом 10, бод 19200, 8бит, none, 1.
Нужно получать данные из регистра 32 бита (1000(16 int)-1001(16 int)) = мощность генератора
данные из регистра 32 бита (2000(16 int)-2001(16 int)) = мощность сети

после некоторых манипуляций записать значение типа INT в регистр 3000.

Казалось бы куда проще. Когда я работаю только с 1 регистром все гуд, но как только начинаю работать с 2 регистрам висят оба. Работаю через библиотеку modbus.lib и с помощью примеров. (кстати не могу понять почему con_num ***INVALID 0*** при работе) но при этом какая то связь идет (так и должно быть).

Пример по читке похожий составил (скорее всего отличается от того что на работе закончил)
Прошу помогите разобраться, очень хотелось бы полную последовательность действий знать при работе с MODBUS RTU

Спасибо.

smk1635
18.11.2013, 22:10
А можно вот с этого места:
Потом нахожу какие то другие способы работы с модбасом, через конфигуратор, но действия приминимые для TCP не применимы к RTU.

поподробнее.
На сколько я в курсе к DSE есть же RS485 с поддержкой протокола MODBUS RTU ?

kgsh82
19.11.2013, 05:26
Могу ошибаться, так как с FBD не работаю, но первое что бросается в глаза - каждый раз открывается порт. Но ведь он открыт уже.
Попробуйте через конфигурацию - с тремя регистрами это не трудно.

apushashkov
19.11.2013, 07:46
Могу ошибаться, так как с FBD не работаю, но первое что бросается в глаза - каждый раз открывается порт. Но ведь он открыт уже.
Попробуйте через конфигурацию - с тремя регистрами это не трудно.

Вот я так и не понял как это делать через конфигурацию... про TCP и 232 вроде понятно, а про RTU 485 нет.


поподробнее.
На сколько я в курсе к DSE есть же RS485 с поддержкой протокола MODBUS RTU ?


Да есть, вот только по нему связаться и не получается. Точнее качествено настроить читку регистров

kgsh82
19.11.2013, 10:56
Вот я так и не понял как это делать через конфигурацию... про TCP и 232 вроде понятно, а про RTU 485 нет.


В чем загвоздка именно?

YuriBel
19.11.2013, 12:04
... мастер ПЛК100...
У вас ПЛК 100 с какой лицензией (L или М).

YuriBel
19.11.2013, 13:00
У вас ПЛК 100 с какой лицензией (L или М).
Пардон, затупил, уже увидел в примере.

Попробуйте вот это, и отпишитесь о результатах. В зависимости от того, что именно будет не так, продолжим...

apushashkov
19.11.2013, 14:17
В чем загвоздка именно?

В том что 232 и ТСП настраиваетс в кофигураторе, и РТУ нет


Пардон, затупил, уже увидел в примере.

Попробуйте вот это, и отпишитесь о результатах. В зависимости от того, что именно будет не так, продолжим...

попробовал, не работает. Я там понял по той причине что в конфигураторе UMD находится не в теле 485 слота. оба значения присылает 0

1000 и 2000 я дал для примера, разумеется в примере опробовал свои значения.

Ниже выкладываю почти рабочую версию программы.

Проблемы начинаются с 10 строчки блога DSE_MODBUS_READ

если первые 2 значения я читаю единой командой а потом как мне надо компаную DWORD(ответ получаю верный). То второй командой мне я пытась прочитать другое значение... но по мимо того что программа не читает его, так еще и начинает переодически портить значение dse_value_second значение постоянно переключается с правильного на 512. (когда убираю эту строку читка работает отлично). В этом же блоке реализовал запись регистра в DSE но не вижу что бы значение приходило в контроллер.

YuriBel
19.11.2013, 15:04
попробовал, не работает. Я там понял по той причине что в конфигураторе UMD находится не в теле 485 слота. Ниже выкладываю почти рабочую версию программы.


Библиотека и конфигурация - вещи разные, и смешивать и х в проекте не следует. Про работу с библиотекой я вам не помогу, если хотите разобраться с конфигурацией, давайте попробуем.
В тело "слота 485" ничего не вставляется, поэтому не работает не поэтому, а потому, что , например:
а) прибор не поддерживает групповое чтение регистров (тогда младший и старший регистры нужно читать по одному, а в программе вычислять значение)
б) команда для чтения, установленная в конфигурации, не соответствует команде, на которую прибор будет отвечать
в) адрес регистра указан неверно (например, нумерация регистров в приборе ведется в соответствии с стандартным подходом (input registers, holding registers, coils, и т.д. ) и начальный регистр имеет номер 1 )
г) неправильно установлены таймауты.

Проше всего попробовать получить-таки данные из одного регистра, а потом двигаться дальше.

apushashkov
19.11.2013, 15:13
Библиотека и конфигурация - вещи разные, и смешивать и х в проекте не следует. Про работу с библиотекой я вам не помогу, если хотите разобраться с конфигурацией, давайте попробуем.
В тело "слота 485" ничего не вставляется, поэтому не работает не поэтому, а потому, что , например:
а) прибор не поддерживает групповое чтение регистров (тогда младший и старший регистры нужно читать по одному, а в программе вычислять значение)
б) команда для чтения, установленная в конфигурации, не соответствует команде, на которую прибор будет отвечать
в) адрес регистра указан неверно (например, нумерация регистров в приборе ведется в соответствии с стандартным подходом (input registers, holding registers, coils, и т.д. ) и начальный регистр имеет номер 1 )
г) неправильно установлены таймауты.

Проше всего попробовать получить-таки данные из одного регистра, а потом двигаться дальше.

Каюсь ибо замыленый глаз не уловил ошибку, да с конфигуратором я читаю 32 битные регистры, но возник вопрос как прочитать 16-битный... и что еще более важно, записать 16-битный регистр?

Кстати подскажите как мне теперь доставать эти значения в программе? (уже настолько затерся что очевидные вещи тяжелы для понимания)

YuriBel
19.11.2013, 15:23
потерпите 10 минут, щас слеплю примерчик.

YuriBel
19.11.2013, 15:33
Вот как-то так. Имена переменных, присвоенные в конфигураторе, имеют статус глобальных (то есть переопределять их нигде не надо, можно просто к ним обращаться, либо вбивая их вручную, либо через F2, кроме того, они попадают в область Retain и при выключении питания сохраняются.

apushashkov
19.11.2013, 16:09
Вот как-то так. Имена переменных, присвоенные в конфигураторе, имеют статус глобальных (то есть переопределять их нигде не надо, можно просто к ним обращаться, либо вбивая их вручную, либо через F2, кроме того, они попадают в область Retain и при выключении питания сохраняются.

Спасибо. Сейчас заряжу аккумуляторы и протестирую. Как я понял из примера что в конфигураторе Register input module имеет как раз размерность 16, но на нем это не написано в названии как на 32 и 8 битных.

Кстати возник такой вопрос пока работал с 32 битными регистрами. Значение которое записывалось в 1000 рег переползало в 2000 потом в 3000 и.т.д. потом опять в 1000. Так же было что регистры показывают верные значения но не в своих адресах. А возможность значение из скажем регистра 1000 такое же как в 2000 исключена.

YuriBel
19.11.2013, 16:58
В терминологии Modbus под регистром понимается 16-разрядная структура. Для того, чтобы понять, что и как (вероятнее всего) происходит в штатном мастере конфигурации ПЛК рекомендую внимательно прочитать про Modbus (какие типы данных какими командами передаются и какова структура запроса и ответа у той или иной команды) и посмотреть в настройках элементов конфигурации, какие команды используются. Многое прояснится. Особенно, если параллельно посмотреть формат команд под сниффером. Насчет переползания данных, вы по всей вероятности про библиотеку говорите, тут я ничего не подскажу. Кстати, те корифеи здешней конференции, кто предпочитает работать через библиотеку, допиливали ее под свои нужды, про это тоже можно почитать.

apushashkov
19.11.2013, 17:11
DEL туплю безбожно

YuriBel
19.11.2013, 17:50
Что сделать-то нужно?

YuriBel
19.11.2013, 18:07
Если я правильно понял, что именно не получается, то :
1. Для того, чтобы поименовать переменные в конфигурации, нужно поставить курсор на заголовок АТ конкретного элемента и нажать левую кнопку мыши. Откроется квадратик, в который нужно вписать имя переменной, которое отныне будет связано с этим элементом (регисторм Modbus или элементом 32 бит, в котором по сути содержатся 2 регистра). При этом это имя больше нигде не должно быть объявлено ни до этого, ни после, то есть дальше этим имнем можно просто пользоваться.
2). Для этого в окне программы или ФБ ставим курсор на три красных вопросика и нажимаем F2. открывается ассистент ввода в котором есть разделы локальных и глобальных переменных. там выбираем глобальные переменные и обнаруживаем в списке имена, присвоенные нами элементам конфигурации (кстати точно также можно именовать и входы и выходы контроллера). Выбираем нужное имя из списка и пользуемся.
3). И еще, пока вы не залезли глубоко - не стоит ли перейти ли на CFC в основоной программе? по сути очень похоже на FBD, только нагляднее и удобнее. Рекомендую.

apushashkov
19.11.2013, 19:42
Если я правильно понял, что именно не получается, то :
1. Для того, чтобы поименовать переменные в конфигурации, нужно поставить курсор на заголовок АТ конкретного элемента и нажать левую кнопку мыши. Откроется квадратик, в который нужно вписать имя переменной, которое отныне будет связано с этим элементом (регисторм Modbus или элементом 32 бит, в котором по сути содержатся 2 регистра). При этом это имя больше нигде не должно быть объявлено ни до этого, ни после, то есть дальше этим имнем можно просто пользоваться.
2). Для этого в окне программы или ФБ ставим курсор на три красных вопросика и нажимаем F2. открывается ассистент ввода в котором есть разделы локальных и глобальных переменных. там выбираем глобальные переменные и обнаруживаем в списке имена, присвоенные нами элементам конфигурации (кстати точно также можно именовать и входы и выходы контроллера). Выбираем нужное имя из списка и пользуемся.
3). И еще, пока вы не залезли глубоко - не стоит ли перейти ли на CFC в основоной программе? по сути очень похоже на FBD, только нагляднее и удобнее. Рекомендую.


Большое спасибо, удалил пост как раз иза того что разобрался со всеми ошибками. Проблема был в том что не записывался регистр в 35109, разобрался сменив RSR(x6) на WMR(x16). Опыт работы с ПЛК имеется но вот с ОВЕНом пришлось знакомиться за полтора дня ибо дали именно его и как и пологается нужно уже вчера. Потому времени на штудировку типа справочника Ганса Бергера увы не было. Сделал по быстрому фаст старт и сразу за модбас. Если честно после длительного общения с Siemens-Desigo и КОНТАР развилось некое отвращение к CFC. Хотя тут он безусловно удобнее. Увы FBD или LAD было навязано ТЗ. Так в основном практикую то что в CODESYS называется ST и IL.

ПЛК100 понравился, никаких танцов с бубном в процессе конфигурирования заливки и отладки. + что можно в визуализации мониторить. Возник вопрос. Может ли он одновременно работать как мастером так и слейвом? На данный момент есть 2 контроллера DSE, 1 контроллер S1200 и планирую 1 ПЛК100 + панель weintek. Как успел прочитать проблем работы с этой панелью и ОВЕНа нет. Каждый контроллер является мастером для своего DSE и слейвом для Weinteka.

Такая задумка так как намного удобнее обработать регистры средствами программирования ПЛК и преобразовать из в инженерные величины чем, шаманить в weinteke.

Flicker
19.11.2013, 20:15
подпишусь на тему. тоже в планах связать плк100 и weintek по модбасу, пока читаю набираюсь опыта

YuriBel
19.11.2013, 23:08
контроллер может быть одновременно мастером и слейвом, но только по разным интерфейсам. Так что никаких проблем быть не должно. С wientek все вяжется легко.

apushashkov
20.11.2013, 01:18
контроллер может быть одновременно мастером и слейвом, но только по разным интерфейсам. Так что никаких проблем быть не должно. С wientek все вяжется легко.

Вот над этим не подумал, но ведь правильно понимаю что можно сделать ПЛК100 мастером по 485 RTU мастером для DSE и для weinteka, а с панели производить манипуляции на DSE или панель может быть только мастером в данном случае?

YuriBel
20.11.2013, 10:05
В принципе можно реализовать разные подходы, чтобы давать какие-то рекомендации, нужно более четко представлять требуемую функциональность всего комплекса и перспективу его расширения. Как минимум, можно на одном интерфейсе сделать контроллер мастером, DSE и панель слейвами, можно сделать контроллер мастером для DSE по одному интерфейсу и слейвом для панели по другому, можно панель сделать мастером и для DSE и для контроллера, и обойтись одним интерфейсом. А еще можно в панели организовать требуемую функциональность (если получится) и обойтись вообще без контроллера. Вариантов много, какой удобнее и быстрее реализовать - не зная деталей сказать сложно.