# Проект разработки для ПЛК210 (ОВЕН) ## Описание проекта - **ПЛК:** ОВЕН ПЛК210 - **Среда разработки:** CODESYS 3.5 SP17 Patch 3 - **Основной язык программирования:** ST (Structured Text / МЭК 61131-3) ## Правила работы ИИ-ассистента с этим репозиторием (Strict Rules) 1. **Бинарник — источник истины:** Файлы `.st` в `plc_src/` — это лишь зеркало. Никакие правки в `.st` не считаются примененными, пока пользователь не прогонит скрипт импорта в CODESYS. 2. **Паспорт файла неизменен:** Секция `(* ... *)` в начале `.st` файлов содержит служебные метаданные для Python-скриптов. **Категорически запрещено** удалять или изменять структуры этих заголовков. 3. **Запрет гадания API:** Использовать ТОЛЬКО те функциональные блоки, функции и типы из внешних библиотек, которые явно описаны в `libs/<ИмяБиблиотеки>_API.md`. Если блока нет — запросить сигнатуру у пользователя. 4. **Безопасность циклов:** Никогда не использовать неограниченные циклы `WHILE` или `REPEAT`. Вся циклическая логика должна опираться на естественный цикл задачи CODESYS (Main Task), иначе сработает **Watchdog** ПЛК. 5. **Атомарность:** При модификации файла вносить изменения минимально необходимыми диффами. Не переписывать весь блок без необходимости. 6. **Новые объекты — только с подтверждением:** Создание нового POU/GVL/DUT (объекта, которого раньше не было в проекте) — необратимое изменение структуры проекта при реальном импорте. Не создавай новый файл с новым объектом молча в рамках другой задачи — явно предупреди пользователя и дождись подтверждения. 7. **Не гадать по существующим символам проекта:** Если нужно сослаться на переменную/POU/тип, которые предположительно уже есть в проекте (не создаются заново) — проверь их в `plc_src/` (grep/поиск по имени), а не полагайся на память или правдоподобное совпадение. --- ## Архитектура проекта и структуры данных ### Иерархия вызова программ (Main Task) - `PLC_PRG`: Главный цикл управления. Содержит только вызов подпрограмм (POU). ### Сеть и протоколы - **Modbus TCP Master и Slave:** Порты `Ethernet1 / Ethernet2` - **Modbus RTU:** Интерфейсы `RS-485-1 / RS-485-2` - Modbus не могут быть экспортированы в .st файл ### Глоссарий сокращений - --- ## Структура репозитория ```text . ├── <Проект>.project # бинарный проект CODESYS — источник истины для компиляции ├── plc_src/ # текстовый экспорт POU/GVL/DUT — ИМЕННО ЭТИ ФАЙЛЫ читает и правит ИИ-ассистент │ ├── <Устройство>/ │ │ ├── POU/ │ │ ├── GVL/ │ │ └── DUT/ │ └── _common/ ├── tools/ │ ├── export_plc_src.py # скрипт экспорта .project -> plc_src (текст) │ └── import_plc_src.py # скрипт импорта plc_src (текст) -> .project ├── libs/ │ └── <ИмяБиблиотеки>_API.md # справочник по FB/FUNCTION самописной библиотеки (файл может отсутствовать) └── Algoritm.md # Основной алгоритм работы (файл может отсутствовать) ``` `plc_src/` генерируется скриптом `tools/export_plc_src.py` из `.project` через CODESYS Scripting API. Это НЕ исходный код в привычном смысле — это зеркало текущего состояния `.project`, нужное для того, чтобы у git был человекочитаемый дифф, а у ИИ-ассистента — текстовые файлы для правки. --- ## Рабочий цикл правки логики (важно!) Перенос правок туда-обратно автоматизирован через пару скриптов, но применяется он **не мгновенно** — между правкой `.st`-файла и тем, что окажется в проекте, есть шаг, который делает пользователь руками в CODESYS. Порядок действий: 1. ИИ-ассистент правит `.st`-файл(ы) в `plc_src/...`. Заголовок-паспорт файла (блок `(* ... *)` в начале, с полями Project/Device/Path/Name/Type) **не трогать и не удалять** — по нему `import_plc_src.py` определяет, в какой POU/METHOD/GVL/DUT проекта записать текст. 2. Пользователь открывает проект в CODESYS и запускает `tools/import_plc_src.py`. 3. Компилирует и тестирует проект в CODESYS как обычно. 4. **Перед коммитом перезапускает `tools/export_plc_src.py`**, чтобы `plc_src/` снова точно соответствовал `.project` — иначе дифф в git будет показывать код, которого уже нет в бинарнике (или наоборот — не будет показывать то, что уже есть). 5. Коммитит `.project` и `plc_src/` вместе. ИИ-ассистент: никогда не считай правку `.st`-файла уже применённой к `.project` — это только предложение изменения. Реальный эффект появится только после того, как пользователь прогонит `import_plc_src.py` (сам, руками) и подтвердит результат. **ИИ-ассистент никогда не запускает `import_plc_src.py` (и команду CODESYS.exe, вызывающую его) самостоятельно — это исключительно ручной шаг пользователя.** --- ## Особенности формата .st файлов (важно при правке) - Один `.st`-файл может содержать несколько блоков подряд: основной POU и дописанные METHOD/PROPERTY/ACTION (каждый со своим заголовком-паспортом). Если добавляешь новый METHOD/ACTION в существующий POU — дописывай его в конец того же файла со своим заголовком, а не создавай отдельный файл. - Для ACTION в заголовке не бывает декларации, только implementation — так и должно быть. - `END_PROGRAM` / `END_FUNCTION_BLOCK` / `END_METHOD` и т.п. в конце блока — оставляй, их пишет `export_plc_src.py`, а `import_plc_src.py` сам их убирает перед отправкой в API. Не убирай их сам и не убирай случайно при правке. - Новый POU/GVL/DUT, которого раньше не было — можно создавать новым файлом с правильным заголовком (см. правило 6 выше про обязательное подтверждение); `import_plc_src.py` создаст объект в проекте автоматически (`get_or_create_*`). Но: сигнатуры создания через API в скрипте помечены как версионно-хрупкие — если создание упадёт с ошибкой, это ожидаемо, надо смотреть Tools → Scripting → API нужной версии. --- ## Что нельзя трогать без согласования - --- ## Библиотека (внешний проект) Есть самописная библиотека — отдельный CODESYS-проект, её исходники в этот репозиторий **не включаются**. - Справочник по публичному API лежит в `libs/<ИмяБиблиотеки>_API.md` - Там для каждого FB/FUNCTION: сигнатура, VAR_INPUT/VAR_OUTPUT/VAR_IN_OUT с типами, краткое описание - **ИИ-ассистент: используй только то, что описано в `libs/<ИмяБиблиотеки>_API.md`.** Не придумывай сигнатуры блоков библиотеки, которых нет в справочнике — если нужного блока/параметра там нет, спроси, а не предполагай --- ## Соглашения по коду ### Именование элементов (Hungarian Notation / Prefix System) **Физические входы/выходы**, привязанные к модулям, — в `VAR_GLOBAL` RAW_IO: - `RDI_` — Raw Digital Input - `RDO_` — Raw Digital Output - `RAI_` — Raw Analog Input - `RAO_` — Raw Analog Output **Входы/выходы после присвоения и нормировки** — в `VAR_GLOBAL` IO: - `DI_` — Digital Input - `DO_` — Digital Output - `AI_` — Analog Input - `AO_` — Analog Output **Типы POU:** - `FB_` — Функциональный блок - `FC_` — Функция - `DUT_` — Пользовательский тип данных (Struct, Enum) ### Правила форматирования и стиля 1. **Язык:** код, имена переменных и блоков — на **английском языке**; комментарии и документация — на **русском**. 2. **Автоматы состояний (State Machines):** всегда использовать `CASE ... OF`, не заменять его цепочкой `IF ... ELSIF`, если по сути нужен автомат. 3. **Безопасность:** - деление на ноль и выход за границы массива должны быть явно заблокированы проверками *до* операции. 4. **Таймеры:** использовать только стандартные `TON`, `TOF`, `TP` из библиотеки `Standard`. 5. **Циклы:** без неограниченных `WHILE`/`REPEAT` — см. правило 4 в разделе Strict Rules выше (иначе сработает Watchdog). --- ## Особенности оборудования ПЛК210 - **Retain-память:** Энергонезависимые переменные объявлять строго в секции `VAR RETAIN` или `VAR PERSISTENT`. Использовать экономно. - **Встроенные входы/выходы:** Использовать таргетные переменные из дерева `ПЛК210 -> Входы/Выходы`. Сырые переменные в RAW_IO, именно их привязку делать через `IO_Mapping`. - **Флеш-память:** Избегать частой циклической записи файлов во внутреннюю память ПЛК (использовать буферизацию в RAM). --- ## Полезные команды Запуск экспорта из командной строки (без открытия GUI CODESYS): ```powershell "C:\Program Files (x86)\CODESYS 3.5.17.30\CODESYS\Common\CODESYS.exe" ^ --Profile="CODESYS V3.5 SP17 Patch 3" --runscript="tools/export_plc_src.py" ^ --project="<путь к .project>" ``` Запуск импорта из командной строки (без открытия GUI CODESYS): ```powershell "C:\Program Files (x86)\CODESYS 3.5.17.30\CODESYS\Common\CODESYS.exe" ^ --Profile="CODESYS V3.5 SP17 Patch 3" --runscript="tools/import_plc_src.py" ^ --project="<путь к .project>" ```