чтение мгн. U,P, I эл.счетчика милур 104 и вывод статистики

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

чтение мгн. U,P, I эл.счетчика милур 104 и вывод статистики

Сообщение directman66 » Сб ноя 11, 2017 1:03 am

Делюсь своим вариантом получения потребляемой мощности и напряжения.

Роутер c usb, в моем примере asus rt-n66u, установлен в непосредственной близости к счетчику. У счетчика Милур 104
СпойлерПоказать
Изображение
есть порт rs485. В роутер вставлен китайский преобразователь rs485-usb
СпойлерПоказать
Изображение
СпойлерПоказать
2034b1c6-f5e3-4a68-b9d3-e25668543500.jpg
2034b1c6-f5e3-4a68-b9d3-e25668543500.jpg (71.02 КБ) 4191 просмотр
fb587e1a-eeef-4042-9f6d-eb853959b905.jpg
fb587e1a-eeef-4042-9f6d-eb853959b905.jpg (103.06 КБ) 4191 просмотр
На роутере установлена прошивка asuswrt-merilin и пакет optware. Нам требуется доустановить coreutils, ser2net и настроить их.

Для того, чтобы железяка успешно стартовала и передавала параметры, необходимо было найти и прописать модуль устройства. Иначе преобразователь работал как модем и посылал какой-то шум.

Извиняюсь, что много ошибок в тексте. Времени уже много (


Скрипт автозапуска роутера:
СпойлерПоказать

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


admin@RT-N66U-8A78:/tmp/home/root# cat /jffs/scripts/mydevice-start.sh
#!/bin/sh
DEVICE="/dev/ttyUSB0"
SPEED=9600
PRODUCT="1a86:7523"  # u-blox GPS receiver

# wait for device to become ready
modprobe cdc-acm
insmod /jffs/scripts/ch341.ko
ser2net -C "3000:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3001:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3002:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3003:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3004:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3005:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3006:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

ser2net -C "3007:raw:60:/dev/ttyUSB0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS"

while : ; do
  lsusb | grep -qi "$PRODUCT"
  if [ $? -eq 0 ]; then
    break
  else
    sleep 5
  fi
done

stty -F $DEVICE $SPEED raw -clocal -echo icrnl
Ссылки на модуль внизу 1 сообщения.

Скрипт обработки запроса МД к роутеру
СпойлерПоказать

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

function strToHex($string){
    $hex='';
    for ($i=0; $i < strlen($string); $i++){
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}


function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

function hex2str($hex) {
    $str = '';
    for($i=0;$i<strlen($hex);$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
    return $str;
}

$host="192.168.1.1";
$port=3000;
   $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"));  // Create Socket
        if (socket_connect($socket, $host, $port)) {  //Connect
//circle 1
        $sendStr = 'ff 08 00 ff ff ff ff ff ff 4f 2d';  // 16 hexadecimal data
        $sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // The 16 binary data into a set of two arrays
     
                      for ($j = 0; $j <count ($sendStrArray); $j++) {
                              socket_write ($socket, Chr (hexdec ($sendStrArray[$j])));   // by group data transmission
            }
            $receiveStr = "";
            $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ);  // The 2 band data received 
                      $receiveStrHex = bin2hex ($receiveStr);   // the 2 hexadecimal data convert 16 hex
         echo  "send:".$sendStr ; 
         echo " answer:" . $receiveStr;   
         echo " answerSTR:" .hex2str($receiveStrHex);
         echo " answerHEX:" . $receiveStrHex.'<br>';
   
         
         //цикл 2
         
        $sendStr = 'ff 01 20 41 b8';  // модель
        $sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // The 16 binary data into a set of two arrays
     
                      for ($j = 0; $j <count ($sendStrArray); $j++) {
                              socket_write ($socket, Chr (hexdec ($sendStrArray[$j])));   // by group data transmission
            }
            $receiveStr = "";
            $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ);  // The 2 band data received 
                      $receiveStrHex = bin2hex ($receiveStr);   // the 2 hexadecimal data convert 16 hex
         echo  "send:".$sendStr ; 
         echo " answer:" . $receiveStr;   
         echo " answerSTR:" .hex2str($receiveStrHex);
         echo " answerHEX:" . $receiveStrHex.'<br>';
 
         //цикл 3
        $sendStr = 'ff 01 03 00 61';  // P
        $sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // The 16 binary data into a set of two arrays
     
                      for ($j = 0; $j <count ($sendStrArray); $j++) {
                              socket_write ($socket, Chr (hexdec ($sendStrArray[$j])));   // by group data transmission
            }
            $receiveStr = "";
            $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ);  // The 2 band data received 
                      $receiveStrHex = bin2hex ($receiveStr);   // the 2 hexadecimal data convert 16 hex
        
$phex=substr($receiveStrHex,12,2).substr($receiveStrHex,10,2).substr($receiveStrHex,8,2);
$p=hexdec($phex)/1000;          
         echo  "P:".$sendStr ; 
         echo " answer:" . $receiveStr;   
         echo " answerSTR:" .hex2str($receiveStrHex);
         echo " answerHEX:" . $receiveStrHex;
  echo " answerPHEX:" . $phex;   
          echo " answerP:" . $p.'<br>';
                sg("current.P",$p);  
         
    //цикл 4
        $sendStr = 'ff 01 01 81 a0 ';  // U
        $sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // The 16 binary data into a set of two arrays
     
                      for ($j = 0; $j <count ($sendStrArray); $j++) {
                              socket_write ($socket, Chr (hexdec ($sendStrArray[$j])));   // by group data transmission
            }
            $receiveStr = "";
            $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ);  // The 2 band data received 
                      $receiveStrHex = bin2hex ($receiveStr);   // the 2 hexadecimal data convert 16 hex
       
