Есть код на php
<?
$fd = dio_open(’/dev/ttyNSC0’, O_RDWR);
dio_tcsetattr($fd, array(
‘baud’ => 9600,
‘bits’ => 8,
‘stop’ => 1,
‘parity’ => 0
));
echo “1”;
dio_write($fd, “\x00\x01\x01\x01\x01\x01\x01\x01\x01\x77\x81”, 11);
echo “2”;
$result = dio_read($fd);
echo “3”;
fclose($fd);
echo “4”;
?>
Которым происходит опрос счетчика взят отсюда
На пункте 2 все зависает
Вчем может быть проблема?
А откуда взят код?
С этим счётчиком у вас когда-нибудь получалось работать по RS-485? До нас доходили слухи, что в некоторых счётчиках Меркурий используется не совсем стандартный RS-485: там надо особым резистором активировать режим RS-485.
Код взят отсюда http://ab-log.ru/forum/viewtopic.php?f=1&t=540&hilit=crc&start=20
Этот счетчик с Программируемым логическим контроллером ОВЕН ПЛК 100 работает.
Вот такой http://www.owen.ru/catalog/73637995
У меня такое чуство что я не открываю (активирую) порт.
Возможно ли получить рабочий пример работы с портом, т.е.
Открытие, отправка данных, получение данных, закрытие.
Язык не имеет значения
Мне кажется, что проблема у вас в dio_read(). Это же блокирующая функция, она может висеть вечно.
Передайте ей какое-нибудь определённое количество байт для считывания соответствующим аргументом.
Я так и не разобрался в чем дело.
Через адаптер Меркурий-221 подключенный к USB все работает.
Напрямую через RS-485 не устанавлювает связь.
Команды одни и те же проверял через снифер.
Заморачиваться пока не буду стоят другие насущные задачи.
Передайте ей какое-нибудь определённое количество байт для считывания соответствующим аргументом.
А вот это пробовали?
Пробовал.
Вот часть кода
dio_write($fd, “\x00\x01\x01\x01\x01\x01\x01\x01\x01\x77\x81”, 11);
usleep($sleep_time);
$result = dio_read($fd, 15);
Через $fd = dio_open(’/dev/ttyUSB0’, O_RDWR);
Все работает
Через $fd = dio_open(‘/dev/ttyNSC0′, O_RDWR);
Не работает.
И еще вопрос: при инициализации модема командой
/opt/utils/gsm/gsm.sh toggle
Падает локальная сеть, это нормально?
Нет, не нормально. Вывод dmesg покажите пожалуйсата после того, как падает.
… И напишите пожалуйста подробнее, что значит “падает”.
На php очень удобно работать с сокетами.
$f = fsockopen($IP,$Port,$errno,$errstr,5); // открыть сокет (адрес, порт)
fwrite($f,$c,4); // записать 4 байта
$result = fread($f, 4); // прочитать 4 байта
fclose($f); // закрыть сокет
В случае подключения Меркурий-230 через преобразователь Moxa N-port 5130 (в режиме TCP-сервер обращаемся по IP-адресу преобразователя на порт 4001, по умолчанию). Если счетчик подключаем непосредственно к машине на которой установлен преобразователь USB/RS485, устанавливаем дополнительно пакет ser2net (конфиг - 2000:raw:0:/dev/ttyRS485:9600 8DATABITS NONE 1STOPBIT) - в этом случае адрес 127.0.0.1 порт 2000.
Работает без нареканий и ошибок.
Тестировали на Ubuntu, Debian, raspbrianpi
Подскажите, пожалуйста, а на текущий момент как реализована поддержка работы с данным электросчетчиком ? Привязали ли настройку и работу с ним к интерфейсу (вебморде). Или все осталось на уровне скрипта из блога ab-log ?
да, всё работает из коробки. Выбираете девайс mercury230 в интерфейсе и всё.
Спасибо за ответ. тогда продолжу тему,
Как часто происходит опрос ? какие параметры опрашивает ?
можно ли скриншот мониторинга счетчика увидеть ?
Запись идет в БД ?
как настроите.
Вплоть до максимальной возможной (с нулевым простоем шины).
все мгновенные и счётчики. Потарифные не снимаются. На условиях платной ТП можем добавить любые другие.
Вот список: https://github.com/contactless/wb-homa-drivers/blob/master/wb-mqtt-serial/wb-mqtt-serial-templates/config-mercury230.json
Запись в БД идёт, да.
у вас на сайте демоинтерфейс глючный или мне показалось, не смог увидеть возможность построения графиков по собранной инфе от счетчика. И еще в догонку, в консоле операционки я смогу получить данные по любому из перечисленных параметров ? ( цель - используя userparameter тащить значения в zabbix)
возможно.
Посмотрите скриншот тут: Веб-интерфейс контроллеров Wiren Board — Wiren Board
да
собственно всё уже есть: Zabbix — Wiren Board
Кроме этого, есть нативная поддержка Zabbix: GitHub - wirenboard/wb-mqtt-zabbix: WB MQTT <--> Zabbix bridge
Подключил меркурий230 к rs-485(can),
cat /etc/wb-mqtt-serial.conf:
{
"debug": true,
"ports": [
{
"path": "/dev/ttyAPP1",
"baud_rate": 9600,
"parity": "N",
"data_bits": 8,
"stop_bits": 2,
"poll_interval": 10,
"enabled": true,
"devices": [
{
"slave_id": 0,
"device_type": "mercury230",
"enabled": true,
"protocol": "mercury230"
}
]
},
{
"path": "/dev/ttyAPP4",
"baud_rate": 9600,
"parity": "N",
"data_bits": 8,
"stop_bits": 2,
"poll_interval": 10,
"enabled": false,
"devices": [
{
"slave_id": "0x02",
"device_type": "mercury230"
}
]
},
{
"path": "/dev/ttyAPP2",
"baud_rate": 9600,
"parity": "N",
"data_bits": 8,
"stop_bits": 2,
"poll_interval": 10,
"enabled": false,
"devices": []
},
{
"path": "/dev/ttyAPP3",
"baud_rate": 9600,
"parity": "N",
"data_bits": 8,
"stop_bits": 2,
"poll_interval": 10,
"enabled": false,
"devices": []
}
]
}
Сервис перезапустил.
Данные с меркурия не пошли.
tail /var/log/messages:
Dec 28 08:40:22 wirenboard-AORXNAWN user.notice serial: Write: 00 01 01 01 01 01 01 01 01 77 81
Dec 28 08:40:23 wirenboard-AORXNAWN user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: failed to establish meter connection [slave_id is mercury230:0]
Сам себе отвечу. Во первых CAN реализован на /dev/ttyAPP4
Во вторых стоповый бит у Меркурий230 по умолчанию 1, а не 2, как в дефолте. Мои недочеты. Но может кому то понадобится. Всех с наступающим.
Немного офтопика: как убрать мертвые сериалдевайсы из вебморды ?
mqtt-delete-retained
В логах очень часто сыпется:
wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is mercury230:0]
Я так понимаю, что это из-за слишком частого опроса ?
Посмотрите настройки порта (стоп-бит), проверьте кабель. Попробуйте убрать другие устройства с линии.
Теоретически да, может быть виноват и частый опрос. В таком случае попробуйте поправить poll_interval и guard_interval