PDA

Просмотр полной версии : и снова про регистры :(



Кольцов Сергей
07.02.2011, 19:36
Извиняюсь за офтоп, но что то я совсем потерялся.
Наваял такую вещь:
modbus slave
var регистр бит нач. биты конеч.

sU1 0x00 0 15
sV1 0x01 16 31
st1 0x02 32 47
sh1 0x03 48 63
sU2 0x04 64 79
sV2 0x05 80 95
st2 0x06 96 111
sh2 0x07 112 127
sU3 0x08 128 143
sV3 0x09 144 159
st3 0x10 160 175
sh3 0x11 176 191
sP13 0x12 192 207
sP11 0x13 208 223
sP12 0x14 224 239
sP14 0x15 240 255
rejim 0x16 256 271
error 0x17 272 287
8bit 0x18 288 295
8bit 0x18 296 303
deist 0x19 304 311
krit 0x20 312 319

18 регистр для выравнивания, но смутил меня codesys потому как адресация получилась у него сквозная. На скрине видно что получилось
8bit 0x18 288 295
8bit 0x19 296 303
deist 0x20 304 311
krit 0x21 312 319

в настройках стоит автоматическое выравнивание.
Так вот, прав ли я что буду обращаться к deist и krit по адресам 19 и 20 соответственно? или codesys всётаки прав и нужно по 20 и 21?

lara197a
08.02.2011, 08:15
У вас не видно начала и конца на скрине.
Так все выравнено: 2 byte или 2 по 8 bite это и есть 1 регистр.
Считайте регистры начиная с нулевого сверху в низ.
19 и 20

Николаев Андрей
08.02.2011, 10:40
Не путайте адреса %I или %Q и адреса ModBus...
В данном конкретном случае просто совпали. Ничего не значит. Надо считать с начала, как описано в инструкции.

drvlas
08.02.2011, 14:00
Я, не отвечаю, я пробую понять...

Сергей, вот это ты создал сначала "в уме":


error 0x17 272 287
8bit 0x18 288 295
8bit 0x18 296 303
deist 0x19 304 311
krit 0x20 312 319

...с решением, что второй байт битной области тебе не нужен? Так? То есть, себе на бумажке записал, что есть еще 8 бит исключительно для выравнивания.
А потом создал в конфигураторе ПЛК ДВА РАЗА 8-битовое поле?

Если ответ "да", то думаю, что Конфигуратор четко отработал - только он оба раза сам выровнял до 2-хбайтного. Поэтому и видим на скрин-шоте, что присвоены адреса 18 и 19.

Т.е. мое предположение, что не надо за Конфигуратор работать. Создал 8 бит (скажем, по адресу 18), знай - есть припрятанные еще 8 бит. Они тебе нормально недоступны, так ты и задумывал это.
Следующую переменную (deist в твоем случае) Конфигуратор поставит на адрес 19.
А обращаться нужно, ИМХО, по тем адресам, которые видишь в Конфигураторе. А как же иначе?

Или я не прав?

Николаев Андрей
08.02.2011, 18:41
Меня никто не услышал???
НЕЛЬЗЯ судить об адресах ModBus на приведенном скриншоте. НЕЛЬЗЯ!!!
Регистр - есть два байта.
Первые добавленные 2 байта - будут 0 регистр, вторые 2 байта - регистр с адресом 1. Если Вам CoDeSys напишет МЭК адрес %QW20.99 - Вы считаете, что это у Вас 20 регистр ModBus? Или 99???
Подтягиваем мат. часть господа...

Да, и 8-ми битные переменные действительно нужно ставить по 2. Но рекомендую ставить их в самом начале списка, так как к ним можно и по регистру обращаться и побитно.

Кольцов Сергей
08.02.2011, 19:19
Благодарю откликнувшихся!
Итак подведём итог, вопрос остался, спор разгорается :)

Выкладываю недостающие скрины и надеюсь на точный ответ.

то: Николаев Андрей
регистры до 18 2 байтовые начиная с 0.

