PDA

Просмотр полной версии : обращение к битам по модбас



drvlas
17.12.2010, 20:58
В примерах на форуме мне не удалось получить ответ на такой вопрос.

Я подключаю к ПЛК (МАСТЕР) устройство по Модбасу RTU (некий АЦП, не ОВЕН). В описании на устройство я вижу таблицу используемых регистров.
Среди них есть несколько типов -

bool
char
int
float
long

и указаны их адреса, команды чтения-записи, диапазон значений и т.д.

Читаю про создание Мастера в ПЛК и в Конфигураторе выбираю Universal Modbas device. Всякие там скорости обмена и прочее - это понятно.
Теперь создаем список переменных, которыми обмениваются ПЛК и АЦП.
И вот тут-то я не могу стартовать.

Беру из описанных в РЭ на АЦП регистров:

Адрес регистра: 101
Тип: bool
Код ф-ции чтения: -
Код ф-ции записи: 5

Сразу за этим битом идет следующий, адрес регистра 102 и так далее.
Но дальше в таблице есть бит с таким же адресом

Адрес регистра: 101
Тип: bool
Код ф-ции чтения: 1
Код ф-ции записи: -

Вопрос: как правильно в Конфигураторе ПЛК этот бит показать? Как быть с тем, что с адреса 101 будет и чтение, и запись туда же?

Ну, а дальше остальные регистры, с адресами и 40010, и 30001, и прочая, и прочая... Тоже некоторые только пишутся или читаются, а некоторые тудым-сюдым. Но думаю, если подскажете, как обойтись с битами, то дальше будет легче.

Спасибо!

lara197a
17.12.2010, 21:03
читать и писать в один регистр можно без проблем.
к примеру я использовал такое для контроля частоты пч.
если в регистре не то значение, что в плк, то давал команду на запись.биты писать в регистр:
VAR
a:WORD;
END_VAR

a.0:= ;(*0-бит*)
a.1:= ;(*1- бит*)
...и т.д.

drvlas
17.12.2010, 21:13
спасибо за скорость :)

и все же, главное: действия в конфигураторе. я не понимаю, как мне записать адрес бита 101. создавать слово из 8 бит? так 100 в параметрах модуля - это адрес слова или бита?

если не влом, просто расскажите все параметры, которые нужно указать в конфигураторе для обращения к битам 100, 101, 102... на чтение и на запись.

drvlas
18.12.2010, 09:12
это то, что здесь называют маской?
да, конечно, я попробую так и делать. и автор, что интресно, доступен будет в понедельник.
вообще не понимаю, зачем гонять по линии несколько байт для передачи одного бита. ведь выделить их из байта (или впихнуть туды биты) совсем не сложно...

но все таки. предположим, что я никогда не узнаю, с каким адресом мне нужно обратиться к ацп, чтобы по команде чтения регистра вытянуть 16 байт и распотрошить их на биты.
тогда процедура создания в конфигураторе возможности обращения к битовым переменным с указанными адресами 100, 101, 102... - какова?
ведь я порождаю там минимально объект длиной 8 бит. нет там буля...
вот это хотелось бы понять. пока автор досыпает свои сны :)

А пока пофантазирую. Описание Модбаса говорит, что со стороны девайса распределение адресов может быть каким угодно. Единственное:

The only requirement is to link data reference with physical address

Таким образом, размышляю я, вовсе не факт, что битовые переменные с адресами 100 и 101 будут физически рядом (как бы это не казалось очевидным). А если так, то я в самом строго независящем от причуд программиста АЦП случае должен сделать так:

1) Для чтения бита 100 - Конфигуратором породить 8 бит в области обмена, дать этому объекту адрес 100 и обращаться к нему командами битового чтения. В получаемом ответе я должен взять строго младший бит, ибо стандарт говорит, что в любом случае именно там находится бит бит, который я адресую.

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

3) Для записи 100 бита я порождаю еще один объект с номером 100 и объявляю его выходным. И пишу либо 0000, дибо FF00. И других вариантов нет.
Вроде так...

Исправлено: Ага! Дудки! Вкуриваю Конфигуратор: В возможных командах в выходном модуле "8 битов" есть только команда 0x0F и "застандартная" 0x71. Вот и выходит (если я правильно понимаю), что записать в один бит, не переживая о способе размещения остальных битов - НИЗЗЯ.

Это правильно?

Алексей Дмитриев
21.12.2010, 21:15
Если вы пишете бит коммандой записи бита, то и адрес указан бита, не регистра, не байта, а именно БИТА. То есть адреса бита с 0 до 15 будут в 16-ти разрядном регистре с адресом 0, биты с адресами 16..31 будут в регистре с адресом 1 и т. д.

