Update CCS12 peripheral firmware and documentation
This commit is contained in:
@@ -1,3 +1,12 @@
|
||||
/**
|
||||
* @file message.c
|
||||
* @brief Параметры устройства и прикладные сообщения протокола Modbus.
|
||||
*
|
||||
* Инициализирует значения по умолчанию, загружает и сохраняет параметры в
|
||||
* EEPROM, принимает команды функций 3/6 и формирует ответы функции 4.
|
||||
* Индексы param/Modbus согласованы с внешней картой регистров; менять порядок,
|
||||
* ANSWER_LEN или представление слов можно только вместе с ведущей системой.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "package.h"
|
||||
#include "RS485.h"
|
||||
@@ -18,9 +27,17 @@
|
||||
|
||||
#include "caliber.h"
|
||||
|
||||
/** @brief Рабочий образ регистров Modbus, передаваемый внешнему мастеру. */
|
||||
int modbus[ANSWER_LEN+1];
|
||||
/** @brief Сохраняемые параметры, индексно согласованные с картой регистров. */
|
||||
unsigned int param[ANSWER_LEN+1];
|
||||
|
||||
/**
|
||||
* @brief Создаёт полный набор безопасных параметров для текущего варианта платы.
|
||||
* @post Modbus/param, режимы, пороги, яркость и калибровки имеют штатные значения.
|
||||
* @details Начальная очистка предотвращает сохранение мусора в зарезервированных
|
||||
* регистрах; далее значения выбираются по Desk и compile-time конфигурации.
|
||||
*/
|
||||
void Default_params()
|
||||
{
|
||||
unsigned int i,def;
|
||||
@@ -46,19 +63,19 @@ void Default_params()
|
||||
|
||||
if(Desk == dsk_EPLT)
|
||||
{
|
||||
Cancount[m_FAST] = 2; // пауза между посылками CAN
|
||||
Cancount[m_FAST] = 2; // пауза между посылками CAN
|
||||
|
||||
for(i=0;i<6;i++) Bright[i] = bright[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
Cancount[m_FAST] = 10; // пауза между посылками CAN
|
||||
Cancount[m_FAST] = 10; // пауза между посылками CAN
|
||||
Brightness = 8;
|
||||
}
|
||||
|
||||
Cancount[m_SLOW] = 101; // пауза между посылками CAN
|
||||
Cancount[m_SLOW] = 101; // пауза между посылками CAN
|
||||
|
||||
if(Owen) Owncount = 20; // пауза между опросами OWEN
|
||||
if(Owen) Owncount = 20; // пауза между опросами OWEN
|
||||
|
||||
if(Kalibro)
|
||||
{
|
||||
@@ -122,9 +139,9 @@ void Default_params()
|
||||
DAC_20 = Caliber[6];
|
||||
DAC_04 = Caliber[7];
|
||||
|
||||
/* Не врема!
|
||||
DAC_go = 6; // начало зарада
|
||||
DAC_stop= 15; // конец зарада
|
||||
/* Не врема!
|
||||
DAC_go = 6; // начало зарада
|
||||
DAC_stop= 15; // конец зарада
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -135,6 +152,11 @@ void Default_params()
|
||||
Init_sensors_more();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Загружает параметрический блок из EEPROM и проверяет его целостность.
|
||||
* @details При несовпадении сигнатуры/CRC вызывается Default_params(); после
|
||||
* успешной загрузки значения переносятся в рабочие глобальные настройки.
|
||||
*/
|
||||
void Load_params()
|
||||
{
|
||||
unsigned int i,crc;
|
||||
@@ -159,6 +181,11 @@ void Load_params()
|
||||
Caliber_time = 0xFFFF;
|
||||
} } }
|
||||
|
||||
/**
|
||||
* @brief Формирует параметрический блок с CRC и записывает его в EEPROM.
|
||||
* @warning Запись следует запускать только при свободном драйвере EEPROM;
|
||||
* питание должно сохраняться до физического завершения транзакции.
|
||||
*/
|
||||
void Save_params()
|
||||
{
|
||||
unsigned int i,dif=0;
|
||||
@@ -177,24 +204,30 @@ void Save_params()
|
||||
|
||||
/***************************************************************/
|
||||
/***************************************************************/
|
||||
/* Передача данных по протоколу ModBus - команда 3
|
||||
Чтение ачеек данных */
|
||||
/* Передача данных по протоколу ModBus - команда 3
|
||||
Чтение ачеек данных */
|
||||
/***************************************************************/
|
||||
/***************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Обрабатывает запрос Modbus чтения диапазона регистров.
|
||||
* @param rs_arr Порт с проверенным входным кадром и буфером ответа.
|
||||
* @details Проверяет начальный адрес и длину, копирует слова из modbus и
|
||||
* формирует CRC непосредственно перед отправкой.
|
||||
*/
|
||||
void ReceiveCommandModbus3(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned int crc, Address_MB, Length_MB, i;
|
||||
|
||||
// получили начальный адрес чтениа
|
||||
// получили начальный адрес чтениа
|
||||
Address_MB =/*(rs_arr->RS_Header[2] << 8) |*/ rs_arr->RS_Header[3];
|
||||
|
||||
// получили количество слов данных
|
||||
// получили количество слов данных
|
||||
Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Отсылка
|
||||
/* Посчитали контрольную сумму перед самой посылкой */
|
||||
// Отсылка
|
||||
/* Посчитали контрольную сумму перед самой посылкой */
|
||||
|
||||
rs_arr->buffer[0] = CNTRL_ADDR;
|
||||
rs_arr->buffer[1] = CMD_MODBUS_3;
|
||||
@@ -223,22 +256,27 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Применяет команду записи одного параметра Modbus.
|
||||
* @details После проверки адреса обновляет разрешённое значение, выставляет
|
||||
* события перенастройки/сохранения и возвращает эхо принятой команды.
|
||||
*/
|
||||
void ReceiveCommandModbus6(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned int Address_MB, Data_MB, i;
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Отсылка
|
||||
/* Отправлаем назад то же самое */
|
||||
// Отсылка
|
||||
/* Отправлаем назад то же самое */
|
||||
|
||||
for (i=0;i<8;i++)
|
||||
rs_arr->buffer[i] = rs_arr->RS_Header[i];
|
||||
|
||||
|
||||
// получили начальный адрес записи
|
||||
// получили начальный адрес записи
|
||||
Address_MB = (/*(rs_arr->RS_Header[2] << 8) | */rs_arr->RS_Header[3]);
|
||||
|
||||
// получили слово данных
|
||||
// получили слово данных
|
||||
Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
|
||||
|
||||
Modbus[Address_MB].all = Data_MB;
|
||||
@@ -247,12 +285,17 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
|
||||
RS_Send(rs_arr, rs_arr->buffer, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Формирует периодический запрос/ответ функции 4 для внешнего устройства.
|
||||
* @details Адрес, полезная нагрузка и CRC помещаются в буфер выбранного RS-порта,
|
||||
* после чего передача запускается неблокирующим RS_Send().
|
||||
*/
|
||||
void SendCommandModbus4(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned int crc;
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Отсылка
|
||||
// Отсылка
|
||||
|
||||
rs_arr->buffer[0] = 16;
|
||||
rs_arr->buffer[1] = 4;
|
||||
@@ -275,12 +318,17 @@ void SendCommandModbus4(RS_DATA *rs_arr)
|
||||
RS_Send(rs_arr, rs_arr->buffer, 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Разбирает ответ внешнего измерителя на функцию Modbus 4.
|
||||
* @details Проверяет формат и переносит температуры/диагностики в ext_temp и
|
||||
* ext_diag; некорректный ответ не должен заменять последний пригодный снимок.
|
||||
*/
|
||||
void ReceiveAnswerModbus4(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Отсылка
|
||||
// Отсылка
|
||||
|
||||
for (i=0;i<8;i++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user