Чтение показаний электросчетчика Меркурий 206 rn

Написал небольшой PHP скрипт для получения основных показаний с электросчетчика Меркурий 206 RN (RS-485)
8-ой контакт (А) и 9-ый (B) от счетчика подключаем к A и B RS-485 порта на контроллере, питание +(7 контакт) и землю -(10 контакт) для порта счетчика берем с контроллера 5V и GND.
Обмен данными через RS-485 (/dev/ttyNSC1 в контроллере).
Для работы скрипта необходим - php_serial.class.php (Rémy Sanchez)
Скрипт работает только из под консоли, через веб сервер не запускайте не заработает :wink:
В скрипте необходимо изменить в запросах к счетчику, серийный номер счетчика на свой.
В моем случае номер счетчика 19174782 переводим в шестнадцатиричную систему и получаем \x01\x24\x95\x7E - менять только эти значения, после адреса идет сам запрос значений. Перевести можно на этом сайте: http://calc-x.ru/dec_to_hex_form.php
$serial->sendMessage("\x01\x24\x95\x7E\x27\x62\xA6",1);

Сам скрипт:

<?php

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}
function strToHex($string){
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}
function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

include "php_serial.class.php";
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyNSC1");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(2);
$serial->confFlowControl("none");
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 10);

$serial->sendMessage("\x01\x24\x95\x7E\x27\x62\xA6",1);
$otvet = $serial->readPort();
$tarif1 = substr(strToHex($otvet), 12,6)/100;
echo "1. По 1 тарифу (кВт/ч) - ".$tarif1."\n";
$serial->sendMessage("\x01\x24\x95\x7E\x63\x62\x95",1);
$otvet = $serial->readPort();
$napryajenie = substr(strToHex($otvet), 10,4)/10;
$mochnost = substr(strToHex($otvet), 20,4)/100;
$tok = substr(strToHex($otvet), 14,4)/100;
echo "2. Напряжение сети (В) - ".$napryajenie."\n";
echo "3. Потребляемая мощность (Вт) - ".$mochnost."\n";
echo "4. Сила тока (А) - ".$tok."\n";
$serial->sendMessage("\x01\x24\x95\x7E\x81\xE2\xDC",1);
$otvet = $serial->readPort();
$chastota = substr(strToHex($otvet), 10,4)/100;
echo "5. Частота (Гц) - ".$chastota."\n";
$serial->sendMessage("\x01\x24\x95\x7E\x66\xA2\x96",1);
$otvet = $serial->readPort();
$dataproizv = substr(strToHex($otvet), 10,6);
echo "6. Дата производства - ".$dataproizv."\n";
$serial->sendMessage("\x01\x24\x95\x7E\x2C\x23\x61",1);
$otvet = $serial->readPort();
$datavkl = substr(strToHex($otvet), 12,12);
echo "7. Дата посл. вкл. - ".$datavkl."\n";
$serial->sendMessage("\x01\x24\x95\x7E\x21\xE2\xA4",1);
$otvet = $serial->readPort();
$time = substr(strToHex($otvet), 12,12);
echo "8. Время счетчика - ".$time."\n";

$serial->deviceClose();

?>

Спасибо!

Не против, если я в нашу вики добавлю?

Подскажите способы как бы удаленно снять показания со счетчика RS-485, если он стоит далеко от квартиры?
Может какие конвертеры есть RS-485->Ethernet (или может RS-485 с wifi есть), а Ethernet подключить через Ethernet по элпроводке.

Подскажите можно-ли с помощью этих штук поключится удаленно к счтчику:

http://www.ebay.com/sch/i.html?_from=R40&_trksid=p2050601.m570.l1313.TR0.TRC0.H0.XRS-485+wifi&_nkw=RS-485+wifi&_sacat=0

ArthurSa, спасибо, у меня есть Wirenboard :slight_smile:

пожалуй, оставлю

По вопросу: надо смотреть, как эта штука определяется в компьютере. Бывает telnet, бывает что-то разной степени нестандартности.

А не проще просто кинуть RS-485? Там же дальность до километра.