Сократить запись логгера УМП до 12 слов формата v4

This commit is contained in:
2026-10-16 11:26:14 +03:00
parent ba9a54959e
commit 1955f2c98f
6 changed files with 246 additions and 147 deletions
+77 -10
View File
@@ -13,37 +13,76 @@ unsigned int adc_table_lem[4];
__declspec(dllexport) int run_tests(void)
{
unsigned int i, generation, archived, reply[UMP_CAN_MAX_WORDS], error, length;
/* Индексы перебирают все поля десяти записей онлайн-окна, проверяя отсутствие сдвига на старые 40 слов. */
unsigned int record_index, word_index, block_words;
unsigned long sequence;
READY = 100;
CHECK(!ump_log_write(UMP_LOG_BASE, 1));
READY = 0;
/* Явная инициализация кэша гарантирует нулевые ЗПТ до первого принятого измерения. */
CHECK(ump_pm67_voltage[0] == 0 && ump_pm67_voltage[1] == 0);
/* Регистр 306 ПМ67 передаётся нулевым CAN-индексом 305 в первой позиции кадра. */
ump_log_can(0x8000U | 305U, 321, 0, 0);
/* Регистр 9 ПМ67 находится во второй позиции кадра с начальным индексом 7 и маской 0x4000. */
ump_log_can(0x4000U | 7U, 0, 456, 0);
/* Напряжения должны обновляться ещё до включения регистратора, чтобы первый снимок уже содержал измерения. */
CHECK(ump_pm67_voltage[0] == 321 && ump_pm67_voltage[1] == 456 && ump_count == 0);
/* Нулевая маска не разрешает первое слово и не должна подменять сохранённое напряжение. */
ump_log_can(305U, 999, 0, 0);
/* Индекс 306 не является индексом регистра 306: прошивка принимает именно нулевую нумерацию CAN. */
ump_log_can(0x8000U | 306U, 999, 0, 0);
/* Оба неверных заголовка обязаны оставить последнее корректное ЗПТ1 без изменения. */
CHECK(ump_pm67_voltage[0] == 321);
/* Третья позиция соответствует индексу 305 даже при пропущенных первых двух словах кадра. */
ump_log_can(0x2000U | 303U, 0, 0, 123);
/* Аналогично проверяет третью позицию для нулевого индекса 8 второго напряжения. */
ump_log_can(0x2000U | 6U, 0, 0, 789);
/* Последний принятый набор должен совпадать с ожидаемыми ЗПТ1/ЗПТ2 в вольтах. */
CHECK(ump_pm67_voltage[0] == 123 && ump_pm67_voltage[1] == 789);
adc_table_lem[0] = 2048; adc_table_lem[3] = 4095;
CHECK(!ump_log_write(UMP_LOG_BASE+1, 0));
CHECK(!ump_log_write(UMP_LOG_BASE+1, 1001));
CHECK(ump_log_write(UMP_LOG_BASE+1, 1));
modbus[127] = 0x80;
/* Дополнительные биты полного слова команд не должны попадать в компактное поле пуска/сброса v4. */
modbus[127] = 0xAB80;
/* Unrelated registers must not determine the fixed 166 ramp. */
modbus[0x50] = 99; modbus[0x51] = 123;
modbus[0x64] = 88; modbus[0x65] = 111;
modbus[0x7B] = 1234; modbus[0x1C] = 160;
/* Сторожевое значение во втором слоте обнаружит случайную запись старых полей за 12-словную границу. */
logs_block[UMP_LOG_WORDS] = 0xA55A;
/* Второй банк не должен затрагиваться заполнением и оборотом кольца первого банка. */
logs_block[UMP_LOG_CAPACITY * UMP_LOG_WORDS] = 0x5AA5;
CHECK(ump_log_write(UMP_LOG_BASE, 1));
/* Число слов и чётная длина совпадают с компактным форматом исполнения 167. */
CHECK(UMP_LOG_WORDS == 12 && 2UL * UMP_LOG_CAPACITY * UMP_LOG_WORDS <= LOG_PAGE_LEN);
/* Первый снимок обязан содержать напряжения, принятые до запуска записи. */
CHECK(ump_word(0, 0, 9) == 123 && ump_word(0, 0, 10) == 789);
/* Нулевой резерв необходим для парной упаковки CAN и не должен содержать старый код ЦАП. */
CHECK(ump_word(0, 0, 11) == 0 && logs_block[UMP_LOG_WORDS] == 0xA55A);
/* В начале доступен один снимок, а оставшаяся часть 124-словного онлайн-окна заполнена нулями. */
CHECK(ump_log_read(UMP_LOG_LIVE+2) == 1 && ump_log_read(UMP_LOG_LIVE+4+UMP_LOG_WORDS) == 0);
CHECK(!ump_log_write(UMP_LOG_BASE, 1));
CHECK(!ump_log_write(UMP_LOG_BASE+1, 20));
for (i=0; i<900; i++) ump_log_tick();
CHECK(ump_count == UMP_LOG_CAPACITY);
CHECK(ump_word(0, 0, 0) == 101);
CHECK(ump_word(0, UMP_LOG_CAPACITY-1, 0) == 900);
CHECK(ump_word(0, 0, 8) == 1234);
CHECK(ump_word(0, 0, 24) == 6);
CHECK(ump_word(0, 0, 25) == 16);
CHECK(ump_word(0, 0, 36) == 2048);
CHECK(ump_word(0, 0, 39) == 4095);
/* После оборота кольца поле команд содержит только биты пуска и сброса, несмотря на посторонние биты 0xAB80. */
CHECK(ump_word(0, 0, 3) == 0x80);
/* Расчётное задание тока переместилось в слово 6 и сохраняет масштаб 0,1 мА. */
CHECK(ump_word(0, 0, 6) == 160);
/* Уставки исполнения 166 остаются фиксированными 6/16 мА независимо от технологических регистров 167. */
CHECK(ump_word(0, 0, 7) == 6 && ump_word(0, 0, 8) == 16);
/* При обороте кольца не теряются оба напряжения и не изменяется сторожевое значение следующего банка. */
CHECK(ump_word(0, 0, 9) == 123 && ump_word(0, 0, 10) == 789 && logs_block[UMP_LOG_CAPACITY * UMP_LOG_WORDS] == 0x5AA5);
/* Короткая CAN-команда должна остаться отдельным событием. */
modbus[127] = 0x40;
ump_log_can(0x807F, 0x40, 0, 0);
CHECK(ump_post == 1000);
CHECK(ump_word(0, ump_count-1, 2) == 0x102);
CHECK(ump_word(0, ump_count-1, 18) == 0x807F);
/* Событие CAN хранит выбранные команды в слове 3 вместо удалённого сырого заголовка в прежнем слове 18. */
CHECK(ump_word(0, ump_count-1, 3) == 0x40);
for (i=0; i<999; i++) ump_log_tick();
CHECK(ump_generation == 0);
ump_log_tick();
@@ -59,8 +98,16 @@ __declspec(dllexport) int run_tests(void)
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived);
CHECK(ump_generation == generation);
CHECK(ump_sequence == sequence + 200);
CHECK(ump_log_read(UMP_LOG_LIVE+2) == 3);
CHECK(ump_log_read(UMP_LOG_LIVE+4) == ump_time-2);
/* Уменьшение записи увеличивает глубину онлайн-окна с трёх до десяти полных снимков. */
CHECK(ump_log_read(UMP_LOG_LIVE+2) == UMP_LOG_LIVE_RECORDS && UMP_LOG_LIVE_RECORDS == 10);
/* Первое онлайн-время относится к самому старому из десяти переданных снимков. */
CHECK(ump_log_read(UMP_LOG_LIVE+4) == ump_time-UMP_LOG_LIVE_RECORDS+1);
/* Сопоставляет каждую запись онлайн-окна с хронологическим чтением кольцевого банка. */
for (record_index = 0; record_index < UMP_LOG_LIVE_RECORDS; record_index++)
/* Проверяет все 12 слов, включая время, выбранные сигналы и нулевой резерв. */
for (word_index = 0; word_index < UMP_LOG_WORDS; word_index++)
/* Смещения должны заполнять ровно 120 полезных слов после четырёх служебных слов. */
CHECK(ump_log_read(UMP_LOG_LIVE+4+record_index*UMP_LOG_WORDS+word_index) == ump_word(0, ump_count-UMP_LOG_LIVE_RECORDS+record_index, word_index));
CHECK(ump_log_write(UMP_LOG_BASE+3, 1));
CHECK(ump_log_write(UMP_LOG_BASE+2, UMP_LOG_CAPACITY-1));
CHECK(ump_log_read(UMP_LOG_DATA) == archived);
@@ -81,7 +128,27 @@ __declspec(dllexport) int run_tests(void)
/* CAN читает те же регистры и формирует цельный снимок из 124 слов.
* Запись по старым технологическим адресам через сервис запрещена. */
length = ump_can_prepare(3, UMP_LOG_BASE, 16, reply, &error);
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 2);
/* Служебный ответ должен объявлять версию v4, длину 12 слов и сохранённую ёмкость банка исполнения 166. */
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 4 && reply[4] == 12 && reply[5] == UMP_LOG_CAPACITY);
/* Проверяет каждое разрешённое число целых компактных записей в архивном CAN-окне. */
for (block_words = UMP_LOG_WORDS; block_words <= 120; block_words += UMP_LOG_WORDS) {
/* Запрашивает от одной до десяти записей, не превышая полезную длину 120 слов. */
length = ump_can_prepare(3, UMP_LOG_DATA, block_words, reply, &error);
/* Все кратные длине записи запросы должны проходить без исключения Modbus. */
CHECK(!error && length == block_words);
} /* Завершает проверку допустимых размеров окна компактного архива. */
/* Прежний блок v2 из 40 слов теперь обрывает запись v4 и должен отклоняться CAN-протоколом. */
ump_can_prepare(3, UMP_LOG_DATA, 40, reply, &error);
/* Исключение 2 сообщает о недопустимом диапазоне регистров. */
CHECK(error == 2);
/* Отклоняет пустой архивный запрос вместо его трактовки как успешного чтения. */
ump_can_prepare(3, UMP_LOG_DATA, 0, reply, &error);
/* Нулевая длина не содержит ни одной целой записи v4. */
CHECK(error == 2);
/* Блок из 11 записей уже превышает разрешённые 120 слов полезного окна. */
ump_can_prepare(3, UMP_LOG_DATA, 132, reply, &error);
/* Ограничение защищает буфер ответа от записи за его границами. */
CHECK(error == 2);
length = ump_can_prepare(3, UMP_LOG_LIVE, 124, reply, &error);
CHECK(!error && length == 124);
ump_can_prepare(3, UMP_LOG_LIVE, 126, reply, &error);