Какие номера битов в 8 битных "полурегистрах" 18, 19 по конфигуратору.

drvlas
08.02.2011, 20:52
Не путайте адреса %I или %Q и адреса ModBus...
В данном конкретном случае просто совпали. Ничего не значит. Надо считать с начала, как описано в инструкции.

Для моего уровня понимания это не то, чтобы "ничего не значит"... Это мало что значит, уважаемый Андрей. Пишите экспликативнее и люди к вам потянутся :)

Хотелось бы именно получить конструктивное обсуждение в вопросах, не понятых после изучения матчасти. Почему Вы решили, что все все сразу понимают? Описалово ни на КДС, ни на ОВЕны не является образцом ясности и непротиворечивости.

Позволю высказать свое понимание связи между адресами Модбаса и цифирьками в окошке Конфигуратора (вот теми самыми, что уважаемый Сергей привел в скрин-шоте). Связи нет вообще, точнее, разработчик устанавливает ее сам, описывая вводимую переменную. А именно:
(вот это поток сознания можно пропустить)
"Цифирьки" раздает м-р Конфигуратор, по своим правилам. Там МЭК, иерархия, "читайте матчасть" и прочая - не буду в это углубляться. Сам не очень врубился, но достаточно стройненько растут цифирьки. И каждый новый адрес "уровня" регистра означает место, выделенное в памяти ПЛК. Причем, меньше, чем 2 байта Конфигуратор не резервирует.
Вот откуда имеем 9.19.0 и 9.20.0. В этих адресах "9" - это номер первого уровня иерархии (у меня так получается, что на весь Модбас-Мастер выделен один такой номер), а "19" и "20" - как раз адреса 2-хбайтных или 4-хбайтных зон (переменных) в памяти ввода-вывода ПЛК. Если на один Модбас-девайс завести несколько Universal Modbus device'ов, то между "9" и номером переменной вклинится еще номер Universal Modbus device'а.

Уф! КАРОЧИ, номера Конфигуратор раздает - и спасибо ему огромное. А вот номера регистров Модбаса разработчик выбирает сам и записывает для каждой переменной в закладочке "Параметры модуля". И тут уж - гуляй душа! Назначаем как угодно и без всякой связи с адресами переменных, присвоенными Конфигуратором по своей прекрасной системе.

Андрей, вот это - я верно понял? Спасибо!

Теперь по вопросам топикастера.

1) Думаю, на "Какой адрес регистра?" можно ответить так:
Если об адресе в памяти ввода-вывода - то вот он, написан, %QB9.20.0
Если об адресе (номере) регистра Модбас - смотри, что написал сам в закладке "Параметры модуля"

2) Ну, а адрес бита block - %QB9.20.0.0

Вопрос Сергею: А зачем тебе адреса? В программе ПЛК обращаешься по именам, а со стороны Модбаса - читай свои вкладки "Параметры модуля". Там ты назначаешь какие угодно адреса и потом описываешь их в РЭ на свой контроллер.

С нетерпением жду оценки моих ответов от знатоков.

Кольцов Сергей
08.02.2011, 20:58
Вопрос Сергею: А зачем тебе адреса? В программе ПЛК обращаешься по именам, а со стороны Модбаса - читай свои вкладки "Параметры модуля". Там ты назначаешь какие угодно адреса и потом описываешь их в РЭ на свой контроллер.



Дружу панель ИП320 с ПЛК. Конкретно аппаратные кнопки назначаю. Установить бит 0x.... Вот с этим и вышла заковыка, пока я не вылез за первый "8 битный" регистр всё было хорошо.

Gans
08.02.2011, 21:05
Выкладываю недостающие скрины и надеюсь на точный ответ.
Адрес регистра 18 (с учетом что первый регистр имеет адрес 0!!!) в скриншоте правда указано не начало регистра.
Номер бита 18*16+8=296 (с учетом что первый бит имеет адрес 0!!!)
Нормальный вопрос, конкретный ответ :-)
P. S. я правда биты и регистры стараюсь раскладывать в разные слейвы - и таких вопросов ваще не возникает;)

