А именно, в теме:
Элементы "умного дома" на Beckhoff рассказывается о контроллере Beckhoff BC9000 и каплере BK9000, поддерживающем протокол ModBus TCP и в теме
Открытая система MajorDoMo упоминается о использовании платы Arduino (в подробности я не вдавался), для которой тоже есть реализация протокола ModBus, а когда есть все исходники лучше выбрать проверенное временем, промышленное решение, чем изобретать свой протокол (ИМХО).
Вот, что я накопал (копия с моей странички):
Утилита Modpoll.
* http://www.focus-sw.com/fieldtalk/modpoll.html Версия 2.4
* http://www.modbusdriver.com/modpoll.html Версия 3.1
Эта утилитка работает как под Windows, так и под Linux. Пользоваться ей крайне просто, копируете исполняемый файл из архива на диск и в командной строке набираете (пример для win):
Отключить WD-таймер
C:\>modpoll.exe -m tcp -r 61441 192.168.100.120 0
Записать выходы
C:\>modpoll.exe -m tcp -r 1 192.168.100.120 8888
Надо обратить внимение на то, что адрес регистра WD, по описанию модуля Momentum 461441 в десятичном виде, а для работы Modpoll необходимо указвать 61441. Почему так не знаю, но тоже относится и к другим регистрам. Единственный недостаток Modpoll, на мой взгляд, это закрытость кода.
Так-как планировалось писать скрипт управления на PHP, я счел не совсем удобным пользоваться функцией exec и решил поискать готовые решения на PHP.
Нашлось две реализации протокола Modbus на PHP:
* PhpModbus - http://code.google.com/p/phpmodbus/ , но этот проект не поддерживает Modbus TCP/IP
* Class: ModbusTcp - http://www.phpclasses.org/package/377-P ... kage-.html , этот проект удовлетворил все мои потребности.
Для примера, вот небольшой скриптик (на 99% это пример из проекта):
Код: Выделить всё
<?php
require_once "Class_ModbusTcp.inc";
$Plc = new ModbusArray;
$Plc->SetAdIpPLC ("192.168.100.120");
/********************************************************/
$Adr = 400001;
$Values = array(3333);
// Записать значение $Values по адресу $Adr
$result = $Plc->WriteModbus($Adr,$Values) ;
/********************************************************/
$Plc->print_r_log($result) ;
$Plc->ModClose();
unset($Plc);
?>