Modbus на Pinboard II. Тестовое приложение

Проект и приложение

Аннотация


Приведены исходники примера для работы с freemodbus на AVR (GNU С++ и IAR C++). Написано тестовое приложение для считывания регистров modbus (VB6, mbaxp.ocx).

Исходники


1. PBIIFreeModbus (svn, pinboard2, avr, c++, winavr + msvs, iar, atmega16, freemodbus)
2. HomeControl (svn, vb6, mbaxp.ocx)

Дистрибутивы


1. Управление домом Версия 0.0.0.181 (программа самообновляется, когда у меня запущен сервер)

Инструменты


Весь набор инструментов для разработки я обычно описываю в файле readme.txt.

Добавлю лишь кое-что по поводу приложения для Windows. Написано клиентское приложение на Visual Basic 6. Вся среда разработки доступна тут: Portable MS Visual Basic 6.0 (SP6, KB957924 + ApiViewer, vbAdvance, CodeSMART).

Для работы с Modbus используется компонент MBAXP Modbus RTU/ASCII ActiveX Control. Я изменил пару байт в файле mbaxp.ocx, чтобы убрать ограничение на 60 минут и чтобы не всплывали надоедливые окошки. Изменённый файл доступен в svn и в дистрибутиве программы.

Описание


Если вкратце, то при установке приложения у вас появится папка такого содержания:

Папка с ярлыками

При запуске программы в трее появится её значок. Левый клик прячет и показывает основное окно, правый показывает контекстное меню. Вот как выглядит основное окно программы:

Основное окно программы

При запуске программа считывает файл values.json из папки установки. Он в данном случае имеет такой вид:

Файл описания запросов

Видно, что это список параметров для запросов по протоколу modbus. Эти параметры передаются компоненту mbaxp.ocx, который и осуществляет работу с нашей платой. Лог обмена выглядит так:

Лог обмена

Видно, что мы считываем два регистра по адресам 1000 и 1001. Первый содержит значение температуры: 0x0020 (32 °С), а второй — какое-то значение напряжения с потенциометра на плате: 0x0300 (768).

Что же касается программы для контроллера, то там используется стандартная демка из AVR/demo.c. Исходники freemodbus-v1.5.0 включены в репозиторий. Были небольшие правки только в части добавления в некоторые файлы моего заголовочника Defines.h.

Температура считывается из LM75BDP по TWI. Это цифровой термометр из сэмплов NXP. Оба параметра (температура и напряжение) показываются также на индикаторе (класс CLCD). Как подключен индиктор см. в методе CMCU::PortsInit(). Из прерываний в микроконтроллере используются: TIMER0_OVF_vect, ADC_vect (это мной) и TIMER1_COMPA_vect, USART_RXC_vect, USART_UDRE_vect (это freemodbus).

Что касаемо потребления ОЗУ и флеш:

AVR Memory Usage
----------------
Program:    8092 bytes (49.4% Full)
(.text + .data + .bootloader)
Data:        428 bytes (41.8% Full)
(.data + .bss + .noinit)
-------- end --------


Примечания


1. ActiveX компоненты приложения при установке должны зарегистрироваться автоматически. Если этого не произойдёт, то приложение не запустится. Нужно будет это делать ручками. Для обладателей Win64 это делается несколько иначе, чем для Win32. Там другая папка, куда нужно копировать ocx-файлы. Поэтому у меня в названии дистрибутива пометка win32, хотя под 64 разряда тоже будет работать.

2. Компонент MBAXP лучше установить отсюда. Тогда появится документация и примеры для разных языков, в том числе и для .Net. Потом можно заменить на мой вариант, если появится такое желание (для лечения использовались IDA Pro и WinHEX).

3. Мониторы COM портов существуют разные, в том числе специализированные для Modbus. Я использую старенький Serial Monitor 3.15. Рекомендую вот это набор. Ещё есть такая штука: ModScan32. В репозиторий включена одна из утилит: FieldTalk(tm) Modbus(R) Polling Utility.

