Снятие показаний счетчиков электричества, воды, газа

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение THK » 31 май 2011, 09:11

Сразу оговорюсь, занимаюсь со счетчиком не я, а друг и коллега по работе... Я лишь изредка помогаю.
Вот скрипт + небольшое описание команд:
Меркурий.rar
(1.41 КБ) 7275 скачиваний
В скрипте подробные комментарии.

PS Узнав, что эта инфа нужна еще кому то он обещал побыстрее разобраться с остальными командами...

Ilya
Сообщения: 12
Зарегистрирован: 11 май 2011, 19:50

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Ilya » 31 май 2011, 09:38

Спасибо большое! То что нужно! Попытаюсь запустить на своей системе) Тема очень интересна!

Ilya
Сообщения: 12
Зарегистрирован: 11 май 2011, 19:50

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Ilya » 31 май 2011, 10:52

Хм... Разбираюсь с командами для 200.02 Сравнивая пример с комментариями от Виктора и свой дамп - более ясно разобрался в принципе общения с счетчиком, однако, команды не совпадают... В обоих случаях запрос идет в таком виде: {серийный номер счетчика команда}

Вот к примеру запрос напряжения батарейки(из примера Виктора): {серийник 29 82 90}
А вот из моего дампа: {серийник 29 56 03}

дата изготовления(из примера Виктора): {серийник 66 С3 64}
из моего дампа: {серийник 66 17 F7}

Отсюда складывается вопрос: модели одинаковые, почему же тогда команды отличаются? Может я чего-то не понял? :oops:

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Andrey_B » 31 май 2011, 11:08

Илья, а что вам мешает составить свою версию протокола, которая работает с вашим счетчиком? Я так понимаю, дел там минут на 20.
В файле, который разместил Виктор, есть информация о дате изготовления, дате выхода версии. Может быть, у вас другая версия?

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение THK » 31 май 2011, 13:00

Вот к примеру запрос напряжения батарейки(из примера Виктора): {серийник 29 82 90}
А вот из моего дампа: {серийник 29 56 03}

дата изготовления(из примера Виктора): {серийник 66 С3 64}
из моего дампа: {серийник 66 17 F7}

Отсюда складывается вопрос: модели одинаковые, почему же тогда команды отличаются? Может я чего-то не понял? :oops:
Интересно! Может быть команда - 66, а С3 64 (в Вашем случае 17 F7) еще что-то? Дата или время закодированное...
Надо поковырять в этом направлении.

PS Совсем забыл сказать, скрипт, который я выкладывал работает под виндой.
По этому поводу мной было сказано много слов, вот некоторые: "на", "Windows" и т.д. :D

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение THK » 31 май 2011, 13:04

Илья, наверное, два последних байта команды, это контрольная сумма. Серийники разные, вот и циферки не сходятся. ;)

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Andrey_B » 31 май 2011, 15:04

А ведь Виктор совершенно прав! Это контрольная сумма.

Ilya
Сообщения: 12
Зарегистрирован: 11 май 2011, 19:50

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Ilya » 31 май 2011, 16:40

Если это контрольная сумма - то тогда все понятно :) Я как раз и тестирую под Windows) Когда будет стабильно - перенесу все на Linux Однако тут тоже было не все гладко... Поменяв команду на ту, что у меня в дампе, я получал один и тот же ответ при каждом выполнении скрипта... Тк я новичок в этом деле - полчаса убил пока до меня дошло что в мой счетчик сначала отправляет мне посланный мною запрос (я так понимаю это называется "эхо") и следом шлет ответ... Т.е. в моем случае скрипт брал значения из моего запроса- поэтому и ответ давал неизменный :lol:

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Andrey_B » 31 май 2011, 23:05

Илья, я проверил алгоритм.
Два последних байта - это Modbus CRC
Полином: 0xA001
Код на С

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

unsigned int CRC16;
#define SEED 0xFFFF
#define GP   0xA001

