Работа со счетчиком Меркурий 230 через RS-485

Есть код на 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)

возможно.

Посмотрите скриншот тут: http://contactless.ru/wiki/index.php/Веб-интерфейс_Wiren_Board#History_.28.D0.98.D1.81.D1.82.D0.BE.D1.80.D0.B8.D1.8F_.D0.BF.D0.BE.D0.BA.D0.B0.D0.B7.D0.B0.D0.BD.D0.B8.D0.B9.29

да

собственно всё уже есть: 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, как в дефолте. Мои недочеты. Но может кому то понадобится. Всех с наступающим.
Немного офтопика: как убрать мертвые сериалдевайсы из вебморды ?

1 лайк

mqtt-delete-retained

1 лайк

В логах очень часто сыпется:
wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is mercury230:0]
Я так понимаю, что это из-за слишком частого опроса ?

Посмотрите настройки порта (стоп-бит), проверьте кабель. Попробуйте убрать другие устройства с линии.

Теоретически да, может быть виноват и частый опрос. В таком случае попробуйте поправить poll_interval и guard_interval

1 лайк