Открытая программная реализация ПЛК (Programmable Logic Controller). Поддерживает все 5 языков IEC 61131-3: Ladder Diagram, ST, FBD, IL, SFC. Запускается на Linux/Raspberry Pi. Используется security-исследователями для создания тестовых ICS-окружений и изучения атак на ПЛК.
git clone https://github.com/Autonomy-Logic/openplc-runtime cd openplc-runtime && sudo ./install.sh ./openplc # REST API на :8443 — не браузерный UI # Подключаться через десктопное приложение OpenPLC Editor
OpenPLC Runtime v4 — это серверная среда выполнения промышленных программно-логических контроллеров (ПЛК), предназначенная для запуска программ стандарта IEC 61131-3 на стандартном вычислительном оборудовании. Она разработана для управления через приложение OpenPLC Editor v4 с помощью REST API или через Autonomy Edge Cloud.
OpenPLC Runtime v4 состоит из двух основных компонентов:
Среда выполнения исполняет программы, созданные в OpenPLC Editor, поддерживая языки программирования IEC 61131-3 (логические диаграммы, структурированный текст, блок-схемы функций и т.д.).
Самый быстрый способ начать работу:
docker pull ghcr.io/autonomy-logic/openplc-runtime:latest
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
Среда выполнения запустится и будет слушать соединения от OpenPLC Editor на порту 8443. Не открывайте https://localhost:8443 в браузере — в отличие от среды выполнения v3, здесь нет веб-интерфейса. Вместо этого откройте приложение OpenPLC Editor для настольных компьютеров и настройте IP-адрес среды выполнения и учетные данные для подключения.
Предварительно собранные бинарные файлы: amd64, arm64, armv7
Для нативной установки в Linux:
# Clone repository
git clone https://github.com/Autonomy-Logic/openplc-runtime.git
cd openplc-runtime
git checkout development
# Install dependencies and compile
sudo ./install.sh
# Start the runtime
sudo ./start_openplc.sh
Среда выполнения запустится и будет слушать порт 8443. Подключитесь к ней из приложения OpenPLC Editor для настольных компьютеров, настроив IP-адрес среды выполнения и выполнив вход из редактора.
Поддерживаемые дистрибутивы: Ubuntu, Debian, Fedora, CentOS, RHEL
Требования: - Компилятор GCC - CMake - Python 3.8+ - Права суперпользователя (для планирования реального времени и привязки к порту)
/api/upload-file с аутентификацией JWT./api/compilation-status для отслеживания прогресса)./api/start-plc и /api/stop-plc./api/debug для отслеживания переменных в реальном времени.Среда выполнения компилирует загруженные программы в разделяемые библиотеки и загружает их динамически. Ядро ПЛК выполняется с приоритетом реального времени (SCHED_FIFO) для детерминированного тайминга.
Подробности интеграции редактора и среды выполнения смотрите в docs/EDITOR_INTEGRATION.md.
OpenPLC Runtime v4 использует двухпроцессную архитектуру:
Процессы общаются через доменные сокеты Unix (/run/runtime/plc_runtime.socket) для передачи команд/управления и потоков журналов.
Подробную информацию об архитектуре смотрите в docs/ARCHITECTURE.md.
Среда выполнения предоставляет внутренний REST API, используемый OpenPLC Editor. Этот API не предназначен для прямого взаимодействия конечным пользователем, но может использоваться для расширенной интеграции или диагностики.
Требуется аутентификация: Все эндпоинты, кроме /api/create-user (для первого пользователя), /api/login и /api/get-users-info, требуют аутентификации JWT через заголовок Authorization: Bearer <token>.
Основные эндпоинты:
- POST /api/create-user — Создание учётной записи пользователя.
- POST /api/login — Вход и получение JWT-токена.
- POST /api/upload-file — Загрузка ZIP-файла программы (multipart/form-data).
- GET /api/compilation-status — Получение статуса компиляции и журналов.
- GET /api/status — Получение статуса среды выполнения ПЛК.
- GET /api/start-plc — Запуск выполнения ПЛК.
- GET /api/stop-plc — Остановка выполнения ПЛК.
- GET /api/runtime-logs — Получение журналов среды выполнения.
Полную документацию по API с описанием процесса аутентификации и примерами смотрите в docs/API.md.
OpenPLC Editor использует интерфейс WebSocket для отладки в реальном времени. Продвинутые интеграторы также могут использовать этот интерфейс:
import { io } from 'socket.io-client';
// Connect with JWT authentication
const socket = io('https://localhost:8443', {
path: '/socket.io',
transports: ['websocket'],
auth: { token: jwt_token },
rejectUnauthorized: false // For self-signed certificates
});
// Listen for connection
socket.on('connect', () => {
console.log('Connected to runtime');
});
// Send debug command (hex-encoded)
socket.emit('debug_command', {
command: '44 00 03 00 00 00 01 00 02' // Get variables 0, 1, 2
});
// Receive response
socket.on('debug_response', (response) => {
console.log(response.data);
});
Полную документацию по протоколу отладки смотрите в docs/DEBUG_PROTOCOL.md и webserver/DEBUG_WEBSOCKET.md.
# Pull image
docker pull ghcr.io/autonomy-logic/openplc-runtime:latest
# Run with persistent storage
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
# View logs
docker logs -f openplc-runtime
# Stop container
docker stop openplc-runtime
Создайте файл docker-compose.yml:
version: '3.8'
services:
openplc-runtime:
image: ghcr.io/autonomy-logic/openplc-runtime:latest
container_name: openplc-runtime
ports:
- "8443:8443"
volumes:
- openplc-runtime-data:/var/run/runtime
restart: unless-stopped
volumes:
openplc-runtime-data:
Запустите командой: docker-compose up -d
Полную документацию по Docker смотрите в docs/DOCKER.md.
Установите зависимости:
# Ubuntu/Debian
sudo apt-get install build-essential gcc make cmake \
python3-dev python3-pip python3-venv
# Fedora/RHEL/CentOS
sudo dnf install gcc gcc-c++ make cmake \
python3 python3-devel python3-pip python3-venv
# Clone repository
git clone https://github.com/Autonomy-Logic/openplc-runtime.git
cd openplc-runtime
git checkout development
# Run installation script
sudo ./install.sh
Скрипт установки выполнит:
1. Определит ваш дистрибутив Linux.
2. Установит системные зависимости.
3. Создаст виртуальное окружение Python в venvs/runtime/.
4. Установит зависимости Python.
5. Скомпилирует ядро среды выполнения ПЛК с помощью CMake.
Для ручной компиляции:
# Create Python virtual environment
python3 -m venv venvs/runtime
source venvs/runtime/bin/activate
pip install -r requirements.txt
pip install -e .
# Compile runtime core
mkdir -p build
cd build
cmake ..
make -j$(nproc)
cd ..
sudo ./start_openplc.sh
Скрипт запуска: 1. Проверит статус установки. 2. Настроит виртуальные окружения для плагинов (если у плагинов есть файл requirements.txt). 3. Активирует виртуальное окружение среды выполнения. 4. Запустит веб-сервер (который автоматически управляет процессом среды выполнения ПЛК).
Примечание: Права суперпользователя требуются для:
- Планирования реального времени (приоритет SCHED_FIFO).
- Привязки к порту 8443.
- Создания доменных сокетов Unix в /run/runtime/.
OpenPLC Runtime поддерживает плагины для аппаратного ввода/вывода:
Типы плагинов: - Python-плагины (с изолированными виртуальными окружениями). - C/C++ плагины.
Настройка: Редактируйте файл plugins.conf для включения/отключения плагинов.
Пример:
# name,path,enabled,type,config_path,venv_path
modbus_slave,./core/src/drivers/plugins/python/modbus_slave_plugin/simple_modbus.py,1,0,./config.json,./venvs/modbus_slave
Управление виртуальными окружениями плагинов:
# Create venv for plugin
sudo bash scripts/manage_plugin_venvs.sh create plugin_name
# Install dependencies
sudo bash scripts/manage_plugin_venvs.sh install plugin_name
# List all plugin venvs
sudo bash scripts/manage_plugin_venvs.sh list
Полную документацию по плагинам смотрите в docs/PLUGIN_VENV_GUIDE.md и core/src/drivers/README.md.
Среда выполнения автоматически генерирует самоподписанные TLS-сертификаты при первом запуске:
- Сертификат: webserver/certOPENPLC.pem
- Закрытый ключ: webserver/keyOPENPLC.pem
OpenPLC Editor автоматически работает с самоподписанными сертификатами. Для продвинутых интеграторов, использующих API напрямую, потребуется настроить HTTP-клиент на приём самоподписанных сертификатов (например, curl -k или rejectUnauthorized: false).
Загружаемые ZIP-файлы проходят комплексную проверку безопасности: - Предотвращение пересечения каталогов - Ограничения размера (10 МБ на файл, 50 МБ суммарно) - Обнаружение ZIP-бомб (проверка коэффициента сжатия) - Белый список расширений (блокируются .exe, .dll, .sh, .bat, .js, .vbs, .scr) - Удаление метаданных macOS
Среда выполнения использует аутентификацию на основе JWT:
- Создание первого пользователя через POST /api/create-user (аутентификация не требуется)
- Вход через POST /api/login возвращает JWT access-токен
- Все последующие запросы требуют заголовка Authorization: Bearer <token>
- Секреты хранятся в /var/run/runtime/.env
- Хэширование паролей с помощью PBKDF2-SHA256 (600 000 итераций), соль и перец
Полную документацию по безопасности смотрите в docs/SECURITY.md.
Невозможно подключиться из OpenPLC Editor:
# Check if runtime is running
ps aux | grep python3 | grep webserver
# Check if port 8443 is listening
sudo netstat -tlnp | grep 8443
# Check firewall
sudo ufw status
Ошибка компиляции:
# Check runtime logs
sudo journalctl -u openplc-runtime -n 50
# Check if runtime directory exists
ls -la /run/runtime/
Ошибки доступа:
# Ensure running with sudo
sudo ./start_openplc.sh
# Check socket directory permissions
ls -la /run/runtime/
Полное руководство по устранению неполадок смотрите в docs/TROUBLESHOOTING.md.
git clone https://github.com/Autonomy-Logic/openplc-runtime.git
cd openplc-runtime
git checkout development
sudo ./install.sh
sudo bash scripts/setup-tests-env.sh
pytest tests/
pip install pre-commit
pre-commit install
developmentПолное руководство по разработке смотрите в docs/DEVELOPMENT.md.
openplc-runtime/
├── webserver/ # Flask web application (Python)
│ ├── app.py # Main application entry
│ ├── restapi.py # REST API blueprint
│ ├── debug_websocket.py # WebSocket debug interface
│ └── ...
├── core/
│ ├── src/plc_app/ # PLC runtime source (C/C++)
│ │ ├── plc_main.c # Main entry point
│ │ ├── plc_state_manager.c/h # State management
│ │ ├── unix_socket.c/h # IPC server
│ │ └── utils/ # Utilities (log, watchdog, timing)
│ └── src/drivers/ # Plugin driver system
├── scripts/ # Build and management scripts
│ ├── compile.sh # Compile PLC program
│ ├── compile-clean.sh # Clean and rename library
│ └── manage_plugin_venvs.sh # Plugin venv management
├── build/ # Compilation output
│ ├── plc_main # Compiled runtime executable
│ └── libplc_*.so # Compiled PLC program libraries
├── docs/ # Documentation
├── CMakeLists.txt # CMake build configuration
├── Dockerfile # Container definition
├── install.sh # Installation script
└── start_openplc.sh # Startup script
Для детерминированной производительности в реальном времени: - Рекомендуется выделенное ядро CPU - Ядро реального времени (PREEMPT_RT) необязательно, но желательно - Минимальное количество фоновых процессов - Привилегии root для планирования SCHED_FIFO
Подробности смотрите в файле LICENSE.
docs/OpenPLC Runtime v4 разработан и поддерживается компанией Autonomy Logic.