void Calc_CRC(unsigned byte b, unsigned int* CRC)
{
   BOOL carry;
   int i;

   CRC[0] ^= b & 0xFF;
   for (i=0; i<8; i++)
   {
      carry = CRC[0] & 0x0001;
      CRC[0]>>=1;
      if (carry) CRC[0] ^= GP;
   }
}
В Интернете можно найти и табличный алгоритм. Но у нас компьютер, не будем экономить.

Ilya
Сообщения: 12
Зарегистрирован: 11 май 2011, 19:50

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Ilya » 01 июн 2011, 21:17

Andrey_B писал(а):Илья, я проверил алгоритм.
Два последних байта - это Modbus CRC
Полином: 0xA001
Код на С
Спасибо большое за помощь! С командами я полностью разобрался. Но разобравшись с этим, тут же столкнулся с нехваткой знаний и опыта работы с PHP :oops: Задача такая: Мне нужно мониторить 2а параметра счетчика (в дальнейшем может больше), это Моментальные значения и накопленную энергию. Создал 2а схожих php скрипта (по примеру Виктора), в каждом по одной команде, однако, это на мой взгляд не рационально, хочу сделать всю обработку в одном файле...Но похоже, что-то делаю не правильно с открытием и закрытием порта, тк объединив код - выполняется только первая команда... :oops:

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

<?php
exec('mode com4: baud=9600 data=8 stop=1 parity=n xon=off');

$f = fopen("com4","r+");
$i=0;
$cmd = array(0x00,0x0E,0xEC,0xBC,0x63,0xD7,0xF4);			// Команда "Мгновенные значения"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);}		// Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,21);

$Uv = ((ord($result[12])>>4)*100)+((ord($result[12])&0x0f)*10)+(ord($result[13])>>4)+((ord($result[13])&0x0f)/10);
$Ia = ((ord($result[14])>>4)*10)+(ord($result[14])&0x0f)+((ord($result[15])>>4)/10)+((ord($result[15])&0x0f)/100);
$Pv = ((ord($result[16])&0x0f)*10)+(ord($result[17])>>4)+((ord($result[17])&0x0f)/10)+((ord($result[18])>>4)/100)+((ord($result[18])&0x0f)/1000);

echo "<br>Напряжение сети:  ".$Uv ." Uv";
echo "<br>Сила тока :  ".$Ia ." Ia";
echo "<br>Потребляемая мощьность : ".$Pv." P kVt";
fclose($f);
?>

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

<?php
exec('mode com4: baud=9600 data=8 stop=1 parity=n xon=off');

$f = fopen("com4","r+");
$i=0;
$cmd = array(0x00,0x0E,0xEC,0xBC,0x27,0xD7,0xC7);			// Команда "Накопленная Энергия"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);}		// Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,30);

$T1 = ((ord($result[13])>>4)*1000)+((ord($result[13])&0x0f)*100)+((ord($result[14])>>4)*10)+(ord($result[14])&0x0f)+((ord($result[15])>>4)/10)+((ord($result[15])&0x0f)/100);
$T2 = ((ord($result[17])>>4)*1000)+((ord($result[17])&0x0f)*100)+((ord($result[18])>>4)*10)+(ord($result[18])&0x0f)+((ord($result[19])>>4)/10)+((ord($result[19])&0x0f)/100);
$SUMM = $T1+$T2;

echo "<br>Тариф 1:  ".$T1 ." kVt*h";
echo "<br>Тариф 2:  ".$T2 ." kVt*h";
echo "<br>Сумма:  ".$SUMM ." kVt*h";
fclose($f);
?>

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение THK » 01 июн 2011, 22:08

Но похоже, что-то делаю не правильно с открытием и закрытием порта, тк объединив код - выполняется только первая команда... :oops:
Вот этот скрипт, по идее, далжен работать.

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

<?php
exec('mode com4: baud=9600 data=8 stop=1 parity=n xon=off');

