Снятие показаний счетчиков электричества, воды, газа
Re: Снятие показаний счетчиков электричества, воды, газа
Уважаемые форумчане и Andrey_B! Неужели никто не сталкивался? (
Re: Снятие показаний счетчиков электричества, воды, газа
aonmaster, у меня лично нет счетчика Энергомера CE102M-A и я никогда не писал для него программ.
Но вот то, что вы не указали. Во-первых, скорость порта. Насколько я понимаю, скорость порта не должна быть выше 9600 бод.
Во-вторых, не очень понятно "На черном экране ввожу ./!"
Но должны ввести "/?!"
Далее, в логе видно еще 2F (слэш), а в протоколе МЭК 61107 про это что-то не написано. Это странно. И что, вы в логе при отправке с терминала видите тоже, что и с AdminTools. Это тем более странно. 2F в конце там в этом случае быть не должно.
"01 42 30 03 75" - это, похоже команда завершение сеанса. Возможно, в Admin Tools ее засобачили для совместимости или на всякий случай. В протоколе нет ее описания.
Что еще. В протоколе обозначены некие тайминги, в течение которых устройство возвращает ответ. Не исключено, что тайминги есть и на прием команды. Возможно, вы просто не успеваете за нужный период времени набрать "/?!"
А какие проблемы, не используйте терминал, напишите программу, которая будет отправлять все в точности также, как AdminTools.
Но вот то, что вы не указали. Во-первых, скорость порта. Насколько я понимаю, скорость порта не должна быть выше 9600 бод.
Во-вторых, не очень понятно "На черном экране ввожу ./!"
Но должны ввести "/?!"
Далее, в логе видно еще 2F (слэш), а в протоколе МЭК 61107 про это что-то не написано. Это странно. И что, вы в логе при отправке с терминала видите тоже, что и с AdminTools. Это тем более странно. 2F в конце там в этом случае быть не должно.
"01 42 30 03 75" - это, похоже команда завершение сеанса. Возможно, в Admin Tools ее засобачили для совместимости или на всякий случай. В протоколе нет ее описания.
Что еще. В протоколе обозначены некие тайминги, в течение которых устройство возвращает ответ. Не исключено, что тайминги есть и на прием команды. Возможно, вы просто не успеваете за нужный период времени набрать "/?!"
А какие проблемы, не используйте терминал, напишите программу, которая будет отправлять все в точности также, как AdminTools.
Re: Снятие показаний счетчиков электричества, воды, газа
Спасибо, Андрей, за помощь и ответ!!! Вы тут главный советчик и гуру.
Конечно, опечатался - набирал /?! - как и нужно.
За это время некие продвижки наступили: нашёл терминалку MU Term, только с её помощью и удалось получить ответы от счётчика. Про 2F 3F - это как раз и есть первые символы /?
а 0D 0A - это перевод строки и возврат каретки (\r\n), про это сказано в Инструкции к счётчику, и это же добавляет AdminTools.
Скорость 9600, чётность Even, stopbits=1, databits=7.
После терминала под виндой, стал делать программу на python, под Linux (Raspbian). Вот код:
======================================
import serial
import time
def s(message):
SERIAL_PORT = '/dev/ttyUSB0'
BAUDRATE = 9600
ser = serial.Serial()
ser.port = "/dev/ttyUSB6"
ser.baudrate = 9600
ser.bytesize = serial.SEVENBITS #number of bits per bytes
ser.parity = serial.PARITY_EVEN #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
ser.timeout = None #block read
ser.timeout = 0 #non-block read
ser.timeout = 2 #timeout block read
ser.xonxoff = False #disable software flow control
ser.rtscts = False #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
ser.writeTimeout = 2 #timeout for write
ser.open()
ser.flushInput()
ser.flushOutput()
# sending the MSG to the serial port
print message
ser.write(message)
out = ''
# let's wait one second before reading output (let's give device time to answer)
time.sleep(1)
print '#'
print (ser.inWaiting())
print '$'
# response = ser.readline()
# print response
# out = ser.read(13)
# print "answer: " + out
while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print "answer: " + out
#src_soc.send ("rs485 says: "+str(out))
#closing the serial connection
ser.close()
return out
MSG1 = '\x2F\x3F\x21\x0D\x0A'
s(MSG1)
======================================
Получаю вот что, т.е. ser.inWaiting() = 0, значит, счётчик ничего не отдаёт.
root@pi:~/182# python 2
/?!
#
0
$
Помогите, пожалуйста, в чем может быть дело?
Через тот же адаптер опрашиваю устройство с MODBUS через RS485 - там данные порта 8-N-1, всё отлично идёт.
Но ведь для CE-102M нужно только 5 этих байт передать, и счётчик должен выдать /EKT......и т.д.
Единственное: не ставил python под win32, надеялся, что всё заработает. Неужели нужно ещё и виндовый питон ставить, и с ним разбираться. Может, какой-то явный ляп делаю. В том и дело, что AdminTools вроде всё так же выдаёт, и MU Term тоже. А питон не желает.
Конечно, опечатался - набирал /?! - как и нужно.
За это время некие продвижки наступили: нашёл терминалку MU Term, только с её помощью и удалось получить ответы от счётчика. Про 2F 3F - это как раз и есть первые символы /?
а 0D 0A - это перевод строки и возврат каретки (\r\n), про это сказано в Инструкции к счётчику, и это же добавляет AdminTools.
Скорость 9600, чётность Even, stopbits=1, databits=7.
После терминала под виндой, стал делать программу на python, под Linux (Raspbian). Вот код:
======================================
import serial
import time
def s(message):
SERIAL_PORT = '/dev/ttyUSB0'
BAUDRATE = 9600
ser = serial.Serial()
ser.port = "/dev/ttyUSB6"
ser.baudrate = 9600
ser.bytesize = serial.SEVENBITS #number of bits per bytes
ser.parity = serial.PARITY_EVEN #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
ser.timeout = None #block read
ser.timeout = 0 #non-block read
ser.timeout = 2 #timeout block read
ser.xonxoff = False #disable software flow control
ser.rtscts = False #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
ser.writeTimeout = 2 #timeout for write
ser.open()
ser.flushInput()
ser.flushOutput()
# sending the MSG to the serial port
print message
ser.write(message)
out = ''
# let's wait one second before reading output (let's give device time to answer)
time.sleep(1)
print '#'
print (ser.inWaiting())
print '$'
# response = ser.readline()
# print response
# out = ser.read(13)
# print "answer: " + out
while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print "answer: " + out
#src_soc.send ("rs485 says: "+str(out))
#closing the serial connection
ser.close()
return out
MSG1 = '\x2F\x3F\x21\x0D\x0A'
s(MSG1)
======================================
Получаю вот что, т.е. ser.inWaiting() = 0, значит, счётчик ничего не отдаёт.
root@pi:~/182# python 2
/?!
#
0
$
Помогите, пожалуйста, в чем может быть дело?
Через тот же адаптер опрашиваю устройство с MODBUS через RS485 - там данные порта 8-N-1, всё отлично идёт.
Но ведь для CE-102M нужно только 5 этих байт передать, и счётчик должен выдать /EKT......и т.д.
Единственное: не ставил python под win32, надеялся, что всё заработает. Неужели нужно ещё и виндовый питон ставить, и с ним разбираться. Может, какой-то явный ляп делаю. В том и дело, что AdminTools вроде всё так же выдаёт, и MU Term тоже. А питон не желает.
Re: Снятие показаний счетчиков электричества, воды, газа
По поводу 2F вы меня не совсем правильно поняли.
Вот вы говорите, что Serial Port Monitor вот так логирует работу AdminTools
ASCII /?! = HEX 2F 3F 21 0D 0A 2F
А я спрашиваю, откуда там на конце 2F? Вначале - понятно. А на конце?
Собственно, это неважно.
Я вот не знаю как именно работает модуль serial в питоне, но попробуйте сделать задержку после отправки запроса и поэкспериментировать с ее величиной.
Вот вы говорите, что Serial Port Monitor вот так логирует работу AdminTools
ASCII /?! = HEX 2F 3F 21 0D 0A 2F
А я спрашиваю, откуда там на конце 2F? Вначале - понятно. А на конце?
Собственно, это неважно.
Я вот не знаю как именно работает модуль serial в питоне, но попробуйте сделать задержку после отправки запроса и поэкспериментировать с ее величиной.
Re: Снятие показаний счетчиков электричества, воды, газа
Всё решилось, когда подключил счетчик через адаптер от Меркурия (Меркурий-221.
Этот заработал при всех значениях DTR, RTS и т.д.
А вот почему не было ответа под linux с тем китайским адаптером (CH340/341), однако же с ним же был ответ в Винде - это загадка.
Этот заработал при всех значениях DTR, RTS и т.д.
А вот почему не было ответа под linux с тем китайским адаптером (CH340/341), однако же с ним же был ответ в Винде - это загадка.
Re: Снятие показаний счетчиков электричества, воды, газа
Написал на Питоне скрипт для СЕ-102М.
Нужно поменять адрес последовательного порта на ваш.
В режиме программирования команды вводятся как в инструкции к счетчику.
Нужно поменять адрес последовательного порта на ваш.
Код: Выделить всё
#!/usr/bin/python
# coding: utf-8
import sys, io, serial
# Если нет ключей, то режим чтения по умолчанию
# -r : чтение ограниченного набора параметров
# -p : режим программирования (отменяет -r)
# -s : "silent mode", только для -p, выводятся только данные
read_flag = '0'
if '-r' in sys.argv:
read_flag = '6'
if '-p' in sys.argv:
read_flag = '1'
silent = '-s' in sys.argv
# Параметры последовательного порта: 9600 бод, 7E1, таймаут 0.1 с
ser = serial.Serial('/dev/ttyNSC0', bytesize=serial.SEVENBITS, parity=serial.PARITY_EVEN, timeout = 0.1)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser), newline = '')
# Чтение посылки с проверкой LRC
def data_decode(sdata):
msg = dict()
msg['head'] = ''
msg['body'] = ''
msg['lrc'] = False
# Ничего не меняем, если пришли служебные символы (ACK, NAK)
if len(sdata) <= 1:
msg['body'] = sdata
msg['lrc'] = True
else:
lrc = 0x00
head_add = False
body_add = False
lrc_add = False
# Считаем LRC (Сложение всех байт после (SOH) или (STX), не включая,
# до (ETX) включительно по модулю 0x7f, одновременно читаем заголовок и данные
for i in range(0,len(sdata)-1):
# Обнаружен (SOH)
if sdata[i] == '\x01':
head_add = True
lrc_add = True
# Обнаружен (STX)
elif sdata[i] == '\x02':
head_add = False
body_add = True
if lrc_add:
lrc = (lrc + ord(sdata[i])) & 0x7f
else:
lrc_add = True
# Обнаружен (ETX)
elif sdata[i] == '\x03':
head_add = False
body_add = False
lrc_add = False
lrc = (lrc + ord(sdata[i])) & 0x7f
else:
if head_add:
msg['head'] += sdata[i]
elif body_add:
msg['body'] += sdata[i]
if lrc_add:
lrc = (lrc + ord(sdata[i])) & 0x7f
# Проверяем последний байт посылки на соответствие вычисленому LRC
msg['lrc'] = lrc == ord(sdata[len(sdata) - 1])
return msg
# Запись посылки в строку с добавлением вычисленного LRC
def data_encode(msg):
sdata = ''
if msg['head']:
sdata += '\x01' + msg['head']
if msg['body']:
sdata += '\x02' + msg['body']
sdata += '\x03'
# Вычисление LRC см. data_decode
lrc = 0x00
lrc_add = False
for i in range(0,len(sdata)):
if sdata[i] == '\x01':
lrc_add = True
elif sdata[i] == '\x02':
if lrc_add:
lrc = (lrc + ord(sdata[i])) & 0x7f
else:
lrc_add = True
elif sdata[i] == '\x03':
lrc_add = False
lrc = (lrc + ord(sdata[i])) & 0x7f
else:
if lrc_add:
lrc = (lrc + ord(sdata[i])) & 0x7f
# Добавление вычисленного LRC в строку посылки
sdata += chr(lrc)
return sdata
# Отправка посылки и чтение данных из последовательного порта
def send_read(sdata):
sio.write(unicode(sdata))
sio.flush()
return sio.read().encode('ascii')
# Пароль для режима программирования (заводской: 777777)
# Если не указан, будет запрошен
password = ''
# Завершаем предыдущий сеанс
send_read(data_encode({'head':'B0','body':''}))
# Получаем идентификационное сообщение в ответ на общий запрос
ident = send_read('/?!\r\n')
# Отправляем подтвеждение с выбором режима и получаем информационное сообщение
message = data_decode(send_read('\x060' + ident[4] + read_flag + '\r\n'))
# Продолжаем, пока не получено сообщение окончания сеанса (B0)
while message['head'] <> 'B0':
# Запрошен пароль для режима программирования
if message['head'] == 'P0':
if password == '':
try:
password = raw_input('' if silent else 'Enter password ('+ message['body'] + '): ')
except (EOFError):
send_read(data_encode({'head':'B0', 'body':''}))
exit()
message = data_decode(send_read(data_encode({'head':'P1', 'body': '(' + password + ')'})))
# Получен запрос повторения (NAK)
# Почему-то после этого счетчик не ждет повторения, а просто перестает отвечать
# Начинаем сначала
elif message['body'] == '\x15':
if not silent:
print '(NAK) received, restarting...'
send_read(data_encode({'head':'B0','body':''}))
ident = send_read('/?!\r\n')
message = data_decode(send_read('\x060' + ident[4] + read_flag + '\r\n'))
# Нет ответа - начинаем сначала
elif message['body'] == '':
if not silent:
print 'Timeout, restarting...'
send_read(data_encode({'head':'B0','body':''}))
ident = send_read('/?!\r\n')
message = data_decode(send_read('\x060' + ident[4] + read_flag + '\r\n'))
else:
# Получено сообщение подтверждения
if message['body'] == '\x06':
if not silent:
print '(ACK)'
else:
# Получено информационное сообщение
print message['body'] if message['lrc'] else 'Data is corrupt!'
# Если режим чтения, выходим
if not (read_flag == '1'):
exit()
# Ввод типа команды (чтение, запись или выход)
# Поддерживаются только R1, W1 и B0
try:
head = raw_input('' if silent else '(R)ead, (W)rite or e(X)it (default)? ')
except (EOFError):
send_read(data_encode({'head':'B0','body':''}))
exit()
# Ввод команды и отправка
if (head.upper() == 'R') or (head.upper() == 'W'):
try:
body = raw_input('' if silent else 'Enter command: ')
except (EOFError):
send_read(data_encode({'head':'B0','body':''}))
exit()
message = data_decode(send_read(data_encode({'head':head.upper()+'1','body':body})))
# Завершение сеанса
else:
send_read(data_encode({'head':'B0','body':''}))
exit()
Код: Выделить всё
Enter password ((www.energomera.ru)): 777777
(ACK)
(R)ead, (W)rite or e(X)it (default)? R
Enter command: VOLTA()
VOLTA(221.42)
(R)ead, (W)rite or e(X)it (default)? R
Enter command: ET0PE()
ET0PE(1928.41)
(541.67)
(570.82)
(815.92)
(0.00)
(0.00)
(R)ead, (W)rite or e(X)it (default)? X
Re: Снятие показаний счетчиков электричества, воды, газа
Добрый день, не кидайте тапками, если вопрос уже задавался. Вопрос в следующем:
Возможно ли подключить:
1) Счетчик воды с импульсным выходом
2) Cчетчик электроэнергии с RS-485
К Мегадевайсу D328 ? Что - то не очень хочется заморачиватся с 1-wire сетью.
Возможно ли подключить:
1) Счетчик воды с импульсным выходом
2) Cчетчик электроэнергии с RS-485
К Мегадевайсу D328 ? Что - то не очень хочется заморачиватся с 1-wire сетью.
Re: Снятие показаний счетчиков электричества, воды, газа
А каким образом счетчик воды с импульсным выходом подключается? Можно взять какой-то уже готовый модуль или надо паять?vtec писал(а):1. Да
2. Нет
Re: Снятие показаний счетчиков электричества, воды, газа
На сколько я понимаю, импульсный выход от счетчика тупо подключается на один из входов Меге.А каким образом счетчик воды с импульсным выходом подключается? Можно взять какой-то уже готовый модуль или надо паять?
http://www.ab-log.ru/page.php?Cat=110&I ... 2%F7%E8%EA
Выдержка:
Счетчики
Для каждого порта типа In (Вход) устройство сохраняет количество срабатываний, согласно настройкам порта.
Значение счетчика указывается на странице конфигурирования порта через слеш (максимальное значение 65535)
ON/1 (Порт активен/количество срабатываний 1)
Обнуление/задание исходного значения счетчика
С помощью параметра "cnt" можно задать любое значение счетчика.
Andrey_B, поправьте если не так.
Re: Снятие показаний счетчиков электричества, воды, газа
aonmaster писал(а):Всё решилось, когда подключил счетчик через адаптер от Меркурия (Меркурий-221.
Этот заработал при всех значениях DTR, RTS и т.д.
А вот почему не было ответа под linux с тем китайским адаптером (CH340/341), однако же с ним же был ответ в Винде - это загадка.
О_о, наконец то нашел хоть какую реализацию опроса СЭЭ как у меня - CE102M R5 145-A.orangetie писал(а):Написал на Питоне скрипт для СЕ-102М.
Нужно поменять адрес последовательного порта на ваш.
Ребят, поделитесь наработками пожалуйста!
Re: Снятие показаний счетчиков электричества, воды, газа
vit34, если под импульсным выходом подразумевается что-нибудь типа геркона, который замыкается при определенном расходе, то такой выход без проблем подключается к стандартному входу модуля.
Re: Снятие показаний счетчиков электричества, воды, газа
Да, в счетчиках воды от Valtec используется геркон. См. картинку подключенияесли под импульсным выходом подразумевается что-нибудь типа геркона, который замыкается при определенном расходе, то такой выход без проблем подключается к стандартному входу модуля
А в счетчике газа http://www.betar.ru/production/802/131 вот что написано:
В конструкции электронного блока применяется оптрон типа KRC357NT, позволяющий применять дистанционный съем показаний, который выдает импульс во внешнюю сеть учета на каждые 10 литров прошедшего газа со следующими параметрами:
- ток внешней цепи оптрона не более 3 мА;
- напряжение на внешней цепи оптрона не более 60 В.
Будет Мега считать такое?
- Вложения
-
- схема подключения счетчика воды
- подключение счетчка VLF-R.JPG (15.42 КБ) 8985 просмотров
Re: Снятие показаний счетчиков электричества, воды, газа
Недостаточно информации, чтобы сказать уверенно.
Если говорить об оптроне KRC357NT, который применяется в счетчике, то вывод 3 оптрона подключается к левой клемме исполнительного модуля, а вывод 4 к правой. Никакой дополнительной обвязки не требуется.
Если говорить об оптроне KRC357NT, который применяется в счетчике, то вывод 3 оптрона подключается к левой клемме исполнительного модуля, а вывод 4 к правой. Никакой дополнительной обвязки не требуется.
Re: Снятие показаний счетчиков электричества, воды, газа
Какой информации не хватает?Недостаточно информации, чтобы сказать уверенно.
На картинке выше схемы для водосчетчика с герконом.ли говорить об оптроне KRC357NT, который применяется в счетчике, то вывод 3 оптрона подключается к левой клемме исполнительного модуля, а вывод 4 к правой. Никакой дополнительной обвязки не требуется.
У счетчика газа Бетар два выхода + и -
По оптрону KRC357NT схем в паспорте нет. Единственное что я нашел это http://www.alldatasheet.com/datasheet-p ... 357NT.html
Если нет уверенности в этом случае может быть вы посоветуете проверенный счетчик газа, который точно будет работать с Мегой?
Re: Снятие показаний счетчиков электричества, воды, газа
vit34, вы привели цитату из инструкции: "В конструкции электронного блока применяется оптрон типа KRC357NT", но неизвестно как этот оптрон связан с разъемом для подключения считывающего прибора. Поэтому недостаточно информации. По оптрону я ответил.
Я не подключал счетчики газа и не специалист в области таких счетчиков, поэтому каких-то определенных рекомендаций дать не могу.
Я не подключал счетчики газа и не специалист в области таких счетчиков, поэтому каких-то определенных рекомендаций дать не могу.
Re: Снятие показаний счетчиков электричества, воды, газа
У меня вот такойvit34 писал(а):Если нет уверенности в этом случае может быть вы посоветуете проверенный счетчик газа, который точно будет работать с Мегой?
http://www.vdgu.ru/catalog/schetchiki-g ... bk-g1.html
Вся серия BK-G имеет под индикатором выемку под родной геркон, но стоит он как сам счетчик.
Я использовал копеечный геркон для пневмоцилиндров, типа такого
В моем случае он встал как родной с натягом, даже крепить не пришлось.
Re: Снятие показаний счетчиков электричества, воды, газа
Это, у меня BK-G4T, значит я тоже смогу снимать показания??Jager писал(а):Вся серия BK-G имеет под индикатором выемку под родной геркон, но стоит он как сам счетчик.
В моем случае он встал как родной с натягом, даже крепить не пришлось.
- Вложения
-
- DSC_0297.JPG (142.91 КБ) 8870 просмотров
Re: Снятие показаний счетчиков электричества, воды, газа
А в чем проблема то? Откройте первую страницу этого топика и увидите куда ставить геркон.electric писал(а):Это, у меня BK-G4T, значит я тоже смогу снимать показания??
-
- Сообщения: 17
- Зарегистрирован: 06 мар 2014, 16:28
Re: Снятие показаний счетчиков электричества, воды, газа
Скрипт не запускается, пишет:orangetie писал(а):Написал на Питоне скрипт для СЕ-102М.
Нужно поменять адрес последовательного порта на ваш.
[cut...]
В режиме программирования команды вводятся как в инструкции к счетчику.
[cut...]
(R)ead, (W)rite or e(X)it (default)? X
[/code]
message = data_decode(send_read('\x060' + ident[4] + read_flag + '\r\n'))
IndexError: string index out of range