Кольцов Сергей
08.02.2011, 21:23
to: Gans Привет землякам!

то-есть что у меня и получилось
8bit 0x18 288 295
8bit 0x18 296 303
deist 0x20 304 311
krit 0x21 312 319

Получается забиваем на номера регистров выставленные конфигуратором?

drvlas
08.02.2011, 21:29
Дружу панель ИП320 с ПЛК.

Ах вот оно что! Ну, здесь уже могу ответить более уверенно, т.к. у меня работает, моя первая связь ;)

Конечно, можно следовать советам бывалых и

- либо располагать все биты в начале
- либо заводить виртуально несколько модбас девайсов (привет уважаемому Учителю Gans'у!)

Но не такая уж высшая математика просто просчитать все аккуратненько. Вот как я начал таблицу:

3419

Потом пошла область многобитных переменных, а потом добавил опять битовые:
3420

Вот эти вычисленные табличкой адреса (столбцы "4xAddr" и "0xAddr") я ставил в Конфигуратор ИП320, а имена (столбец "Название") присваивал переменным, которые заводил Конфигуратором ПЛК. В силу того, что ПЛК работал Слейвом, мне не нужно было беспокоиться о номерах регистров в Модбасе - Конфигуратор сам наращивал адреса, а я прописывал туда заготовленные имена переменных (битов и регистров).

Так что мои рассуждения о номерах регистров Модбаса касаются только случая, когда ПЛК работает мастером...

Gans
08.02.2011, 21:37
Получается забиваем на номера регистров выставленные конфигуратором?
Каждый раз пробегаемся глазками и считаем в уме или на калькуляторе.
и не забываем, что нумерация в конфигураторе может не совпадать например:
1. в начале было 4 раза по "8 бит"
2. в начале был один "4 байта"
и в первом и втором примере адресация последующих битов и регистров будет одинаковая для обращения из вне, а вот нумерация в кодесис будет разной;)

Кольцов Сергей
08.02.2011, 22:11
Каждый раз пробегаемся глазками и считаем в уме или на калькуляторе.
и не забываем, что нумерация в конфигураторе может не совпадать например:
1. в начале было 4 раза по "8 бит"
2. в начале был один "4 байта"
и в первом и втором примере адресация последующих битов и регистров будет одинаковая для обращения из вне, а вот нумерация в кодесис будет разной;)


Каждый раз пробегаемся глазками и считаем в уме или на калькуляторе.
и не забываем, что нумерация в конфигураторе может не совпадать например:
1. в начале было 4 раза по "8 бит"
2. в начале был один "4 байта"
и в первом и втором примере адресация последующих битов и регистров будет одинаковая для обращения из вне, а вот нумерация в кодесис будет разной;)

Итак....попробую для себя подвести итог.

расчётные величины:

переменная___адрес slave__номер начального бита____конечного бита

sU1 0x00 0 15
sV1 0x01 16 31
st1 0x02 32 47
sh1 0x03 48 63
sU2 0x04 64 79
sV2 0x05 80 95
st2 0x06 96 111
sh2 0x07 112 127
sU3 0x08 128 143
sV3 0x09 144 159
st3 0x10 160 175
sh3 0x11 176 191
sP13 0x12 192 207
sP11 0x13 208 223
sP12 0x14 224 239
sP14 0x15 240 255
rejim 0x16 256 271
error 0x17 272 287
8bit 0x18 288 295
8bit 0x18 296 303 конфигуратор кодесис выставляет 0x19
deist 0x19 304 311 конфигуратор кодесис выставляет 0x20
krit 0x20 312 319 конфигуратор кодесис выставляет 0x21

из панели мне нужно обращаться по расчётным адресам и биты для 8битных переменных я посчитал правильно.

Правда теперь возник другой вопрос, а что тогда делает конфигуратор и как автовыравнивание работает? (но это совсем другая история :) )

