Чтение, модификация и обнуление параметров
Основное назначение протокола обмена это чтение, модификация и обнуление параметров счетчика. Перечень параметров приведен в таблице «Кодировка параметров» приложения А. Все параметры предполагают возможность чтения за исключением параметра №37 «Пароль», который можно только изменить. Знаком «+» в полях «Модификация» и «Обнуление» помечены те параметры, которые можно изменять или обнулять.
В счетчике предусмотрена защита от несанкционированного изменения параметров счетчика. Имеется два уровня доступа. Основной уровень предоставляет полный доступ ко всем модифицируемым параметрам, а вспомогательный позволяет изменить только сетевой адрес, конфигурацию порта связи и маску отображаемых параметров. Каждый из уровней доступа защищен своим паролем. Поэтому перед выполнением команд, которые могут изменить какой-либо параметр необходимо подтвердить свое право на выполнение таких действий. Получить тот или другой уровень доступа можно с помощью команды «Отключить защиту». Аргументом команды «Отключить защиту» является 8-ми байтный пароль. Если после отключения защиты счетчик не принял ни одной команды изменяющей параметры в течение 240 секунд, то защита будет восстановлена автоматически. Защиту также можно восстановить с помощью команды «Восстановить защиту».
Предприятием-изготовителем счетчики поставляются с основным и вспомогательным паролем равным «00000000». Каждый символ пароля это ASCII-код символа «0» (шестнадцатеричный код – 0х30). Пользователь счетчика может изменить пароли с помощью параметра №37.
Формат пакета команды для чтения параметра приведен на рисунке 4.4. Поле «функция» должно содержать код 3 или 4. Назначение полей «адрес» и «CRC» были рассмотрены выше.
Рисунок 4.4 – Структура пакета команды для чтения параметров
Поле «код параметра» уточняет запрашиваемый параметр. Соответствие кода и названия параметра приведено в приложении А
Поле «смещение» уточняет, к какому временному интервалу относится запрашиваемый параметр. Модуль поля указывает, на сколько единиц отстоит запрашиваемый временной интервал от текущей даты и времени, а знак указывает направление. Например, если требуется получить приращение энергии за предыдущий месяц, то поле «смещение» должно содержать число -1, если за текущий то 0. Для некоторых параметров это поле может иметь другое назначение. Более подробно о кодировании этого поля изложено ниже. Допустимые значения поля «смещение» для каждого параметра приведены в приложении А.
Поле «тариф» должно содержать код требуемого тарифа. Число 0 зарезервировано для бестарифных значений, 1…4 кодирует один из 4 тарифов. Для некоторых параметров это поле может иметь другое назначение. Допустимые значения поля «тариф» для каждого параметра приведены в приложении А.
Поле «уточнение» позволяет конкретизировать запрашиваемое значение. Код 0 зарезервирован для команды чтения всех значений параметра. Например, при запросе энергии или мощности с помощью этого поля, можно указать какое именно направление требуется считать. Если требуется только активная потребленная энергия, то поле «уточнение» должно быть 1.
Если поля «смещение», «тариф» или «уточнение» для запрашиваемого параметра не имеет смысла (например, необходимо считать версию программы), то в этом случае значения этих полей должны быть 0;
Как показано на рисунках выше, для чтения параметров используются функции №3 и №4. Обе эти функции имеют одинаковый формат запроса и работают с одним и тем же набором параметров. Запрос с функцией №4 включен в протокол обмена для представления одного и того же параметра в двух вариантах. Например, при считывании параметра №1 «Суммарная накопленная энергия» запросом с функцией №3, в ответном сообщении будет возвращена энергия в двоичном представлении без учета коэффициентов трансформации по току и напряжению, а тот же параметр, считанный запросом с функцией №4, будет представлен числом типа «float» в том же формате, в каком он отображается на индикаторе электросчетчика. В настоящее время альтернативное представление значений реализовано только для некоторых параметров (более подробно смотри ниже по тексту). Для всех остальных параметров, запросы с функциями №3 и №4, абсолютно равнозначны, но для обеспечения совместимости с будущими версиями программного обеспечения счетчика настоятельно рекомендуется для чтения таких параметров использовать запрос с функцией №3.
В ответ на запрос счетчик возвратит пакет, вид которого представлен на рисунке 4.5.
Рисунок 4.5 – Структура пакета, возвращаемого счётчиком
Значение полей «функция» и «код параметра» повторяют значение соответствующего поля запроса. В случае успешного выполнения запроса поле «результат» будет содержать 0, а поле «данные» – запрашиваемый параметр (параметры). Наличие кода отличного от 0 в поле «результат» является признаком невозможности выполнения запроса. В этом случае поле «данные» будет отсутствовать, а в поле «функция» будет установлен старший бит в 1.
Возможные значения кода «результат» приведены в приложении Б. Содержание поля «данные» зависит от типа считываемого параметра и подробно рассматривается ниже.
Для модификации параметров используется пакет с функцией №16. (Здесь и далее если не оговорено, то имеется в виду десятичное представление числа). Формат пакета приведен на рисунке 4.6.
Рисунок 4.6 – Формат пакета данных для модификации параметров
Все поля рассматривались ранее. Поле «уточнение» позволяет более полно конкретизировать модифицируемый параметр. Наполнение поля «данные» зависит от модифицируемого параметра. Формат ответного сообщения представлен на рисунке 4.7.
Рисунок 4.7 – Формат ответного пакета
Как следует из рисунка 4.7, формат ответа совпадает с ответом на команду чтение параметра, представленной на рисунке 4.4, за исключением того, что поле «данные» отсутствует.
Обнулить параметры можно командой с кодом функции №30. Формат команды представлен на рисунке 4.8.
Рисунок 4.8 – Формат пакета команды обнуления
Здесь, как и обычно, поле «код параметра» содержит код обнуляемого параметра. Формат ответа будет таким же, как и ответ на команду модификации, представленной на рисунке 4.7.
Циклический избыточный код (CRC)
Контроль циклическим кодом применяется для повышения надежности передачи данных. Смысл контроля заключается в следующем. Запрос подвергается шифровке циклическим кодом. Полученный результат добавляется в конец запроса, и весь пакет отправляется подчиненному устройству. Подчиненное устройство выполняет те же действия над байтами запроса и сравнивает полученный результат с «CRC» принятого пакета, и в случае положительного результата выполняет требуемое действие. Затем оно формирует ответное сообщение, подвергает его той же процедуре шифровки, «прицепляет» полученный код в конец пакета и посылает его обратно главному устройству. Главное устройство выполняет ту же процедуру дешифровки, проверяя правильность принятого пакета. Вероятность обнаружения ошибки в одном разряде байта пакета равна 99,998%.
В качестве примера рассмотрим вычисление CRC в виде функции написанной на языке Java . Все возможные значения CRC помещены в два массива. Один массив содержит все возможные значения для старшего байта CRC, а второй – для младшего.
Текст функции шифровки циклическим кодом «CRC» приведён в приложении .
Функции в качестве параметров принимает указатель на сообщение, используемое для формирования «CRC» (msg) и размер сообщения в байтах (len), а возвращает 16-ти битное значение «CRC».