$uhex=substr($receiveStrHex,12,2).substr($receiveStrHex,10,2).substr($receiveStrHex,8,2);
$u=hexdec($uhex)/1000;       
 echo  "U:".$sendStr ; 
         echo " answer:" . $receiveStr;   
         echo " answerSTR:" .hex2str($receiveStrHex);
         echo " answerHEX:" . $receiveStrHex;    
      echo " answerUHEX:" . $uhex;   
          echo " answerU:" . $u.'<br>'; 
         sg("current.U",$u);
        }
        socket_close($socket);  // Close Socket

 
Декодировка протокола обмена проводилась по примеру протокола меркуриев. Родной протокол взаимодействия найти не удалось.

В планах научиться получать значения счетчиков раз в месяц.

Ссылка на архив драйвера https://yadi.sk/d/wwdJCkmA3PbRsc
Ссылка на модуль в отдельности https://yadi.sk/d/Hv4FDzD33PbRxu
Ссылка на протокол меркурий (очень похож) https://yadi.sk/i/9LlIbMyM3PbpyG
Руководство на счетчик https://yadi.sk/i/y4ZmytsD3Pc4Pu

upd: разработчик прислал описание протокола милур! https://yadi.sk/i/sVrkf7Wk3PdvDA
Последний раз редактировалось directman66 Вт фев 20, 2018 3:16 pm, всего редактировалось 4 раза.
За это сообщение автора directman66 поблагодарил:
Ron (Пн дек 25, 2017 11:35 pm)
Рейтинг: 1.23%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение directman66 » Сб ноя 11, 2017 4:29 pm

Хочу также научиться получать значения регистров. Из встроенного конфигуратора получены актуальные значения и ответ счетчика.

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

