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

Состав:
— концентратор Меркурий-225.5
— счетчик Меркурий-203.2Т (однофазный)
— штатный виндовый софт — BQuark v.011
— снифер ком-порта, первый попавшийся (не буду делать рекламу)

Последовательность действий такая:
— составляем файл задания для BQuark в соответствии с его документацией
— скармливаем его этому самому Bquark-у
— сессию обмена с концентратором записываем
— вооружаемся всей доступной документацией и пытаемся расшифровать протокол.

BQuark пишет собственный лог, что может оказаться полезным (Поразительно то, что лог он пишет в файл задания. При этом и само задание переписывает по своему усмотрению. Таким образом, одно задание нельзя выполнить два раза — после первого раза оно становится уже другим. У меня нет слов). Остается добавить протокол снифера.

Вот что в итоге удалось записать:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// СЕКЦИЯ ОПИСАНИЯ ОБЪЕКТОВ СИСТЕМЫ СБОРА ДАННЫХ
OBJECTS
TYPE=PLC_II_CONCENTRATOR; ADDR=3186; MODE=GET; DIALOG=NO
TYPE=COMMAND; RUN=GET_CONFIG
TYPE=COMMAND; RUN=GET_SEG_NUM
TYPE=COMMAND; RUN=GET_TIMEDATE
TYPE=COMMAND; RUN=GET_VERINFO
TYPE=MAILBOX; ADDR=05301037; PROTOCOL=M-200
TYPE=SEGMENT; RUN=GET_ENERGY; ARDY=YES; ANS=2700000432000000000000000000000000; TIMEDATE=133716170A09
TYPE=SEGMENT; RUN=GET_POWER; ARDY=YES; ANS=260000; TIMEDATE=1C3716170A09
TYPE=SEGMENT; RUN=GET_TIMEDATE; ARDY=YES; ANS=2102225523241109; TIMEDATE=1E3716170A09
// СЕКЦИЯ ОПИСАНИЯ ИНТЕРФЕЙСА ПРОГРАММЫ

(опущено за ненадобностью)

// СЕКЦИЯ ПРОТОКОЛА
++++ сюда будем дописывать строки из протокола снифера и комментарии
LOG
00001: i/o 000000:000000 (22:55:04): 24.11.2009 22:55:04
00002: i/o 000000:000000 (22:55:04): Номер версии программы: ‘BQuark v.0.11’.
00002: i/o 000000:000000 (22:55:04):
00003: i/o 000000:000000 (22:55:04): Начинаем исполнение задания ‘TaskFile.dat’.
00003: i/o 000000:000000 (22:55:04):
00004: i/o 000000:000000 (22:55:04): На данном компьютере обнаружены следующие COM-порты: COM1, COM2, COM3, COM4.
00005: i/o 000000:000000 (22:55:05): Из них доступны: COM1, COM2, COM3, COM4.
00005: i/o 000000:000000 (22:55:05):
00006: i/o 000000:000000 (22:55:05): Начинаем поиск концентратора 3186.
00007: i/o 000000:000000 (22:55:05): Пробуем порт COM1, скорость обмена 38400.
00008: i/o 000000:000000 (22:55:06): Пробуем порт COM2, скорость обмена 38400.
00009: i/o 000000:000000 (22:55:07): Пробуем порт COM3, скорость обмена 38400.
00010: i/o 000000:000000 (22:55:07): Концентратор 3186 обнаружен. Порт COM3.

Запрос:24.11.2009 22:55:07.18464
75 C6 CC FF FF 86 31 01 86 85
86 — запрос адреса концентратора (Вообще, это имеет смысл, если адрес неизвестен, а концентратор в сети только один. Тогда запрос отправляется на широковещательный адрес, а концентратор в ответ сообщит свой.)

Ответ:24.11.2009 22:55:07.38764 (+0.2031 seconds)
14 C2 9B 86 31 FF FF 03 86 86 31 3C
31 86 — адрес, он нам и так известен (в данном случае это используется для проверки доступности концентратора)

00010: i/o 000000:000000 (22:55:07):
00011: i/o 000000:000000 (22:55:07): Начинаем обмен с концентратором 3186, порт COM3.

Запрос:24.11.2009 22:55:07.40364 (+0.0156 seconds)
75 C6 CC FF FF 86 31 01 80 7F
80 — GET_CONFIG Чтение конфигурации концентратора

Ответ:24.11.2009 22:55:07.41964 (+0.0156 seconds)
EF 8E 1D 86 31 FF FF 02 80 8D 0C
8D — SCAN | CONFIRM | EXE | DAYLIGHTSAVING

00012: i/o 000022:000010 (22:55:07): Концентратор 3186, параметры конфигурации: SCAN, CONFIRM, EXE, DAYLIGHTSAVING

