Описание файловой структуры программы микроконтроллерного устройства, необходимой для формирования дерева конфигурации с поддержкой MCT-протокола.

Описание файловой структуры программы микроконтроллерного устройства, необходимой для формирования дерева конфигурации с поддержкой MCT-протокола.

Файловая структура программы.

Проект программы для микроконтроллерного устройства на примере  регистратора температуры и влажности, взаимодействующего с MCT-протоколом, содержит основные файлы поддержки протокола:

  • conf_init.h, в котором описана структура дерева конфигурации;
  • mk_conf_tree.h, mk_conf_tree.c, в которых заданы основные функции обработки пакетов дерева конфигурации;
  • system.h, system.c, в которых задаются функции описывающие узел «System» дерева конфигурации;
  • control.h, control.c, в которых задаются функции описывающие узлы «Control» и «Parameters» дерева конфигурации (ДК);
  • ds18b20.h, ds18b20.c, в которых также задаются функции описывающие узел «Temper + RH» дерева конфигурации.

Файлы описания узлов (типа System, Control и т.д.) создаются разработчиком программы, и могут содержать желаемую конфигурацию описания параметров, которая необходима в каждом конкретном случае. Количество узлов (максимум 255) в ДК ограничивается удобством визуального восприятия. Также нужно учитывать, что ДК может быть многоуровневым (иметь родительские и дочерние узлы), опрос (передача пакетов по каналу связи) большого количества одновременно открытых узлов будет сильно замедлен. Для примера (Регистратора температуры и влажности) ниже приведен скриншот ДК устройства.

Описание файла conf_init.h.

Заголовочный файл conf_init.h содержит описание структур, из которых формируется ДК. Для примера мы возьмем уже упомянутый проект устройства регистратора температуры и влажности. В файле conf_init.h этого проекта имеется 5 узлов описанных в структуре:

const char *namesUnit[] =
{
«DS18B20 + SHTC3»,
«System»,
«Control»,
«Temper + RH»,
«Parameters»,
};

Узел «DS18B20 + SHTC3» является родительским и не содержит параметров, но содержит все остальные узлы. По желанию разработчика этот узел тоже может содержать параметры.

enum UNIT_NUM
{
MAIN_UNIT,
SYSTEM_UNIT,
CONTROL_UNIT,
DS18B20_UNIT,
PARAM_UNIT,
N_UNIT,
// Number of units (nodes)
};

const u8 unitProp[][2] =
{
{MAIN_UNIT, 0},
{MAIN_UNIT, SYSTEM_VAR_NUM},
{MAIN_UNIT, CONTROL_VAR_NUM},
{MAIN_UNIT, DS18B20_VAR_NUM},
{MAIN_UNIT, PARAM_VAR_NUM},
};

«UNIT_NUM» содержит ID всех узлов ДК, которые отображаются в колонке «ID» ДК (см. скриншот выше). Структура «unitProp[][2]» ссылается на «UNIT_NUM» содержит иерархию родства ДК, отсюда видно, что «MAIN_UNIT» (или «DS18B20 + SHTC3») является родителем для всех остальных узлов.

И наконец, структуры функций «Func_prop[]», «Func_get[]» и «Func_set[]» содержат ссылки на функции, в которых описаны параметры в наших узлах, «0» в начале структуры означает, что у узла «DS18B20 + SHTC3» нет параметров.

Как не сложно узнать, функции «System_prop», «System_get» и «System_set» находятся в файле system.c и так далее. Назначение этих функций описаны далее.

Функции описания параметров на примере System_prop, System_get и System_set из файла system.c.

Функции «System_prop», «System_get» и «System_set» являются ключевыми в описании параметров и их функционала, которые содержатся в узле «System» ДК. Структура этих функций унифицирована и используется для описания параметров из любого узла ДК.

В заголовочном файле system.h в структуре «enum SYSTEM_VAR» содержатся именованные ID параметров узла , которые затем отображаются в колонке «ID» ДК (см. скриншот выше).