16:08:22 - устройство с адресом:255. Получение измерительных данных однофазного счетчика
16:08:22 - TX: ff 08 00 ff ff ff ff ff ff 4f 2d 
16:08:22 - RX: ff 08 00 46 30 
16:08:22 - TX: ff 01 04 41 a3 
16:08:22 - RX: ff 01 04 04 58 84 85 00 de 52  - скорее всего общий счетчик по всем тарифам, показывает 5848,85
16:08:22 - TX: ff 01 05 80 63 
16:08:22 - RX: ff 01 05 04 94 47 82 00 12 df - значения в конфигураторе 2874.49, тариф 1
16:08:22 - TX: ff 01 06 c0 62 
16:08:22 - RX: ff 01 06 04 63 47 92 00 2d 58  - значения в конфигураторе 2974.36 , тариф 2
16:08:22 - TX: ff 01 07 01 a2 
16:08:22 - RX: ff 01 07 04 00 00 00 00 ef b8  - значения в конфигураторе 0 , тариф 3
16:08:22 - TX: ff 01 08 41 a6 
16:08:22 - RX: ff 01 08 04 00 00 00 00 ef 47 - значения  в конфигураторе 0 , тариф 4
Справа отмечены значения, которые отображает конфигуратор.

Выйти на эти цифры у меня не получилось.

Из протокола меркурия:
СпойлерПоказать

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

Пример:
Запрос чтения количества зафиксированной энергии по сумме тарифов для счётчика с ад-
ресом 128.
Запрос: 80 08 14 F0 (CRC)
Ответ: 80 00 00 2C 36 FF FF FF FF 00 00 2F 07 00 00 00 00 (CRC)
NA+ = 362Ch = 13868d EA+ = 13868 Вт⋅ч
NR+ = 072Fh = 1839d ER+ = 1839 вар⋅ч

по логике понимаю, что за значения регистров отвечают 5-7 бит,

т.е. 0x944782 = 2874.49
и 0x634792=2974.36
но каким образом получаются эти значения, мне не понятно

еще запрос:
СпойлерПоказать

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

18:47:35 - TX: ff 01 04 41 a3 
18:47:35 - RX: ff 01 04 04 14 25 85 00 99 20 - 5852.41
18:47:35 - TX: ff 01 05 80 63 
18:47:35 - RX: ff 01 05 04 94 47 82 00 12 df  - 2874.39
18:47:35 - TX: ff 01 06 c0 62 
18:47:35 - RX: ff 01 06 04 29 77 92 00 3b 4f   - 2977.92
18:47:35 - TX: ff 01 07 01 a2 
18:47:35 - RX: ff 01 07 04 00 00 00 00 ef b8  - 0
18:47:35 - TX: ff 01 08 41 a6 
18:47:35 - RX: ff 01 08 04 00 00 00 00 ef 47  - 0

зыж, похоже счетчики отдают значение в джоулях 1 J = 0.00027777777777778 Wh

и все равно значения отличаются. У меня мысли закончились.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение directman66 » Пн дек 25, 2017 1:54 pm

Из данных протокола:
СпойлерПоказать

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

4.1.26.​ Интерфейсный объект «Энергия в суточных интервалах», «Энергия в месячных интервалах»

Интерфейсные объекты «Энергия в суточных интервалах», «Энергия в месячных интервалах» представляют собой линейный список, заполняемый по событиям «Начало новых суток», «Начало нового месяца».

Элемент списка «Энергия в интервалах» представляет собой структуру.

Для версий ПО счетчика до 3.99 включительно метод возвращает следующую структуру данных:

typedef struct{

BYTE seconds;    // Секунды (0..59)

BYTE minutes;    // Минуты (0..59)

BYTE hours;    // Часы (0...12)

BYTE day;    // День месяца (1...31)

BYTE month;    // Месяц (1...12)

BYTE year;    // Год (00...99)

BYTE energy[20];    // Энергия (20 байт)

} ENTARecord_t;

Для версий ПО счетчика, начиная с 4.00 включительно, метод возвращает следующую структуру данных:

typedef struct{

BYTE seconds;    // Секунды (0..59)

BYTE minutes;    // Минуты (0..59)

BYTE hours;    // Часы (0...12)

BYTE day;    // День месяца (1...31)

BYTE month;    // Месяц (1...12)

BYTE year;    // Год (00...99)

BYTE energy[20];    // Энергия активная на начало интервала, (20 байт)

BYTE energyQ[20];    // Энергия реактивная на начало интервала, (20 байт)

} ENTAQRecord_t;

