Ряд наших устройств имеет встроенный порт RS-232 для считывания данных с источников бесперебойного питания (ИБП) по двум наиболее распространённым протоколам обмена – Megatec и Voltronic. Для облегчения тестирования устройств мы разработали небольшую программу-эмулятор. Именно о ней дальше и пойдёт речь.

Протоколы Megatec и Voltronic текстовые и довольно простые. Обмен данными ведётся на низкой скорости 2400 бит/сек, 8 бит данных, без контроля чётности по принципу «запрос-ответ». Запросы представляют собой текстовые строки длиной от одного до трёх символов, оканчивающихся байтом перевода строки (код 0x0D). Ответы приходят также в текстовом виде с завершающим символом 0x0D. Значения в ответах разделяются пробелами. Числа могут передаваться либо с незначащими нулями в начале, либо с дополнительными пробелами.

В зависимости от конкретного ИБП таких команд может быть разное количество, но основную информацию можно получить при помощи четырёх из них. Рассмотрим их подробнее.

Q1 – запрос текущего состояния
Ответ ИБП:
(MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.T b7b6b5b4b3b2b1b0
( – начальный символ.
MMM.M – входное напряжение, В.
NNN.N – напряжение, при котором последний раз был осуществлён переход на работу от батареи, В.
PPP.P – выходное напряжение, В.
QQQ – потребляемая мощность, %.
RR.R – частота сети, Гц.
SS.S – напряжение на батарее, В. Оно может передаваться в двух форматах: SS.S – для линейно-интерактивных ИБП или S.SS – для онлайн-ИБП (указывается напряжение на одном элементе).
TT.T – температура ИБП, °C.
b7...b0 – статусные биты, которые могут принимать значение 0 или 1.
b7 – 1 : работа от АКБ, 0 : работа от сети.
b6 – 1 : низкий уровень заряда АКБ, 0 : АКБ в норме.
b5 – 1 : байпас включён, 0 : байпас выключен (только для онлайн-ИБП).
b4 – 1 : авария ИБП, 0 : ИБП в норме.
b3 – 1 : линейно-интерактивный ИБП, 0 : онлайн-ИБП.
b2 – 1 : запущен тест ИБП.
b1 – 1 : ИБП выключен, 0 : ИБП включён.
b0 – 1 : звуковой сигнал включён, 0 : выключен.

I – запрос информации об ИБП
Ответ ИБП:
#CompanyName Model Version
# – начальный символ.
CompanyName – производитель ИБП.
Model – название модели.
Version – версия ИБП.

F – запрос информации о номинальных параметрах ИБП
Ответ ИБП:
#MMM.M QQQ SS.SS RR.R
# – начальный символ.
MMM.M – номинальное выходное напряжение, В.
QQQ – номинальный выходной ток, А.
SS.SS – номинальное напряжение АКБ, В (может быть в форматах SS.SS или SSS.S).
RR.R – номинальная частота выходного напряжения, Гц.

QBV – запрос информации об АКБ
Ответ ИБП:
(RRR.R NN MM CCC TTT
( – начальный символ.
RRR.R – номинальное напряжение АКБ, В.
NN – количество батарей в АКБ, шт.
MM – количество параллельных групп батарей, шт.
CCC – ёмкость АКБ, %.
TTT – оставшееся время работы от АКБ, мин.

Помимо команд, которые считывают какие-либо параметры ИБП, есть ещё управляющие команды. Часто используются такие:
T – запуск теста АКБ на 10 сек.
TL – запуск теста АКБ до полного разряда.
T<n> – запуск теста АКБ на заданное количество минут.
CT – остановка теста АКБ.
Q – включение/отключение звукового сигнала ИБП.

На первый взгляд вышеописанные команды очень простые, но дьявол, как обычно, кроется в мелочах. Например, некоторые ИБП вообще не выдают ответы на команды I и QBV. Примером может служить ряд моделей от Ippon.

Также замечено, что различные ИБП выполняют команду Q (управление звуковым сигналом) за совершенно разное время. То есть от момента выдачи команды Q и до момента смены бита b0 в ответе на команду Q1 может пройти до 30 сек!!! А так как включение и выключение осуществляется одной командой, то при автоматизированном управлении может начаться «колебательный» процесс. Например, контроллеру через Web-интерфейс задаётся выключенное состояние звукового сигнала. Он анализирует текущее состояние ИБП (по флагу b0), и если оно отличается от нужного, то подаёт команду Q. При следующем запросе Q1 контроллер опять проверяет флаг b0 и видит, что он не поменялся. В результате он опять подаёт команду Q. Но ИБП всё это время на самом деле что-то там у себя внутри «обдумывал», поэтому не сразу среагировал на первую Q, а тут уже пришла и вторая. В результате звуковой сигнал может остаться включённым. И, более того, в некоторых ИБП при смене статуса звукового сигнала осуществляется короткий «бип». А из-за такого «колебательного» процесса эти «бипы» могут издаваться много раз, пока наконец контроллер и ИБП не «синхронизируются».

Мы решили эту проблему просто – смену состояния звукового сигнала проводим только раз в минуту. За это время у ИБП внутри уже всё «устаканится».

Ещё один интересный момент заключается в расчёте оставшейся ёмкости АКБ. Считается она по упрощённой формуле:

BatCap =  \frac{U - U_{min}}{U_{max} - U_{min}}\times100\%

Здесь:

U – текущее напряжение АКБ.
Umin– минимально допустимое напряжение на АКБ (обычно около 10В).
Umax– напряжение заряженной АКБ (обычно 13,8...14,2В).

Этого обычно достаточно для оценки оставшегося заряда.

Протокол Voltronic на множестве указанных выше команд отличается только одной из них – вместо кода Q1 используется QS. При этом форматы ответов совпадают. В наших устройствах реализовано автоматическое определение протокола обмена как раз на основе данного отличия. Контроллер при включении пробует посылать по очереди команды Q1 и QS. На какую приходит ответ, тот протокол дальше и используется. Если в течение определённого тайм-аута на команду перестают приходить ответы (был подключён другой ИБП «на горячую»), то определение протокола автоматически запускается заново.

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

Она представляет из себя экран с настройками и выбором COM-порта, через который будет осуществляться обмен. Поддерживаются все указанные выше команды, в том числе и для запуска тестов:

Работа с программой нее вызовет затруднений. Менять любые параметры можно прямо в процессе работы, и тут же видеть результат:

Для оценки работы программы в «динамике» я записал небольшое видео:

Саму программу эмулятора можно скачать здесь.