跳到主要内容

嵌入式运行时 (本地数据库 + Python)

为减少现场部署负担,Darra Runtime 的安装包自带数据库和脚本运行时,客户开箱即用:

组件版本体积说明
SQLite内置 .NET零部署,单文件数据库,适合单机小型项目
MariaDB Portable11.4.4~72 MB完全兼容 MySQL 协议,精简到无调试符号/开发文件/备份工具
Python Embeddable3.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 x64installer/redist/vc_redist.x64.exe(24MB)缺失自动静默安装
WebView2 Evergreen Runtimeinstaller/redist/MicrosoftEdgeWebView2Setup.exe(1.7MB Bootstrapper)缺失自动静默安装
嵌入式 Python 3.11installer/runtime/python-3.11-embed/(23MB)随安装包 xcopy 到 InstallDir\runtime\
嵌入式 MariaDB 11.4installer/runtime/mariadb-11.4-portable/(72MB)同上
%ProgramData%\DarraPLC\{logs,certs,data,backups}安装时自动创建 + 授权

安装完成后,客户无需再装任何东西,双击 IDE / Runtime / Panel 快捷方式即可用。

首次启动 (自动)

Runtime 启动时 EmbeddedRuntimeManager 自动完成:

  1. 检测 runtime/python-3.11-embed/python.exeruntime/mariadb-11.4-portable/bin/mariadbd.exe
  2. MariaDB 首次启动:
    • 生成 my.ini(端口 13306,避开客户自装 MySQL 的 3306)
    • 初始化 data/ 目录(mariadb-install-db)
    • 创建默认数据库 plc(字符集 utf8mb4)
    • 启动 mariadbd.exe 作为子进程
    • 等待端口就绪(最多 25 秒)
  3. Python:无启动步骤,PythonRuntimeEngine 运行脚本时自动用嵌入式
  4. 失败降级:MariaDB 启动失败 → 自动回退到 SQLite,Service 继续运行

快捷方式 (安装后)

开始菜单 → Darra PLC:

  • Darra PLC IDE — 主 IDE
  • Darra PLC Runtime — Runtime 独立启动(测试)
  • Darra PLC Panel — 操作员界面
  • Darra MariaDB Client — 嵌入式 MariaDB 命令行(运维诊断用)
  • Uninstall Darra PLC — 卸载

数据库配置(在 IDE 里)

项目 > 数据库 > 添加数据库连接,下拉列表的前两个就是本地:

选项连接串(自动填好)
🏠 本地 SQLiteData 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-serverdnf 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.iniport = 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