4. Клиентское приложение ведёт журнал ошибок в файле homectrl.log, ярлык на который также доступен в Главном меню (так и называется Журнал ошибок).

П.С. Вот пример того как теперь можно подключить OPC-сервер и утилиту мониторинга, анализа и хранения ibaPDA к нашему устройству:

OPC-сервер и ibaPDA

П.С.2 Предлагаю перенести более подробное обсуждение на местный форум: Modbus на Pinboard II. Тестовое приложение
  • 0
  • 18 июля 2012, 18:54
  • uni

Комментарии (18)

RSS свернуть / развернуть
Не совсем понятно что хотел конкретно хотел показать автор ибо все несколько в кучу.
+1
Когда человек освоит внутренности modbus, ему хочется подняться на уровень выше, который так и называется — высокий уровень. Там находятся средства HMI — интерфейс пользователя и SCADA. Так вот путь этот обычно лежит через «средний» уровень — различного рода ПО для мониторинга состояния оборудования. В том числе и самописного.

Вряд ли кому будет интересно, если я распишу как работает freemodbus изнутри. Цель же не в том, чтобы написать свой драйвер, а в том, чтобы всё это хозяйство работало в комплексе.

Это стенд на основе Pinboard 2, на котором можно обкатывать как своё ПО, так и стороннее
0
Я не умаляю ваших трудов — наоборот все отлично, просто все вместе получается ни о чем конкретно.
Пишите тему про пин боард, а ни фото ни как подключали к RS-485 нет (на борде же не стоит драйвер емнип), начинающим это было бы интересно.
А неначинающим хз мне лично не очень, т.к. привязываться ко взломанным контролам не айс, freemodbus мне не удобен я писал свой стэк и здесь приводил примеры и видео.
+1
У меня есть другой драйвер, но я не могу приводить его публично.
Да, на Pinboard 2 нет железа для связи по RS-485, но оно и не нужно для отладки ПО. Это просто физический уровень передачи сигналов и на логику работы он не влияет.

Начинающие могли бы и догадаться, что для работы этого примера не нужно вообще ничего кроме самого Pinboard2. В репозитории даже прошивка есть, правда с неизменными настройками порта (это я потом исправлю). Прелесть в этом и заключается, что работу по modbus можно изучать с ходу, имея плату, HappyJTAG2, WinAVR и AVR Studio 4. Всё прекрасно отлаживается и можно посмотреть как же всё таки работает этот малопонятный freemodbus, если кто устрашился обилие файлов и перекрестных тамошних взаимодействий. Главное — иметь простой работающий пример. Я потому и не стал пока его усложнять, разве только показал как настроить исходники под своё окружение. Не каждый может программу на Си такого размера подключить к проекту на С++.

Можно сделать и отдельное повествование о том как работает драйвер freemodbus, но это лучше показывать на уже работающем примере и на видео.

Компонент не совсем прям взломан, кто посмотрит на асмкод результата, тот увидит примитивные замены некоторых ветвлений, а можно было бы и свой lic файл соорудить и ничего не изменять. Да, это не подойдет для распространения, а вот для отладки — очень даже ничего. Ты не привязан ни к какому языку, пиши на любом, но под Windows.

В идеале я хотел бы иметь конструктив с питанием и Ethernet, который был бы модулем с аналоговыми и дискретными входами, а также дискретными выходами, причем с открытыми исходниками и детали для его сборки я мог бы купить в местном магазине радиодеталей.
0
GYUR22 как бы намекает, что Ваша статья написана в таком стиле что ничего непонятно.
Я бы на вашем месте переписал статью по другому:
1. Расширил аннотацию, где изложил более подробно что это, к чему подключается, что нужно иметь для запуска.
2. Описание подключения железа и кода для него (что, где в каких файлах проекта, что надо сделать с пинбордой чтоб это в нее залить и посмотреть)
3. Описание приложения на компе с которым все это тестить. Что нужно для установки, настройки запуска.
4. Некоторые тонкости

А так как сейчас написано совершенно непонятно что за проект управления домом, куда его девать, причем тут пинборда и модбас и какие инструменты (может разводные газовые ключи?) лежат в файле readme.txt