Николаев Андрей
09.02.2011, 18:46
Мдя...
Господа DrvLas и Кольцов Сергей:
Настойчиво рекомендую почитать документацию. Что такое область памяти входов\выходов в ПЛК - вопрос не относящийся к ПЛК ОВЕН.
Однако этот вопрос в документации на ПЛК освещен. Ну и мануальчик по CoDeSys бы я почитал, про области входов\выходов.

drvlas
10.02.2011, 10:03
Господин Николаев! Вы, наверное, так много прочли, что уже не в состоянии вчитываться в то, что Вас спрашивают.
Цитирую себя, любимого:


Хотелось бы именно получить конструктивное обсуждение в вопросах, не понятых после изучения матчасти.


Есть конкретное место в конкретном документе, которое дает ответ на наши вопросы? Нечто такое, что вот Вам лично стало совершенно ясно: именно это место мы

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

...так укажите его, пожалуйста!
На мой взгляд, ни один из приведенных пунктов недостаточности знакомства с матчастью не является поводом бросать в нас камни, уважаемый Андрей.
Нет у Вас терпения на таких недотеп? Не отвечайте. Заберите свое "Мдя" себе... на память и дайте возможность терпеливому Gans'у помочь народу. Он это умеет, слава Богу.

А хотите отвечать - учитесь отвечать. Ваши ответы в данной конкретной теме являются хорошим учебным пособием, как не надо отвечать. Я Вам это сейчас покажу.
Сначала совет из разряда "так нельзя" (характерно для Вас, ни слова о том, как можно):

Не путайте адреса %I или %Q и адреса ModBus...
В данном конкретном случае просто совпали. Ничего не значит. Надо считать с начала, как описано в инструкции.

Затем, уже несколько раздраженно:

Меня никто не услышал???

И снова о том, что НИЗЗЯ:


НЕЛЬЗЯ судить об адресах ModBus на приведенном скриншоте. НЕЛЬЗЯ!!!

Ну, теперь немного интриги, разбирайтесь в тонкой разнице между "0 регистр" и "регистром с адресом 0":

Первые добавленные 2 байта - будут 0 регистр, вторые 2 байта - регистр с адресом 0.

Конечно же, совет начитанного:

Подтягиваем мат. часть господа...

Еще раз для тех, кто в танке:

Настойчиво рекомендую почитать документацию...
Однако этот вопрос в документации на ПЛК освещен. Ну и мануальчик по CoDeSys бы я почитал, про области входов\выходов.

Вам нравится, что Ваши советы оказываются не востребованными конкретными господами DrvLas и Кольцов Сергей? Тогда продолжайте. Только не раздражайтесь. Это плохо влияет на пищеварение.

