Modbus

Определение конца пакета.
- Если скорость передачи данных больше 19200, то нужно использовать фиксированное время 1750 мкс. В противном случае время должно быть в 3,5 больше времени символа. - Таймер настраивается на частоту 50 мкс. - В данном проекте управление переключением режима передачи происходит не стороне контроллера. Между включением передатчика и отправкой первого байта пакета необходима задержка. Задержка необходима и между отправкой последнего символа и выключением передатчика. Задержка реализована с помощью аппаратного таймера TIM6. Время задержки соответствует времени передачи двух символов с учетом текущей скорости USART.
Функции
- **0x01 (1)** - чтение значений из нескольких регистров флагов - Read Coil Status. - **0x02 (2)** - чтение значений из нескольких дискретных входов - Read Discrete Inputs. - **0x03 (3)** - чтение значений из нескольких регистров хранения - Read Holding Registers. - **0x04 (4)** - чтение значений из нескольких регистров ввода - Read Input Registers. - **0x05 (5)** - запись значения одного флага - Force Single Coil. - **0x06 (6)** - запись значения в один регистр хранения - Preset Single Register. - **0x07 (7)** - чтение сигналов состояния - Read Exception Status. - **0x08 (8)** - диагностика - Diagnostic. - **0x0B (11)** - чтение счетчика событий - Get Com Event Counter. - **0x0C (12)** - чтение журнала событий - Get Com Event Log. - **0x0F (15)** - запись значений в несколько регистров флагов - Force Multiple Coils. - **0x10 (16)** - запись значений в несколько регистров хранения - Preset Multiple Registers. - **0x11 (17)** - чтение информации об устройстве - Report Slave ID. - **0x14 (20)** - чтение из файла - Read File Record. - **0x15 (21)** - запись в файл - Write File Record. - **0x16 (22)** - запись в один регистр хранения с использованием маски "И" и маски "ИЛИ" - Mask Write Register. - **0x18 (24)** - чтение данных из очереди - Read FIFO Queue. - **0x2B (43)** - Encapsulated Interface Transport.
Команды и регистры для теста
Проверить функции для чтения и записи: * (0x03) Read Holding Registers. Чтение N регистров управления и уставок. * (0x10) Write Multiple registers Запись N регистров управления и уставок (0x10). Адреса тестовых регистров для чтения и записи: 0x30 - лежит значение 123456789 тип uint32_t (4 байта) 0x32 - лежит значение 32768 тип uint16_t (2 байта) 0x34 - лежит значение 1.23456 тип float (4 байта)
Карта памяти
0x0800 0000 - 0x0801 FFFF (128кБт) - **IAP** 0x0801 F800 - 0x0801 FFFF 0x0802 0000 - 0x0802 07FF (2кБт) - **Основные настройки (SETTINGS)** 0x0802 0800 - 0x0802 0FFF (2кБт) - **Системные настройки (SETTINGS_SYS)** 0x0802 1000 - 0x080F FFFF (кБт) - **FW** 0x0802 1000 - вектора прерываний 0x0802 11F0 - Модель 0x0802 1200 - Остальные данные прошивки
Настройки
```c // Адрес CRC системных настроек #define SYS_CRC_ADDRESS 0x08020FFC // Контрольное слово системных настроек #define SETTINGS_CONTROL_WORD 123456789 // Структура системных настроек typedef struct { uint16_t model; // Модель char sn[SN_LEN]; // Серийный номер char proddate[PROD_LEN]; // Дата производства char testState[16]; // Статус тестирования uint32_t controlword; // Контрольное слово uint32_t crc; // CRC } sys_settings_t; ```
Таймеры
- TMR_4 - таймер для статистики FreeRTOS - TMR_5 - дополнительный таймер для RTC в мс - TMR_6 - дополнительный modbus таймер - TMR_7 - основной modbus таймер - TMR_9 - для выходов PWM (10 Гц частота прерывания) - TMR_10 - uptime - TMR_12 - таймер функции антидребезга - TMR_13 - резерв под watchdog - TMR_14 - для ведения архива по разным каналам
TODO
- Выход из IAP по таймауту после получения первого пакета с ключом и размером. - Перенести вызов функции очисти флеш-памяти под FW. - Добавить проверку CRC.
Логика
**Безопасный режим** При включении или обрыве связи по RS-485 интерфейсу дискретные выходы должны переходить в безопасный режим или выставлять последнее полученные настройки для выходов. Включение безопасного режима должно задаваться настройкой. В случае если безопасный режим отключен, то на входах при старте работы модуля или обрыве связи должны выставляться последнее полученные настройки для выходов.
ADC MS5192T (16 бит)
* Настроить в режиме с включенным буфером. * По умолчанию включается режим непрерывного преобразования. * **Разное:** * MS5192T/MS5193T при усилении 1 или 2 работают в режиме без буфера. При увеличении усиления буфер автоматически включается. В режиме с буфером абсолютное входное напряжение ограничено от GND + 100 мВ до AVDD - 100 мВ. При увеличении усиления до 4 или более, включается приборный усилитель. При использовании приборного усилителя абсолютное входное напряжение ограничено от GND + 300 мВ до AVDD - 1.1B. При установке общего режима напряжения пользователь должен учитывать вышеперечисленные ограничения, чтобы не превысить указанные значения и избежать снижения линейной и шумовой характеристики устройства. * **Коммуникационный регистр** - Бит 7. (1 - будет запись. 0 - чтение). - Бит 6. (0 - следующая операция запись в указанный регистр. 1 - чтение). - Биты 5, 4, 3. (биты адреса, какие регистры выбраны для обмена). - Бит 2. (вкл/выкл режим непрерывного чтения. Смотри примеры ниже) - Биты 1, 0. (всегда 0) **Биты 5, 4, 3:** 0 0 0 - Запись в устройство осуществляется в 8и битный коммуникационный регистр 0 0 0 - Чтение из устройства производится из 8-битного регистра состояния 0 0 1 - Регистр режима 16 бит 0 1 0 - Конфигурационный регистр 16 бит 0 1 1 - Регистр данных 16 бит (MS5193T) / 24 бит (MS5192T) 1 0 0 - Регистр ID 8 бит 1 0 1 - Регистр IO 8 бит 1 1 0 - Регистр смещения 16 бит (MS5193T) / 24 бит (MS5192T) 1 1 1 - Регистр полной шкалы 16 бит (MS5193T) / 24 бит (MS5192T) **Примеры:** - 01011100 - включить режим непрерывного чтения - 01011000 - выключить режим непрерывного чтения (при записи сигнал RDY должен быть низким) **Регистр состояния** Для получения регистра состояния нужно записать в регистр связи: 01000000 В режиме непрерывного чтения до записи инструкции линия DIN должна быть в низком состоянии.
Задачи
- Реализовать CLI (интерфейс DEBUG UART) для отладочных целей и помощи в разработке ПО. - RTC в режиме uint64_t. Настроить аппаратный таймер с частотой в мс и с синхронизацией от модуля RTC. Реализовать API - чтение/запись, синхронизация uinix-time по MODBUS RTU. - Реализовать внутренне API для ведения журнала и архива. Создание разделов, добавление/считывание, удаление записей. Создать тестовый модуль для проверки API. Протестировать. - Реализовать функции для чтения у управления журналом и логом по MODBUS RTU. * Размер архива. * Количество записей. * Текущая точка записи. * Событие изменения периода архива.
Общие данные ringfs
* Объем flash-памяти 2МБт - 512 секторов по 4096 байт. * Делим память на два одинаковых раздела под журнал событий и архив, оставляя небольшой резерв в начале каждого раздела. * Первые 4 сектора (16 кБт) оставим под служебную информацию. * Журнал занимает 252 сектора (1008 кБт) и смещен на 4 сектора относительно начала памяти. * Архив занимает 252 сектора (1008 кБт) и смещен на 260 (256 + 4) секторов относительно начала памяти. * 4 сектора (257, 258, 259 и 260 - служебная информация (резерв)) *
"Файловая система"
**Основные параметры** - `sector_size` - размер сектор в байтах. В нашем случае 4096, что соответствует размеру сектора flash-памяти. - `sector_offset` - смещения раздела в секторах - `sector_count` - размер раздела в секторах. Пока журнал и архив по 252 сектора - `object_size` - размер одной записи в байтах - `slots_per_sector` - количество записей в одном слоте. - `read, write, cursor` - структуры с полями `sector` и `slot`.
Этапы разработки ПО
- 100% Проверка всех функциональных модулей (внешний и внутренний ADC, DAC, USB, RTC, внешняя память, индикация, сдвиговые регистры, мультиплексоры). - 95% Реализация обновление встроенного ПО. Загрузчик. - 100% Разработка модуля работы с общими и системными настройками. - 85% Драйверы внешних ADC, DAC, управления режимами цифровых входов/выходов. - 80% Реализация Modbus, и разработка карты регистров. - 75% Реализация основной логики работы модулей. Безопасный режим работы, установка и считывание значений входов/выходов, различные режимы работы входов/выходов. Настройка о опрос модулей по протоколу Modbus RTU. - 75% Разработка модулей архива и журнала событий. - 100% Разработка USB драйвера для класса RNDIS - 0% Реализация web-интерфейса.
Короткие задачи
- [ ] Настройки порта UART для Modbus RTU. - [x] Модель. MDIO_88, MAO_8, MAI_12. Модель определяется в прошивке в файле `shared/model/model_cfg.h` Модель в строковом виде сохраняется по адресу 0x0802 11F0. - [x] Сохранение настроек - [x] Архив - [ ] Рефакторить modbus.c
LOAD
`1` - нагрузки нет `0` - нагрузка есть
Запрос записей журнала и архива
reference type - 0x06 - архив reference type - 0x07 - журнал Запрос: File number - индекс записи record number - 0 - номер канала архива [1..8], 0 - если это журнал regord length - количество записей Ответ: resp data len - длина ответа в байтах file resp. length - 0 - номер канала архива [1..8], 0 - если это журнал reference type - 6 или 7 error code 0x94 exception code - 0x09
Переезд пинов. Ревизия платы
- HW_REV_BIT_0 (PB_13) -> ART_CLK_LS (PC_10) - HW_REV_BIT_1 (PB_14) -> ART_MISO_CH712 (PD_2) - HW_REV_BIT_2 (PB15) -> ART_MISO_CH16/CS_LS (PC_11)
Тестирование модуля MDIO_88
Датчик нагрузки работает только когда выходы разомкнуты 1.1 Замкнуть все выходы. 1.2 Размыкаю 1ый выход, контролирую первый датчик 1.2 Смотреть состояние датчика обрыва линии