Учет расхода газа или дальнейшее изучение протокола Vaillant и e-Bus

07/04/2010 18:57:25

Газовый счетчик Metrix G10Одна из важных функций Умного Дома - учет и анализ расхода ресурсов. Некоторое время назад я подключил с помощью USB/CAN адаптера свой электросчетчик Меркурий 230 и написал собственную программу считывания показаний. Это позволило не только вести учет расхода электроэнергии в целом и отдельно по фазам, но и воочию, детально наблюдать параметры электроснабжения. Записывая все значения в базу данных и используя такие библиотеки как jpGraph и Open Flash Chart 2, в Web-интерфейсе Умного Дома я вывел несколько полезных графиков. Таким образом я имею возможность отслеживать потребление не только по месяцам, но и по дням, часам, минутам и даже секундам! Совсем другое дело обстоит с учетом потребления газа. Механический газовый счетчик не имеет никаких интерфейсов, поэтому считывание и запись показаний в БД возможна только вручную. Но если раз в месяц, если не забывать, еще можно записать показания счетчика, то делать это каждый день крайне утомительно. Таким образом появился вопрос - можно ли как-то учитывать потребление газа автоматически?

Безусловно, существуют системы автоматического учета потребления газа со всеми необходимыми интерфейсами и протоколами, но стоимость такого оборудования, программного обеспечения, согласования монтажа этой системы со всеми газовыми инстанциями и собственно самого монтажа выльется в копеечку. Оптическое считывание информации с табло счетчика в принципе возможно. Квитанции об уплате штрафа за нарушение правил дорожного движения с фотографией на память тому подтверждение. И ведь в целом не обязательно фотографировать и распознавать целиком табло (для чего требуется фотокамера и освещение), можно привязать какое-нибудь устройство к конкретной точке или сектору на дисковом табло. Например, часто проход через ноль закрашен красным (более темным) цветом. Но вид увешенного проводами счетчика вряд ли будет воспринят представителем газоснабжающей организации с энтузиазмом. Как еще можно учитывать потребление газа? У меня появилась идея подключить модуль на базе DS2406P (точно так же как я это уже делал с насосом Grundfos MQ) параллельно с газовым клапаном котла. Газовый клапан открыт только в процессе сжигания газа, а значит учитывая время его работы и зная номинальное расход газа котлом (указано в документации и постоянно для немодулирующих горелок) можно довольно точно учитывать потребление газа. Выход? Конечно. Но мой котел оснащен продвинутой электроникой. Может быть он сам ведет учет работы газового клапана? Оказывается ведет! Детально изучив документацию я нашел регистр, который отвечает за такой учет. Называется он "Время работы котла в режиме отопления" и измеряется в часах. Зная, что мой котел потребляет 4,7м3 газа в час необходимо только перемножить эти значения. Конечно, такой учет не будет абсолютно точным, поскольку, по всей вероятности, номинальное потребление зависит от давления в магистрали. Также не стоит забывать, что могут быть другие потребители, такие как газовая плита. Однако сделав расчеты я пришел к выводу, что газовое отопление потребляет по меньшей мере 90% от всего потребления газа в год. А если прибавить 10% к тому, что потребил котел, получится фактически то число, которое отображается счетчиком. Но тут случилась загвоздка. Я не знал какой командой получить значение этого регистра...

Vaillant DIA SystemВ предыдущей статье я рассказал о том, как мне удалось подключить котел Vaillant atmoVIT к персональному компьютеру посредством RS-232 интерфейса. У меня также получилось заглянуть в протокол общения между программой vrDIALOG и котлом. И хотя у меня по-прежнему нет описания протокола, эмпирически получен некоторый список команд, с помощью которых я могу получать многие параметры работы котла, а также и задавать свои значения в те регистры, которые допускают запись. И все дело в том, что программа vrDIALOG, видимо, адаптируется к варианту (модели) оборудования. И хотя в демо-режиме программа отображала регистр, отвечающий за время работы котла в режиме отопления, будучи подключенной к моему котлу, она это значение в закладке Диагностика не отображала. Поэтому мне пришлось немного глубже коснуться протокола Vaillant и представить более детальное описание с указанием фактических команд и регистров системы DIA.

Напомню, что котлу посылаются команды вида: x07x00x00x00xC2x01x7C
 vrDIALOG формирует команды размером 7 байт