Николаев Андрей
10.02.2011, 11:26
Ну вот, опять drvlas все пытается свести к холивару, и попытке как то самоутвердится... Опасно это на форуме ОВЕН на модераторов ОВЕН шипеть, о чем Вы к стати не однократно предупреждены были ;)
И что Вы своим сообщением сделали полезного? Чем то помогли Сергею? На мой вкус Вы своими неуместными, дилетантскими репликами только все испортили, и человек, последовав Вашему примеру не стал пытаться разобраться в вопросе...
Цель форума направить, а не учить. Для того, чтобы научить было написано море документации, чтобы этих вопросов не возникало... Кто бы её пробовал читать... :(

От слов к делу:
Для тех, кто ленится полистать документацию сам, и пропускает:
Каталог ОВЕН - глоссарий, стр.367.
Документы с диска:
CoDeSysv23_RU.pdf - разделы 6.6 и 10.12
PLC_Configuration_OWEN.pdf:
Общая часть - стр. 5-8, 11-15.
ModBus Slave - стр. 40-52, особенно страницы 50-52
Форум - ПОШАГОВОЕ описание: http://www.owen.ru/forum/showpost.php?p=7574&postcount=8
Возможно Вы на сайте разработчика CoDeSys описание работы с PLC Configuration посмотрели???
http://www.3s-software.com/index.shtml?ru_ru_Produkt-Tour
Может хотя бы краем глаза описание ModBus почитали???

А теперь серьезно:
1. С данного момента времени любые Ваши попытки развести холивар, господин drvlas будут пресекаться. Жестко. И это не только мое субъективное мнение. Кроме негатива Вы ничего полезного на форуме не сделали.
Оставляю за собой право считать высказывания личного характера (в виде пожеланий хорошего пищеварения и рассказов что кому и куда надо забрать) нарушением правил форума, что повлечет за собой выдачу нарушения с временным отстранением от форума.
2. Когда ты приходишь с вопросом - научить задавать вопрос, и будь готов услышать и попытаться понять ответ. Не понятен ответ - переспроси, уточни, а не просто проигнорируй слова отвечающего, тем более модератора.

Ну и чтобы не возникало вопросов немного о себе (дабы отбросить вопросы о компетентности):
Куратор направления ПЛК в компании ОВЕН.
5 лет занимался поддержкой клиентов.
3 года вел обучающие семинары по ПЛК.
По сей день веду техническое сопровождение ключевых клиентов.

Ну и последнее - для тех, кому тяжело, не понятно, не охота разбираться - милости просим на обучающие семинары по CoDeSys. Благо мы их проводим с завидным постоянством.


P.S.: Слукавил - одно полезное дело Вы сделали - в посте, где я подсказывал по формированию памяти ModBus случайно опечатался: естественно, что вторые два байта будут вторым регистром, с адресом один. Спасибо.
С уважением, и наилучшими пожеланиями,
Николаев Андрей.

Илья Кареткин
10.02.2011, 12:24
Чтобы разбавить общение и вернутся к теме, выкладываю одну из своих любимых картинок для ПЛК-Slave:

Кольцов Сергей
10.02.2011, 20:31
И всё-таки свершилось!
Спасибо Илья это именно то что было нужно! Всё встало на свои места. Теперь то понятно, что сдвиг делает конфигуратор, а не юзер путём вставки лишних 8битных регистров как это сделал я :). Правда по ходу дела и регистр который я вставил для выравнивания пошёл в дело.
Благодарю всех откликнувшихся!

afsh
28.03.2011, 19:54
Чтобы разбавить общение и вернутся к теме, выкладываю одну из своих любимых картинок для ПЛК-Slave:

Спасибо за ответ, ясно излагает тот, кто знает на самом деле. И не нужно было всего флуда.

Safron
21.04.2011, 09:10
Всем привет. У меня такой вопрос. В конфигураторе ПЛК организовал модуль Модбас(слейв) для связи с панелью. Панель является мастером. В этом модуле, то бишь Модбас(слейв), я добавил подэлемент Модбас (мастер)-тоже 485 RTU. Добавил УниверсалМодбайсДивайс. Добавил РегистрИмпутМодуль -АТ% 18.11.1.0.0.
То есть таким образом хочу организовать шлюз с одним из преобразователей аналового сигнала, который может работать по Модбасу. Панель-> PLC-> Device.
В документации к дивайсу даны регистры.
Например один из них:Регистр- MAXOUT_FL_H, и даётся его адрес ADD - 40050, R/W.
Вопрос как мне этот адрес (40050) указать в ПЛК конфигурации. Или не париться и не обращать внимания на это число. А просто обозвать по имени нужный мне регистр в ПЛК конфигурации. MAXOUT_FL_H АТ% 18.11.1.0.0.?
Или как?

swerder
21.04.2011, 09:42
что-то вы не то ваяете. добавляется отдельно слэйв, отдельно мастер. значение из мастера через присваивание в программе передается по слэйву

Safron
21.04.2011, 11:34
Мне необходимо получать не только данные из девайса. Но и входить в режим конфигурирования. Редактирование значений будет происходить в Панели (Мастер), потом обрабатываться в ПЛК и далее идти на запись в дивайс. Именно поэтому я пытаюсь проработать такой вариант, если это не возможно, тогда буду искать другой вариант.
Но в любом случае мне не ясно как поступать с адресацией данной в описании к дивайсу. См. выше.

