4.8 KiB
UKSVEP STM32F103RC: регистровый CAN
Профиль относится к UKSVEP_ICE_22220.6: Core/Src/can.c,
Core/Inc/package.h, Core/Src/message.c, Core/Src/lampa.c и main.h.
Он подключён в SETGUI как отдельный эмулятор проекта «Ледокол».
Classic CAN, extended 29-битный ID, DLC=8, 250000 бит/с.
DeviceID 0…15 задают J0…J3; Mode=DeviceID+1.
Данные ВЭП: 0x001CE000 | DeviceID; команды ВЭП:
0x001CE020 | DeviceID. Это регистровое приложение, а не ProtoCAN Boot Type5.
Broadcast из старого приложения не выдаётся этим клиентом за адресный ответ.
Payload общий с историческим balsam_can: word2, word3,
адрес/маска, word1, по два байта big endian. В заголовке биты15…13 задают
присутствие слов, биты12…0 — начальный адрес. uksvep_can ограничивает
банк R0…R127; отсутствующие слова не должны обнулять предыдущее состояние.
Маршрутизация других Balsam-плат остаётся в их собственном профиле.
| Регистры | Назначение |
|---|---|
| 0 / 1 / 2 | Входы / неисправности / аварии |
| 8 / 9 | Маски неисправностей / аварий |
| 23 | Перемычки; младший полубайт соответствует DeviceID |
| 48 | Sleep_time, секунды |
| 100 | Brightness, 0…10 тактов ШИМ |
| 101 / 102 | Cancount, быстрый / медленный период по 10 мс |
| 125 / 126 / 127 | Версия протокола / Mode / команды |
Назначения входов, GPIO, команд и значения по умолчанию доступны через
uksvep_field_*, uksvep_input_name, uksvep_command_name.
uksvep_evaluate_inputs моделирует ReadEnteres: R0.7 никогда не является
неисправностью/аварией; R0.8 всегда является неисправностью и становится
аварией по Error_mask.8; R0.9 всегда является неисправностью и аварией.
Вход R0.9/PB12 читается без инверсии, остальные назначенные
сигналы собираются в соответствии с физической картой STM32-проекта.
Слои
SETGUI → protocan/uksvep.py (ctypes) → uksvep_can.c → общий payload balsam_can.c.
Ни GPIO, ни Qt, ни часы ОС общему C-профилю не нужны; динамическая память
не используется. Вычисления и wire не дублируются в Python.
Все выходные буферы принадлежат caller и имеют явную capacity:
uksvep_can_encode: минимум8 байтов, возвращает8 либо0;uksvep_can_decode: минимум8 слов uint16 — направление, количество, затем максимум3 пары адрес/значение; возвращает число пар,0 для чужого ID, −1 для неверных аргументов/своего повреждённого кадра;uksvep_field_info: минимум4 слова uint16 — адрес, максимум, default, flags;uksvep_evaluate_inputs: минимум2 слова uint16 — неисправности и аварии.
Флаги полей: PARAM=1, COMMAND=2, STATE=4. GUI использует их для выбора допустимых редакторов роли. Имена возвращаются постоянными строками UTF-8; владение памятью клиенту не передаётся. Для применения RX клиент дополнительно отбрасывает STD/RTR и собственное направление/эхо. Физические уровни LED0…LED3 и PVT по текущему регистровому CAN не передаются; интерфейс не должен представлять расчётные лампы как измерение этих GPIO.
Проверки
test_uksvep_can фиксирует независимые wire-эталоны, все16 адресов,
малый выходной буфер, границы R127, sparse101, неверный DLC, чужие профили,
особые входы и регрессию прежнего decoder Бальзам. Python-тесты используют
ту же DLL, GUI-тесты подменяют только аппаратный драйвер.