Элемент структуры «energy» ( и «energyQ» ) содержит двадцать байт, в которые записываются: значение суммарной активной (реактивной) энергии по всем тарифам, активной (реактивной) энергии по тарифу1, активной (реактивной) энергии по тарифу 2, активной (реактивной) энергии по тарифу 3, активной (реактивной) энергии по тарифу 4. Значение энергий выводится в упакованном BCD-формате, младший байт вперёд, младшая тетрада вперёд. Например, считанное значение 60 10 00 00 означает значение энергии 1,06 кВтч. Каждая значащая цифра энергии располагается в своей тетраде. Структура элемента «energy» ( и «energyQ» ) следующая:

Смещение, байт

Наименование параметра

Длина параметра, байт

0

Суммарная энергия

4

4

Энергия по тарифу 1

4

8

Энергия по тарифу 2

4

12

Энергия по тарифу 3

4

16

Энергия по тарифу 4

4

Управление функциональностью объектов «Энергия в интервалах» осуществляется посредством команд LISTINIT, GETLISTNE, GET_ENTALIST.

Для работы со списками, необходимо сначала выставить время в счетчике, а затем проинициализировать их командой LISTINIT.

После успешной инициализации список будет содержать одну запись, в которой будет содержаться значение энергий на момент инициализации списка.

Командами GET_ENTALIST с указанием объекта и параметром порядкового номера записи можно получить её содержимое одной записи списка в формате ENTARecord_t или ENTAQRecord_t.

Максимальное количество записей в списке «Энергия в суточных интервалах» − 35 или 123. Максимальное количество записей в списке «Энергия в месячных интервалах» − 12. Номер запрашиваемой записи в команде GET_ENTALIST должен быть в диапазоне от 0 до 34 (или от 0 до 122) и от 0 до 11 соответственно. В противном случае будет возвращен код ошибки.

Командой GETLISTNE запрашивается общее количество имеющихся в списке записей. Количество записей для заполненного списка всегда будет возвращаться всегда одно и то же – 35 (или 123) и 12 соответственно. Для заполненного списка индексы 34 (или 122) и 11 соответственно всегда являются текущими.

При установке времени счетчика, переводе часов, потере времени из-за разряженной батареи резервного питания в списке могут появляться пропуски или появляться дублирующие записи с одинаковым временем.

В выключенном состоянии новые записи в списке не формируются.

При включении счетчика, если день или месяц последней записи, не совпадают с текущими, в списке формируется новая запись с датой, временем, энергиями на момент включения счетчика. 
вроде по русски написано, но не понимаю как получить суммарную энергию по каждому тарифу
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение directman66 » Вс янв 28, 2018 6:01 pm

Добавлен функционал расчета потребленной энергии. Естественно я понимаю, что значения примерные и очень сильно зависят от частоты собираемых значений. Но тем не менее полученные значения очень похожи.
Метод, вызываемый при изменении значений мощности P (подходит к любому счетчику):
СпойлерПоказать

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

$i=gg("current.P")/gg("current.U");
sg("current.I",  round($i,2));
SQLUpdate('objects', array("ID"=>$this->id, "DESCRIPTION"=>gg('sysdate').' '.gg('timenow'))); 

//расчет потребленного электричества с момента последней проверки
//получаем дату предыдущей проверки
//$laststamp=getHistoryValue($this->getProperty('timestamp'),);
$t1=gg("current.t1");
$t2=gg("current.t2");
$laststamp=gg('current.lasttimestamp');
$diff=(gmdate('i',trim(time()-$laststamp)));
$pattern = "|\b[0]+([1-9][\d]*)|is"; 
$diff2= preg_replace($pattern, "\\1", $diff); 
sg("current.proshlo_min",  $diff2);

//получаем последннее значение мощности
//$lastph=getHistoryMax($this->getProperty('P'));
//$lastph=getHistoryMax("current.P");
$lastph=getHistoryValue("current.P", $laststamp-1,$laststamp+1);
//переведем в ват в мин
$lastpm=$lastph*0.0166667;
 //за последний период в минутах было потреблено ватт