Запрос:24.11.2009 22:55:07.45064 (+0.0156 seconds)
75 C6 CC FF FF 86 31 01 99 98
99 — GET_SEG_NUM Чтение количества сегментов, составляющих почтовый ящик

Ответ:24.11.2009 22:55:07.46564 (+0.0156 seconds)
EF 8E 1D 86 31 FF FF 02 99 04 9C
04 — четыре сегмента

00013: i/o 000044:000020 (22:55:07): Концентратор 3186, параметры почтового ящика: сегментов 4.

Запрос:24.11.2009 22:55:07.48164 (+0.0156 seconds)
75 C6 CC FF FF 86 31 01 81 80
81 — GET_TIMEDATE Чтение часов/календаря концентратора

Ответ:24.11.2009 22:55:07.51264 (+0.0313 seconds)
DB DA 36 86 31 FF FF 08 81 1E 37 16 01 17 0A 09 16

1E 37 16 01 17 0A 09
30 55 22 01 23 10 09 — в десятичном виде
22:55:30 вторник 24.11.2009

00014: i/o 000078:000030 (22:55:07): Концентратор 3186, показания часов/календаря: 22:55:30, 24.11.2009, вторник.

Запрос:24.11.2009 22:55:07.52864 (+0.0156 seconds)
75 C6 CC FF FF 86 31 01 83 82
83 — GET_VERINFO Чтение версии «прошивки» концентратора.

Ответ:24.11.2009 22:55:07.54464 (+0.0156 seconds)
5F 41 79 86 31 FF FF 1A 83 64 63 20 76 2E 30 2E
35 72 63 34 20 EE F2 20 32 32 2E 30 37 2E 32 30
30 38 BA

64 63 20 76 2E 30 2E 35 72 63 34 20 EE F2 20 32 32 2E 30 37 2E 32 30 30 38 — текстовая строка в кодировке cp1251

00015: i/o 000148:000040 (22:55:07): Концентратор 3186, версия микропрограммы: ‘dc v.0.5rc4 от 22.07.2008’.
00015: i/o 000148:000040 (22:55:07):

00016: i/o 000148:000040 (22:55:07): Концентратор 3186, чтение регистров статуса почтовых ящиков.
00016: i/o 000186:000055 (22:55:07):

Запрос:24.11.2009 22:55:07.57564 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9A 37 10 30 05 00 15
9A — GET_SEG_STATUS Чтение регистров статуса
37 10 30 05 — адрес счетчика (ящика) — 05301037 Оказывается, серийный номер счетчика — это шестнадцатиричная строка!
00 — номер сегмента

Ответ:24.11.2009 22:55:07.60664 (+0.0313 seconds)
D6 0F BC 86 31 FF FF 0A 9A 37 10 30 05 00 33 1F 01 00 68
37 10 30 05 — адрес
00 — номер сегмента
33 — STATUS статус сегмента почтового ящика (1 байт)
1F 01 — TIME таймер продолжительности цикла обмена (2 байта)
00 — errCNT счётчик неудачных попыток обращения к узлу (1 байт)

00017: i/o 000186:000055 (22:55:07): Концентратор 3186, mailbox 05301037, segment 0: CYCLE, GET_ENERGY, ARDY, STATE=OK, 2.87 сек, ошибок 0.

Аналогично для сегмента 01:

Запрос:24.11.2009 22:55:07.65364 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9A 37 10 30 05 01 16

Ответ:24.11.2009 22:55:08.70064 (+0.0469 seconds)
D6 0F BC 86 31 FF FF 0A 9A 37 10 30 05 01 33 E5 00 00 2E

00018: i/o 000224:000070 (22:55:08): Концентратор 3186, mailbox 05301037, segment 1: CYCLE, GET_POWER, ARDY, STATE=OK, 2.29 сек, ошибок 0.

Аналогично для сегмента 02:

Запрос:24.11.2009 22:55:08.73164 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9A 37 10 30 05 02 17

Ответ:24.11.2009 22:55:08.77864 (+0.0469 seconds)
D6 0F BC 86 31 FF FF 0A 9A 37 10 30 05 02 32 F8 00 00 41

00019: i/o 000262:000085 (22:55:08): Концентратор 3186, mailbox 05301037, segment 2: CYCLE, GET_TIMEDATE, ARDY, STATE=TRANSACTION, 2.48 сек, ошибок 0.

00019: i/o 000262:000085 (22:55:08):
00020: i/o 000262:000085 (22:55:08): Концентратор 3186, считывание ответов.
00020: i/o 000374:000115 (22:55:08):

Запрос:24.11.2009 22:55:08.79464 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9B 37 10 30 05 00 16
9B — GET_SEG_REQ Чтение отделения для запросов почтового ящика
37 10 30 05 — адрес
00 — сегмент

