嵌入式运行时 (本地数据库 + Python)
为减少现场部署负担,Darra Runtime 的安装包自带数据库和脚本运行时,客户开箱即用:
| 组件 | 版本 | 体积 | 说明 |
|---|---|---|---|
| SQLite | 内置 .NET | — | 零部署,单文件数据库,适合单机小型项目 |
| MariaDB Portable | 11.4.4 | ~72 MB | 完全兼容 MySQL 协议,精简到无调试符号/开发文件/备份工具 |
| Python Embeddable | 3.11.9 | ~23 MB | 含 pip,可安装 OpenCV / HALCON / PyTorch / Pandas 等 |
为什么选 SQLite + MariaDB 作为两个本地默认
| 场景 | 推荐 |
|---|---|
| 单机 / 数据量 < 1GB / 无并发 | SQLite — 零配置,单文件 .db |
| 多用户 / HMI+MES 并发 / 数据量大 | MariaDB — 完整 SQL 支持,百万并发级 |
| 已有 MySQL 后端需对接 | MariaDB(协议完全兼容,可迁移) |
| 对接 SQL Server / Oracle / PostgreSQL | 手动配置,改 ConnectionString |
目录布局
Runtime 安装后的结构:
<安装目录>/
├── bin/
│ └── DarraRT.Service.exe
├── runtime/ ← 嵌入式运行时
│ ├── python-3.11-embed/ ← Python 可嵌入包
│ │ ├── python.exe
│ │ ├── python311.dll
│ │ ├── python311._pth ← 已启用 site-packages
│ │ └── get-pip.py
│ └── mariadb-11.4-portable/ ← MariaDB 绿色版
│ ├── bin/
│ │ ├── mariadbd.exe ← 服务器
│ │ ├── mariadb.exe ← 客户端
│ │ ├── mariadb-admin.exe
│ │ └── mariadb-install-db.exe
│ ├── share/
│ ├── data/ ← 首次启动自动初始化
│ └── my.ini ← 自动生成
└── data/
└── plc.db ← SQLite 默认路径
安装包自带(开箱即用)
Darra 安装包 installer/install_plc.ps1 已集成全部前置依赖:
| 前置依赖 | 来源 | 安装脚本处理方式 |
|---|---|---|
| .NET 8 Desktop Runtime | 客户机 | 检测,缺失则给出下载链接并中止(NativeAOT 版跳过) |
| VC++ 2015-2022 Redist x64 | installer/redist/vc_redist.x64.exe(24MB) | 缺失自动静默安装 |
| WebView2 Evergreen Runtime | installer/redist/MicrosoftEdgeWebView2Setup.exe(1.7MB Bootstrapper) | 缺失自动静默安装 |
| 嵌入式 Python 3.11 | installer/runtime/python-3.11-embed/(23MB) | 随安装包 xcopy 到 InstallDir\runtime\ |
| 嵌入式 MariaDB 11.4 | installer/runtime/mariadb-11.4-portable/(72MB) | 同上 |
%ProgramData%\DarraPLC\{logs,certs,data,backups} | — | 安装时自动创建 + 授权 |
安装完成后,客户无需再装任何东西,双击 IDE / Runtime / Panel 快捷方式即可用。
首次启动 (自动)
Runtime 启动时 EmbeddedRuntimeManager 自动完成:
- 检测
runtime/python-3.11-embed/python.exe和runtime/mariadb-11.4-portable/bin/mariadbd.exe - MariaDB 首次启动:
- 生成
my.ini(端口 13306,避开客户自装 MySQL 的 3306) - 初始化
data/目录(mariadb-install-db) - 创建默认数据库
plc(字符集 utf8mb4) - 启动
mariadbd.exe作为子进程 - 等待端口就绪(最多 25 秒)
- 生成
- Python:无启动步骤,
PythonRuntimeEngine运行脚本时自动用嵌入式 - 失败降级:MariaDB 启动失败 → 自动回退到 SQLite,Service 继续运行
快捷方式 (安装后)
开始菜单 → Darra PLC:
- Darra PLC IDE — 主 IDE
- Darra PLC Runtime — Runtime 独立启动(测试)
- Darra PLC Panel — 操作员界面
- Darra MariaDB Client — 嵌入式 MariaDB 命令行(运维诊断用)
- Uninstall Darra PLC — 卸载
数据库配置(在 IDE 里)
项目 > 数据库 > 添加数据库连接,下拉列表的前两个就是本地:
| 选项 | 连接串(自动填好) |
|---|---|
| 🏠 本地 SQLite | Data Source={DataDir}/plc.db;Pooling=true; |
| 🏠 本地 MariaDB(嵌入式) | Server=127.0.0.1;Port=13306;Database=plc;Uid=root;Pwd=embedded;Charset=utf8mb4; |
| 🌐 远程 MySQL | 需手填 |
| 🌐 远程 PostgreSQL | 需手填 |
| 🌐 SQL Server | 需手填 |
| 🌐 Oracle | 需手填 |
本地两个数据库 Runtime 已预装,无需再装。
Python 脚本运行时
PLC 程序调用 async_call_python(...) 时,Runtime 使用嵌入式 Python 子进程执行:
# 脚本示例 (在 IDE 的 Python 编辑器里)
import cv2
import numpy as np
def detect_edge(img_path: str) -> list:
img = cv2.imread(img_path, 0)
edges = cv2.Canny(img, 100, 200)
return [int(edges.sum())]
首次使用 OpenCV 需要 pip 安装:
runtime\python-3.11-embed\python.exe -m pip install opencv-python numpy
或者在 IDE 的「Python 包管理器」对话框里点选安装。
Python 多线程问题
Python 3.11 Embeddable 就是带 GIL 的标准多线程版本:
threading— 可多线程,IO 密集场景无问题(HTTP/串口/视觉采集)multiprocessing— 多进程,CPU 密集场景绕过 GIL(图像处理/ML 推理)- Darra 默认使用子进程池,每个脚本独立进程,天然避开 GIL 限制
没有"单线程版"与"多线程版"之分,用这个就行。Python 3.13+ 才有实验性的 no-GIL 版(python3.13t.exe),当前生产不用。
离线部署
如果工控机无法联网,Runtime 安装包(.exe / .msi)已内置完整 runtime/ 目录,离线安装后自动可用。
或者在联网机上跑 scripts/embedded/download-runtimes.ps1 下载并精简,再拷贝整个 runtime/ 到无网机:
# 在联网机
cd Darra_Software_PLC\scripts\embedded
powershell -ExecutionPolicy Bypass -File download-runtimes.ps1
# 把 ../../Darra_PLC_Service/runtime/ 拷贝到无网机同路径
体积优化(已做)
MariaDB 官方 zip 281 MB,Darra 精简到 72 MB:
| 删除内容 | 节省 |
|---|---|
bin/*.pdb 调试符号 | 72 MB |
include/ 开发头文件 | 7 MB |
lib/ 静态库 | 13 MB |
mysql-*.exe 别名(与 mariadb-* 重复) | ~30 MB |
mariadb-backup.exe / mariabackup.exe(备份工具,生产不需) | 37 MB |
aria_*.exe / myisam*.exe(存储引擎专用工具) | 20 MB |
sql-bench/ / mariadb-test/ / support-files/ | ~10 MB |
保留的核心工具:
mariadbd.exe— 服务器(必需)mariadb.exe— 命令行客户端mariadb-admin.exe— 管理命令mariadb-install-db.exe— 初始化mariadb-dump.exe— 备份导出server.dll/libmariadb.dll/ 插件 DLL
端口说明
| 端口 | 用途 |
|---|---|
| 13306 | 嵌入式 MariaDB (避开客户自装 3306) |
| 3306 | 客户自装 MySQL(如有) |
| 127.0.0.1 only | 仅监听本地回环,不对外暴露,防误配 |
Linux 支持
当前嵌入式运行时仅 Windows x64。Linux 版本计划:
- Python:使用系统 Python 或 pyenv 编译
- MariaDB:使用系统包管理器(
apt install mariadb-server或dnf install mariadb)
Linux 部署暂不提供"开箱即用"嵌入式模式,需按发行版安装依赖。
常见问题
Q: 已有 MySQL/MariaDB 安装,冲突吗?
A: 不冲突。嵌入式用 13306 端口,不动 3306。
Q: 数据库数据存哪?
A: <安装目录>/runtime/mariadb-11.4-portable/data/。卸载 Runtime 不会自动删除(除非勾选"清理数据")。
Q: root 密码安全吗?
A: 默认 embedded,仅本地回环监听,生产建议首次启动后改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '自定义密码';
并在 Runtime 配置里更新连接串。
Q: 可以改端口吗?
A: 改 my.ini 的 port = 13306,并同步更新 Runtime 的 ConnectionString。
Q: Python 装不了 pythonnet / numpy 怎么办?
A: 嵌入式 Python 的 pip 有时需要 --trusted-host pypi.org --trusted-host files.pythonhosted.org 参数,IDE 的「Python 包管理器」会自动处理。离线安装:下载 .whl 后用 python.exe -m pip install xxx.whl。