$f = fopen("com4","r+");
//*************************************************************
$i=0;
$cmd = array(0x00,0x0E,0xEC,0xBC,0x63,0xD7,0xF4);         // Команда "Мгновенные значения"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);}      // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,21);

$Uv = ((ord($result[12])>>4)*100)+((ord($result[12])&0x0f)*10)+(ord($result[13])>>4)+((ord($result[13])&0x0f)/10);
$Ia = ((ord($result[14])>>4)*10)+(ord($result[14])&0x0f)+((ord($result[15])>>4)/10)+((ord($result[15])&0x0f)/100);
$Pv = ((ord($result[16])&0x0f)*10)+(ord($result[17])>>4)+((ord($result[17])&0x0f)/10)+((ord($result[18])>>4)/100)+((ord($result[18])&0x0f)/1000);

echo "<br>Напряжение сети:  ".$Uv ." Uv";
echo "<br>Сила тока :  ".$Ia ." Ia";
echo "<br>Потребляемая мощьность : ".$Pv." P kVt";
//*************************************************************
$i=0;
$cmd = array(0x00,0x0E,0xEC,0xBC,0x27,0xD7,0xC7);         // Команда "Накопленная Энергия"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);}      // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,30);

$T1 = ((ord($result[13])>>4)*1000)+((ord($result[13])&0x0f)*100)+((ord($result[14])>>4)*10)+(ord($result[14])&0x0f)+((ord($result[15])>>4)/10)+((ord($result[15])&0x0f)/100);
$T2 = ((ord($result[17])>>4)*1000)+((ord($result[17])&0x0f)*100)+((ord($result[18])>>4)*10)+(ord($result[18])&0x0f)+((ord($result[19])>>4)/10)+((ord($result[19])&0x0f)/100);
$SUMM = $T1+$T2;

echo "<br>Тариф 1:  ".$T1 ." kVt*h";
echo "<br>Тариф 2:  ".$T2 ." kVt*h";
echo "<br>Сумма:  ".$SUMM ." kVt*h";
//*************************************************************
fclose($f);
?>
Или именно такой вариант не работает?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Andrey_B » 01 июн 2011, 22:58

Между передачей двух команд может потребоваться пауза.
Попробуйте для начала поставить секунду

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

<?
sleep(1);
?>
Если поможет, можно попробовать уменьшить время. В моем скрипте есть код для Windows.

Ilya
Сообщения: 12
Зарегистрирован: 11 май 2011, 19:50

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение Ilya » 02 июн 2011, 08:37

THK писал(а):Вот этот скрипт, по идее, далжен работать.
И в самом деле работает :D Хотя я делал точно также :? Видимо где-то поторопился и допустил ошибку.
Andrey_B писал(а):Между передачей двух команд может потребоваться пауза.
Попробуйте для начала поставить секунду
Задержку поставил на всякий случай, хотя обе команды прошли и без нее.

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение THK » 02 июн 2011, 10:53

Расчет CRC на языке PHP:

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

/*
  Name            : CRC-16 CCITT
  Poly (default)  : 0x1021    x^16 + x^12 + x^5 + 1
  Init (default)  : 0xFFFF
  XorOut (default): 0x0000
  Revert          : false
  Check           : 0x29B1 ("123456789")
  MaxLen          : 4095 байт (32767 бит) - обнаружение
    одинарных, двойных, тройных и всех нечетных ошибок
*/
function crc16($sStr, $aParams = array()){
 
   //-- устанавливаем значения по умолчанию у незаданных параметров
   $aDefaults = array(
      "polynome" => 0x1021,
      "init" => 0xFFFF,
      "xor_out" => 0,
   );
 
   foreach ($aDefaults as $key => $val){
      if (!isset($aParams[$key])){
         $aParams[$key] = $val;
      }
   }
 
   //-- инициализируем переменные
   $sStr .= "";
   $crc = $aParams['init'];
   $len = strlen($sStr);
   $i = 0;
 
   //-- считаем
   while ($len--){
      $crc ^= ord($sStr[$i++]) << 8;
      $crc &= 0xffff;
 
      for ($j = 0; $j < 8; $j++){
         $crc = ($crc & 0x8000) ? ($crc << 1) ^ $aParams['polynome'] : $crc << 1;
         $crc &= 0xffff;
      }
   }
 
   $crc ^= $aParams['xor_out'];
 
   return $crc;
}
Взято отсюда http://ru.wikipedia.org/wiki/%D0%A6%D0% ... 0%BE%D0%B4