Имхо, материал подан неправильно и непонятно. Особенно для новичков.
0
Ну как бы я понял. Учту в следующий раз.

1. Описано в быстром запуске в документации на Pinboard 2.
2. Можно использовать на абсолютно голой плате Pindoard 2 без индикатора даже, но с модулем контроллера и HappyJTAG2. То есть не нужно вообще ничего, просто суём USB проводок в ПК и получаем работающий стенд.
3. У меня здесь даже 2 приложения, с которым тестить. Если вы обратитесь к документации на freemodbus, то увидите там такой файл, который есть у меня в репозитории, так и называется: README.txt

Вот выдержка их него:


TESTING
=======

Start the Modbus Sample Application and test if the input registers starting
at protocol address 1000 can be read. There are four registers value available
and the output should look like:

Polling slave (Ctrl-C to stop) ...
[1000]: 6474
[1001]: 0
[1002]: 0
[1003]: 0
Polling slave (Ctrl-C to stop) ...
[1000]: -8831
[1001]: 0
[1002]: 0
[1003]: 0
Polling slave (Ctrl-C to stop) ...

The simple testing utility used in the 'demo_rtu.bat' script can be found
at [5].

demo_rtu.bat и сама утилита для тестирования работы прошивки также приложена и я об этом написал:

В репозиторий включена одна из утилит: FieldTalk(tm) Modbus(R) Polling Utility.

Короче говоря, всё практически по дефолту, только я сделал проект на cpp, но там из моего шаблона даже настройки не используются, так как freemodbus как модуль полностью самодостаточен: он сам настраивает таймер, порт и прерывания вне зависимости от ваших настроек. Ещё я использую свой Makefile, что не должно никого смутить, я думаю.

Какой смысл это всё описывать? Вот моё приложение на бейсике может смутить, ибо на него нет документации. Но даже на ActiveX этот для работы с ним имеет подробный chm файл и я написал об этом, кроме того там полно примеров для разных ЯВУ. Можно и не использовать мою программу, она просто для примера, можно обойтись и одной консольной утилитой, указанной выше, но её вывод, так скажем, не особенно удобен.
0
а я так и не понял как раз его низкий уровень с этими регистрами
мне для моего станка надо было, но сейчас проще за 150 у китайцев купить усб контроллер

надо было цикл статей сделать или хотя бы 2-3, а то и правда все в кучу
0
Дело в том, что когда вы создаёте программный образ конфига устройства, то нужно уже знать где и как он будет использоваться, т.е. нужно иметь ТЗ на те внутренние данные, которые будут в качестве тегов наверху. Этот самый верх не все себе ясно представляют, а внутренние данные могут иметь довольно изощрённую структуру и форматы.

Вот пример простого конфигуратора для модуля с AI и DO. Каждая ветка в свойствах имеет целый список параметров:

Конфигуратор модуля АСУТП

По идее, сначала нужно обрисовать назначение устройства, потом описать типовые необходимые настроечные параметры (даже для тестового устройства их будет достаточно: настройка связи, параметры устройства, сведения и т.д.). Затем нужно создать для себя лабораторный стенд, на котором можно было бы последовательно доводить ядро устройства до кондиции.

Я показал работающий стенд на 8-битном AVR контроллере и свободно распространяемом драйвере freemodbus. Мало того, он и в Proteus будет работать даже без Pinboard2, у кого его нет. Рассказывать басни про то как собрать из исходников проект для WinAVR мне показалось излишним, так как там нужно было просто вписать все .c файлы в Makefile и всё, а в моём случае из-за конфликта определений (там используются windows-типы как и у меня в моём шаблоне для cpp-проектов) мне пришлось добавить свой общий заголовочник в некоторые файлы. Зачем и кому это нужно пояснять?

После того, как есть макет и есть набор инструментов для мониторинга его состояния, то можно уже опускаться в дебри усложнённых и изощрённых настроек. Поскольку я взял для примера ATmega16, то ввиду ограничений по ОЗУ я не смогу показать какие-нить внутренние преобразования с аналоговыми величинами, которые могут быть в реальном устройстве, но работу с дискретными вх и вых на этом мк показать вполне возможно.