swerder
21.04.2011, 13:01
в сети rs485 может быть только 1 мастер. т.е. для девайсов им будет либо контроллер, либо панель. ну а дальше даж не знаю как у вас получится соединить панель с плк в такой сети.
не буду настаивать, но если вы разнесете панель и девайсы на разные интерфейсы и будете "пробрасывать порты" через контроллер (с выполнением каких-либо операций над данными по необходимости), то все это будет и проще и стабильнее.

Safron
21.04.2011, 13:34
Хорошо. Даже если, я разнесу дивайсы по разным интерфейсам, что с адресом делать я не пойму. Меня в данный момент беспокоит не конфигурация оборудования, а РЕГИСТР.

swerder
21.04.2011, 15:04
видимо в universal modbus device, там где задается номер регистра, и надо вписать этот номер. проименовывание в ПЛК конфигурации регистра именем MAXOUT_FL_H приведет к тому, что у вас в проекте просто появится глобальная переменная, получающая свое значение из сети

Safron
21.04.2011, 15:24
Я тут пытаюсь вникать в описалово по Модбасу и если я правильно рассуждаю. То адресация дивайса происходит следующим образом.
У меня даны регистры с номерами, ну например, 40044, 400049, 40057 и т.д. и т.п. Цифра 4 означает, что обмен идёт согласно функции 3. А остальные цифры, как я понимаю, и есть сами адреса. Если у меня в конфигурации занято (перед дивайсом)в области ввода/вывода ровно 43 регистра , то я их (номера 44,49, 57) должен оставить как есть, соответственно между 44 и 49, 49 и 57 будут не занятые регистры(пустые придётся добавить). Либо если, другими дивайсами занято пространство, ну к примеру, 60 регистров, то на эту разницу (60-43=17) изменится вся адресация и тогда, 44 станет 61 (44+17),49 станет 66, а 57 станет 74.
В общем, хотелось бы знать правильные у меня рассуждения или я всё таки не догоняю...?

Safron
21.04.2011, 15:29
Дополнение к предыдущему..
Хотя наверное "пустые " регистры можно было бы использовать, а 44, 49 и 57 зарезервировать под этот дивайс...

swerder
21.04.2011, 16:38
кажется вы совсем зачитались. надо отдохнуть/поспать/по усмотрению.
номера регистров "например, 40044, 400049, 40057", как вы и писали, даны в руководстве для вашего "дивайса". к другим вашим "дивайсам" они отношения не имеют.
попробую пояснить максимально просто: на улице Ленина (сеть модбас) расположено несколько домов с адресами 16, 24,48,...(адреса "дивайсов"). в каждом доме есть квартиры (регистры). в одной из квартир лежит сундук с золотом. как до него добраться? идем в дом №х квартиру №у.

Safron
21.04.2011, 21:30
OK. Спасибо. Кажется начинаю понимать. Регистримпутмодуль. В параметрах модуля устанавливается значение этого регистра. Я думал, что здесь назначение адресов регистров происходит также попорядку, как если бы в устройство Модбас (слейв или мастер) добавлять байты, флоат и прочее.
Здесь оказывается по другому. Здесь всё прописывается в параметрах модуля. Спасибо ещё раз.
Теперь следующий вопрос. Насколько я понимаю для чтения регистра надо добавлять registerimputmodule, а для записи - Registeroutputmodule. А тогда как быть в случае R/W ??

drvlas
21.04.2011, 22:11
как быть в случае R/W ??
Я делал 2 канала, один на ввод, другой на вывод. Вполне удобно

Safron
22.04.2011, 05:03
OK. Спасибо. Похоже другого варианта нет.

drvlas
22.04.2011, 09:47
Я думал, что здесь назначение адресов регистров происходит также попорядку, как если бы в устройство Модбас (слейв или мастер) добавлять байты, флоат и прочее.
Здесь оказывается по другому. Здесь всё прописывается в параметрах модуля
Я тоже так думал и даже помучил знатоков вопросами :) А потом пришло понимание, которым хочу поделиться. Потому что понимание значительно лучше запоминания.
Мое понимание связано с использованием понятий "клиент-сервер" вместо или вместе с понятиями "мастер-слейв". Да, кто-то более образованый в данном вопросе найдет разницу. Но нам покатит и так.

