Страница 1 из 26

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

Добавлено: Пт июл 04, 2014 8:32 am
Geban
Добавил в последние обновления модуль 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

Re: модуль modbus

Добавлено: Пт июл 04, 2014 11:08 am
ignat99
Вот в этой французкой системе, есть модуль на си 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/

Имидж на Райсрбери Пай лучше писать популярной утилитой под виндоус, под Линукс нужно делать ещё один финт с загрузчиком, который тут не указан.

Re: модуль modbus

Добавлено: Пт июл 04, 2014 12:29 pm
Geban
проблема не в том что бы подружить modbus с линуксовой машиной, с этим траблов нет. Хотелось иметь поддержку этого протокола внутри MDM, так сказать нативно. А не так как это работает у меня сейчас.
На винду у меня аллергия. Поэтому все действия происходят под Debian7

Re: модуль modbus

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

Re: модуль modbus

Добавлено: Пн июл 07, 2014 1:52 pm
Geban
sergejey писал(а):
Geban писал(а):проблема не в том что бы подружить modbus с линуксовой машиной, с этим траблов нет. Хотелось иметь поддержку этого протокола внутри MDM, так сказать нативно. А не так как это работает у меня сейчас.
На винду у меня аллергия. Поэтому все действия происходят под Debian7
А нет какого-нибудь HTTP API для этого протокола? Типа как для OneWire. Было бы идеально.
Да вот фиг знает! Не нашел я. Все что есть это библиотека для PHP которую я пользую.

Re: модуль modbus

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

Re: модуль modbus

Добавлено: Пн июл 07, 2014 10:32 pm
Geban
в корне вэб сервера лежит файл 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 принимает решение о мерах для поддержания климата.

Re: модуль modbus

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

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

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

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

$recDataCount = count($recData); 
for ($i = 1; $i < $recDataCount; $i++)
{
   print $recData[$i] . '|';
}
 

Re: модуль modbus

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

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

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

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

$recDataCount = count($recData); 
for ($i = 1; $i < $recDataCount; $i++)
{
   print $recData[$i] . '|';
}
Можно и так. спасибо )

Re: модуль modbus

Добавлено: Вт июл 08, 2014 10:35 am
sergejey
В целом ясно. Записал себе в список задач. Постараюсь сделать модуль в ближайшее время.