Ну вот и прошли первые испытания работы по Modbus между контроллером на баз FreeBsd и измерителем мощности SPT-660.
Теперь я могу поделиться с вам информацией, как установить 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.
Ну теперь давайте рассмотрим как работать с данной библиотекой и как нам передать или принять данные.
Нам будет необходимы заголовочные файлы от библиотеки. Рекоммендую их скопировать к проекту. Это файлы 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 и использовать соединитель. А то вот так и не правильно и не эстетично :-)
как подключается UTP cat 5 к самому устройству? можете дать картинку? данной программой вы прошивали контроллер, спрятанный в корпусе SP-216? Спасибо!
Подключается аналогично подключению к преобразователю SIPABC.
Сфотографирую - выложу.
SP-216 - это не контроллер. Это преобразователь интерфейсов RS232 - RS485.
В качестве контроллера используется вот этот компьютер. Соответственно программа компилировалась и заливалась на него.
В качестве slave-устройства был измеритель мощности