Modbus. Первые шаги.

Опубликовано 13 декабря 2013 в рубрике Умный дом

Рейтинг статьи:

Ну вот и прошли первые испытания работы по Modbus между контроллером на баз FreeBsd и измерителем мощности SPT-660.Modbus

Теперь я могу поделиться с вам информацией, как установить libmodbus, как написать простейшую программу мастера сети modbus и как все это запустить.

И так. Для работы из FreeBsd с протоколом Modbus нам необходимо либо написать свою собственную библиотеку, реализующую данный протокол, либо же взять готовую. Вот чтобы не изобретать велосипед, воспользуемся готовой библиотекой Libmodbus. Почему именно она? Да просто она на данный момент неплохо развивается, хорошо документирована и кроссплатформенна. .

Установка библиотреки на FreeBSD довольно не сложная. Здесь возможны 2 варианта. 
Первый вариант. Установка из портов. Вводим в консоли 

cd /usr/ports/comms/libmodbus/ && make install clean
После этого библиотека должна быть установлена.

Второй вариант - скачиваем с официального сайта архив с библиотекой, распаковываем во временный каталог и делаем  make install clean

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

Для начала по подключению. Я для эксперимента использовал кабель UTP cat 5. По хорошему нужно использовать кабель с волновым сопротивлением 120 Ом и с терминаторами на концах. Далее, в передаче учавствуют только 2 сигнала + и -, что так же соответствует некотороым обозначемиям как A и B. 

Преобразователь RS232 - Modbus

Ну теперь давайте рассмотрим как работать с данной библиотекой и как нам передать или принять данные.
Нам будет необходимы заголовочные файлы от библиотеки. Рекоммендую их скопировать к проекту. Это файлы modbus.h, modbus-rtu.h, modbus-tcp.h, modbus-version.h. Также нам будет нужен собственно файл библиотеки libmodbus, который расположен скорее всего в /usr/local/lib.

Подключаем заголовочный файл к проекту #include "modbus.h"

Далее создаем контекст устройства модбас:
modbus_t *ctx;
ctx = modbus_new_rtu(DEFAULT_PORT, DEFAULT_SPEED, 'N', 8, 1);

И так, что за параметры необходимы данной функции. Сюда мы должны передать порт, на котором у нас будет модбас, далее скорость передачи в бодах, четность (нет), количество бит данных и количество стоповых бит.

Если функция вернула контекст - значит все хорошо и мы продолжаем дальше инициализацию.
Далее нам необходимо указать адес Slave - устройства и открыть соединение

modbus_set_slave(ctx, 1); // Устанавливаем slave адрес.
modbus_connect(ctx); // Устанавливаем соединение.

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

Для этого в зависимости от реализации функций в клиенте выбираем функции реализующие обмен. 

Ну вот за сим разрешите откланяться, если будут вопросы - пишите. И может кому пригодиться - пример программы. Строго не пинайте, писал на коленке левой ногой. :-)

PS. 

Может кто посоветует, как лучше выполнить разъемное соединение двух проводов типа витая пара? Может какие клеммники? Мне пока пришло в голову только взять обжать rj45 и использовать соединитель. А то вот так и не правильно и не эстетично :-) 

Modbus - соединение

 

Комментариев: 6

  • guest:

    как подключается UTP cat 5 к самому устройству? можете дать картинку? данной программой вы прошивали контроллер, спрятанный в корпусе SP-216? Спасибо!

      Somebady:

      Подключается аналогично подключению к преобразователю SIPABC.
      Сфотографирую - выложу.
      SP-216 - это не контроллер. Это преобразователь интерфейсов RS232 - RS485.
      В качестве контроллера используется вот этот компьютер. Соответственно программа компилировалась и заливалась на него.
      В качестве slave-устройства был измеритель мощности

  • guest:

    That's the peerfct insight in a thread like this. http://ksunlyszy.com [url=http://qaxjrsl.com]qaxjrsl[/url] [link=http://wwarnl.com]wwarnl[/link]

  • guest:

    Огромное Вам спасибо за выложенные исходники. Очень помогли быстро разобраться с тем как запрашивать состояние регистров и получать данные с контроллера Owen ПЛК100 по сети. Адаптировал код под modbus_tcp путем замены строки ctx = modbus_new_rtu(cfg.ttyport, cfg.ttyspeed, 'N', 8, 1); на строку подключения по TCP ctx = modbus_new_tcp("10.0.6.10", 502);
    и запрос первой переменной rc = modbus_read_registers(ctx, 0x00, 0x02, tab_reg);
    Все оказалось очень просто.

  • guest:

    Компания Умная Электроника выложила в открытый доступ бесплатную программу Alpha Controller, которая позволяет заменить собой аппаратный контроллер ModBus RTU. Для работы программы требуется компьютер с ОС Windows и любой USB-RS485 преобразователь, определяющийся в качество Com порта. Программа бесплатная, имеет логику if-then-else, 512 переменных.
    Ограничения касаются только устройств, работающих на закрытом протоколе ADnet. ModBus устройства должны работать на скорости 9600.

    Полагаю, что данная программа будет полезна для вашей внутренней работы.
    http://alpha-se.ru/alpha.php?page1=406&page2=42&razdel=3&info=114

    Обучающее видео
    https://www.youtube.com/watch?v=Dc7W659eDnc

  • guest:

    Бесполезная программа. 512 переменных вообще ни о чем, да еще на скорости 9600! К примеру у меня свыше 3000 переменных на скорости не менее 115200 по 485.
    Побаловаться только.

Добавить комментарий