1 байт: длина команды, включая контрольную сумму
2 байт: запрос значения 00h или запись значения 80h, 03h в ответе котла означает ошибку
3-... байты: команды котлу и ответы котла
последний байт: 8-bit CRC

За что отвечает 6 байт стандартной команды выяснить не удалось, так как независимо от значения этого поля, котел возвращает одинаковые значения. В немецких источниках есть предположение, что это длина ожидаемых данных, но котел, видимо, игнорирует это поле.

Алгоритм CRC я бы назвал нестандартным. Во всяком случае ничего подобного мне никогда не попадалось. Пример на PHP (переделать на C займет 2,5 секунды)

function get_crc($crc, $my_char)
{
	$short_c = ord($my_char);
	if ( $crc & 0x80 )
	$crc = ( $crc << 1 ) ^ 25;
	else
	$crc = $crc << 1;
	$crc &= 0xFF;
	$crc ^= $short_c;
	return $crc;
}

Таким образом, диапазон значений, который используется для передачи команд от 0 до 256. С помощью vrDIALOG удалось выяснить только некоторые команды. Имея функцию работы с CRC я написал простейшую программу, которая по очереди отправляет котлу команды из всего диапазона возможных значений. Конечно, PHP не лучший вариант для написания такого рода "драйверов", но иногда и микроскопом гвозди забивают.

for ( $i = 1; $i < 255; $i++ )
{
	sleep(1);
	$my_cmd = "x07x00x00x00".chr($i)."x02";
	$crc = get_crc($my_cmd);
	$my_cmd = $my_cmd.chr($crc);
	fwrite($fp, $my_cmd);

	unset($crc_ok);
	unset($result);
	unset($my_cnt);
	echo $i." - ";
	while ( $crc_ok == 0 )
	{
		$my_cnt++;
		$result .= fread($fp, 1);

		$crc = get_crc($result, 1);

		if ( ord($result[0]) == 3 )
		{
			echo "Error";
			$result .= fread($fp, 2);
			$crc_ok = 1;
		}
		elseif ( ord($result[strlen($result) - 1]) == $crc )
		{
			$crc_ok = 1;
			for ( $j = 0; $j < $my_cnt; $j++ )
			echo dd($result[$j]);
		}

	}
}

В результате работы программы получены следующие результаты.
Как видно из
Проведя анализ предлагаю следующую интерпретацию команд и значений. В таблице отсутствуют те команды, в ответ на которые котел вернул ошибку.

