В последнее время протокол DLMS/COSEM стал активно применяться в приборах учета (счетчики электрической энергии, тепла, воды, газа) отечественного производства. Почти у каждой компании, специализирующейся на выпуске микроконтроллеров, имеется, сертифицированный стек DLMS/COSEM, используя который можно сократить стоимость и время разработки прибора учета, поддерживающий данный протокол. В этой статье речь пойдет о стеке DLMS/COSEM для микроконтроллеров семейства MSP430 компании Texas Instruments.
Стек DLMS/COSEM от компании TI имеет следующие особенности:
- Поддерживаются все интерфейсные классы COSEM.
- Поддерживаются три уровня ассоциации: открытый доступ (no security), низкий уровень секретности (low security) и высокий уровень секретности (high security). Доступ к прибору учета в режиме высокого уровня секретности осуществляется с применением 4-стадийной аутентификацией, основанной на алгоритме AES128.
- Поддерживается только LN (long name) адресация.
- Поддерживается одна, двух и четырех байтовая адресация.
- Поддерживаются сервисы GET, SET, GET WITH BLOCK, SET WITH BLOCK, ACTION, а также селективный доступ для объектов класса Profile Generic.
- Требуемый размер памяти для хранения стека – 24 кБ.
- Требуемый размер оперативной памяти – 1,8кБ.
Для того чтобы «пощупать» стек нам понадобятся:
- Среда разработки IAR Embedded Workbench for MSP430;
- DLMS/COSEM клиент, возьмем бесплатный с открытым исходным кодом DLMSDirector от компании Gurux;
- Оценочная плата EVM430-F6779;
- Отладчик/программатор MSP-FET430UIF.
Загрузка и распаковка
Стек DLMS/COSEM доступен по адресу (http://www.ti.com/tool/dlmsobj-eval), для его загрузки необходимо иметь учетную запись TI. Сам стек упакован в дистрибутив под названием DLMS-4.0.6-windows-installer. После его установки, в папке установки будет лежать zip-папка «DLMS_Object» в которой находятся файлы стека.
Библиотека состоит из следующих файлов:
- iec62056_demo.c: В этом файле инициализируется вся периферия микроконтроллера и конечный автомат HDLC;
- uart_comms.c: Файл конфигурации для модуля UART;
- iec62056_link.r43: В этом файле реализованы HDLC и MAC уровни;
- server_msgs.r43: В этом файле реализован прикладной уровень COSEM;
- config.c: Основной конфигурационный файл. В этом файле можно удалять или добавлять параметры для списка объектов (object list);
- app_server_msgs.c: В этом файле пишутся функции для извлечения данных из памяти и предоставления их библиотеке DLMS;
- config.h: Макроопределения и прототипы функций для файла config.c;
- cosem.h: Определения всех констант, используемых в прикладном уровне COSEM;
- iec_62056_link.h: Макроопределения и прототипы функций для HDLC уровня;
Все эти файлы уже собраны в проект под название dlms_obj.eww.
Запуск проекта
В этой части мы запустим демонстрационный проект и посмотрим, как представляются объекты COSEM. Для этого, открываем файл dlms_obj.eww в IAR for MSP430 и выбираем требуемый микроконтроллер, в нашем случае это MSP430F67791.
Собираем проект и программируем контроллер. Открываем программу DLMSDirector и добавляем новое устройство со следующими параметрами:
Нажимаем кнопку «ОК». Затем в дереве «Devices» выбираем наше устройство, нажимаем кнопку «Connect» и … получаем вот такую ошибку:
Исправляется она легко, открываем файл uart_comms.c проекта dlms_obj.eww и в строке 132 видим, что при конфигурировании UART была допущена «опечатка»:
Правильная строка должна иметь вид:
P3SEL0 |=(BIT0|BIT1);
После исправления, связь с прибором учета успешно устанавливается, в результате чего становится доступной кнопка «Read», а в статусной строке мы видим «Ready»:
Для загрузки информации с прибора учета нажимаем кнопку «Read». Процесс этот не быстрый, поэтому придется чуть-чуть подождать. В результате получаем дерево из объектов COSEM:
В данном стеке, в открытом доступе, по умолчанию, отображается пять объектов:
- 0.0.1.0.0.255 – отображает текущее время в приборе учета;
- 0.0.40.0.0.255 – отображает информацию о текущей ассоциации;
- 0.0.40.0.1.255 – отображает информации об ассоциации №1;
- 0.0.41.0.0.255 – отображает так называемое SAP назначение;
- 0.0.42.0.0.255 – отображает логическое имя устройства, по сути – серийный номер счетчика.
Например, информация о текущем времени в приборе учета представляется следующим образом:
Мы можем не только узнать время, но и получить информацию о часовом поясе, об источнике тактирования, о дате и времени перехода на летнее время и обратно, а в режиме высокой секретности появляется возможность задавать эти параметры.
Для доступа к прибору учета в режиме низкой секретности необходимо использовать следующие настройки (Пароль по умолчанию — 00000000):
В этом режиме доступно гораздо больше объектов COSEM:
Добавление нового объекта COSEM
Для добавления нового объекта открываем файл config.c проекта dlms_obj.eww, находим структуру:
const struct object_desc_s object_list[]
и добавляем в нее следующую строку:
{ASSOC_PC_MR_US, CLASS_ID_DATA, 0, { 0, 0, 96, 1, 0, 255}, 2, Obj_Meter_Sr_No, 0, NULL}
Где:
- ASSOC_PC_MR_US – определяет видимость объекта, в данном случае объект будет виден и в режиме открытого доступа, и в режиме доступа с низким уровнем секретности и в режиме доступа с высоким уровнем секретности;
- CLASS_ID_DATA – идентификатор интерфейсного класса, в данном случае объект относится к классу Data;
- 0 – версия класса (0);
- { 0, 0, 96, 1, 0, 255} – логическое имя объекта;
- 2 – количество атрибутов (2);
- Obj_Meter_Sr_No – указатель на список атрибутов;
- 0 – количество методов (0);
- NULL – указатель на список методов (методы отсутствуют).
Затем создаем структуру со списком атрибутов в том же файле:
static const struct attribute_desc_s Obj_Meter_Sr_No[] =
{
{1, ACCESS_PCR__MRR__USR_, TAG_OCTET_STRING, (void *) object_list[11].instance_id, NULL},
{2, ACCESS_PCR__MRR__USR_, TAG_OCTET_STRING, (void *) Meter_Sr_No, NULL},
};
Где:
- Первый параметр – номер атрибута;
- Второй параметр – права доступа;
- Третий параметр – тип данных атрибута;
- Четвертый параметр – указатель на данные;
- Пятый параметр – функция обратного вызова. Это функция вызывается, когда данные необходимо взять, например, из EEPROM памяти. Более подробную информацию можно получить из руководства пользователя.
В нашем случае объект не имеет функции обратного вызова, а в качестве типа данных используется строка байтов.
Meter_Sr_No указывает на следующую структуру:
const uint8_t Meter_Sr_No[] =
{
8, 'A','B','C','D','1','2','3','4'
};
Вот и все процедуры по созданию нового объекта. Результат:
Заключение
В данной статье не приводится полного описания библиотеки DLMS/COSEM для микроконтроллеров семейства MSP430, так как без освещения основных моментов самого протокола это сделать трудно. Однако тем, кому такое описания необходимо могут ознакомиться с ним загрузив его с сайта компании TI (http://www.ti.com/tool/dlmsobj-eval).
Автор: AlexFTF