Где лежат данные в паре "клиент-сервер"? На сервере (= у слейва). Чтобы разместить данные в памяти, нужно резервировать ячейки - байты, слова, двойные слова, стринги... Естественно, что резервирование компилятор будет производить по некоему правилу, но все же - в порядке возрастания адресов. Вот откуда то наращавание адресов, которое мы видим в Конфигураторе и о котором ты пишешь.

А теперь посмотрим на клиента (мастера, инициатора обмена). Ему нужны данные, хранимые на сервере. Ему может захотеться обратиться к любому из имеющихся адресов (номеров регистров). То есть Конфигуратору клиента (мастера) нужно сказать: "наша переменная по адресу АТ%18.11.1.0.0 в (нашей) области ввода-вывода находится на сервере в регистре номер 40050". Именно при конфигурировании мастера мы и заносим в Register Input(Output) Module во вкладку "Параметры модуля" как Register Address.

Резюме. При работе с Конфигуратором ПЛК нужно:

У слейва разместить данные (последовательно возрастают адреса памяти)
У мастера - указать, по какими номерами регистров на сервере лежат данные

При работе не с Конфигуратором адреса в памяти сервера можно связывать с номерами регистров Модбаса произвольным образом. Отсюда такие номера как 40000, 30000 и т.д.

drvlas
22.04.2011, 10:06
По другому - можно. И нужно.
Можно. Но всегда ли нужно?

Если я верно понял смысл твоего примера:
Мастеру нужно постоячнно мониторить все данные на сервере, сравнивая их со своими копиями. Ничего себе траффик может гудеть!

А в чем выгода? Только потому, что "раздваивать ввод-вывод - клиника", как сказал один парень?
Ну, нам не холодно и не жарко от того, что при желании изменить данные я пишу

АТ%18.11.1.0.0 := 12345;

а при желании прочесть данные я обращаюсь к АТ%18.12.1.0.0 (другой адрес в области обмена). Очень даже комфортно нам в нашей больничке :)

Safron
22.04.2011, 14:48
Спасибо. Буду переваривать. Интересного много...

drvlas
23.04.2011, 09:02
Каждый сам себе выбирает больничку по душе.:)
То что народ вообще тут трется - это уже диагноз.
Что-то ты мрачноват, Учитель. Я тоже чту Страстную Пятницу, но как-то смиреннее :)


Для себя решил. Всегда.
Не зарекайся. Думаю, что задачи бывают разные - и оптимальная организация обмена тоже не всегда одна и та же. Несмотря на видимый душевный комфорт от "четкого решения навсега".

Чтобы читающим нас было понятно, вокруг чего идет спор, я позволю себе чуть подробнее показать специфику своего обмена.
Основной прикол тут в динамичности требований. В процессе работы программа ПЛК может находиться в разных состояниях (фазах работы). В одном состоянии требуется работать с одной группой данных, хранящихся у слейва (сервера), в другом - с другой группой. Иногда, по действиям оператора или иным событиям, возникает задача разового обращения к некоей третьей, четвертой группе. И, как неизменная составляющая, в фоновом режиме постоянно вычитываются одна важная парочка регистров.
Все это, заметьте, с совершенно разным бэкграундом. Есть фазы работы, в которых вся эта модбас-болтовня может идти в развалочку, а есть суровые моменты жизни, когда нужно все похерить кроме той нашей парочки регистров - но их читать максимально быстро-часто.
Вот именно в те суровые моменты система "виртуально общего пула данных" никак не катит!

Поэтому у меня запущено 8 модулей модбас (библиотека уважаемого Валенка). Они опрашиваются по довольно сложной логике программы, но примерно это может выглядеть так:

1 1 1 1 1 1 2 1 1 1 1 3 1 2 1 1 1 1 1 1 1 1 1....1 3 1 2 1 4 1 1 1 1 1 1

То есть идет некое действие - вызывается нужный модуль или модули, а между ними непрерывно шарашит наш фоновый модуль опроса двух регистров.