BIN HEX Ответ котла Значение Описание DIA
1 01 050002301c ? 35 ??? ???
3 03 0400f0e0 ? - ??? ???
4 04 050000f0d8 15 С Расчетная температура бойлера d.7
5 05 04000f1f ? + ? Сигнал наличия пламени* ???
6 06 0e00ffffffffffffffffffffff3b ??? ? Информация об ошибках* ???
7 07 0400f0e0 ? - ??? ???
8 08 04000111 1 Режим (1 - Зима; 0 - Лето) d.23
9 09 050003e8c6 ? 1000 ??? ???
10 0A 05000283af ? 643 ??? ???
11 0B 050002bc90 ? 700 ??? ???
13 0D 04000f1f ? + ??? ???
14 0E 04000111 1 Комнатный термостат (1 - ВКЛ; 0 - ВЫКЛ) d.8
17 11 04000010 0 ??? ???
20 14 08000297fd6800c1 41,50 C Температура отходящих газов d.48
21 15 0800ffff000055a7 ??? ??? ???
22 16 0600ff21aa5f  -13,94 С Датчик расхода ГВ ???
23 17 0600ff21aa5f  -13,94 С Температура бойлера d.4
24 18 060003c400fd  60,25 C Температура подающей линии d.40
25 19 050003d0fe  61 C Заданное значение температуры подачи d.5
26 1A 04000010 0 ??? ???
30 1E 04000010 0 ??? ???
31 1F 04000a1a 10 Число сбоев автомата розжига d.61
32 20 04000010 0 Число отключений по тепловой защите d.60
33 21 04000212 2 ??? ???
34 22 0500000028 0 Часы работы на ГВС d.81
35 23 0500000028 0 Количество стартов горелки на ГВС d.83
36 24 0500000028 0 ? Номинальный расход* ???
37 25 050005a082 90 С Расчетная температура подачи внешнего 7-8-9 регулятора d.9
38 26 0d001c1c9c1c1c1c1d1c1c1cb3 ??? ??? ???
40 28 0500179e98 6046 Часы работы на отопление d.80
41 29 0500017d57 381 Количество стартов горелки на отопление d.82
42 2A 0b002d1600fb0001951c61 ??? ??? ???
43 2B 0b000000000000000000df 0 ??? ???
44 2C 04002434 3,6 c Максимальное время розжига d.65
45 2D 04001505 2,1 c Среднее время розжига d.64
46 2E 050003634d ? 867 ??? ???
50 32 050000f0d8 ? - ??? ???
51 33 050003614f ? 865 ??? ???
52 34 0500000028 0 ??? ???
54 36 0500000028 0 ??? ???
55 37 0500061e3a ? 1566 ??? ???
56 38 04000010 0 ? Блокировка горелок* ???
57 39 050003d0fe 61 С ? Заданное значение температуры подачи* ???
60 3C 04000111 1 ??? ???
62 3E 04000010 0 ??? ???
63 3F 04000111 1 Внешний насос отопления d.11
64 40 04000111 1 ? Пламя/газовый клапан/горелки (1 - ВКЛ) ???
65 41 0500000028 0 ? Прогноз времени до отключения горелок ???
66 42 04000010 0 ? VUV* ???
67 43 04000111 1 ??? ???
68 44 04000111 1 Встроенный насос d.10
69 45 04000010 0 VUV Mittenstellung ???
70 46 0400f0e0 ? 240 ??? ???
71 47 04000f1f ? + ??? ???
72 48 0400f0e0 ? - ? Состояние газового клапана* ???
73 49 0400f0e0 ? - ? Состояние розжига* ???
74 4A 04000010 0 ??? ???
75 4B 0500000028 0 ??? ???
76 4C 04000a1a ? 10 ??? ???
77 4D 0400f0e0 ? - ??? ???
78 4E 04000f1f ? + ??? ???
79 4F 04000f1f ? + ??? ???
80 50 04000f1f ? + ??? ???
81 51 04000f1f ? + ??? ???
82 52 0400f0e0 ? - ??? ???
83 53 0400f0e0 ? - ??? ???
84 54 04000010 0 ??? ???
85 55 0500000028 0 ??? ???
87 57 04000010 0 ??? ???
88 58 04000010 0 Запрос нагрева бойлера через контакты C1/C2 d.22
90 5A 04000010 0 ??? ???
91 5B 04000010 0 ??? ???
92 5C 0500000028 0 ??? ???
93 5D 04000010 0 ??? ???
94 5E 04000010 0 ??? ???
95 5F 04000010 0 ??? ???
97 61 04000010 0 ??? ???
99 63 04001202 180 сек Выбег насоса после отключения бойлера d.72
100 64 04001e0e 30 мин Выбег насоса после отключения горелок d.01
101 65 04000010 0 Корректировка значения наружной темп. d.46
102 66 04002d3d 45 мин Максимальное время нагрева бойлера d.75
103 67 04000010 0 ??? ???
104 68 0a0000000000000000fa 0 ??? ???
105 69 04000010 0 Статус сигнала DCF d.91
106 6A 0600fc39aa63 -60,44 Значение наружной температуры d.47
107 6B 06000092aaf7 ? 9,16 ??? ???
108 6C 04000010 0 ??? ???
109 6D 04000010 0 ??? ???
110 6E 04000b1b 11 Число безуспешных розжигов с 1 попытки d.68
111 6F 04000a1a 10 Число безуспешных розжигов со 2 попытки d.69
112 70 04000010 0 ??? ???
113 71 04000111 1 Старт ГВЛ по таймеру ???

???

d.25