$potrebleno=$lastpm*$diff2;
sg("current.potrebleno_w",  $potrebleno);
sg("current.lastph",  $lastph);
sg("current.lastpm",  $lastpm);
$time=date("H:i:s");
//sg("current.time",  $time);

$date_min = new DateTime("7:00"); // минимальное значение времени
$date_max = new DateTime("23:00"); // максимальное значение времени
$date_now = new DateTime($date); // текущее значение времени
// Проверяем, находится ли $date_now в диапазоне
if ($date_now >= $date_min && $date_now <= $date_max) 
{$tarif=1; 
sg("current.potrebleno_w_t1",  $potrebleno);
sg("current.potrebleno_w_t1_sum",  gg("current.potrebleno_w_t1_sum")+$potrebleno); 
//$st=$t1/16.6667;
 $st=$t1/1000;
sg("current.potrebleno_w_t1_rub",  $potrebleno*$st);
sg("current.potrebleno_w_rub",  $potrebleno*$st); 
} else
{$tarif=2;
sg("current.potrebleno_w_t2",  $potrebleno);
sg("current.potrebleno_w_t2_sum",  gg("current.potrebleno_w_t2_sum")+$potrebleno);  
//$st=$t2/16.6667;
 $st=$t2/1000;
sg("current.potrebleno_w_t2_rub",  $potrebleno*$st);
sg("current.potrebleno_w_rub",  $potrebleno*$st);
 
}
sg("current.tarif",  $tarif);


 
Сценарий отправки сообщений в телегу:
СпойлерПоказать

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

include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();

//$lu=gg("kia ceed.updated");
$luts=gg("current.timestamp");
$diff=(gmdate('i',trim(time()-$luts)));
$pattern = "|\b[0]+([1-9][\d]*)|is"; 
$diff2= preg_replace($pattern, "\\1", $diff); 
$text = "Информация была получена "  .$diff2 . " минут назад. ";
$telegram_module->sendMessageToAll($text);
$text="P:".gg('current.P')."W / U:".gg("current.U")."V/ I:".gg("current.I")."A";
$telegram_module->sendMessageToAll($text);
$date=date("d.m.YY");
$now=date();

$watt=getHistorySum('current.potrebleno_w', $now-3600 ,$now);
$rub=getHistorySum('current.potrebleno_w_rub', $now-3600 ,$now);
//$text = "За ".$date. " было израсходовано ".$watt." Вт (".$rub. "руб.)";
$text = "За час было израсходовано ".round(($watt/1000),2)." КВт (".round($rub,2). "руб.)";
$telegram_module->sendMessageToAll($text);

$watt=getHistorySum('current.potrebleno_w', $now-86400 ,$now);
$rub=getHistorySum('current.potrebleno_w_rub', $now-86400 ,$now);
//$text = "За ".$date. " было израсходовано ".$watt." Вт (".$rub. "руб.)";
$text = "За сутки было израсходовано ".round(($watt/1000),2)." КВт (".round($rub,2). "руб.)";
$telegram_module->sendMessageToAll($text);

$watt=getHistorySum('current.potrebleno_w', $now-604800 ,$now);
$rub=getHistorySum('current.potrebleno_w_rub', $now-604800,$now);
//$text = "За ".$date. " было израсходовано ".$watt." Вт (".$rub. "руб.)";
$text = "За неделю  было израсходовано ".round(($watt/1000),2)." КВт (".round($rub,2). "руб.)";
$telegram_module->sendMessageToAll($text);

  $watt=getHistorySum('current.potrebleno_w', $now-2629743,$now);
$rub=getHistorySum('current.potrebleno_w_rub',$now-2629743,$now);
//$text = "За ".$date. " было израсходовано ".$watt." Вт (".$rub. "руб.)";
$text = "За месяц  было израсходовано ".round(($watt/1000),2)." КВт (".round($rub,2). "руб.)";
$telegram_module->sendMessageToAll($text);


