[Из песочницы] Знакомство со стеком DLMS/COSEM для микроконтроллеров семейства MSP430 компании Texas Instruments

ae6fec3123e04662887d470f7f15ccf3.png

В последнее время протокол 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кБ.


Для того чтобы «пощупать» стек нам понадобятся:

  1. Среда разработки IAR Embedded Workbench for MSP430;
  2. DLMS/COSEM клиент, возьмем бесплатный с открытым исходным кодом DLMSDirector от компании Gurux;
  3. Оценочная плата EVM430-F6779;
  4. Отладчик/программатор 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.

137e81292b5143d4a12f6c862a6bf868.png

Собираем проект и программируем контроллер. Открываем программу DLMSDirector и добавляем новое устройство со следующими параметрами:

024b4c5237d04e4fb7b50a4fc32a3d3e.png

Нажимаем кнопку «ОК». Затем в дереве «Devices» выбираем наше устройство, нажимаем кнопку «Connect» и … получаем вот такую ошибку:

e8f2de24d87641cca2243819d5ef2933.png

Исправляется она легко, открываем файл uart_comms.c проекта dlms_obj.eww и в строке 132 видим, что при конфигурировании UART была допущена «опечатка»:

3eae51c485314dd4baf880ec69471374.png

Правильная строка должна иметь вид:

P3SEL0 |=(BIT0|BIT1);


После исправления, связь с прибором учета успешно устанавливается, в результате чего становится доступной кнопка «Read», а в статусной строке мы видим «Ready»:

565c30812071457382ff89e80a7eab8e.png

Для загрузки информации с прибора учета нажимаем кнопку «Read». Процесс этот не быстрый, поэтому придется чуть-чуть подождать. В результате получаем дерево из объектов COSEM:

2e4aba8da9824f40bc91a17b6e366083.png

В данном стеке, в открытом доступе, по умолчанию, отображается пять объектов:

  • 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 — отображает логическое имя устройства, по сути — серийный номер счетчика.


Например, информация о текущем времени в приборе учета представляется следующим образом:

eaee4e2bda644cbb9208425f66136f7a.png

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

Для доступа к прибору учета в режиме низкой секретности необходимо использовать следующие настройки (Пароль по умолчанию — 00000000):

57a9b0895fc14cccb1dd7ba201e01e32.png

В этом режиме доступно гораздо больше объектов COSEM:

48f917742b2e4264a4399c96e49a6520.png

Добавление нового объекта 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'
};


Вот и все процедуры по созданию нового объекта. Результат:

5c52755f016a4b8eb5bb11f54afaa097.png

Заключение


В данной статье не приводится полного описания библиотеки DLMS/COSEM для микроконтроллеров семейства MSP430, так как без освещения основных моментов самого протокола это сделать трудно. Однако тем, кому такое описания необходимо могут ознакомиться с ним загрузив его с сайта компании TI (http://www.ti.com/tool/dlmsobj-eval).

© Habrahabr.ru