Ответ:24.11.2009 22:55:08.84064 (+0.0469 seconds)
DB DA 36 86 31 FF FF 08 9B 37 10 30 05 00 40 27 7D
37 10 30 05 — адрес
00 — сегмент
40 27 — запрос к счетчику (а кто его туда положил ?)
В протоколе М203 код 27 — чтение тарифных аккумуляторов. 40 — ??

Запрос:24.11.2009 22:55:08.85664 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9C 37 10 30 05 00 17
9C — GET_SEG_ANS Чтение отделения для ответов почтового ящика
37 10 30 05 — адрес
00 — сегмент

Ответ:24.11.2009 22:55:08.90364 (+0.0469 seconds)
BE A7 EA 86 31 FF FF 1E 9C 37 10 30 05 00 13 37
16 17 0A 09 C0 27 00 00 04 32 00 00 00 00 00 00
00 00 00 00 00 00 BE

37 10 30 05 — адрес
00 — сегмент
Время отсчета:
13 — сек
37 — минуты
16 — часы
17 — дата
0A — месяц
09 — год
C0 27 00 00 04 32 00 00 00 00 00 00 00 00 00 00 00 00 — ответ от счетчика

C0 27 — повторение кода команды (27), что такое C0 — пока не понятно
00 00 04 32
00 00 00 00
00 00 00 00
00 00 00 00
— четыре тарифных аккумулятора. Каждый из них представляет собой
4-х байтовое значение потребленной эл.энергии в десятках Вт.ч Старшие разряды вперёд. (из протокола М203)
В нашем случае:
4,32 кВт*ч
0,00 кВт*ч
0,00 кВт*ч
0,00 кВт*ч

00021: i/o 000374:000115 (22:55:08): Концентратор 3186, mailbox 05301037, segment 0: получено 17 байт.

Аналогично для сегмента 1:
Запрос:24.11.2009 22:55:08.93464 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9B 37 10 30 05 01 17

Ответ:24.11.2009 22:55:08.98164 (+0.0469 seconds)
DB DA 36 86 31 FF FF 08 9B 37 10 30 05 01 40 26 7D
40 26 — запрос к счетчику — Чтение текущей мощности в нагрузке (код 26)

Запрос:24.11.2009 22:55:08.99764 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9C 37 10 30 05 01 18

Ответ:24.11.2009 22:55:08.07564 (+0.0781 seconds)
6B 15 52 86 31 FF FF 10 9C 37 10 30 05 01 1C 37
16 17 0A 09 C0 26 00 00 91
37 10 30 05
01
1C 37 16 17 0A 09
C0 26 00 00 — ответ счетчика (Значение текущей мощности в нагрузке mm,mm кВт BCD)
В данном случае — 0,0 кВт

00022: i/o 000458:000145 (22:55:08): Концентратор 3186, mailbox 05301037, segment 1: получено 3 байт.

Аналогично для сегмента 2:

Запрос:24.11.2009 22:55:08.09064 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9B 37 10 30 05 02 18

Ответ:24.11.2009 22:55:08.13764 (+0.0469 seconds)
DB DA 36 86 31 FF FF 08 9B 37 10 30 05 02 40 21 79
40 21 — запрос счетчику (Чтение внутренних часов и календаря счетчика — код 21)

Запрос:24.11.2009 22:55:08.15364 (+0.0156 seconds)
62 B9 53 FF FF 86 31 06 9C 37 10 30 05 02 19

Ответ:24.11.2009 22:55:08.20064 (+0.0469 seconds)
71 BF 47 86 31 FF FF 15 9C 37 10 30 05 02 1E 37
16 17 0A 09 C0 21 02 22 55 23 24 11 09 69
37 10 30 05
02
1E 37 16 17 0A 09
C0 21 02 22 55 23 24 11 09 — ответ счетчика
dow-hh-mm-ss-dd-mon-yy
02 — вторник
22:55:23
24-11-2009

00023: i/o 000552:000175 (22:55:08): Концентратор 3186, mailbox 05301037, segment 2: получено 8 байт.
00023: i/o 000552:000175 (22:55:09):
00024: i/o 000552:000175 (22:55:09): Задание ‘TaskFile.dat’ выполнено.
00024: i/o 000552:000175 (22:55:09):
00025: i/o 000552:000175 (22:55:09): Общая продолжительность: 0:00:04
00026: i/o 000552:000175 (22:55:09): Сообщений: 25
00027: i/o 000552:000175 (22:55:09): Предупреждений: 0
00028: i/o 000552:000175 (22:55:09): Ошибок: 0

 

Добавить комментарий

Set your Twitter account name in your settings to use the TwitterBar Section.