[Модуль] ModBus (modbus)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Geban
Сообщения: 136
Зарегистрирован: Вс июл 14, 2013 2:42 pm
Благодарил (а): 6 раз
Поблагодарили: 26 раз

[Модуль] ModBus (modbus)

Сообщение Geban » Пт июл 04, 2014 8:32 am

Добавил в последние обновления модуль ModBus.

Возможности:
* Подключение к устройствам ModBus по протоколам TCP/UDP
* Операции чтения данных: FC1, FC2, FC3, FC4 (реле, входы, регистры)
* Выбор функции преобразования прочитанных данных (float, integer, string и т.п.)
* Операции записи данных: FC5, FC6, FC15, FC16 (реле и регистры)

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

Для операций чтения надо выставлять время опроса (в секундах), для операций записи не обязательно, точнее лучше его делать очень большим (запись через связанные свойства будет осуществляться мгновенно и даже без запуска цикла опроса ModBus)

Пример экрана настройки устройства:

Изображение

После добавления первого устройства надо перезапустить систему, т.к. цикл опроса ModBus-устройств запустится только если есть хоть одно устройство.
СпойлерПоказать
Добрый день.
понадобилось мне подружить пром.автоматику и умный дом. Было два варианта, первый - ModBus over RS485, второй - ModbusTCP
Для первого нужны преобразователи, для второго все есть. Но вот беда, в MDM нет функции работы по этому протоколу.
Около недели сидел колупал модуль snmpdevices, хотел на его основе сделать модуль для modbus, но ничего не получилось.
Сейчас все работает на основе сценариев и phpmodbusTcp, но это как то.. на костыли похоже. может кто то сделать модуль или подскажите где почитать про модулеписание для MDM
спасибо.
З.Ы.
На случай если кто то возмется за разработку и не имеет железа для проверки:
Вот тут http://habrahabr.ru/post/214011/ человек юзает на ардуине modbus slave, проверял, работает.
А вот тут http://www.modbustools.com/download.asp можно качнуть софтику для проверки конекта
PHP ModBUS https://code.google.com/p/phpmodbus
ignat99
Сообщения: 206
Зарегистрирован: Сб дек 21, 2013 9:21 pm
Откуда: Spain
Благодарил (а): 1 раз
Поблагодарили: 22 раза

Re: модуль modbus

Сообщение ignat99 » Пт июл 04, 2014 11:08 am

Вот в этой французкой системе, есть модуль на си ModBus over RS485, сделанный русским.

git clone https://github.com/calaos/calaos-os.git
sudo wajig install gawk
./build.sh config raspberrypi
sudo wajig install diffstat chrpath
cd /home/user/claos/calaos-os/
nano /home/user/claos/calaos-os/sources/meta-calaos/recipes-extended/log4cpp/log4cpp_1.0.bb
Need change current to old inside of link.
./build.sh build
(may be : bitbake calaos-image, . ./env.sh)
sudo dd if=./tmp-calaos-eglibc/deploy/images/calaos-image-raspberrypi-
20131203193356.rootfs.rpi-sdimg of=/dev/mmcblk0
sudo dd bs=1M if=./tmp-calaos-eglibc/deploy/images/raspberrypi/calaos-image-
raspberrypi-20131203193356.rootfs.rpi-sdimg of=/dev/sdb
Extra experimental images :
http://calaos.fr/download/experimental/

Имидж на Райсрбери Пай лучше писать популярной утилитой под виндоус, под Линукс нужно делать ещё один финт с загрузчиком, который тут не указан.
Geban
Сообщения: 136
Зарегистрирован: Вс июл 14, 2013 2:42 pm
Благодарил (а): 6 раз
Поблагодарили: 26 раз

Re: модуль modbus

Сообщение Geban » Пт июл 04, 2014 12:29 pm

проблема не в том что бы подружить modbus с линуксовой машиной, с этим траблов нет. Хотелось иметь поддержку этого протокола внутри MDM, так сказать нативно. А не так как это работает у меня сейчас.
На винду у меня аллергия. Поэтому все действия происходят под Debian7
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: модуль modbus

Сообщение sergejey » Пн июл 07, 2014 1:10 pm

Geban писал(а):проблема не в том что бы подружить modbus с линуксовой машиной, с этим траблов нет. Хотелось иметь поддержку этого протокола внутри MDM, так сказать нативно. А не так как это работает у меня сейчас.
На винду у меня аллергия. Поэтому все действия происходят под Debian7
А нет какого-нибудь HTTP API для этого протокола? Типа как для OneWire. Было бы идеально.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Geban
Сообщения: 136
Зарегистрирован: Вс июл 14, 2013 2:42 pm
Благодарил (а): 6 раз
Поблагодарили: 26 раз