Я предпочитаю движение сверху вниз, а не снизу вверх. Т.е. сначала мы видим как это использовать, какие нужны инструменты на ПК, какие требования к конфигурации устройства, а потом уже размышляем как это реализовать имеющимися средствами. И мне не понятны местные стенания по поводу freemodbus. Что там такого сложного и неудобного?

а я так и не понял как раз его низкий уровень с этими регистрами
Тут вы не первый и не последний. Когда я посмотрел в ядро уже готового реального модуля, то вообще ничего не понял. Главное, что должно быть — это прозрачность в понимании где находятся данные, как они запрашиваются, как они отдаются, как они изменяются и что делать, если форматы данных не совпадают. Поэтому я сделал упор на утилитах, которые прямо побайтно показывают лог протокола передачи. С точки зрения пользователя дравера modbus, грубо говоря, нужно понимать куда написать какой код и где разместить данные, чтобы программа на ПК смогла их «увидеть».
Вот это я и постараюсь показать в следующем примере. После того, как макет «завёлся» самое первое, что нужно сделать — это дать устройству имя, версию прошивки (она, кстати, уже есть), дать возможность изменять его адрес и параметры порта: скорость и пр. Потом уже можно будет озаботиться наполнением функционала.
0
мне лично кажется что низкий уровень это самое простое что есть в модбасе -например как массив WORD -16bit, а определенные нюансы есть при использовании не 16bit переменных, те можно класть float переменные в2 регистра, однобитные койлы, групповые запросы ну и тд и тп
0
Вот пример того как теперь можно подключить OPC-сервер и утилиту мониторинга, анализа и хранения ibaPDA к нашему устройству:
А еще можно подключить TraceMode не только для мониторинга, но и для управления.
PS: надо кроме термометра и потенциометра еще светодиод подключить.
0
Я про тоже, но для этого нужно стандартную демку немного допилить. Я когда-то занимался написанием конфигураторов для такого рода устройств, вот там было гораздо посложнее. В следующий раз будут возможности управления.
0
Поддержу претензии к изложению материала. Это не статья, это «смотрите, я пример модбаса сделал».
Вот, например, неплохая статья про V-USB. А будь она написана как твоя, она бы выглядела примерно так:

Аннотация
Приведены исходники примера для работы с V-USB на AVR (С). Написано тестовое приложение для обмена данными с ним (C++ Builder).

Исходники
(ссылки на исходники)

Инструменты
(список инструментария со ссылками)

Описание
(несколько скринов и размер получившейся прошивки)
Как говорится, почувствуйте разницу.
0
  • avatar
  • Vga
  • 19 июля 2012, 23:58
Я ожидал комментария в таком духе, разницу можно почувствовать, когда заглянуть по тем ссылкам что я дал. Считаю эти посылы совершенно не обоснованными. Ну прямо вообще не в тему.

1. Читаем название и видим там Pinboard 2. Это плата специально предназначена для того, чтобы на ней что-то макетировать. Надо подозревать, что если я пишу это в названии, что я что-то на ней макетирую.

2. Что же я на ней макетирую? Опять же я написал — демо пример из freemodbus. Скомпилировал ли я этот самый демо пример? Нет, потому что в стандартной демке другие настройки мк и частоты процессора, а кроме того, я это сделал для С++ компилятора. Надо ли объяснять что это означает? Точно тоже, если бы я скомпилировал V-USB для С++ окружения. Просто это сделать? Нет не просто, хотя и не сложно.

3. Я не описал как нужно компилировать, так как это всё равно стандартная демка по своему составу. Не трудно заметить, что у меня также присутствует Makefile и долго думать не надо что нужно ввести в консоли, чтобы собрать проект.

