Expose the existing registers through Modbus and service CAN using one GAS provider only in M95M02 builds. Include the EEPROM layout/driver, LOAD protection and calibration, firmware identity and shared CCS build workflow. Add transport/profile and SCI8 validation tests, documentation and the checked M95M02 firmware image.
98 lines
11 KiB
Markdown
98 lines
11 KiB
Markdown
# GAS 167: только M95M02
|
||
|
||
Реализован профиль GAS **167/v1** для установленной EEPROM **M95M02-DR, 256 КиБ**. Он предоставляет общий доступ к существующим технологическим регистрам через Modbus RTU и служебный CAN УМП. Оба транспорта используют один provider [gas167.c](../Source/Internal/gas167.c). Состав регистров, алгоритм управления, защита, сохранение параметров и регистратор УМП сохранены.
|
||
|
||
## Включение и сборка
|
||
|
||
В [eeprom_config.h](../Source/Internal/Include/eeprom_config.h) сейчас выбран **EEPROM_M95M02=0** (AT25256B). Для установленной M95M02 выбрать **1**. GAS включается только этим аппаратным выбором; отдельного runtime-переключателя нет. Для AT25256B установить **0**, затем выполнить **Clean/Rebuild**. В этой сборке отсутствуют GAS-код и дополнительные регионы.
|
||
|
||
Новый файл gas167.c подключён к CCS через .project. После обновления проекта выполнить Clean/Rebuild, чтобы CCS добавил его в сборку. Конфигурацию памяти менять не требуется: код продолжает загружаться в прежнюю RAM.
|
||
|
||
CLI define EEPROM_M95M02 должен передаваться и компилятору, и линкеру. Значение в заголовке теперь находится внутри ifndef, поэтому override не переопределяется обратно на 1. Выбор должен соответствовать установленной микросхеме.
|
||
|
||
## Карта адресов
|
||
|
||
Адреса ниже относятся к профилю конкретного устройства **167/v1**. Они не назначают новые универсальные значения нормативному XLSX ОАП и не совместимы по смыслу с экспериментальным профилем GAS-логгера ПМ35.
|
||
|
||
| GAS | Штатный адрес / источник | Назначение | Доступ |
|
||
|---|---|---|---|
|
||
| 0x5000…0x507F | 0x0000…0x007F, modbus[128] | Те же 128 технологических регистров; GAS = 0x5000 + индекс | Как штатный Modbus; ограничения LOAD ниже |
|
||
| 0x5050 | 0x0050 | Задание ЦАП | RW, штатный raw |
|
||
| 0x5051 | 0x0051 | Штатный регистр останова | RW |
|
||
| 0x5052 | 0x0052 | CAN timeout LOAD, мс | RW; для LOAD 1…60000 |
|
||
| 0x507C | 0x007C | LOAD_STATUS | Только чтение для LOAD |
|
||
| 0x507D | 0x007D | LOAD_ATTEMPTS | Только чтение для LOAD |
|
||
| 0x507E | 0x007E | LastMode | Как штатный регистр |
|
||
| 0x507F | 0x007F | Commands, битовая маска | RW; штатная фиксация команды |
|
||
| 0x5F00…0x5F07 | Константы GAS-профиля | Сигнатура, версия, возможности | Только чтение |
|
||
|
||
Один регистр — **16 бит raw**. Битовые маски, знаковость и масштаб отдельных параметров сохраняют смысл существующего проекта; преобразование в физические величины выполняет клиент. Отдельной копии значений, нового массива логгера и новых сохранённых параметров нет.
|
||
|
||
Прежние адреса 0x0000…0x007F, УМП 0x1000…0x117B, паспорта 0x1200…0x120B, защиты 0x1300…0x1307 и EEPROM 0x8000…0xFFFF продолжают обслуживаться своими обработчиками. Дополнительные окна GAS не пересекают их.
|
||
|
||
## Обнаружение профиля
|
||
|
||
Прочитать **8 слов с 0x5F00**. Перед записью клиент проверяет сигнатуру, версию, номер профиля и аппаратный вариант.
|
||
|
||
| Адрес | Значение | Смысл |
|
||
|---|---:|---|
|
||
| 0x5F00 | 0x4741 | Сигнатура GA |
|
||
| 0x5F01 | 0x5331 | Сигнатура S1 |
|
||
| 0x5F02 | 1 | Версия контракта профиля |
|
||
| 0x5F03 | 167 | Профиль устройства |
|
||
| 0x5F04 | 0x5000 | Начало технологических регистров |
|
||
| 0x5F05 | 128 | Количество технологических регистров |
|
||
| 0x5F06 | 7 | Бит 0: RTU; бит 1: служебный CAN; бит 2: запись FC06 |
|
||
| 0x5F07 | 1 | EEPROM M95M02 |
|
||
|
||
В сборке AT25256B эти адреса отклоняются как недопустимые; сигнатуру GAS она не возвращает.
|
||
|
||
## Modbus RTU и служебный CAN
|
||
|
||
**Modbus:** FC03 читает 1…124 слова, FC06 записывает одно слово. Блок целиком находится в одном регионе. Ответ FC06 возвращает исходный GAS-адрес. GAS использует обычный ответ расширения без исторических хвостовых нулей; штатные низкие адреса сохраняют прежний формат.
|
||
|
||
Примеры: FC03(0x5F00, 8) — профиль; FC03(0x5000, 124) и FC03(0x507C, 4) — все технологические слова; FC06(0x5052, 1000) — штатный timeout LOAD.
|
||
|
||
**CAN:** используется существующий служебный запрос УМП с маркером 0x1F00, ненулевым token и функцией 3/6. Прикладной provider тот же, что у RTU. Для MBOX1 поля запроса: MDL = (GAS_address << 16) | quantity_or_value; MDH = 0x1F000000 | (token << 8) | function. Extended CAN ID запроса/ответа, порядок упаковки C28x и планировщик MBOX2 остаются штатными.
|
||
|
||
Чтение CAN допускает **2…124 слова, чётное количество**: один ответный фрагмент содержит два слова. Запись возвращает пару GAS_address/value и код результата, token сохраняется. Ответы передаются из снимка; изменение RAM между фрагментами не меняет уже захваченный блок. Для одного слова читать допустимую пару и выбрать нужное слово. Если пара вышла бы за границу региона, начать её на один адрес раньше.
|
||
|
||
Нативный ProtoCAN MsgType=0x3 не добавлялся. Для подключения SETGUI/другого клиента нужно использовать этот профиль и существующий служебный транспорт УМП, а не кодировку экспериментального pcan_gas.
|
||
|
||
## Проверки доступа
|
||
|
||
| Условие | Результат |
|
||
|---|---|
|
||
| Функция отличается от 3/6 | Код 1, illegal function |
|
||
| Адрес вне региона; блок пересекает границу; запись паспорта GAS | Код 2, illegal address |
|
||
| FC03 quantity = 0 или >124; нечётное количество CAN | Код 3, illegal value |
|
||
| LOAD: запись 0x507C или 0x507D | Код 2; значения не меняются |
|
||
| LOAD: запись timeout 0 или >60000 в 0x5052 | Код 3; значение не меняется |
|
||
| Запись 0x507F | Штатная запись Commands и вызов ump_log_rs, как при FC06(0x007F) |
|
||
|
||
Валидация блока выполняется до чтения. Параметр modbus[128] вне опубликованных 128 слов не раскрывается. Чтение и запись GAS выполняются под существующей короткой IRQ-блокировкой main loop; EEPROM SPI остаётся вне этой блокировки.
|
||
|
||
## Проверенная сборка
|
||
|
||
TI C2000 22.6.0.LTS, -O2, speed=0, gen_func_subsections=on, FPU32/COFF. Версия из пользовательского firmware_version.h: **1.1.2**. Загрузочный образ проверен как SCI8: заголовок, полные блоки, завершающее слово, адреса RAM и entry point.
|
||
|
||
| Сборка | Без GAS, байт | С GAS, байт | Добавлено | Лимит прошивки | Свободно |
|
||
|---|---:|---:|---:|---:|---:|
|
||
| AT25256B | 32472 | **32472** | **0** | 32508 | 36 |
|
||
| M95M02 | 32764 | **33174** | **410** | 261884 | **228710** |
|
||
|
||
AT25256B сравнен с исходниками до добавления GAS при одинаковых параметрах и generated identity: BIN совпадает **побайтно и по SHA-256**. GAS-символов в его MAP нет. У M95M02 остаётся 0x033F слов (1662 физических байта) свободной RAML0; секции и данные прежнего логгера не увеличены.
|
||
|
||
Готовый образ: [GAS M95M02 BIN](../Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin), рядом manifest с eeprom=M95M02, GAS-профилем и SHA-256. Сборка включает незакоммиченные изменения проекта; build_id содержит знак +.
|
||
|
||
Проверки на ПК:
|
||
|
||
~~~powershell
|
||
python tests/gas167/run_test.py
|
||
python tests/gas167/check_image.py Bin/GAS_M95M02/UKSSTMS320F28335_GAS_M95M02.bin --eeprom M95M02
|
||
~~~
|
||
|
||
Тест использует production GAS provider, фактические тела обработчиков Modbus и UMP_CAN_service, общую сериализацию CRC/CAN и аппаратные mocks. Проверены обе конфигурации, адреса/границы, запреты записи, 124-словный RTU-ответ и полный CAN-снимок в 62 фрагментах. Числовая ABI GCC адаптирована к 16-битным словам C28x; целевая компиляция дополнительно проверена TI.
|
||
|
||
Загрузка на плату, холодный SPI boot и аппаратные тайминги в этой задаче не проверялись.
|