$url = 'http://192.168.1.35/pChart/?p=current.P&type=2d&width=1980&height=1440';
$path = './cached/chart.jpg';
file_put_contents($path, file_get_contents($url));
$telegram_module->sendImageToAll('/var/www/cached/chart.jpg');

$url = 'http://192.168.1.35/pChart/?p=current.U&type=2d&width=1980&height=1440';
$path = './cached/chart.jpg';
file_put_contents($path, file_get_contents($url));
$telegram_module->sendImageToAll('/var/www/cached/chart.jpg');


$url = 'http://192.168.1.35/pChart/?p=current.A&type=2d&width=1980&height=1440';
$path = './cached/chart.jpg';
file_put_contents($path, file_get_contents($url));
$telegram_module->sendImageToAll('/var/www/cached/chart.jpg');





//отправляем картинку в телеграмм
//$img='./cached/power.jpg';


 
СпойлерПоказать
234.png
234.png (37.11 КБ) 4020 просмотров
не забывайте нажать "спасибо" )
За это сообщение автора directman66 поблагодарили (всего 2):
savenko_egor (Ср фев 07, 2018 3:14 pm) • Teacher_77 (Вт фев 20, 2018 12:23 pm)
Рейтинг: 2.47%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
Teacher_77
Сообщения: 25
Зарегистрирован: Пт янв 05, 2018 1:54 pm
Благодарил (а): 13 раз
Поблагодарили: 0

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение Teacher_77 » Вт фев 20, 2018 12:40 pm

Коллега, я так понял вам удалось "пробросить" данные с RS-485 на порт TCP, где вы их забираете и дешифруете?
Не подскажете что за софт это делает, из скрипта я не очень понял.
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение directman66 » Вт фев 20, 2018 2:23 pm

В 1 сообщении есть информация о перепрошивке роутера и есть скрипты запуска ser2net. Он должен работать на всех dd-wrt (optware) прошивках роутера. Он собственно и пребразует физический уровень в сетевой. Также пришлось внедрять модуль в ядро, чтобы свисток корректно отображался.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
Teacher_77
Сообщения: 25
Зарегистрирован: Пт янв 05, 2018 1:54 pm
Благодарил (а): 13 раз
Поблагодарили: 0

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение Teacher_77 » Вт фев 20, 2018 2:31 pm

въехал.
будем пробовать. получается это самый недорогой способ, т.к. радиоудлиннители rs-485 стоят раза в 2-3 дороже.
а удалось расшифровать данные протокола?
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение directman66 » Вт фев 20, 2018 3:01 pm

Дак конечно!
СпойлерПоказать
Безымянный33.png
Безымянный33.png (102.99 КБ) 3874 просмотра
Вся инфа о протоколе тоже в 1 сообщении. Достаточно добавить готовые сценарии и все будет работать, если счетчик у вас такой-же. Также родной программой от милур *конфигутор" можете проверить корректность настройки sern2net.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
Teacher_77
Сообщения: 25
Зарегистрирован: Пт янв 05, 2018 1:54 pm
Благодарил (а): 13 раз
Поблагодарили: 0

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение Teacher_77 » Вт фев 20, 2018 3:08 pm

супер.
но у меня не милур - я еще не взял пока счетчик.
мне приходится ставить дублирующий, поэтому пока выбираю. скорее всего Энергомеру возьму - т.к. почти готовый модуль уже есть
Только у меня 3 фазы и 2 тарифа.
directman66
Сообщения: 2755
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 377 раз
Поблагодарили: 632 раза
Контактная информация:

Re: чтение мгновенных данных U,P, I электросчетчика милур 10

Сообщение directman66 » Вт фев 20, 2018 3:13 pm

Тут вроде на форуме были сценарии работы с протоколом меркурий. Он более распространен и на него точно в сети много примеров работы. А вообще почти все счетчики работают по протоколу MODBUS в разнличных их вариациях (в понимании производителя).
За это сообщение автора directman66 поблагодарил:
Teacher_77 (Вт фев 20, 2018 6:24 pm)
Рейтинг: 1.23%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram | +79122962262 WhatsApp
Ответить