Re: модуль modbus

Сообщение Geban » Пн июл 07, 2014 1:52 pm

sergejey писал(а):
Geban писал(а):проблема не в том что бы подружить modbus с линуксовой машиной, с этим траблов нет. Хотелось иметь поддержку этого протокола внутри MDM, так сказать нативно. А не так как это работает у меня сейчас.
На винду у меня аллергия. Поэтому все действия происходят под Debian7
А нет какого-нибудь HTTP API для этого протокола? Типа как для OneWire. Было бы идеально.
Да вот фиг знает! Не нашел я. Все что есть это библиотека для PHP которую я пользую.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: модуль modbus

Сообщение sergejey » Пн июл 07, 2014 2:07 pm

В принципе, этой библиотеки вполне достаточно и я могу попробовать сделать модуль "вслепую", чтобы его потом можно было проверить.
А есть примеры того, как сейчас используется эта библиотека с реальным железом?

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Geban
Сообщения: 136
Зарегистрирован: Вс июл 14, 2013 2:42 pm
Благодарил (а): 6 раз
Поблагодарили: 26 раз

Re: модуль modbus

Сообщение Geban » Пн июл 07, 2014 10:32 pm

в корне вэб сервера лежит файл modbus.php . Вот с такими вот кишками

Код: Выделить всё

<?php

require_once dirname(__FILE__) . '/Phpmodbus/ModbusMasterTcp.php';

// Create Modbus object
$modbus = new ModbusMasterTcp("$ip");

try {
    // FC 3
    $recData = $modbus->readMultipleRegisters(0, 12288, 10);
}
catch (Exception $e) {
    echo "!!error";
    exit;
}

for ($i=1;$i < count($recData); $i++)
{
 print $recData[$i].'|';
}
return 0;
?>
на выходе функция readMultipleRegisters(0, 12288, 10) отдает массив прочитанных регистров. Тут 0 - device id, 12288 - начало адресного пространства по версии этой библиотеки, 10 кол-во регистров для чтения.
Я немного подправил вывод что бы получать форматированную строку удобную для парсинга. MDM раз в минуту или по событию дергает этот скрипт, в ответ получает строку и распарсивает её. В принципе такая конструкция работает не плохо, но это большой и страшный костыль. Примеры чтения и записи устройств есть в архиве с библиотекой, ссылку на которую я давал в первом посте.
У меня на шине висит панель оператора, модуль сбора данных и самодельный девайс на ардуине. Панель пока не ковырял, времени нет, модуль собирает инфу с термодатчиков, ардуина получает инфу с восьми DHT22 и рулит пятью твердотельными реле, а MDM принимает решение о мерах для поддержания климата.
Последний раз редактировалось Geban Вт июл 08, 2014 9:02 am, всего редактировалось 1 раз.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: модуль modbus

Сообщение LutsenkoDenis » Вт июл 08, 2014 8:33 am

Внесу свои пять копеек :)
Для того, чтобы каждый раз в цикле не высчитывать количество элементов, замените кусок кода:

Код: Выделить всё

for ($i=1;$i < count($recData); $i++)
{
 print $recData[$i].'|';
}
на этот:

Код: Выделить всё

$recDataCount = count($recData); 
for ($i = 1; $i < $recDataCount; $i++)
{
   print $recData[$i] . '|';
}
 
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Geban
Сообщения: 136
Зарегистрирован: Вс июл 14, 2013 2:42 pm
Благодарил (а): 6 раз
Поблагодарили: 26 раз

Re: модуль modbus

Сообщение Geban » Вт июл 08, 2014 8:59 am

LutsenkoDenis писал(а):Внесу свои пять копеек :)
Для того, чтобы каждый раз в цикле не высчитывать количество элементов, замените кусок кода:

Код: Выделить всё

for ($i=1;$i < count($recData); $i++)
{
 print $recData[$i].'|';
} 
на этот:

Код: Выделить всё

$recDataCount = count($recData); 
for ($i = 1; $i < $recDataCount; $i++)
{
   print $recData[$i] . '|';
}
Можно и так. спасибо )
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: модуль modbus

Сообщение sergejey » Вт июл 08, 2014 10:35 am

В целом ясно. Записал себе в список задач. Постараюсь сделать модуль в ближайшее время.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ответить