114 72 04000010 0 ??? ???
115 73 0500fcec25 64768 Ток ионизации ???
116 74 04000010 0 Имеется регулятор с обратной связью d.90
117 75 04000010 0 ??? ???
118 76 0600fc39aa63 -60,44 C ??? ???
119 77 0400f0e0 ? - ??? ???
121 79 04000010 0 ??? ???
122 7A 04000010 0 ??? ???
123 7B 04000010 0 ??? ???
124 7C 0500000028 0 ??? ???
125 7D 0500060024 ? 96 ??? ???
126 7E 04000212 2 ??? ???
127 7F 0500000028 0 ??? ???
128 80 050003e8c6 ? 1000 ??? ???
129 81 050003d0fe ? 976 ??? ???
130 82 04000010 0 ??? ???
131 83 0500000028 0 ??? ???
132 84 0500000028 0 ??? ???
134 86 04000010 0 ??? ???
137 89 04000111 1 ??? ???
138 8A 04000212 2 ??? ???
139 8B 0400f0e0 ? - ??? ???
140 8C 04000010 0 ??? ???
142 8E 04000010 0 ??? ???
143 8F 0c00f03e2418600007000084 ??? ??? ???
144 90 0500000028 0 ??? ???
145 91 0500000028 0 ??? ???
146 92 04000616 6 ??? ???
147 93 04000212 2 ??? ???
148 94 04000010 0 ??? ???
153 99 04000212 2 ??? ???
154 9A 08000009fff60058 ??? ??? ???
155 9B 04000010 0 ??? ???
157 9D 04000717 7 с Сдвиг значения горячего старта (?) d.73
158 9E 04000010 0 Насос обогрева бойлера d.12
160 A0 04000212 2 ??? ???
161 A1 04000010 0 ??? ???
165 A5 04004353 67 C Макс. температура подачи отопление d.71
166 A6 04005545 85 C Макс. температура подачи ГВС d.78
169 A9 04000111 1 Частичный нагрев бойлера ??? ???
170 AA 04000010 0 ??? ???
171 AB 04000717 7 Коды состояния (напри. S.07) S.*
172 AC 05000bc2fc 3010 Число часов до следующего обслуживания d.84
175 AF 04000010 0 Циркуляционный насос ГВС d.13
176 B0 04000010 0 ??? ???
179 B3 04000010 0 ? Состояние обратного контроля* ???
180 B4 04000010 0 ??? ???
181 B5 0400ffef ? 255 ??? ???
182 B6 0600ff21aa5f -13,94 Температура бойлера СК внизу d.42
184 B8 060000000060 0 С Температура коллектора ??? ???
185 B9 0500000028 0 ??? ???
186 BA 04000010 0 ??? ???
187 BB 04000111 1 ??? ???
188 BC 04000010 0 ??? ???
189 BD 04000010 0 ??? ???
190 BE 0500000028 0 ??? ???
191 BF 04000010 0 ??? ???
192 C0 04000010 0 ??? ???
193 C1 04000010 0 ??? ???
194 C2 04002333 35 C Минимальная температура подачи d.85
195 C3 04000212 2 C Гистерезис включения d.51
196 C4 04000616 6 C Гистерезис выключения d.50
197 C5 0400f0e0 ? - ??? ???
198 C6 04000010 0 ??? ???
199 C7 04000010 0 ??? ???
200 C8 04000010 0 ??? ???
202 CA 04000f1f ? + ??? ???
203 CB 04000010 0 ??? ???
204 CC 0900000000000000e4 0 ??? ???
207 CF 0900000000000000e4 0 ??? ???
223 DF 04000010 0 Насос СК ??? ???
224 E0 04000010 0 ??? ???
225 E1 04004656 70 С Максимальная расч. температура бойлера d.20
231 E7 04000414 4 ??? ???
232 E8 04000212 2 ??? ???

Кроме вышеперечисленных ответов, котел может вернуть сообщения типа:

030602 - Значение успешно записано в регистр.
030107 - Возможно, ошибка контрольной суммы.
030305 - Ошибка. Некорректная команда.

Отдельный интерес представляет команда ABh, с помощью которой можно получить информацию о текущем статусе котла. Этот статус в документации Vaillant описан как S.01, S.02. Таким образом можно обращаться как к отдельным регистрам (элементам) котла, так и запрашивать самодиагностические коды электроники.

Несколько слов о кодировании температуры. В части регистров это простое преобразование HEX->BIN.
Например команда e7h (максимальная температура бойлера). Значение 46h нужно понимать как 70 градусов.
Сложнее с командой 18h (температура подачи). Котел возвращает данные 060003c400fd.
Читать это значение нужно так:

3C -> 60 градусов
40 -> 64/255 -> 0,25 градуса
Значение температуры 60,25 градуса.

Примечательно, что это информация разнесена по 3 байтам: 03 c4 00

Значения типа 00h и 01h очевидны без пояснений. Но встречаются также значения вида 0Fh и F0h. Это состояние активности элемента - активен или не активен.