drvlas
21.12.2010, 21:45
Я думаю о записи одного бита, а не о чтении и не о записи регистра.

Если я пишу командой записи 1 бита (команда 0х05), то именно в этот бит все и попадает. Причем по самой линий связи проходит вот та самая неповторимая комбинация 0000 или FF00.

А если пишу командой записи многих битов (команда 0x0F), но указываю количество битов 1, то в путь отправляется слово из 16 бит, но просто с младшим битом, который установлен в нужное нам состояние 0 или 1.

И вроде это работает. В том устройстве (АЦП), что я сейчас запустил, не было реализовано команды 0x0F, а в ПЛК поленились реализовать команду 0х05. Поэтому проверять пришлось от компьютера. А от ПЛК так и не могу записать бит. Ну, кажется, что легче достучаться до автора того АЦП, чем до наших другзей из ОВЕНа. Они не сказали мне, что я неправ, но и не поспешили заняться добавлением команды 0х05 :)

Алексей Дмитриев
21.12.2010, 22:10
Вот кусок оглавления из описания библиотеки модбас для ПЛК63. Не знаю с каким контроллером Вы работаете, но если в биосе плк нет комманды 0х05, то ее можно организовать в программе пользователя, поковыряйте в этом направлении.:)

http://s41.radikal.ru/i092/1012/1f/f13299e192c0.jpg (http://www.radikal.ru)

Александр Приходько
22.12.2010, 10:12
Здравствуйте, drvlas. В чем собственно проблема? Что за оборудование вы подключаете и что вы хотите из него получить?
Дело в том, что у любой железяки есть определенный набор правил. Ну к примеру, регистры с 0 по 100 читаются ф-ей 03h, а пишутся ф-ей 10h. Если про битовые операции нет ни слова, то с данными регистрами они могут просто не работать.
Биоса в ПЛК нет (что бы людей в заблуждение не вводить). Но есть область PLC_Configuration или проще говоря конфигурация ПЛК. К сожалению в ПЛК63 изначально задумывался как довольно простое устройство. Поэтому часть функционала в конфигурацию контроллера не вошло. Работать с функцией 5 вы можете только через библиотеку. Если ПЛК63 выступает мастером сети, то программу придется писать исключительно через библиотеку, т.к. конфигурация ПЛК63 не позволяет организовывать мастера сети.

Алексей Дмитриев
22.12.2010, 10:37
Биоса в ПЛК нет (что бы людей в заблуждение не вводить).

Что же тогда по вашему исполняет программу? Вы же ее не пишете на ассемблере по "железу". Есть некий набор поддерживаемых функций, который присутствует в данной системе. В ПЛК63 нет функций поддержки модбас, а в плк100 есть, но не все реализованы - вот суть вопроса.

Николаев Андрей
22.12.2010, 10:42
1. Программу выполняет система исполнения CoDeSys - на то от там и есть. CODESYS - ЭТО НЕ ТОЛЬКО СИСТЕМА ПРОГРАММИРОВАНИЯ...
2. То, что ПЛК63 не поддерживает в конфигурации ПЛК работу мастером четко прописано. То, что с помощью БЕСПЛАТНОЙ библиотеки Мастер таки можно организовать - тоже написано...
3. В ПЛК100 поддержаны не все функции ModBus - это тоже описано.

Так в чем вопрос?

drvlas
22.12.2010, 23:37
Так в чем вопрос?

Дорогие мои! Нет уже вопроса. Нет. Разобрался. Мог бы быстрее. Например, если бы вы раньше ответили. Думаю, так коряво я ставлю вопросы.

А вот мне подсказали, что библиотека Modbus.lib для ПЛК63 вполне подходит для использования с ПЛК100. Я ее скачал и изучаю. А есть ли библиотека для режима Slave?

Александр Приходько
23.12.2010, 09:51
Дорогие мои! Нет уже вопроса. Нет. Разобрался. Мог бы быстрее. Например, если бы вы раньше ответили. Думаю, так коряво я ставлю вопросы.

А вот мне подсказали, что библиотека Modbus.lib для ПЛК63 вполне подходит для использования с ПЛК100. Я ее скачал и изучаю. А есть ли библиотека для режима Slave?

Режим Slave поддержан в самих контроллерах, поэтому в вуде библиотек как таковой его организации нет.

Но! Есть библиотеки UNM и Syslibcom, которые позволяют работать с портом напрямую: отсылать заданную последовательность байт\символов и также получать ответы из сети. Но это библиотеки для работы с нестандартными протоколами.

drvlas
23.12.2010, 11:06
Есть библиотеки UNM и Syslibcom, которые позволяют работать с портом напрямую: отсылать заданную последовательность байт\символов и также получать ответы из сети. Но это библиотеки для работы с нестандартными протоколами.

На них и уповаю! Спасибо!