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

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
aonmaster
Сообщения: 13
Зарегистрирован: 04 июл 2013, 06:17

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

Сообщение aonmaster » 26 июн 2015, 09:51

Уважаемые форумчане и Andrey_B! Неужели никто не сталкивался? :((

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

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

Сообщение Andrey_B » 26 июн 2015, 11:35

aonmaster, у меня лично нет счетчика Энергомера CE102M-A и я никогда не писал для него программ.
Но вот то, что вы не указали. Во-первых, скорость порта. Насколько я понимаю, скорость порта не должна быть выше 9600 бод.
Во-вторых, не очень понятно "На черном экране ввожу ./!"
Но должны ввести "/?!"
Далее, в логе видно еще 2F (слэш), а в протоколе МЭК 61107 про это что-то не написано. Это странно. И что, вы в логе при отправке с терминала видите тоже, что и с AdminTools. Это тем более странно. 2F в конце там в этом случае быть не должно.
"01 42 30 03 75" - это, похоже команда завершение сеанса. Возможно, в Admin Tools ее засобачили для совместимости или на всякий случай. В протоколе нет ее описания.
Что еще. В протоколе обозначены некие тайминги, в течение которых устройство возвращает ответ. Не исключено, что тайминги есть и на прием команды. Возможно, вы просто не успеваете за нужный период времени набрать "/?!"
А какие проблемы, не используйте терминал, напишите программу, которая будет отправлять все в точности также, как AdminTools.

aonmaster
Сообщения: 13
Зарегистрирован: 04 июл 2013, 06:17

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

Сообщение aonmaster » 26 июн 2015, 13:34

Спасибо, Андрей, за помощь и ответ!!! Вы тут главный советчик и гуру.
Конечно, опечатался - набирал /?! - как и нужно.
За это время некие продвижки наступили: нашёл терминалку 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 тоже. А питон не желает.

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

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

Сообщение Andrey_B » 26 июн 2015, 15:25

По поводу 2F вы меня не совсем правильно поняли.
Вот вы говорите, что Serial Port Monitor вот так логирует работу AdminTools
ASCII /?! = HEX 2F 3F 21 0D 0A 2F
А я спрашиваю, откуда там на конце 2F? Вначале - понятно. А на конце?

Собственно, это неважно.
Я вот не знаю как именно работает модуль serial в питоне, но попробуйте сделать задержку после отправки запроса и поэкспериментировать с ее величиной.

aonmaster
Сообщения: 13
Зарегистрирован: 04 июл 2013, 06:17

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

Сообщение aonmaster » 28 июн 2015, 11:18

Всё решилось, когда подключил счетчик через адаптер от Меркурия (Меркурий-221.
Этот заработал при всех значениях DTR, RTS и т.д.

А вот почему не было ответа под linux с тем китайским адаптером (CH340/341), однако же с ним же был ответ в Винде - это загадка.

orangetie
Сообщения: 1
Зарегистрирован: 28 июл 2015, 16:58

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

Сообщение orangetie » 28 июл 2015, 17:05

Написал на Питоне скрипт для СЕ-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

vit34
Сообщения: 27
Зарегистрирован: 18 ноя 2015, 21:25

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

Сообщение vit34 » 21 ноя 2015, 00:27

Добрый день, не кидайте тапками, если вопрос уже задавался. Вопрос в следующем:
Возможно ли подключить:
1) Счетчик воды с импульсным выходом
2) Cчетчик электроэнергии с RS-485
К Мегадевайсу D328 ? Что - то не очень хочется заморачиватся с 1-wire сетью.


empenoso
Сообщения: 1039
Зарегистрирован: 11 ноя 2015, 08:03
Откуда: Пермь

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

Сообщение empenoso » 25 ноя 2015, 06:09

vtec писал(а):1. Да
2. Нет
А каким образом счетчик воды с импульсным выходом подключается? Можно взять какой-то уже готовый модуль или надо паять?

vit34
Сообщения: 27
Зарегистрирован: 18 ноя 2015, 21:25

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

Сообщение vit34 » 08 дек 2015, 13:12

А каким образом счетчик воды с импульсным выходом подключается? Можно взять какой-то уже готовый модуль или надо паять?
На сколько я понимаю, импульсный выход от счетчика тупо подключается на один из входов Меге.
http://www.ab-log.ru/page.php?Cat=110&I ... 2%F7%E8%EA
Выдержка:
Счетчики
Для каждого порта типа In (Вход) устройство сохраняет количество срабатываний, согласно настройкам порта.
Значение счетчика указывается на странице конфигурирования порта через слеш (максимальное значение 65535)
ON/1 (Порт активен/количество срабатываний 1)
Обнуление/задание исходного значения счетчика
С помощью параметра "cnt" можно задать любое значение счетчика.


Andrey_B, поправьте если не так.

electric
Сообщения: 57
Зарегистрирован: 16 сен 2013, 00:36

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

Сообщение electric » 08 дек 2015, 13:55

aonmaster писал(а):Всё решилось, когда подключил счетчик через адаптер от Меркурия (Меркурий-221.
Этот заработал при всех значениях DTR, RTS и т.д.
А вот почему не было ответа под linux с тем китайским адаптером (CH340/341), однако же с ним же был ответ в Винде - это загадка.
orangetie писал(а):Написал на Питоне скрипт для СЕ-102М.
Нужно поменять адрес последовательного порта на ваш.
О_о, наконец то нашел хоть какую реализацию опроса СЭЭ как у меня - CE102M R5 145-A.
Ребят, поделитесь наработками пожалуйста!

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

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

Сообщение Andrey_B » 08 дек 2015, 16:23

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

vit34
Сообщения: 27
Зарегистрирован: 18 ноя 2015, 21:25

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

Сообщение vit34 » 08 дек 2015, 17:51

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

А в счетчике газа http://www.betar.ru/production/802/131 вот что написано:
В конструкции электронного блока применяется оптрон типа KRC357NT, позволяющий применять дистанционный съем показаний, который выдает импульс во внешнюю сеть учета на каждые 10 литров прошедшего газа со следующими параметрами:
- ток внешней цепи оптрона не более 3 мА;
- напряжение на внешней цепи оптрона не более 60 В.

Будет Мега считать такое?
Вложения
подключение счетчка VLF-R.JPG
схема подключения счетчика воды
подключение счетчка VLF-R.JPG (15.42 КБ) 8980 просмотров

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

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

Сообщение Andrey_B » 08 дек 2015, 18:21

Недостаточно информации, чтобы сказать уверенно.
Если говорить об оптроне KRC357NT, который применяется в счетчике, то вывод 3 оптрона подключается к левой клемме исполнительного модуля, а вывод 4 к правой. Никакой дополнительной обвязки не требуется.

vit34
Сообщения: 27
Зарегистрирован: 18 ноя 2015, 21:25

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

Сообщение vit34 » 09 дек 2015, 13:16

Недостаточно информации, чтобы сказать уверенно.
Какой информации не хватает?
ли говорить об оптроне KRC357NT, который применяется в счетчике, то вывод 3 оптрона подключается к левой клемме исполнительного модуля, а вывод 4 к правой. Никакой дополнительной обвязки не требуется.
На картинке выше схемы для водосчетчика с герконом.

У счетчика газа Бетар два выхода + и -
По оптрону KRC357NT схем в паспорте нет. Единственное что я нашел это http://www.alldatasheet.com/datasheet-p ... 357NT.html
Если нет уверенности в этом случае может быть вы посоветуете проверенный счетчик газа, который точно будет работать с Мегой?

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

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

Сообщение Andrey_B » 09 дек 2015, 16:51

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

Jager
Сообщения: 42
Зарегистрирован: 20 ноя 2011, 19:48

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

Сообщение Jager » 09 дек 2015, 17:06

vit34 писал(а):Если нет уверенности в этом случае может быть вы посоветуете проверенный счетчик газа, который точно будет работать с Мегой?
У меня вот такой

Изображение
http://www.vdgu.ru/catalog/schetchiki-g ... bk-g1.html

Вся серия BK-G имеет под индикатором выемку под родной геркон, но стоит он как сам счетчик.
Я использовал копеечный геркон для пневмоцилиндров, типа такого

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

electric
Сообщения: 57
Зарегистрирован: 16 сен 2013, 00:36

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

Сообщение electric » 09 дек 2015, 18:49

Jager писал(а):Вся серия BK-G имеет под индикатором выемку под родной геркон, но стоит он как сам счетчик.
В моем случае он встал как родной с натягом, даже крепить не пришлось.
Это, у меня BK-G4T, значит я тоже смогу снимать показания?? :mrgreen:
Вложения
DSC_0297.JPG
DSC_0297.JPG (142.91 КБ) 8865 просмотров

Jager
Сообщения: 42
Зарегистрирован: 20 ноя 2011, 19:48

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

Сообщение Jager » 09 дек 2015, 19:35

electric писал(а):Это, у меня BK-G4T, значит я тоже смогу снимать показания?? :mrgreen:
А в чем проблема то? Откройте первую страницу этого топика и увидите куда ставить геркон.

Smirnoffkv
Сообщения: 17
Зарегистрирован: 06 мар 2014, 16:28

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

Сообщение Smirnoffkv » 20 мар 2016, 15:23

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

Ответить