Сбор показаний электросчетчика Меркурий 200
Сбор показаний электросчетчика Меркурий 200
Всем привет!
Давно я не была на этом форуме, но сегодня я решила очень важную задачу и решила об этом отписаться.
Я не смогла организовать сбор показаний с м200 два года назад и забила на это. Но сегодня мне "приспичило" и проблема была решена.
Что имеем
1) Сервер на Debian 7
2) Меркурий 200 + Меркурий 221 (CAN2USB преобразователь)
3) Подключаем м221 к серверу, он его видит (о чем сообщает /var/log/messages)
4) При отправке echo "123" > /dev/ttyUSB0 м221 моргает светодиодом
5) Устанавливаем dio для php
6) Не забываем проверить права на dev/ttyUSB0 чтобы www-data мог туда писать и читать оттуда
7) И всё. С помощью dio ничего сделать не удалось. Были перепробованы все параметры dio_open, dio_fcntl, но безрезультатно. Данные отправляются, но при dio_read скрипт висит и ничего не выводит.
8) Зато проблема была решена с помощью решения пользователя этого форума ТНК, а вернее доработанного решения Sergey Krasnov (mrkrasser) взятого тут https://github.com/mrkrasser/MercuryStats/ за что этим товарищам ОГРОМНЕЙШЕЕ человеческое спасибо
Его скрипт успешно работает и с помощью него (наконец-то) удалось получить данные с Меркурия 200.
Надеюсь эта информация поможет тем, у кого Меркурий 200
Давно я не была на этом форуме, но сегодня я решила очень важную задачу и решила об этом отписаться.
Я не смогла организовать сбор показаний с м200 два года назад и забила на это. Но сегодня мне "приспичило" и проблема была решена.
Что имеем
1) Сервер на Debian 7
2) Меркурий 200 + Меркурий 221 (CAN2USB преобразователь)
3) Подключаем м221 к серверу, он его видит (о чем сообщает /var/log/messages)
4) При отправке echo "123" > /dev/ttyUSB0 м221 моргает светодиодом
5) Устанавливаем dio для php
6) Не забываем проверить права на dev/ttyUSB0 чтобы www-data мог туда писать и читать оттуда
7) И всё. С помощью dio ничего сделать не удалось. Были перепробованы все параметры dio_open, dio_fcntl, но безрезультатно. Данные отправляются, но при dio_read скрипт висит и ничего не выводит.
8) Зато проблема была решена с помощью решения пользователя этого форума ТНК, а вернее доработанного решения Sergey Krasnov (mrkrasser) взятого тут https://github.com/mrkrasser/MercuryStats/ за что этим товарищам ОГРОМНЕЙШЕЕ человеческое спасибо
Его скрипт успешно работает и с помощью него (наконец-то) удалось получить данные с Меркурия 200.
Надеюсь эта информация поможет тем, у кого Меркурий 200
Последний раз редактировалось nyasha 04 май 2016, 07:29, всего редактировалось 1 раз.
Re: Сбор показаний электросчетчика Меркурий 200
Добрый день.
Данный скрипт также работает и с М206
Впрочем, с dio М206 тоже был запущен, ради спортивного интереса
Данный скрипт также работает и с М206
Впрочем, с dio М206 тоже был запущен, ради спортивного интереса
Re: Сбор показаний электросчетчика Меркурий 200
Кто то допилил скрипт... Даже Readme.txt не поменяли.
viewtopic.php?p=460#p460
PS Это не претензия, наоборот приятно, что наработка не пропала даром. Дал ссылку, т.к. там есть инфа по теме.
viewtopic.php?p=460#p460
PS Это не претензия, наоборот приятно, что наработка не пропала даром. Дал ссылку, т.к. там есть инфа по теме.
Re: Сбор показаний электросчетчика Меркурий 200
А, так вот почему, мне это всё так знакомо показалосьTHK писал(а):Кто то допилил скрипт... Даже Readme.txt не поменяли.
viewtopic.php?p=460#p460
PS Это не претензия, наоборот приятно, что наработка не пропала даром. Дал ссылку, т.к. там есть инфа по теме.
Re: Сбор показаний электросчетчика Меркурий 200
Есть вариант работы со счетчиком через чистый SHELL(BASH, SH).
Просьба проверить для Меркурий 200.
https://hi.dp.ua/svn/electo_counters/trunk/ user:tat pass:123
в electro_counter.conf указать нужные: DEVICE, COUNTER_SN, PASS_READ, COUNTER_TYPE="merc200.sh"
запускать: sh electro_counter.sh <КОМАНДА>
где <КОМАНДА> для Меркурий 200:
Просьба проверить для Меркурий 200.
https://hi.dp.ua/svn/electo_counters/trunk/ user:tat pass:123
в electro_counter.conf указать нужные: DEVICE, COUNTER_SN, PASS_READ, COUNTER_TYPE="merc200.sh"
запускать: sh electro_counter.sh <КОМАНДА>
где <КОМАНДА> для Меркурий 200:
Код: Выделить всё
kwatthour Опрос накопленной энергии
amper Сила тока A (А)
power Мощность P (кВт)
volt Напряжение U (В)
batvolt Напряжение батареи
serialnum Серийный номер счетчика
version Дата версии ПО
datetime Дата время по счетчику
datemake Дата изготовления
last_on Время последнего включения
last_off Время последнего выключения
"Та нам з тобою своє робити, відкрити очі і далі йти!
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
Re: Сбор показаний электросчетчика Меркурий 200
Натыкалась я на этот вариант. Но мне нужно было именно PHP, поэтому смотреть не стала
kpp писал(а):Есть вариант работы со счетчиком через чистый SHELL(BASH, SH).
Просьба проверить для Меркурий 200.
https://hi.dp.ua/svn/electo_counters/trunk/ user:tat pass:123
в electro_counter.conf указать нужные: DEVICE, COUNTER_SN, PASS_READ, COUNTER_TYPE="merc200.sh"
запускать: sh electro_counter.sh <КОМАНДА>
где <КОМАНДА> для Меркурий 200:Код: Выделить всё
kwatthour Опрос накопленной энергии amper Сила тока A (А) power Мощность P (кВт) volt Напряжение U (В) batvolt Напряжение батареи serialnum Серийный номер счетчика version Дата версии ПО datetime Дата время по счетчику datemake Дата изготовления last_on Время последнего включения last_off Время последнего выключения
Re: Сбор показаний электросчетчика Меркурий 200
Если бы это был "чистый PHP" - вопросов не было.
В существующем варианте через PHP есть вызов команды шелла
// Parameters for port
exec('/bin/stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts');
С таким же успехом вместо всего этого скрипта PHP можно делать:
exec('/bin/bash <path>electro_counter.sh <КОМАНДА>' , $output, $return_var);
Плюсы: не нужно устанавливать dio (не всегда есть возможность его установить), можно использовать любую версию ПХП, как и любой другой язык программирования или вообще обойтись без других языков
А на самом деле есть просьба проверить скрипт со счетчиком меркурий 200
У меня такого счетчика нет, есть только Меркурий 230.
Заранее спасибо.
В существующем варианте через PHP есть вызов команды шелла
// Parameters for port
exec('/bin/stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts');
С таким же успехом вместо всего этого скрипта PHP можно делать:
exec('/bin/bash <path>electro_counter.sh <КОМАНДА>' , $output, $return_var);
Плюсы: не нужно устанавливать dio (не всегда есть возможность его установить), можно использовать любую версию ПХП, как и любой другой язык программирования или вообще обойтись без других языков
А на самом деле есть просьба проверить скрипт со счетчиком меркурий 200
У меня такого счетчика нет, есть только Меркурий 230.
Заранее спасибо.
"Та нам з тобою своє робити, відкрити очі і далі йти!
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
Re: Сбор показаний электросчетчика Меркурий 200
dio я тоже не использую. Оно не работает.kpp писал(а):Если бы это был "чистый PHP" - вопросов не было.
В существующем варианте через PHP есть вызов команды шелла
// Parameters for port
exec('/bin/stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts');
С таким же успехом вместо всего этого скрипта PHP можно делать:
exec('/bin/bash <path>electro_counter.sh <КОМАНДА>' , $output, $return_var);
Плюсы: не нужно устанавливать dio (не всегда есть возможность его установить), можно использовать любую версию ПХП, как и любой другой язык программирования или вообще обойтись без других языков
А на самом деле есть просьба проверить скрипт со счетчиком меркурий 200
У меня такого счетчика нет, есть только Меркурий 230.
Заранее спасибо.
Re: Сбор показаний электросчетчика Меркурий 200
Подскажите,пожалуйста,как считать с счетчика "МЕРКУРИЙ 200.2" значение "Накопленная Энергия от сброса".
Напряжение,ток,мощность,это все видит,и корректно отображает.
Делаю так:
$i=0;
$cmd = array(0x00,0x0E,0xAB,0x56,0x27,0x28,0xB2); // Команда "Накопленная Энергия"(адрес,посылка моего счетчика)
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);} // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c,strlen($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);
Ответ Т1: 0 Т2: 0
СпасиБо.
Напряжение,ток,мощность,это все видит,и корректно отображает.
Делаю так:
$i=0;
$cmd = array(0x00,0x0E,0xAB,0x56,0x27,0x28,0xB2); // Команда "Накопленная Энергия"(адрес,посылка моего счетчика)
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);} // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c,strlen($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);
Ответ Т1: 0 Т2: 0
СпасиБо.
-
- Сообщения: 141
- Зарегистрирован: 22 июн 2015, 13:24
Re: Сбор показаний электросчетчика Меркурий 200
В моём скрипте :
$cmd = '00'."0774BE"."27";
$cmd .= bin2hex(crc16_modbus(hex2bin($cmd)));
fwrite($fp, hex2bin($cmd));
$result = myread_port();
$T1 = ((ord($result[5])>>4)*100000)+((ord($result[5])&0x0f)*10000)+(ord($result[6])>>4)*1000+((ord($result[6])&0x0f)*100)+((ord($result[7])>>4)*10)+(ord($result[7])&0x0f)+((ord($result[8])>>4)/10)+((ord($result[8])&0x0f)/100);
$T2 = ((ord($result[9])>>4)*100000)+((ord($result[9])&0x0f)*10000)+(ord($result[10])>>4)*1000+((ord($result[10])&0x0f)*100)+((ord($result[11])>>4)*10)+(ord($result[11])&0x0f)+((ord($result[12])>>4)/10)+((ord($result[12])&0x0f)/100);
$cmd = '00'."0774BE"."27";
$cmd .= bin2hex(crc16_modbus(hex2bin($cmd)));
fwrite($fp, hex2bin($cmd));
$result = myread_port();
$T1 = ((ord($result[5])>>4)*100000)+((ord($result[5])&0x0f)*10000)+(ord($result[6])>>4)*1000+((ord($result[6])&0x0f)*100)+((ord($result[7])>>4)*10)+(ord($result[7])&0x0f)+((ord($result[8])>>4)/10)+((ord($result[8])&0x0f)/100);
$T2 = ((ord($result[9])>>4)*100000)+((ord($result[9])&0x0f)*10000)+(ord($result[10])>>4)*1000+((ord($result[10])&0x0f)*100)+((ord($result[11])>>4)*10)+(ord($result[11])&0x0f)+((ord($result[12])>>4)/10)+((ord($result[12])&0x0f)/100);
Re: Сбор показаний электросчетчика Меркурий 200
Andrey2509,большое спасибо,все отображается как надо. Почему я раньше не спросил.Перепробовал с $result[?], по разному.То запятая не там,то цифры не те.
А по месяцам,как ?
СпасиБо.
А по месяцам,как ?
СпасиБо.
-
- Сообщения: 141
- Зарегистрирован: 22 июн 2015, 13:24
Re: Сбор показаний электросчетчика Меркурий 200
А разве меркурий 200 хранит данные на 1 число каждого месяца? не знал
Я для этих целей как обычно пишу в базу показания каждые 15 мин, а затем sql+php для вывода показаний на 1 число.
Я для этих целей как обычно пишу в базу показания каждые 15 мин, а затем sql+php для вывода показаний на 1 число.
Re: Сбор показаний электросчетчика Меркурий 200
Andrey2509, можно посмотреть на функцию "crc16_modbus"?
В протоколе счётчиков СЭТ указывается, что контрольная сумма считается с помощью CRC с полиномом MODBUS. Там в результате два байта получается. У Вас тоже на выходе два байта?
В протоколе счётчиков СЭТ указывается, что контрольная сумма считается с помощью CRC с полиномом MODBUS. Там в результате два байта получается. У Вас тоже на выходе два байта?
Re: Сбор показаний электросчетчика Меркурий 200
Andrey2509,переделал скрипт,как у Вас(почти),все заработало.
"А разве меркурий 200 хранит данные на 1 число каждого месяца?" -проверял программой "КОНФИГУРАТОР" , там есть таблица по месяцам.
"А разве меркурий 200 хранит данные на 1 число каждого месяца?" -проверял программой "КОНФИГУРАТОР" , там есть таблица по месяцам.
-
- Сообщения: 141
- Зарегистрирован: 22 июн 2015, 13:24
Re: Сбор показаний электросчетчика Меркурий 200
Мужики,а кто-нибудь пробовал запустить этот скрипт "Чтение данных из счетчиков электроэнергии Merciry 200 2016-05-15 version 1 kohan pavel"(viewtopic.php?f=1&t=1180#p21834) с "Меркурий 200"?
У меня: " sh ./electro_counter.sh amper
Error! Not answer "/dev/ttyS0"! "
Какой пароль нужен для # пароль записи
PASS_WRITE=?
СпасиБо.
У меня: " sh ./electro_counter.sh amper
Error! Not answer "/dev/ttyS0"! "
Какой пароль нужен для # пароль записи
PASS_WRITE=?
СпасиБо.
Re: Сбор показаний электросчетчика Меркурий 200
Меркурия 200 в наличии нет, чтобы проверить. Только через эмулятор.Булат писал(а):Мужики,а кто-нибудь пробовал запустить этот скрипт "Чтение данных из счетчиков электроэнергии Merciry 200 2016-05-15 version 1 kohan pavel"(viewtopic.php?f=1&t=1180#p21834) с "Меркурий 200"?
У меня: " sh ./electro_counter.sh amper
Error! Not answer "/dev/ttyS0"! "
Какой пароль нужен для # пароль записи
PASS_WRITE=?
СпасиБо.
Давайте вместе проверим.
Для чтения данных из счетчика PASS_WRITE не нужен.
Для вычитки данных из Меркурия 200 в файле electro_counter.conf нужно указать:
Код: Выделить всё
# файл протокола обмена со счетчиком
COUNTER_TYPE="merc200.sh"
# устройство-порт, к которому подключен счетчик
DEVICE="/dev/ваш_девайс"
# серийный номер счетчика
COUNTER_SN=номер_вашего_счетчика (8 цифр)
# AUTO, FREEBSD, LINUX
OS=ваша_ОС
указать параметры COM-порта:
для FreeBSD
DEV_FLAGS=" ixany ignbrk opost cread cs8 -ixon -ixoff -parenb -parodd -hupcl -clocal -cstopb raw"
для Linux Raspberry
DEV_FLAGS_LINUX=" speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke"
для Linux Debian
DEV_FLAGS_LINUX=" cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -ech
"Та нам з тобою своє робити, відкрити очі і далі йти!
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
Re: Сбор показаний электросчетчика Меркурий 200
Попробовал дописать две цифры серийного номера,строки PASS_ ,закомментировал.
Результат : Error! Not answer "/dev/ttyS0"! "
Запрос к счетчику идет,на MOXe вспыхивает светодиод.
ответа нет.
Результат : Error! Not answer "/dev/ttyS0"! "
Запрос к счетчику идет,на MOXe вспыхивает светодиод.
ответа нет.
Re: Сбор показаний электросчетчика Меркурий 200
Какая ОС?Булат писал(а):Попробовал дописать две цифры серийного номера,строки PASS_ ,закомментировал.
Результат : Error! Not answer "/dev/ttyS0"! "
Запрос к счетчику идет,на MOXe вспыхивает светодиод.
ответа нет.
COUNTER_TYPE="merc200.sh" прописали?
Проверьте правильность написания серийного номера счетчика.
Установите DEBUG=1 для того чтобы видеть какие команды идут на счетчик.
Какие параметры порта используете?
"Та нам з тобою своє робити, відкрити очі і далі йти!
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
І зуби сильно стиснувши, маму ніжно любити, хто ж тоді, як не ми, брати?!"(с)
Re: Сбор показаний электросчетчика Меркурий 200
OS :LINUX DEBIAN 8
COUNTER_TYPE="merc200.sh" прописал.
серийного номера счетчика 13961366
Ошибка одна: Error! Not answer "/dev/ttyS0"! "
COUNTER_TYPE="merc200.sh" прописал.
серийного номера счетчика 13961366
Ошибка одна: Error! Not answer "/dev/ttyS0"! "