Увеличить период передачи кнопок пульта по CAN до 200 мс

This commit is contained in:
2026-10-16 11:26:45 +03:00
parent 4635f00a20
commit 22eb4ce243
2 changed files with 38 additions and 36 deletions
+36 -36
View File
@@ -1,8 +1,8 @@
/* Параметры и обработчики Modbus после проверки CRC. Массив modbus /* Параметры и обработчики Modbus после проверки CRC. Массив modbus
* содержит обычные адреса 0..127, область 0x1000 обслуживает логгер. * содержит обычные адреса 0..127, область 0x1000 обслуживает логгер.
* EEPROM хранит параметры, но не является источником START/STOP: * EEPROM хранит параметры, но не является источником START/STOP:
* при загрузке сохраняется последняя живая команда нагрузки. * при загрузке сохраняется последняя живая команда нагрузки.
* Функции вызываются из main; EEPROM блокирует этот контекст. * Функции вызываются из main; EEPROM блокирует этот контекст.
*/ */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "package.h" #include "package.h"
@@ -47,7 +47,7 @@ void Default_params()
for(i=0;i<ANSWER_LEN;i++) for(i=0;i<ANSWER_LEN;i++)
{ {
/* Команда нагрузки не является параметром по умолчанию. */ /* Команда нагрузки не является параметром по умолчанию. */
if (Desk != dsk_LOAD || i != 127) Modbus[i].all = 0; if (Desk != dsk_LOAD || i != 127) Modbus[i].all = 0;
} }
@@ -56,17 +56,17 @@ void Default_params()
if(Desk == dsk_EPLT) if(Desk == dsk_EPLT)
{ {
Cancount[m_FAST] = 2; // пауза между посылками CAN Cancount[m_FAST] = 10; // Задаёт для пульта быстрый CAN-пакет раз в 10 базовых интервалов CANPOWSE по 20 мс, то есть примерно 200 мс; это значение по умолчанию, которое могут заменить параметры EEPROM.
for(i=0;i<6;i++) Bright[i] = bright[i]; for(i=0;i<6;i++) Bright[i] = bright[i];
} }
else else
{ {
Cancount[m_FAST] = 10; // пауза между посылками CAN Cancount[m_FAST] = 10; // пауза между посылками CAN
Brightness = 8; Brightness = 8;
} }
Cancount[m_SLOW] = 101; // пауза между посылками CAN Cancount[m_SLOW] = 101; // пауза между посылками CAN
if(Kalibro) if(Kalibro)
{ {
@@ -126,9 +126,9 @@ void Default_params()
DAC_20 = Caliber[6]; DAC_20 = Caliber[6];
DAC_04 = Caliber[7]; DAC_04 = Caliber[7];
/* Не врема! /* Не врема!
DAC_go = 6; // начало зарада DAC_go = 6; // начало зарада
DAC_stop= 15; // конец зарада DAC_stop= 15; // конец зарада
*/ */
} }
@@ -139,9 +139,9 @@ void Default_params()
Init_sensors_more(); Init_sensors_more();
} }
/* CRC и Mode проверяются до применения EEPROM. Слово 127 /* CRC и Mode проверяются до применения EEPROM. Слово 127
* нагрузки не копируется даже временно: ISR не должен увидеть * нагрузки не копируется даже временно: ISR не должен увидеть
* старый START из EEPROM либо потерять текущую CAN-команду. * старый START из EEPROM либо потерять текущую CAN-команду.
*/ */
void Load_params() void Load_params()
{ {
@@ -153,7 +153,7 @@ void Load_params()
(crc !=0xFFFF) && (crc !=0xFFFF) &&
(Mode == param[126])) (Mode == param[126]))
{ {
/* Не восстанавливать START/STOP из EEPROM даже на один тик ISR. */ /* Не восстанавливать START/STOP из EEPROM даже на один тик ISR. */
for(i=0;i<ANSWER_LEN;i++) for(i=0;i<ANSWER_LEN;i++)
if (Desk != dsk_LOAD || i != 127) modbus[i] = param[i]; if (Desk != dsk_LOAD || i != 127) modbus[i] = param[i];
UMP_reset_parameter_commands(); UMP_reset_parameter_commands();
@@ -169,9 +169,9 @@ void Load_params()
Caliber_time = 0xFFFF; Caliber_time = 0xFFFF;
} } } } } }
/* ISR продолжает менять измерения во время сбора param. CRC /* ISR продолжает менять измерения во время сбора param. CRC
* относится к собранному массиву, а не атомарному снимку всей платы. * относится к собранному массиву, а не атомарному снимку всей платы.
* Не вызывать сохранение из критического пути дискретов. * Не вызывать сохранение из критического пути дискретов.
*/ */
void Save_params() void Save_params()
{ {
@@ -191,8 +191,8 @@ void Save_params()
/***************************************************************/ /***************************************************************/
/***************************************************************/ /***************************************************************/
/* Передача данных по протоколу ModBus - команда 3 /* Передача данных по протоколу ModBus - команда 3
Чтение ачеек данных */ Чтение ачеек данных */
/***************************************************************/ /***************************************************************/
/***************************************************************/ /***************************************************************/
@@ -212,10 +212,10 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
{ {
unsigned int crc, Address_MB, Length_MB, i, value, saved = 0; unsigned int crc, Address_MB, Length_MB, i, value, saved = 0;
// получили начальный адрес чтениа // получили начальный адрес чтениа
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; 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]; Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
if (!Length_MB || Length_MB > 125 || if (!Length_MB || Length_MB > 125 ||
!((Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB) || !((Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB) ||
@@ -228,15 +228,15 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
} }
///////////////////////////////////////////////// /////////////////////////////////////////////////
// Отсылка // Отсылка
/* Посчитали контрольную сумму перед самой посылкой */ /* Посчитали контрольную сумму перед самой посылкой */
rs_arr->buffer[0] = CNTRL_ADDR; rs_arr->buffer[0] = CNTRL_ADDR;
rs_arr->buffer[1] = CMD_MODBUS_3; rs_arr->buffer[1] = CMD_MODBUS_3;
rs_arr->buffer[2] = Length_MB*2; rs_arr->buffer[2] = Length_MB*2;
/* Защищаем целостность одного снимка/блока; передача UART идёт уже /* Защищаем целостность одного снимка/блока; передача UART идёт уже
* с разрешёнными прерываниями и не задерживает измерение/управление. */ * с разрешёнными прерываниями и не задерживает измерение/управление. */
if (Address_MB >= UMP_LOG_BASE) saved = __disable_interrupts(); if (Address_MB >= UMP_LOG_BASE) saved = __disable_interrupts();
for (i=0;i<Length_MB;i++) for (i=0;i<Length_MB;i++)
{ {
@@ -258,9 +258,9 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
rs_arr->buffer[Length_MB*2+8] = 0; rs_arr->buffer[Length_MB*2+8] = 0;
rs_arr->flag_TIMEOUT_to_Send=true; rs_arr->flag_TIMEOUT_to_Send=true;
/* Расширение логгера отвечает точным кадром Modbus без хвостовых /* Расширение логгера отвечает точным кадром Modbus без хвостовых
* нулей: они иначе попали бы в начало ответа следующего блока GUI. * нулей: они иначе попали бы в начало ответа следующего блока GUI.
* Исторический формат технологических регистров оставлен прежним. */ * Исторический формат технологических регистров оставлен прежним. */
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+(Address_MB >= UMP_LOG_BASE ? 5 : 8)); RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+(Address_MB >= UMP_LOG_BASE ? 5 : 8));
return; return;
@@ -271,17 +271,17 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
unsigned int Address_MB, Data_MB, i; unsigned int Address_MB, Data_MB, i;
///////////////////////////////////////////////// /////////////////////////////////////////////////
// Отсылка // Отсылка
/* Отправлаем назад то же самое */ /* Отправлаем назад то же самое */
for (i=0;i<8;i++) for (i=0;i<8;i++)
rs_arr->buffer[i] = rs_arr->RS_Header[i]; rs_arr->buffer[i] = rs_arr->RS_Header[i];
// получили начальный адрес записи // получили начальный адрес записи
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; 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]; Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
if (Address_MB >= UMP_LOG_BASE) { if (Address_MB >= UMP_LOG_BASE) {
@@ -289,8 +289,8 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
modbus_exception(rs_arr, CMD_MODBUS_6, 3); return; modbus_exception(rs_arr, CMD_MODBUS_6, 3); return;
} }
} else if (Address_MB < ANSWER_LEN) { } else if (Address_MB < ANSWER_LEN) {
/* RS и CAN используют одну историю фронтов. Чередование каналов /* RS и CAN используют одну историю фронтов. Чередование каналов
* не создаёт двух независимых повторных запусков. */ * не создаёт двух независимых повторных запусков. */
if (Address_MB == 127) { if (Address_MB == 127) {
UMP_commands_write(Data_MB); UMP_commands_write(Data_MB);
ump_log_rs(); ump_log_rs();
@@ -1,4 +1,6 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
# Показывает пояснения периода CAN и обработки параметров в сохранённой кодировке UTF-8.
encoding//Source/Internal/message.c=UTF-8
# Показывает русские пояснения выбора исполнения и порядка индикаторов в кодировке UTF-8. # Показывает русские пояснения выбора исполнения и порядка индикаторов в кодировке UTF-8.
encoding//Source/Internal/Include/package.h=UTF-8 encoding//Source/Internal/Include/package.h=UTF-8
encoding//Debug/Libraries/subdir_rules.mk=UTF-8 encoding//Debug/Libraries/subdir_rules.mk=UTF-8