enum SYSTEM_VAR
{
SYSTEM_VAR_SERIAL,
// серийный номер
SYSTEM_VAR_WORKTIME,
// время работы
SYSTEM_VAR_RESET,
// перегрузка системы
SYSTEM_VAR_SETUP_SAVE,
// соxранить настройки
SYSTEM_VAR_NUM
// количество переменных
};

Функция «System_prop» из файла system.с содержит описание имени, тип данных и количество байт в «слове» параметра, которые также отображаются в соответствующих колонках ДК. Например, для ID=0 (SYSTEM_VAR_SERIAL) имя будет «Серийный номер», тип данных «UINT», а количество байт, передаваемых в ДК, — « (см. скриншот выше).

Значение типа данных «UINT» представлено в таблице здесь. Таким образом, в функции «System_prop» даны свойства параметров узла, которые передаются при загрузке ДК по «команде 3» в MCT-протоколе.

Внутри функции «System_get» задаются ссылки на регистры, из которых берутся значения параметров. Например, для ID=0 (SYSTEM_VAR_SERIAL) «Серийный номер», значение находится в регистре «Setup.SerialId», описание этого регистра находится в файлах setup.h и setup.с. Функция «System_get» будет действовать при использовании «команды 4» в MCT-протоколе.

Функция «System_set» задает возможность изменения значения регистра. Например: для ID=0 (SYSTEM_VAR_SERIAL) «Серийный номер», значение «Setup.SerialId» можно изменить из загруженного на ПК дерева конфигурации. Кроме того в «System_set» можно задавать выполнение других функций (действий) и т.д. Например: «SYSTEM_VAR_RESET» выполняется «Перегрузка системы«, а «SYSTEM_VAR_SETUP_SAVE» выполняет «Сохранить настройки«.

Действия выполняются в  функции «System_set» только для тех параметров, которые имеют атрибут «WR» (запись и чтение см. таблицу), который отображается в колонке «Atrib«, смотри скриншот выше. Если параметр имеет атрибут «RO» (только чтение см. таблицу), то функция «System_set» для этого параметра игнорируется, например, для параметра SYSTEM_VAR_WORKTIME», который имеет атрибут «RO». Функция «System_set» будет действовать при использовании «команды 5» из MCT-протокола. Все атрибуты и типы данных определены в заголовочном файле mk_conf_tree.h проекта. Атрибут «WR» в файле явно не определен, так как он имеет нулевое значение в старшем разряде байта, записанного в «hex» формате.

#define WR 0x00 // 0 – Запись и чтение

Описание файла mk_conf_tree.c.

Файл mk_conf_tree.c содержит функции «MKBUS_rx» и «MKBUS_send» обработки пакета MCT-запроса на обработку от MCT-конфигуратора или любого другого устройства, которое отправило корректный запрос по каналу связи.

Функции «MKBUS_rx» и «MKBUS_send»  встраиваются в потоковую функцию приема данных канала связи. В нашем примере для устройстварегистратора температуры и влажности это функция «USART2_Proc()», которая находится в файле «usart.c».

На вход функции «MKBUS_rx» в потоке поступает один байт, который сохраняется в кольцевом буфере и участвует в дальнейшей обработке. После того, как полный пакет из кольцевого буфера корректно идентифицирован, совпали: заголовок, серийный номер и контрольная сумма, происходит его обработка.

Обработка пакета осуществляется в функциях для каждой конкретной команды:

  • MKBUS_msg_cmd1;
  • MKBUS_msg_cmd2;
  • MKBUS_msg_cmd3;
  • MKBUS_msg_cmd4;
  • MKBUS_msg_cmd5.

 Все команды описаны MCT-протоколе. Функции обработки команд осуществляют взаимодействие с функциями обработки для каждого конкретного узла (например:  узла «System»), указатели которых содержатся в файле conf_init.h.

Функция «MKBUS_send»  служит для отправки сформированного ответного пакета на устройство, которое отправило запрос. В нашем примере отправка ответного пакета происходит с задержкой (10 мсек.), так как передача данных идет через медленный радио модуль  JDY-40, имеющий паузу между передачей и приемом.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Back To Top