Снятие показаний счетчиков электричества, воды, газа
Re: Снятие показаний счетчиков электричества, воды, газа
Сразу оговорюсь, занимаюсь со счетчиком не я, а друг и коллега по работе... Я лишь изредка помогаю.
Вот скрипт + небольшое описание команд: В скрипте подробные комментарии.
PS Узнав, что эта инфа нужна еще кому то он обещал побыстрее разобраться с остальными командами...
Вот скрипт + небольшое описание команд: В скрипте подробные комментарии.
PS Узнав, что эта инфа нужна еще кому то он обещал побыстрее разобраться с остальными командами...
Re: Снятие показаний счетчиков электричества, воды, газа
Спасибо большое! То что нужно! Попытаюсь запустить на своей системе) Тема очень интересна!
Re: Снятие показаний счетчиков электричества, воды, газа
Хм... Разбираюсь с командами для 200.02 Сравнивая пример с комментариями от Виктора и свой дамп - более ясно разобрался в принципе общения с счетчиком, однако, команды не совпадают... В обоих случаях запрос идет в таком виде: {серийный номер счетчика команда}
Вот к примеру запрос напряжения батарейки(из примера Виктора): {серийник 29 82 90}
А вот из моего дампа: {серийник 29 56 03}
дата изготовления(из примера Виктора): {серийник 66 С3 64}
из моего дампа: {серийник 66 17 F7}
Отсюда складывается вопрос: модели одинаковые, почему же тогда команды отличаются? Может я чего-то не понял?
Вот к примеру запрос напряжения батарейки(из примера Виктора): {серийник 29 82 90}
А вот из моего дампа: {серийник 29 56 03}
дата изготовления(из примера Виктора): {серийник 66 С3 64}
из моего дампа: {серийник 66 17 F7}
Отсюда складывается вопрос: модели одинаковые, почему же тогда команды отличаются? Может я чего-то не понял?
Re: Снятие показаний счетчиков электричества, воды, газа
Илья, а что вам мешает составить свою версию протокола, которая работает с вашим счетчиком? Я так понимаю, дел там минут на 20.
В файле, который разместил Виктор, есть информация о дате изготовления, дате выхода версии. Может быть, у вас другая версия?
В файле, который разместил Виктор, есть информация о дате изготовления, дате выхода версии. Может быть, у вас другая версия?
Re: Снятие показаний счетчиков электричества, воды, газа
Интересно! Может быть команда - 66, а С3 64 (в Вашем случае 17 F7) еще что-то? Дата или время закодированное...Вот к примеру запрос напряжения батарейки(из примера Виктора): {серийник 29 82 90}
А вот из моего дампа: {серийник 29 56 03}
дата изготовления(из примера Виктора): {серийник 66 С3 64}
из моего дампа: {серийник 66 17 F7}
Отсюда складывается вопрос: модели одинаковые, почему же тогда команды отличаются? Может я чего-то не понял?
Надо поковырять в этом направлении.
PS Совсем забыл сказать, скрипт, который я выкладывал работает под виндой.
По этому поводу мной было сказано много слов, вот некоторые: "на", "Windows" и т.д.
Re: Снятие показаний счетчиков электричества, воды, газа
Илья, наверное, два последних байта команды, это контрольная сумма. Серийники разные, вот и циферки не сходятся.
Re: Снятие показаний счетчиков электричества, воды, газа
А ведь Виктор совершенно прав! Это контрольная сумма.
Re: Снятие показаний счетчиков электричества, воды, газа
Если это контрольная сумма - то тогда все понятно Я как раз и тестирую под Windows) Когда будет стабильно - перенесу все на Linux Однако тут тоже было не все гладко... Поменяв команду на ту, что у меня в дампе, я получал один и тот же ответ при каждом выполнении скрипта... Тк я новичок в этом деле - полчаса убил пока до меня дошло что в мой счетчик сначала отправляет мне посланный мною запрос (я так понимаю это называется "эхо") и следом шлет ответ... Т.е. в моем случае скрипт брал значения из моего запроса- поэтому и ответ давал неизменный
Re: Снятие показаний счетчиков электричества, воды, газа
Илья, я проверил алгоритм.
Два последних байта - это Modbus CRC
Полином: 0xA001
Код на С
В Интернете можно найти и табличный алгоритм. Но у нас компьютер, не будем экономить.
Два последних байта - это 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;
}
}
Re: Снятие показаний счетчиков электричества, воды, газа
Спасибо большое за помощь! С командами я полностью разобрался. Но разобравшись с этим, тут же столкнулся с нехваткой знаний и опыта работы с PHP Задача такая: Мне нужно мониторить 2а параметра счетчика (в дальнейшем может больше), это Моментальные значения и накопленную энергию. Создал 2а схожих php скрипта (по примеру Виктора), в каждом по одной команде, однако, это на мой взгляд не рационально, хочу сделать всю обработку в одном файле...Но похоже, что-то делаю не правильно с открытием и закрытием порта, тк объединив код - выполняется только первая команда...Andrey_B писал(а):Илья, я проверил алгоритм.
Два последних байта - это Modbus CRC
Полином: 0xA001
Код на С
Код: Выделить всё
<?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);
?>
Re: Снятие показаний счетчиков электричества, воды, газа
Вот этот скрипт, по идее, далжен работать.Но похоже, что-то делаю не правильно с открытием и закрытием порта, тк объединив код - выполняется только первая команда...
Код: Выделить всё
<?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);
?>
Re: Снятие показаний счетчиков электричества, воды, газа
Между передачей двух команд может потребоваться пауза.
Попробуйте для начала поставить секунду
Если поможет, можно попробовать уменьшить время. В моем скрипте есть код для Windows.
Попробуйте для начала поставить секунду
Код: Выделить всё
<?
sleep(1);
?>
Re: Снятие показаний счетчиков электричества, воды, газа
И в самом деле работает Хотя я делал точно также Видимо где-то поторопился и допустил ошибку.THK писал(а):Вот этот скрипт, по идее, далжен работать.
Задержку поставил на всякий случай, хотя обе команды прошли и без нее.Andrey_B писал(а):Между передачей двух команд может потребоваться пауза.
Попробуйте для начала поставить секунду
Re: Снятие показаний счетчиков электричества, воды, газа
Расчет CRC на языке PHP:
Взято отсюда http://ru.wikipedia.org/wiki/%D0%A6%D0% ... 0%BE%D0%B4
Код: Выделить всё
/*
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;
}
Re: Снятие показаний счетчиков электричества, воды, газа
Наткнулся сегодня "Счетчик потребляемой электроэнергии MT4011" вроде полезная вещь. Показания снимать можно с помощью веб камеры.
-
- Сообщения: 90
- Зарегистрирован: 17 май 2011, 13:25
- Откуда: СПб
- Контактная информация:
Re: Снятие показаний счетчиков электричества, воды, газа
Вообще, возникает странное впечатление, что снятие показаний с помощью веб-камеры тянет на "универсальный" способ. Предлагаю эту мысль обмусолить
Аргументы: вот, допустим, некий счетчик имеет некий проводной информационный выход... Разобраться в интерфейсе, спаять схему согласования, расковырять протокол - если эта работа поставлена "на поток", то дня за 2 можно справиться... При этом, китайская камера стоит $5, еще немножко стоят провода... А программу можно сделать "универсальную". ИМХО, получается СИЛЬНО дешевле...
Проблему вижу в длине USB-проводов. Китайский удлинитель USB по эзернету стоит $15. У меня дома оно стоит - консоль сервера вынесена на 10м, по USB подключены мышь, клава, звук, +3м USB-кабеля - сканер, принтер. Так вот - с помехоустойчивостью как-то не очень шоколадно. 1-2 раза в сутки стабильно пробегает какой-то глюк, так что вся USB-шность ресетится. Правда, ресетится успешно. Но - там ведь камер нет, говорят с ними могут быть проблемы...
Аргументы: вот, допустим, некий счетчик имеет некий проводной информационный выход... Разобраться в интерфейсе, спаять схему согласования, расковырять протокол - если эта работа поставлена "на поток", то дня за 2 можно справиться... При этом, китайская камера стоит $5, еще немножко стоят провода... А программу можно сделать "универсальную". ИМХО, получается СИЛЬНО дешевле...
Проблему вижу в длине USB-проводов. Китайский удлинитель USB по эзернету стоит $15. У меня дома оно стоит - консоль сервера вынесена на 10м, по USB подключены мышь, клава, звук, +3м USB-кабеля - сканер, принтер. Так вот - с помехоустойчивостью как-то не очень шоколадно. 1-2 раза в сутки стабильно пробегает какой-то глюк, так что вся USB-шность ресетится. Правда, ресетится успешно. Но - там ведь камер нет, говорят с ними могут быть проблемы...
-
- Сообщения: 4
- Зарегистрирован: 25 июн 2011, 10:18
- Откуда: Мурманск/Урюпинск/Питер/Кострома/Москва
- Контактная информация:
Re: Снятие показаний счетчиков электричества, воды, газа
есть счетчики СЭТ-4ТМ с полностью открытым протоколом передачи данных и возможностью подключения по 485 порту...
-
- Сообщения: 90
- Зарегистрирован: 17 май 2011, 13:25
- Откуда: СПб
- Контактная информация:
Re: Снятие показаний счетчиков электричества, воды, газа
2rss: Разумеется, в природе есть все, или почти все. Но на поиск этого счетчика надо потратить время, на покупку - деньги (а "старый" - на помойку?); платы rs-485 у меня в коробке нет - ее тоже надо купить. Считаем время на все это...
Или - прицепил камеру, настроил положение и размер окна с цифрами. И пофиг какой счетчик и какой у него интерфейс...
Или - прицепил камеру, настроил положение и размер окна с цифрами. И пофиг какой счетчик и какой у него интерфейс...
-
- Сообщения: 4
- Зарегистрирован: 25 июн 2011, 10:18
- Откуда: Мурманск/Урюпинск/Питер/Кострома/Москва
- Контактная информация:
Re: Снятие показаний счетчиков электричества, воды, газа
СЭТ-4ТМ http://set-4tm.ru/ - у него есть и так называемый оптопорт - втыкается в COM или USB и простейшими командами можно считывать потребление могу даже если поковырятся прислать пример как php считывать... этот счетчик помоему 20% рынка энергоучета занимает
Re: Снятие показаний счетчиков электричества, воды, газа
Ну нет я хочу делать на ACS756 в Терраелектронике чип стоит около 150 руб. - и пофиг мне на компьютер ))stanislav.l писал(а):2rss: Разумеется, в природе есть все, или почти все. Но на поиск этого счетчика надо потратить время, на покупку - деньги (а "старый" - на помойку?); платы rs-485 у меня в коробке нет - ее тоже надо купить. Считаем время на все это...
Или - прицепил камеру, настроил положение и размер окна с цифрами. И пофиг какой счетчик и какой у него интерфейс...