# Общее адресное пространство: GAS и GAS SLOT Дата редакции: **2026-10-23**. Номер типа однозначно определяет единицу адресации: | MsgType | Имя | MsgBody | Payload | |---|---|---|---| | `0x3` | GAS | адрес первого 16-битного регистра | 1…4 последовательных регистра, DLC 2/4/6/8 | | `0x4` | GAS SLOT | адрес слота | Word0 — маска; Word1…Word3 — три значения; DLC 8 | В обоих случаях запрос чтения — extended data frame с `DLC=0`, `Route=0`. Ответ имеет `Route=1`, тот же узел и адрес. Прикладного ACK записи нет; успех применения уставки проверяется прикладным ответом или последующим чтением. RTR, error frame, стандартный 11-битный ID и нечётные длины не исполняются. ## GAS 0x3: отдельные регистры `MsgBody=RegisterAddress[15:0]`. Адреса `0…65535` (`0x0000…0xFFFF`) обозначают **65 536 отдельных 16-битных регистров**, логически 128 КиБ на узел. Это адреса протокола, а не указатели RAM MCU; provider подключает только существующие регионы. Payload содержит значения с адресов `addr`, `addr+1`, `addr+2`, `addr+3` в порядке little-endian. Количество равно `DLC/2`, допускаются DLC 2, 4, 6, 8. Для изменения одной уставки по адресу `0x0001` на `0x1234` передаются `MsgBody=0x0001`, `DLC=2`, Data=`34 12`; соседние слова не изменяются. Чтение возвращает до четырёх существующих последовательных регистров, останавливаясь на первом недоступном адресе или границе `0xFFFF`. Запись, пересекающая `0xFFFF`, отвергается до изменения данных. Регионы карты, права и значения проверяет `pcan_gas`; callback остаётся ответственностью приложения. Блочная запись может остановиться на первом отказе provider: атомарность нескольких регистров не обещается. Связанные `u32/float32` и команды требуют согласованной прикладной операции. Основной контракт: `c/set-protocol/docs/legacy/GAS.md`. GAS 167/v1, GAS Logger, GAS_WATCH2, NAND и Altera Logic сохраняют регистровые адреса. Номер mode задаёт адрес узла; его нельзя автоматически прибавлять к адресу регистра. ## GAS SLOT 0x4: маска в Word0 `MsgBody=SlotAddress[15:0]`. Восемь октетов имеют фиксированное расположение: | Октеты | Wire-слово | Назначение | |---|---|---| | 0…1 | Word0 | 16-битная маска, little-endian | | 2…3 | Word1 | первое значение | | 4…5 | Word2 | второе значение | | 6…7 | Word3 | третье значение | Биты маски 1, 2, 3 соответствуют Word1, Word2, Word3. Бит 0 и биты 4…15 зарезервированы и должны быть нулевыми. Маска непустая; все допустимые маски: `0x0002`, `0x0004`, `0x0006`, `0x0008`, `0x000A`, `0x000C`, `0x000E`. При записи отмеченные значения применяются, неотмеченные позиции игнорируются и сохраняют текущие значения устройства. Нули не являются специальными маркерами. При чтении маска ответа отмечает достоверные/доступные значения. Например, изменить только Word2 на `0x1234`: Data=`04 00 00 00 34 12 00 00`. Word1 и Word3 сохраняются. Полная запись трёх значений использует маску `0x000E`. Передаются всегда восемь октетов, кроме пустого запроса чтения. Сжатия или сегментации нет. Provider проверяет все выбранные права и значения до первого изменения, затем применяет выбранные слова под общей блокировкой. Невыбранные readonly-поля не записываются. Ядро не выполняет опасное чтение-изменение-запись слота на стороне клиента. Полное пространство 0x4 содержит **65 536 слотов × 3 значения = 196 608 слов = 384 КиБ**. Word0 — метаданные кадра, не четвёртый хранимый регистр. Координата значения — `(SlotAddress, WordIndex)`, где `WordIndex=1…3`. Любой узел поддерживается общими `pcan_gas_slot_id()` и `pcan_gas_slot_handle_address()`; адрес слота не ограничен страницами PERIPH. Тип `0x4 MODBUS_COIL` заменён этим сервисом. Modbus `0x5/0x6/0x7` сохраняет номера. Старое оборудование с Coil 0x4 требует согласованного обновления; автоопределения формата нет. ## PERIPH: проекция 200 слов на слоты 0x4 `mode=0…31`; `DeviceType=1+mode/16`, `DeviceID=mode mod 16`. `SlotAddress=(mode<<8)|LocalSlot`. Маски не занимают места в карте значений. На mode сохранены 200 слов, поэтому используются 67 слотов `LocalSlot=0x00…0x42`: 66 полных слотов и два значения последнего. В последнем разрешена только маска из битов 1/2 (`0x0002`, `0x0004`, `0x0006`); Word3 не существует. `LocalSlot=0x43…0xFF` — резерв. Узел и старший октет слота должны совпадать. Смещение технологического слова: `n=3*LocalSlot+(WordIndex-1)`. Обратное преобразование: `LocalSlot=n/3`, `WordIndex=1+n mod 3`. Соседние native-сервисы могут оказаться в одном слоте, поэтому provider проверяет доступ и наличие каждой отмеченной позиции отдельно. | mode | Назначение | DeviceType / DeviceID | Слоты 0x4 | Запрос первого слота | |---:|---|---|---|---| | 0 | Резерв | `0x01 / 0x00` | `0x0000…0x0042` | `0x11040000` | | 1 | Трансформатор 1 | `0x01 / 0x01` | `0x0100…0x0142` | `0x11140100` | | 2 | Трансформатор 2 | `0x01 / 0x02` | `0x0200…0x0242` | `0x11240200` | | 3 | Силовой узел 1 | `0x01 / 0x03` | `0x0300…0x0342` | `0x11340300` | | 4 | Силовой узел 2 | `0x01 / 0x04` | `0x0400…0x0442` | `0x11440400` | | 5 | УМП1 | `0x01 / 0x05` | `0x0500…0x0542` | `0x11540500` | | 6 | УМП2 | `0x01 / 0x06` | `0x0600…0x0642` | `0x11640600` | | 7 | ENG1 | `0x01 / 0x07` | `0x0700…0x0742` | `0x11740700` | | 8 | Задатчик / пульт | `0x01 / 0x08` | `0x0800…0x0842` | `0x11840800` | | 9 | Шкаф | `0x01 / 0x09` | `0x0900…0x0942` | `0x11940900` | | 10 | Общий адрес: служебная роль | `0x01 / 0x0A` | `0x0A00…0x0A42` | `0x11A40A00` | | 11 | Терминал: служебная роль | `0x01 / 0x0B` | `0x0B00…0x0B42` | `0x11B40B00` | | 12 | Резерв назначения | `0x01 / 0x0C` | `0x0C00…0x0C42` | `0x11C40C00` | | 13 | Резерв назначения | `0x01 / 0x0D` | `0x0D00…0x0D42` | `0x11D40D00` | | 14 | Резерв назначения | `0x01 / 0x0E` | `0x0E00…0x0E42` | `0x11E40E00` | | 15 | Резерв назначения | `0x01 / 0x0F` | `0x0F00…0x0F42` | `0x11F40F00` | | 16 | Резерв назначения | `0x02 / 0x00` | `0x1000…0x1042` | `0x12041000` | | 17 | Резерв назначения | `0x02 / 0x01` | `0x1100…0x1142` | `0x12141100` | | 18 | Резерв назначения | `0x02 / 0x02` | `0x1200…0x1242` | `0x12241200` | | 19 | Резерв назначения | `0x02 / 0x03` | `0x1300…0x1342` | `0x12341300` | | 20 | Резерв назначения | `0x02 / 0x04` | `0x1400…0x1442` | `0x12441400` | | 21 | Резерв назначения | `0x02 / 0x05` | `0x1500…0x1542` | `0x12541500` | | 22 | Резерв назначения | `0x02 / 0x06` | `0x1600…0x1642` | `0x12641600` | | 23 | Резерв назначения | `0x02 / 0x07` | `0x1700…0x1742` | `0x12741700` | | 24 | Резерв назначения | `0x02 / 0x08` | `0x1800…0x1842` | `0x12841800` | | 25 | Резерв назначения | `0x02 / 0x09` | `0x1900…0x1942` | `0x12941900` | | 26 | Резерв назначения | `0x02 / 0x0A` | `0x1A00…0x1A42` | `0x12A41A00` | | 27 | Резерв назначения | `0x02 / 0x0B` | `0x1B00…0x1B42` | `0x12B41B00` | | 28 | Резерв назначения | `0x02 / 0x0C` | `0x1C00…0x1C42` | `0x12C41C00` | | 29 | Резерв назначения | `0x02 / 0x0D` | `0x1D00…0x1D42` | `0x12D41D00` | | 30 | Резерв назначения | `0x02 / 0x0E` | `0x1E00…0x1E42` | `0x12E41E00` | | 31 | Резерв назначения | `0x02 / 0x0F` | `0x1F00…0x1F42` | `0x12F41F00` | ## Назначения mode из periph_28335 Источники: `28335_periph/Source/Internal/Include/package.h`, `peripher.c:get_Mode()`, `cntrl_adr.c`. Код платы `Desk` не участвует в вычислении адреса. | mode | Назначение | Исходный символ | |---:|---|---| | 0 | Резерв | Перемычками текущей платы не задаётся | | 1 / 2 | Трансформаторные узлы 1 / 2 | `adr_TRN1 / adr_TRN2` | | 3 / 4 | Силовые узлы 1 / 2 | `adr_POW1 / adr_POW2` | | 5 / 6 | УМП1 / УМП2 | `adr_LOA1 / adr_LOA2`, `Desk=dsk_LOAD=6` | | 7 | ENG1 | `adr_ENG1` | | 8 | Задатчик / пульт | `adr_PULT`; имя «Задатчик» принято в реестре PERIPH | | 9 | Шкаф | `adr_SHKF` | | 10 | Общий адрес, служебная роль | `CNTRL_ADDR_UNIVERSAL`, `ADDR_FOR_ALL`; не отдельная плата | | 11 | Терминал, служебная роль | `ADDR_TERMINAL`; не доказательство отдельной платы | | 12…31 | Резерв назначения | Перемычки текущей платы дают только 1…16 | ## Соответствия native-сервисам PERIPH | Смещение n | Native-адрес | Назначение | Доступ | |---|---|---|---| | 0…127 | `0x0000…0x007F` | технологические данные, уставки, команды | по provider | | 128…143 | `0x1000…0x100F` | статус регистратора УМП | R | | 144…155 | `0x1200…0x120B` | паспорт прошивки | R | | 156…163 | `0x1300…0x1307` | защита УМП | W только `0x1302/0x1303` | | 164…167 | `0x1000…0x1003` | команды регистратора | по операции | | 168…199 | нет | резерв | отказ | `pcan_gas_slot_native()` принимает WordIndex=1…3; WordIndex=0 является маской и не переводится в регистр. Наличие сервиса, права и блокировку проверяет приложение. GAS 0x3 сохраняет собственные адреса подключённых регионов; эта проекция относится только к 0x4. Архив УМП, окна 120/124 слова и физическая EEPROM сохраняют native-контракты. ## Реализация и реестр - GAS 0x3: `pcan_gas.h/.c`, существующие ABI и клиенты. - GAS SLOT 0x4: `pcan_gas_slot.h/.c`; тонкие Python `GasSlots` и Android/JNI `GasSlots`. - Формат определяется MsgType, параметр `gas_profile` не используется. - C28x хранит wire-октеты в `uint_least8_t`; DLC измеряется октетами линии. - Перенос в другую единицу адресации или fallback после отказа запрещены. XLSX «Интерфейс протокола» содержит оба типа; «Общее адресное пространство» — проекцию 0x4 и native-адреса её значений; «ОАП legacy» сохраняет исходный словный реестр 0x3. Уникальный ключ реестра включает узел, MsgType, адрес и для 0x4 WordIndex. Права, тип, единица, масштаб и порядок слов u32/float32 задаются явно. Эталоны: `examples/gas-slot-vectors.json`; регистровые проверки — `test_gas_register.c`.