C:\YZWater)YZWater.Avalonia.exe# 使用 nssm 安装为服务
nssm install YZWater "C:\YZWater\YZWater.Avalonia.exe"
nssm set YZWater AppDirectory "C:\YZWater"
nssm start YZWater
# 1. 发布 Linux 版本
dotnet publish -c Release -r linux-x64 --self-contained -o ./publish
# 2. 进入发布目录
cd publish
# 3. 运行安装脚本
sudo ../deploy/install-linux.sh
# 4. 启动服务
sudo systemctl start yzwater
# 5. 查看状态
sudo systemctl status yzwater
# 创建目录
sudo mkdir -p /opt/yzwater
cd /opt/yzwater
# 复制发布文件
sudo cp -r /path/to/publish/* .
# 创建用户
sudo useradd -r -s /bin/false yzwater
sudo chown -R yzwater:yzwater /opt/yzwater
# 安装服务
sudo cp deploy/yzwater.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable yzwater
sudo systemctl start yzwater
# 构建镜像
docker-compose build
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f
./config/ # 配置文件(yzwater-config.json)
./data/ # 数据库(yzwater.db)
./logs/ # 日志文件
./backups/ # 数据库备份
./projects/ # 项目档案
yzwater-config.json(首次运行自动创建):
{
"PlcIp": "192.168.1.100",
"PlcPort": 102,
"PlcProtocol": "SiemensS7",
"AutoConnect": true,
"LevelHighAlarm": 80,
"LevelLowAlarm": 20,
"FlowHighAlarm": 100,
"FlowLowAlarm": 5,
"RunMode": "Direct",
"HubPort": 8765,
"HubServerUrl": "ws://localhost:8765",
"ActiveProject": "",
"IsDarkTheme": true,
"IsChinese": true
}
| 模式 | 说明 |
|---|---|
Direct |
直连 PLC(默认) |
Server |
中控服务端(连接 PLC + 启动 WebSocket) |
Client |
中控客户端(连接 WebSocket 服务端) |
Mock |
模拟模式(无 PLC,生成测试数据) |
| 协议 | 说明 | 默认端口 |
|---|---|---|
SiemensS7 |
西门子 S7 系列(S200/S300/S1200/S1500) | 102 |
MitsubishiMC |
三菱 MC 协议 | 6000 |
OmronFins |
欧姆龙 Fins 协议 | 9600 |
ModbusTcp |
Modbus TCP | 502 |
AllenBradley |
AB EtherNet/IP | 44818 |
系统支持通过项目档案适配不同泵站配置。项目 JSON 文件存放在 projects/ 目录下。
配置方法:
projects/ 目录下创建 JSON 文件(如 yangjie2.json)yzwater-config.json 中设置 ActiveProject 为项目名(不含后缀)项目档案结构:
{
"name": "扬杰二厂泵站",
"description": "3台排污泵 + 液位/压力/流量监控",
"viewTemplate": "PumpStation",
"pumps": [
{
"name": "1#泵",
"runAddress": "Q0.1",
"faultAddress": "I0.1",
"currentAddress": "VD50",
"startAddress": "M1.3",
"stopAddress": "M1.4"
}
],
"tanks": [
{
"name": "集水池",
"levelAddress": "VD62",
"startPump1LevelAddress": "VD500",
"stopLevelAddress": "VD528"
}
],
"gauges": [
{
"name": "压力",
"unit": "MPa",
"valueAddress": "VD6600",
"highSetAddress": "VD6704",
"lowSetAddress": "VD6700"
}
]
}
切换项目:
yzwater-config.json 中的 ActiveProject,重启程序程序配置:
{
"PlcIp": "192.168.1.100",
"PlcPort": 102,
"PlcProtocol": "SiemensS7"
}
测试连接:在参数设置页点击「测试连接」
地址格式:
VD100 - 变量存储区双字(4字节浮点数)M1.0 - 标志位Q0.1 - 输出位I0.1 - 输入位准备 PFX 证书文件(如 server.pfx)
在 Windows 绑定证书:
# 导入证书
Import-PfxCertificate -FilePath server.pfx -CertStoreLocation Cert:\LocalMachine\My
# 获取证书指纹
$thumbprint = (Get-PfxCertificate server.pfx).Thumbprint
# 绑定到端口
netsh http add sslcert ipport=0.0.0.0:8765 certhash=$thumbprint appid="{00000000-0000-0000-0000-000000000000}"
修改配置文件:
{
"HubPort": 8765,
"UseTls": true,
"CertificatePath": "C:\\YZWater\\server.pfx",
"CertificatePassword": "your_password"
}
修改配置文件:
{
"HubServerUrl": "wss://server-ip:8765",
"IgnoreCertificateErrors": false
}
注意:自签名证书可设置
IgnoreCertificateErrors: true(仅测试环境)
.\Logs\log-YYYYMMDD.txt/opt/yzwater/Logs/log-YYYYMMDD.txt./logs/log-YYYYMMDD.txt.\crash.log 或 /opt/yzwater/crash.log在应用界面点击"数据库备份",或:
# Linux
sqlite3 /opt/yzwater/Data/yzwater.db "VACUUM INTO '/opt/yzwater/Backups/backup_$(date +%Y%m%d_%H%M%S).db';"
创建 cron 任务(Linux):
# 每天凌晨 2 点备份
0 2 * * * sqlite3 /opt/yzwater/Data/yzwater.db "VACUUM INTO '/opt/yzwater/Backups/backup_\$(date +\%Y\%m\%d).db';"
# 停止服务
sudo systemctl stop yzwater
# 备份当前数据库
cp /opt/yzwater/Data/yzwater.db /opt/yzwater/Data/yzwater.db.bak
# 恢复备份
cp /opt/yzwater/Backups/backup_20240101.db /opt/yzwater/Data/yzwater.db
# 启动服务
sudo systemctl start yzwater
已在代码中自动启用:
修改 appsettings.json:
{
"Serilog": {
"MinimumLevel": {
"Default": "Information"
}
}
}
ping <PLC_IP>Logs/log-*.txtSQLite 支持单写多读,高并发写入时可能锁表。解决方案:
DataLoggingService.FlowLogIntervalSeconds)dotnet-trace)DataRetentionDays(默认 30 天)建议使用 Prometheus + Grafana 监控(待实现)。
配置文件格式变更时,参考 yzwater-config.json.example 手动迁移。
Logs/ 目录和 crash.log