Кстати, вопрос к Автору библиотеки. Выяснилось, что есть одно неудобство при отладке. Когда отлаживаю по шагам, то весь процесс обмена останавливается. Как-то это в штатном Конфигураторе не так - там ввод-вывод в фоне идет. Толком не исследовал, да и не представляю, чтобы это можно было изменить в твоей библиотеке, так что мирюсь. Остальные преимущества перевешивают, как слон моську :)

drvlas
23.04.2011, 14:02
Ну дык я ж не система. Не "интегрирован". Обычный пользовательский код.
Я ж понимаю, я ж не в претензии :)

Чего сложного. Модбас – один единственный туалет
Ладно, наши понимания сложности различаются в разы :) Для меня - сложная логика, и баста!


В развитие.Мне лично нафик не нужно, но в штатном мастере легко поймать момент прихода данных.
А нужно ли? Я вот подумываю перевести ИП-320 тоже на твою библиотеку (сделав его слейвом, ясен перец). И тогда пусть приходы ловят непосвященные :)

Safron
24.04.2011, 15:16
Всех с Праздником. Очень интересная полемика. И снова про эти самые регистры...Чем больше читаю про модбас. тем больше каша в голове.
• 1 (0x01) — чтение значений из нескольких регистров флагов (Read Coil Status)
• 2 (0x02) — чтение значений из нескольких дискретных регистров (Read Discrete Inputs)
• 3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers)
• 4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Registers.
Выше приведённое описание мне мало о чём говорит...

В параметрах модуля Register imput module даются на выбор три команды функции 3, 4 и ещё некая функция Read bytes.
Так вот, в чём собственно говоря разница между чтением регистров хранения и чтением регистров ввода?
Чем мне руководствоваться при выборе той или иной команды для чтения дивайса?
Если регистр хранения записывается в контроллере, то где? В какой памяти энергонезависимой или энергозависимой. Какая польза мне от того, что он сохранился? Я имею ввиду возможное прикладное использование этого факта...И как его потом извлекать?
Или я опять не туда попёр?
В общем, чем дальше в лес, тем больше дров...
Вы то уж маститые, не первый год играетесь с контроллерами, объясните мне "особо одарённому".
Спасибо. Ещё раз всех с праздником...

ASo
24.04.2011, 19:11
Это разные регистры.
Вообще говоря, в протоколе МОДБАС 4 разных адресных пространства с одинаковыми адресами! И в общем случае, чтение ф-ей 3 и 4 - это м.б. чтения разных переменных. Реально так не делает никакой производитель, во всяком случае, мне такие устройства не известны.
А дальше - все понятно из описания. Только для ввода логические и слово и для вывода и ввода(контроля) тоже.

Safron
25.04.2011, 13:44
OK/ Спасибо. Теперь следующие непонятки. Установил связь с дивайсом Модбас RTU (ПЛК154 мастер). На контроллере светодиод связь горит, на дивайсе Rx и Tx тоже горят, команду установил 255, Last error =0,- вроде всё чудесно должно быть , а ничего не принимается. Адреса несколько странноватые у дивайса. Все начинаются на 4. Например 40003, 40005,40057, 40063 и т.д. и т.п. Посоветовали мне забивать последние цифры 3, 5, 57, 63 и т.д. Пытался адреса на единицу меньше адреса устанавливать, а воз и ныне там...Кто-нибудь может сталкивался с подобным???

ASo
25.04.2011, 13:56
Регистры 4хххх - это Holding Register. При этом хххх нумеруется с 1, а адрес, который идет в посылке - с 0, т.е. на 1 меньше.
Считываются ф-ей 3.
Пробовать для начала лучше с устройства с жестко прошитыми регистрами МОДБАС

Safron
25.04.2011, 20:13
Да нет, ASo оказался прав. Я поменял четвёртую на третью функцию и всё пошло. А адреса я использую только последние цифры. В принципе я и задавал адреса на единицу меньше. Но оказывается надо устанавливать регистр хранения, а не ввода...