xebes
Сообщения: 102
Зарегистрирован: 21 апр 2011, 17:27

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение xebes » 29 июн 2011, 21:19

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

stanislav.l
Сообщения: 90
Зарегистрирован: 17 май 2011, 13:25
Откуда: СПб
Контактная информация:

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение stanislav.l » 30 июн 2011, 21:35

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

Аргументы: вот, допустим, некий счетчик имеет некий проводной информационный выход... Разобраться в интерфейсе, спаять схему согласования, расковырять протокол - если эта работа поставлена "на поток", то дня за 2 можно справиться... При этом, китайская камера стоит $5, еще немножко стоят провода... А программу можно сделать "универсальную". ИМХО, получается СИЛЬНО дешевле...

Проблему вижу в длине USB-проводов. Китайский удлинитель USB по эзернету стоит $15. У меня дома оно стоит - консоль сервера вынесена на 10м, по USB подключены мышь, клава, звук, +3м USB-кабеля - сканер, принтер. Так вот - с помехоустойчивостью как-то не очень шоколадно. 1-2 раза в сутки стабильно пробегает какой-то глюк, так что вся USB-шность ресетится. Правда, ресетится успешно. Но - там ведь камер нет, говорят с ними могут быть проблемы...

rss
Сообщения: 4
Зарегистрирован: 25 июн 2011, 10:18
Откуда: Мурманск/Урюпинск/Питер/Кострома/Москва
Контактная информация:

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение rss » 01 июл 2011, 18:35

есть счетчики СЭТ-4ТМ с полностью открытым протоколом передачи данных и возможностью подключения по 485 порту...

stanislav.l
Сообщения: 90
Зарегистрирован: 17 май 2011, 13:25
Откуда: СПб
Контактная информация:

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение stanislav.l » 01 июл 2011, 21:23

2rss: Разумеется, в природе есть все, или почти все. Но на поиск этого счетчика надо потратить время, на покупку - деньги (а "старый" - на помойку?); платы rs-485 у меня в коробке нет - ее тоже надо купить. Считаем время на все это...
Или - прицепил камеру, настроил положение и размер окна с цифрами. И пофиг какой счетчик и какой у него интерфейс...

rss
Сообщения: 4
Зарегистрирован: 25 июн 2011, 10:18
Откуда: Мурманск/Урюпинск/Питер/Кострома/Москва
Контактная информация:

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение rss » 01 июл 2011, 22:29

СЭТ-4ТМ http://set-4tm.ru/ - у него есть и так называемый оптопорт - втыкается в COM или USB и простейшими командами можно считывать потребление могу даже если поковырятся прислать пример как php считывать... этот счетчик помоему 20% рынка энергоучета занимает

maxxir
Сообщения: 32
Зарегистрирован: 15 апр 2011, 12:42
Откуда: Тольятти

Re: Снятие показаний счетчиков электричества, воды, газа

Сообщение maxxir » 01 июл 2011, 22:32

stanislav.l писал(а):2rss: Разумеется, в природе есть все, или почти все. Но на поиск этого счетчика надо потратить время, на покупку - деньги (а "старый" - на помойку?); платы rs-485 у меня в коробке нет - ее тоже надо купить. Считаем время на все это...
Или - прицепил камеру, настроил положение и размер окна с цифрами. И пофиг какой счетчик и какой у него интерфейс...
Ну нет я хочу делать на ACS756 в Терраелектронике чип стоит около 150 руб. - и пофиг мне на компьютер ))

Ответить