4. Чтобы чем-то отличаться от стандартной демки, я использовал то окружение, что есть на Pinboard 2 для вывода этих параметров наружу — это напряжение с потенциомерта. Хоть там также подключен и цифровой датчик температуры, но не будет ничего страшного, если он не подключен. Просто будет ноль в показания. Ни наличие потенциометра, ни наличие датчика, ни даже а/ц ЖКИ не влияют на работу примера.

5. Инструменты. Нужно сначала прочитать то, что написано сверху, а потом уже делать заявления. Я прямо указал для особо одарённых чем я пользуюсь для РАЗРАБОТКИ. Вот ведь прямо так и написано чёрным по белому!!!

Весь набор инструментов для разработки я обычно описываю в файле readme.txt


И ссылку даже дал на файл: readme.txt. Этот файл у меня не просто в какой-то там статье, он есть в каждом моём проекте ПО УМОЛЧАНИЮ. В каждом! Я понимаю, читать его лень, проще чего-нить накомментить для мусора, но я приведу выдержки:


                     И Н С Т Р У М Е Н Т Ы
                     =====================

1. Enterprise Architect - средство визуального моделирования на основе
        языка UML 2. Предназначено для автоматизированного формирования
        структуры классов программы.

2. Microsoft Visual Studio 2008/2010 - средство разработки программного кода
        на языке C++. Visual Studio 2008 связана с EA специальным дополнением.

3. WinAVR - набор средств для компиляции исходного кода при помощи
        свободного компилятора AVR GCC.

4. IAR - средство разработки программного кода на языке C++. В IAR также
        удобно отлаживать проект как в симуляторе, так и внутрисхемно.

5. AVR Studio - средство разработки программного кода на ассемблере и
        GNU C++. При помощи IAR можно создать проект для AVR Studio, в
        котором также можно отлаживать программный код.

6. Bascom AVR - средство разработки программного кода на бейсике.

7. Proteus - средство визуального моделирования макета устройства.

8. PrimalScript - IDE для разработки скриптов Windows Script Host и
   многого другого.

9. VisualSVN - средство для удобного управления хранилищем, дополнение
    к VS2008 (по желанию).

Команды для сборки проекта (для VS2008):

Для WinAVR-20100110 (последняя версия в виде отдельного набора утилит):

build: C:\WinAVR-20100110\utils\bin\make.exe build
clean: C:\WinAVR-20100110\utils\bin\make.exe clean
build all: C:\WinAVR-20100110\utils\bin\make.exe build all

Для Atmel Studio 6:

build: "C:\Program Files\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.3.2.31\AVRToolchain\bin\make.exe" build
clean: "C:\Program Files\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.3.2.31\AVRToolchain\bin\make.exe" clean
build all: "C:\Program Files\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.3.2.31\AVRToolchain\bin\make.exe" build all

Директивы препроцессора: __GNUC__, __DEBUG__

...

Далее более менее подробно указаны ПРЯМЫЕ ссылки на эти инструменты или на сайты, где их можно получить.

Я бы мог ещё написать всякой билиберды про то как нужно выставлять перемычки на плате, но за меня это подробно сделано в документации к Pindoard 2, а мог бы также повторить про то как нужно прошивать при помощи HappyJTAG2 или как нужно с его помощью отлаживать, но опять же это есть в статьях самого DI HALT и в соответствующем разделе его же форума по этой плате.

Короче говоря, народ, ответьте мне на пару вопросов:
1. У кого из вас тут есть Pinboard 2 и кто читал на него документацию?
2. Кто читал раздел быстрого старта для AVR модуля?
3. Кто читал про использование отладчика HappyJTAG2 на Pinboard 2?
4. Кто читал документацию на демку для freemodbus?
5. Кто сравнивал ресурсы необходимые для работы демки freemodbus со стандартной комплектацией Pinboard 2 и AVR модуля?
6. Нужно ли человеку, который прочитал и настроил ОДИН раз плату Pinboard 2, прошил её посредством HappyJTAG2 пояснять как залить туда прошивку для ATmega16?
7. Могу ли я сделать логическое предположение, что человек, имеющий Pinboard 2 прочитал на неё документацию и пару раз попробовал её в деле?

