311 lines
7.4 KiB
Markdown
311 lines
7.4 KiB
Markdown
# 充电桩管理系统使用说明
|
||||
|
|
|
|||
|
|
## 📋 概述
|
|||
|
|
|
|||
|
|
充电桩管理系统是一个基于 WinForms 的可视化管理工具,用于管理 AGV 系统中的充电桩设备。
|
|||
|
|
|
|||
|
|
## 🚀 快速开始
|
|||
|
|
|
|||
|
|
### 打开管理窗口
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 在代码中打开充电桩管理窗口
|
|||
|
|
var form = new StandardScene.Charge.ChargeStationManagementForm();
|
|||
|
|
form.ShowDialog();
|
|||
|
|
|
|||
|
|
// 或者在按钮点击事件中
|
|||
|
|
private void btnOpenChargeManagement_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
var form = new StandardScene.Charge.ChargeStationManagementForm();
|
|||
|
|
form.Show();
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 添加菜单项(推荐)
|
|||
|
|
|
|||
|
|
在主窗口的菜单栏中添加:
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 在主窗口的初始化代码中
|
|||
|
|
var menuItem = new ToolStripMenuItem("充电桩管理");
|
|||
|
|
menuItem.Click += (s, e) => {
|
|||
|
|
var form = new StandardScene.Charge.ChargeStationManagementForm();
|
|||
|
|
form.Show();
|
|||
|
|
};
|
|||
|
|
// 将 menuItem 添加到主菜单
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📖 功能说明
|
|||
|
|
|
|||
|
|
### 1. 充电桩列表(左侧面板)
|
|||
|
|
|
|||
|
|
#### 功能特性
|
|||
|
|
- **实时显示**:显示所有充电桩的详细信息
|
|||
|
|
- **颜色标识**:
|
|||
|
|
- 🟢 **绿色**:充电中
|
|||
|
|
- 🔴 **红色**:故障
|
|||
|
|
- ⚫ **灰色**:离线
|
|||
|
|
- ⚪ **白色**:空闲/其他状态
|
|||
|
|
- **搜索功能**:支持按编号、名称、IP地址搜索
|
|||
|
|
- **双击编辑**:双击列表项可快速编辑
|
|||
|
|
|
|||
|
|
#### 列表字段
|
|||
|
|
| 字段 | 说明 | 示例 |
|
|||
|
|
|-----|------|------|
|
|||
|
|
| 编号 | 充电桩唯一标识 | CS20240115123456 |
|
|||
|
|
| 名称 | 充电桩名称 | 1号充电桩 |
|
|||
|
|
| IP地址 | 设备IP | 192.168.1.100 |
|
|||
|
|
| 端口 | 通信端口 | 502 |
|
|||
|
|
| 电压(V) | 额定电压 | 220.0 |
|
|||
|
|
| 电流(A) | 额定电流 | 32.0 |
|
|||
|
|
| 功率(W) | 计算功率 | 7040.0 |
|
|||
|
|
| 状态 | 当前状态 | 空闲/充电中/故障 |
|
|||
|
|
| 启用 | 是否启用 | 是/否 |
|
|||
|
|
| 站点ID | 关联站点 | 1001 |
|
|||
|
|
| 备注 | 备注信息 | 南区1号充电桩 |
|
|||
|
|
|
|||
|
|
### 2. 充电桩编辑(右侧面板)
|
|||
|
|
|
|||
|
|
#### 必填字段
|
|||
|
|
- ✅ **编号**:自动生成(格式:CS+时间戳+随机数)
|
|||
|
|
- ✅ **名称**:充电桩名称,便于识别
|
|||
|
|
- ✅ **IP地址**:设备IP,必须为有效IP格式
|
|||
|
|
- ✅ **端口**:通信端口(1-65535)
|
|||
|
|
- ✅ **电压**:额定电压(0-1000V)
|
|||
|
|
- ✅ **电流**:额定电流(0-500A)
|
|||
|
|
|
|||
|
|
#### 选填字段
|
|||
|
|
- 📌 **状态**:空闲/充电中/故障/离线/维护中/预约中
|
|||
|
|
- 📌 **启用**:是否启用该充电桩
|
|||
|
|
- 📌 **站点ID**:关联的站点编号(与地图站点关联)
|
|||
|
|
- 📌 **备注**:额外说明信息
|
|||
|
|
|
|||
|
|
#### 自动计算
|
|||
|
|
- ⚡ **功率**:自动计算(电压 × 电流)
|
|||
|
|
|
|||
|
|
### 3. 操作按钮
|
|||
|
|
|
|||
|
|
#### 右侧编辑区
|
|||
|
|
- 🆕 **新增**:清空表单,准备添加新充电桩
|
|||
|
|
- 💾 **保存**:保存当前充电桩信息(新增或更新)
|
|||
|
|
- 🗑️ **删除**:删除当前选中的充电桩
|
|||
|
|
- ❌ **取消**:清空表单
|
|||
|
|
|
|||
|
|
#### 左侧列表区
|
|||
|
|
- 🔄 **刷新**:重新加载数据
|
|||
|
|
- 📤 **导出**:导出充电桩数据为 JSON 或 CSV 文件
|
|||
|
|
|
|||
|
|
## 🔒 数据验证规则
|
|||
|
|
|
|||
|
|
### IP地址验证
|
|||
|
|
```
|
|||
|
|
✅ 有效:192.168.1.100, 10.0.0.1, 172.16.0.1
|
|||
|
|
❌ 无效:192.168.1, 256.1.1.1, abc.def.ghi.jkl
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 端口验证
|
|||
|
|
```
|
|||
|
|
✅ 有效:502, 8080, 1234
|
|||
|
|
❌ 无效:0, 70000, -1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 电压验证
|
|||
|
|
```
|
|||
|
|
✅ 有效:220V, 380V, 110V
|
|||
|
|
❌ 无效:-10V, 1500V, 0V
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 电流验证
|
|||
|
|
```
|
|||
|
|
✅ 有效:32A, 16A, 63A
|
|||
|
|
❌ 无效:-5A, 600A, 0A
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 唯一性验证
|
|||
|
|
- ❌ 编号不能重复
|
|||
|
|
- ❌ IP地址+端口组合不能重复
|
|||
|
|
|
|||
|
|
## 💾 数据存储
|
|||
|
|
|
|||
|
|
### 存储位置
|
|||
|
|
```
|
|||
|
|
项目根目录/Data/ChargeStations.json
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 数据格式
|
|||
|
|
```json
|
|||
|
|
[
|
|||
|
|
{
|
|||
|
|
"StationId": "CS20240115123456",
|
|||
|
|
"Name": "1号充电桩",
|
|||
|
|
"IpAddress": "192.168.1.100",
|
|||
|
|
"Port": 502,
|
|||
|
|
"Voltage": 220.0,
|
|||
|
|
"Current": 32.0,
|
|||
|
|
"Status": 0,
|
|||
|
|
"Enabled": true,
|
|||
|
|
"SiteId": 1001,
|
|||
|
|
"Remarks": "南区1号充电桩",
|
|||
|
|
"CreatedTime": "2024-01-15T12:34:56",
|
|||
|
|
"ModifiedTime": "2024-01-15T14:20:30"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 代码集成
|
|||
|
|
|
|||
|
|
### 获取充电桩数据
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
using StandardScene.Charge;
|
|||
|
|
|
|||
|
|
// 获取数据服务实例
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
|
|||
|
|
// 获取所有充电桩
|
|||
|
|
var allStations = dataService.GetAllStations();
|
|||
|
|
|
|||
|
|
// 获取空闲充电桩
|
|||
|
|
var idleStations = dataService.GetIdleStations();
|
|||
|
|
|
|||
|
|
// 根据编号获取充电桩
|
|||
|
|
var station = dataService.GetStationById("CS20240115123456");
|
|||
|
|
|
|||
|
|
// 获取充电中的充电桩数量
|
|||
|
|
int chargingCount = dataService.GetChargingCount();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 添加/更新充电桩
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 创建新充电桩
|
|||
|
|
var newStation = new ChargeStation
|
|||
|
|
{
|
|||
|
|
Name = "2号充电桩",
|
|||
|
|
IpAddress = "192.168.1.101",
|
|||
|
|
Port = 502,
|
|||
|
|
Voltage = 220.0,
|
|||
|
|
Current = 32.0
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 添加
|
|||
|
|
if (dataService.AddStation(newStation, out string errorMsg))
|
|||
|
|
{
|
|||
|
|
Console.WriteLine("添加成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Console.WriteLine($"添加失败: {errorMsg}");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新状态
|
|||
|
|
dataService.UpdateStationStatus("CS20240115123456", ChargeStationStatus.Charging);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 删除充电桩
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 删除充电桩
|
|||
|
|
if (dataService.DeleteStation("CS20240115123456", out string errorMsg))
|
|||
|
|
{
|
|||
|
|
Console.WriteLine("删除成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Console.WriteLine($"删除失败: {errorMsg}");
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
1. **数据持久化**:所有数据自动保存到 JSON 文件,重启后数据不会丢失
|
|||
|
|
2. **线程安全**:数据服务使用单例模式和锁机制,支持多线程访问
|
|||
|
|
3. **状态管理**:充电中的充电桩无法删除,需先停止充电
|
|||
|
|
4. **IP冲突检测**:系统会自动检测IP和端口的冲突
|
|||
|
|
5. **数据备份**:建议定期备份 `Data/ChargeStations.json` 文件
|
|||
|
|
|
|||
|
|
## 🔧 扩展功能建议
|
|||
|
|
|
|||
|
|
### 与充电任务集成
|
|||
|
|
|
|||
|
|
在 `AbstractChargeMission.cs` 中集成充电桩数据:
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 在充电任务中获取充电桩信息
|
|||
|
|
private void SelectChargeStation(Car car)
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
var idleStations = dataService.GetIdleStations();
|
|||
|
|
|
|||
|
|
if (idleStations.Count > 0)
|
|||
|
|
{
|
|||
|
|
var nearestStation = FindNearestStation(car, idleStations);
|
|||
|
|
|
|||
|
|
// 更新充电桩状态
|
|||
|
|
dataService.UpdateStationStatus(
|
|||
|
|
nearestStation.StationId,
|
|||
|
|
ChargeStationStatus.Reserved
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 分配车辆到充电桩
|
|||
|
|
AssignCarToStation(car, nearestStation);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 充电完成后
|
|||
|
|
private void OnChargeComplete(Car car, ChargeStation station)
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
dataService.UpdateStationStatus(
|
|||
|
|
station.StationId,
|
|||
|
|
ChargeStationStatus.Idle
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 监控充电桩状态
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 定期检查充电桩在线状态
|
|||
|
|
private void MonitorChargeStations()
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
var stations = dataService.GetAllStations();
|
|||
|
|
|
|||
|
|
foreach (var station in stations)
|
|||
|
|
{
|
|||
|
|
if (station.Enabled)
|
|||
|
|
{
|
|||
|
|
bool isOnline = PingStation(station.IpAddress, station.Port);
|
|||
|
|
|
|||
|
|
var newStatus = isOnline
|
|||
|
|
? ChargeStationStatus.Idle
|
|||
|
|
: ChargeStationStatus.Offline;
|
|||
|
|
|
|||
|
|
if (station.Status != newStatus)
|
|||
|
|
{
|
|||
|
|
dataService.UpdateStationStatus(station.StationId, newStatus);
|
|||
|
|
Diagnosis.Log($"充电桩 {station.Name} 状态变更: {newStatus}",
|
|||
|
|
"ChargeStation", true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📞 技术支持
|
|||
|
|
|
|||
|
|
如有问题,请检查:
|
|||
|
|
1. `Data` 文件夹是否有写入权限
|
|||
|
|
2. JSON 文件格式是否正确
|
|||
|
|
3. 日志中的错误信息(标签:`ChargeStation`)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**版本**: 1.0.0
|
|||
|
|
**最后更新**: 2024-01-15
|
|||
|
|
**作者**: MDCS System
|
|||
|
|
|
|||
|
|
|
|||
|
|
|