Полезными для меня показались такие параметры котла как общее состояние котла системы самодиагностики, общее количество часов работы котла, состояние горелок, температура подающей линии котла, температура отходящих газов (выхлопа), значения среднего и максимального времени розжига, а также общее количество неудачного розжига с первой попытки. С помощью простейшей программы я считываю эти параметры котла и записываю в базу данных системы Умный Дом. Далее эти данные используются в программе управления отоплением и для отображения работы системы в Web-интерфейсе.

 

 

Но самым главным результатом этой работы стала возможность считывать значение, определяющее время работы котла в режиме отопления, а значит потребление газа. Конечно, разрешающая способность такого учета низкая. Минимальное величина учета - час, а значит почти 5 м3 газа. Но это, согласитесь, лучше, чем ничего. Да и с учетом тех расходов, которые происходят в зимние месяцы (от 50 до 70 м3 в сутки) такая шкала вполне приемлема. Как только наберется достаточная статистика обязательно сообщу о том, насколько полученные данные расходятся с показанием счетчика.

E-BUS

В котлах Vaillant, как, впрочем и в некоторых других марках, таких как Protherm, Wolf, имеется поддержка шины E-Bus. В приведенном выше примере видно, что котел Vaillant atmoVIT поддерживает работу с портом RS-232, но это не единственный способ общения с котлом. Более прогрессивным и гибким способом коммуникации является подключение компьютера, также как и других принадлежностей - регулятора calorMATIC и модулей расширения к единой шине E-Bus. При подключении к общей шине применяется принципиально иной подход. Например, при наличии двух котлов и регулятора calorMATIC 630 с помощью компьютера можно получать данные и управлять всеми этими устройствами, имея всего один адаптер, подключенный к любому свободному разъему E-BUS в колодке котла или регулятора. Есть данные что адаптер TTL-RS232 работает не со всеми котлами марки Vaillant. Возможно в последних моделях и вовсе нет прямой поддержки RS232, поэтому единственным вариантом подключения котла к компьютеру остается цифровая шина E-Bus. Для тех, кто интересуется этой темой приведу некоторые документы на тему шины E-Bus.

eBUS Specification. Network Management
eBUS Specification. Physical Layer (OSI 1). Data-Link Layer (OSI 2)
eBUS Specification. Application Layer (OSI 7)
eBUS Specification. Application Layer (OSI 7). Appendix
eBUS Specification. Physical Layer Testing
eBUS Specification. Data-Link Layer Testing
Vaillant eBUS Commands (Попытка реверс-инжиниринга)

Нужно понимать, что компьютер к шине E-Bus подключается не напрямую, а через адаптер. Для E-Bus существуют адаптеры как для USB, так и для RS232 интерфейса. Стандартная для E-Bus скорость 2400 бод.

Схема адаптера E-Bus

Принципиальная схема простейшего адаптера E-Bus без гальванической развязки

Адаптер eBUS-RS232

Принципиальная схема адаптера eBUS-RS232 на базе MAX232

При использовании шины e-Bus для управления котлом требуется совершенно иные подходы в программировании, чем те, что описаны в этой статье. Так как у меня успешно работает прямое подключение котла к порту RS232, я не стал детально разбираться в протоколе и не использовал адаптеры eBUS, однако буду признателен за любую полезную информацию по теме управления котлами Vaillant и шине E-Bus.


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




2010-04-12 23:01:17 | Andrey_B
George, as a matter of fact, my boiler (Vaillant atmoVIT) has no modulation. It's normal for Russia. Simple, without burning modulation boilers are cheaper. It's rather cheaper to buy two boiler (20kW) without modulation than one boiler (40kW) with modulation. So my calculations are close to the truth (I've compared it with gas metering readings). But, you are right. For your Ecotec this information will not be true. But I'm convinced that information about current modulation is in boiler's memory like other data. So it's perhaps possible to write programm for continuous (without any delays or not more than second) polling boiler to get current status of boiler (fire on/off) and current modulation and then to calculate avarage values to write it to database (one for minutes for example).


2010-04-12 22:30:01 | George Hills
I am worried about your gas calculation. Does the boiler modulate? I mean, does it vary its power output while burning? I have a Vaillant Ecotec and it is not enough to know how many minutes the burner has been running for. It is also necessary to know at what power level - this can be 9kW - 30 kW.

Good luck!