Так вот, сделав такие элементарные предположения, я не посчитал нужным для целевой аудитории объяснять всё то, что им ИТАК УЖЕ ИЗВЕСТНО. Если не понятно как работает modbus и конкретно этот драйвер, то этого не объяснить текстом так просто, это лучше смотреть на точках останова, когда у вас есть работающий стенд и вот для чего я написал эту заметку. Вот вам пример на Пинборде2, где есть всё для его работы. Берите и разжевывайте то, что вам непонятно, ибо я пока не видел тут никаких телодвижений по поводу модбаса на AVR и в простом окружении.

Ваш ошибка в том, что вы предполагаете, что я должен сделать какую-то макетную плату сам, развести её, протравить, спаять, написать уникальную хрень, сказав, что freemodbus это не бро, а потом сделать какие-то скриншоты этого хозяйства с фотографиями :) И добавить, что это для новичков самое-то. Увы, у меня другие понятия о новичках. Некоторые из оных даже демо проект скомпилировать не могут, я уже не говорю про какое-то осмысленное ваяние плат данной специфики.

Кто из вас, специалистов, собрал демо проект freemodbus?
+1
Если все и так известно или нужно читать во внешних источниках — то, собственно, зачем твоя статья?
Пример по ссылке рассказывает о V-USB, о том, как его подключить и использовать. Твоя статья не рассказывает ни о чем.
-1
Разве? А на мой взгляд она рассказывает о работающем примере стандартной демки на Pinboard 2. Куда спешить-то? Вот есть пример, который можно завести и посмотреть его работу на Pinboard 2. Я не обещал, что расскажу про все исходники freemodbus'а или про спецификацию на modbus. Где это написано? Написано, что это тестовый пример и относится к нему так и надо — как к тестовому примеру. Его специфика в том, что на его основе можно показывать то как работает modbus. Т.е. сначала пример, а потом рассказы с использованием отладчика как то, что написано в описании стандарта, выглядит в реальности.

Причём, кое-что же я показал — это реальные логи реального modbus'а. Сколько писанины нужно, чтобы описать структуру freemodbus я примерно представляю и у меня нет иллюзий по этому поводу. Я сначала хочу показать как им пользоваться, точно также как в теме про V-USB (у меня есть такое же точно тестовое приложение, кстати).

У меня есть большие сомнения, что я должен в статьях писать: «Создаем проект в AVR Studio», либо выкладывать портянки для main.c, либо показывать ключи компилятора C++Builder — вот это уже реальный замес всего в подряд и в кучу. Проект у меня уже создан, хотите посмотреть код? Я специально размещаю все исходники на svn-сервере, которые периодически обновляю, что можно увидеть по журналу. Флажки в C++Builder совсем не уместны. Мы либо учим программировать под контроллер, либо учим программировать под Windows? Что за мешанина? Я ведь тоже могу накопать всякой несуразности при имеющемся желании человека писать как для журнала Хакер. Но так не учат проектированию программ.
0
Вот как нужно относится к своим проектам. Не одноразово, а устремлением в будущее (кликабельно).

Это журнал ведения работы с репозиторием программы для контроллера:

Журнал репозитория по прошивке контроллера

А это то же для тестового приложения на VB6:

Журнал репозитория по программе для ПК

И так я отношусь к любому своему проекту на любом языке и в любой среде, даже к скриптам. Более того, если обратите внимание, то увидите, что моё приложение — это не просто какой-то там прототип, который я набросал на пару минут. Он имеет свой собственный скрипт инсталлятора homectrl.iss, своё местно в хранилище, удобства в работе.

Это всякие мелочи, их у меня много, если приглядеться, и именно они отличают один подход к делу от остальных.
0
Во первых, я не о проекте, а о статье.
Во вторых, SVN и я пользоваться умею. Равно как и инсталлмейкерами.
P.S. Вижу комментарии к коммитам. Похвально. Многие забивают.
0
П.С.2 Предлагаю перенести более подробное обсуждение на местный форум: Modbus на Pinboard II. Тестовое приложение
0
  • avatar
  • uni
  • 20 июля 2012, 03:08
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.