415 lines
12 KiB
Markdown
415 lines
12 KiB
Markdown
# 🔌 充电桩实时数据功能说明
|
||||
|
|
|
|||
|
|
## ✅ 已完成的修改
|
|||
|
|
|
|||
|
|
### 1. 数据模型更新(ChargeStation.cs)
|
|||
|
|
|
|||
|
|
添加了实时电压和电流字段:
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
/// <summary>
|
|||
|
|
/// 实时电压 (V) - 当前充电时的实际电压
|
|||
|
|
/// </summary>
|
|||
|
|
[DisplayName("实时电压(V)")]
|
|||
|
|
public double RealTimeVoltage { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 实时电流 (A) - 当前充电时的实际电流
|
|||
|
|
/// </summary>
|
|||
|
|
[DisplayName("实时电流(A)")]
|
|||
|
|
public double RealTimeCurrent { get; set; }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 列表显示更新
|
|||
|
|
|
|||
|
|
#### ❌ 移除的列:
|
|||
|
|
- **功率(W)** - 功率列已移除
|
|||
|
|
|
|||
|
|
#### ✅ 新增的列:
|
|||
|
|
- **实时电压(V)** - 显示充电桩当前实际电压
|
|||
|
|
- **实时电流(A)** - 显示充电桩当前实际电流
|
|||
|
|
|
|||
|
|
#### 列表结构(更新后):
|
|||
|
|
```
|
|||
|
|
┌────────┬──────┬────────┬──────────┬────┬────────┬────────┬──────────┬──────────┬────┬────┬──────┬────┐
|
|||
|
|
│ 编号 │ 名称 │ 类型 │ IP地址 │端口│ 电压(V)│ 电流(A)│实时电压(V)│实时电流(A)│状态│启用│站点ID│备注│
|
|||
|
|
├────────┼──────┼────────┼──────────┼────┼────────┼────────┼──────────┼──────────┼────┼────┼──────┼────┤
|
|||
|
|
│CS12345 │1号桩 │标准 │192.168..│502 │220.0 │32.0 │215.5 │28.3 │充电│是 │1001 │... │
|
|||
|
|
│CS12346 │2号桩 │快速 │192.168..│502 │380.0 │63.0 │0.0 │0.0 │空闲│是 │1002 │... │
|
|||
|
|
└────────┴──────┴────────┴──────────┴────┴────────┴────────┴──────────┴──────────┴────┴────┴──────┴────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 界面更新
|
|||
|
|
|
|||
|
|
#### ❌ 移除的按钮:
|
|||
|
|
- **新增按钮** - 已从界面移除
|
|||
|
|
|
|||
|
|
#### ✅ 保留的按钮(重新排列):
|
|||
|
|
- **保存** - 位置调整到最左侧(20, 20),尺寸 100×50
|
|||
|
|
- **删除** - 位置调整到中间(150, 20),尺寸 100×50
|
|||
|
|
- **取消** - 位置调整到右侧(280, 20),尺寸 100×50
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌──────────────────────────────────┐
|
|||
|
|
│ │
|
|||
|
|
│ [ 保存 ] [ 删除 ] [ 取消 ]│
|
|||
|
|
│ (蓝色) (红色) (默认) │
|
|||
|
|
│ │
|
|||
|
|
└──────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 编辑区保留功能
|
|||
|
|
|
|||
|
|
**设置电压和电流功能完全保留**:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────┐
|
|||
|
|
│ 充电桩信息 │
|
|||
|
|
├─────────────────────────────────┤
|
|||
|
|
│ │
|
|||
|
|
│ 名称: [1号充电桩 ] │
|
|||
|
|
│ 类型: [标准充电桩 ▼] │
|
|||
|
|
│ IP地址:[192.168.1.100 ] │
|
|||
|
|
│ 端口: [502 ▲▼] │
|
|||
|
|
│ │
|
|||
|
|
│ 电压(V):[220.0 ▲▼] │ ← 额定电压(设置值)
|
|||
|
|
│ 电流(A):[32.0 ▲▼] │ ← 额定电流(设置值)
|
|||
|
|
│ │
|
|||
|
|
│ 状态: [空闲 ▼] │
|
|||
|
|
│ ☑ 启用充电桩 │
|
|||
|
|
│ ... │
|
|||
|
|
└─────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 字段说明
|
|||
|
|
|
|||
|
|
### 电压和电流的区别
|
|||
|
|
|
|||
|
|
| 字段 | 类型 | 说明 | 用途 |
|
|||
|
|
|------|------|------|------|
|
|||
|
|
| **Voltage** | 额定电压 | 充电桩的设计电压(固定值) | 充电桩参数配置 |
|
|||
|
|
| **Current** | 额定电流 | 充电桩的设计电流(固定值) | 充电桩参数配置 |
|
|||
|
|
| **RealTimeVoltage** | 实时电压 | 当前实际工作电压(动态值) | 实时监控显示 |
|
|||
|
|
| **RealTimeCurrent** | 实时电流 | 当前实际工作电流(动态值) | 实时监控显示 |
|
|||
|
|
|
|||
|
|
### 典型场景示例
|
|||
|
|
|
|||
|
|
#### 场景1:充电桩空闲时
|
|||
|
|
```
|
|||
|
|
额定电压:220.0V
|
|||
|
|
额定电流:32.0A
|
|||
|
|
实时电压:0.0V ← 未在充电,实时值为0
|
|||
|
|
实时电流:0.0A ← 未在充电,实时值为0
|
|||
|
|
状态:空闲
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景2:充电桩充电中
|
|||
|
|
```
|
|||
|
|
额定电压:220.0V
|
|||
|
|
额定电流:32.0A
|
|||
|
|
实时电压:215.5V ← 实际充电电压
|
|||
|
|
实时电流:28.3A ← 实际充电电流
|
|||
|
|
状态:充电中
|
|||
|
|
实时功率:6098.65W (215.5V × 28.3A)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景3:充电桩故障
|
|||
|
|
```
|
|||
|
|
额定电压:220.0V
|
|||
|
|
额定电流:32.0A
|
|||
|
|
实时电压:180.2V ← 电压异常偏低
|
|||
|
|
实时电流:5.1A ← 电流异常偏低
|
|||
|
|
状态:故障
|
|||
|
|
告警:电压低于额定值20%
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💻 代码实现
|
|||
|
|
|
|||
|
|
### 1. 创建充电桩时初始化
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
var station = new ChargeStation
|
|||
|
|
{
|
|||
|
|
Name = "1号充电桩",
|
|||
|
|
Type = ChargeStationType.Standard,
|
|||
|
|
IpAddress = "192.168.1.100",
|
|||
|
|
Port = 502,
|
|||
|
|
|
|||
|
|
// 额定参数(固定)
|
|||
|
|
Voltage = 220.0,
|
|||
|
|
Current = 32.0,
|
|||
|
|
|
|||
|
|
// 实时参数(初始为0)
|
|||
|
|
RealTimeVoltage = 0.0,
|
|||
|
|
RealTimeCurrent = 0.0,
|
|||
|
|
|
|||
|
|
Status = ChargeStationStatus.Idle
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 更新实时数据(模拟PLC数据)
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
/// <summary>
|
|||
|
|
/// 更新充电桩实时数据
|
|||
|
|
/// </summary>
|
|||
|
|
public void UpdateRealTimeData(string stationId, double voltage, double current)
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
var station = dataService.GetStationById(stationId);
|
|||
|
|
|
|||
|
|
if (station != null)
|
|||
|
|
{
|
|||
|
|
station.RealTimeVoltage = voltage;
|
|||
|
|
station.RealTimeCurrent = current;
|
|||
|
|
|
|||
|
|
dataService.UpdateStation(station, out string errorMsg);
|
|||
|
|
|
|||
|
|
// 检查异常
|
|||
|
|
CheckVoltageCurrentAbnormal(station);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检查电压电流是否异常
|
|||
|
|
/// </summary>
|
|||
|
|
private void CheckVoltageCurrentAbnormal(ChargeStation station)
|
|||
|
|
{
|
|||
|
|
// 充电中才检查
|
|||
|
|
if (station.Status == ChargeStationStatus.Charging)
|
|||
|
|
{
|
|||
|
|
// 电压偏差超过20%
|
|||
|
|
double voltageDiff = Math.Abs(station.RealTimeVoltage - station.Voltage) / station.Voltage;
|
|||
|
|
if (voltageDiff > 0.2)
|
|||
|
|
{
|
|||
|
|
Diagnosis.Log($"充电桩 {station.Name} 电压异常: " +
|
|||
|
|
$"额定{station.Voltage}V, 实时{station.RealTimeVoltage}V",
|
|||
|
|
"ChargeStation", true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 电流偏差超过20%
|
|||
|
|
double currentDiff = Math.Abs(station.RealTimeCurrent - station.Current) / station.Current;
|
|||
|
|
if (currentDiff > 0.2)
|
|||
|
|
{
|
|||
|
|
Diagnosis.Log($"充电桩 {station.Name} 电流异常: " +
|
|||
|
|
$"额定{station.Current}A, 实时{station.RealTimeCurrent}A",
|
|||
|
|
"ChargeStation", true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 充电开始时设置实时数据
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
/// <summary>
|
|||
|
|
/// 开始充电
|
|||
|
|
/// </summary>
|
|||
|
|
public void StartCharging(string stationId, int carId)
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
var station = dataService.GetStationById(stationId);
|
|||
|
|
|
|||
|
|
if (station != null)
|
|||
|
|
{
|
|||
|
|
// 更新状态
|
|||
|
|
station.Status = ChargeStationStatus.Charging;
|
|||
|
|
|
|||
|
|
// 初始化实时数据(初始值约为额定值的90%)
|
|||
|
|
station.RealTimeVoltage = station.Voltage * 0.9;
|
|||
|
|
station.RealTimeCurrent = station.Current * 0.9;
|
|||
|
|
|
|||
|
|
dataService.UpdateStation(station, out _);
|
|||
|
|
|
|||
|
|
Diagnosis.Log($"车辆 {carId} 开始充电: " +
|
|||
|
|
$"充电桩 {station.Name}, " +
|
|||
|
|
$"实时电压 {station.RealTimeVoltage:F1}V, " +
|
|||
|
|
$"实时电流 {station.RealTimeCurrent:F1}A",
|
|||
|
|
"ChargeStation", true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 充电结束时清零实时数据
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
/// <summary>
|
|||
|
|
/// 停止充电
|
|||
|
|
/// </summary>
|
|||
|
|
public void StopCharging(string stationId, int carId)
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
var station = dataService.GetStationById(stationId);
|
|||
|
|
|
|||
|
|
if (station != null)
|
|||
|
|
{
|
|||
|
|
// 更新状态
|
|||
|
|
station.Status = ChargeStationStatus.Idle;
|
|||
|
|
|
|||
|
|
// 清零实时数据
|
|||
|
|
station.RealTimeVoltage = 0.0;
|
|||
|
|
station.RealTimeCurrent = 0.0;
|
|||
|
|
|
|||
|
|
dataService.UpdateStation(station, out _);
|
|||
|
|
|
|||
|
|
Diagnosis.Log($"车辆 {carId} 充电完成: 充电桩 {station.Name}",
|
|||
|
|
"ChargeStation", true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 从PLC读取实时数据
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
/// <summary>
|
|||
|
|
/// 从PLC读取充电桩实时数据
|
|||
|
|
/// </summary>
|
|||
|
|
public void ReadRealTimeDataFromPLC()
|
|||
|
|
{
|
|||
|
|
var dataService = ChargeStationDataService.Instance;
|
|||
|
|
var stations = dataService.GetAllStations()
|
|||
|
|
.Where(s => s.Status == ChargeStationStatus.Charging)
|
|||
|
|
.ToList();
|
|||
|
|
|
|||
|
|
foreach (var station in stations)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 从PLC读取实时电压和电流
|
|||
|
|
// 这里需要根据实际PLC通信协议实现
|
|||
|
|
double voltage = ReadVoltageFromPLC(station.IpAddress, station.Port);
|
|||
|
|
double current = ReadCurrentFromPLC(station.IpAddress, station.Port);
|
|||
|
|
|
|||
|
|
// 更新实时数据
|
|||
|
|
station.RealTimeVoltage = voltage;
|
|||
|
|
station.RealTimeCurrent = current;
|
|||
|
|
|
|||
|
|
dataService.UpdateStation(station, out _);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Diagnosis.Log($"读取充电桩 {station.Name} 实时数据失败: {ex.Message}",
|
|||
|
|
"ChargeStation", true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 这些方法需要根据实际PLC协议实现
|
|||
|
|
private double ReadVoltageFromPLC(string ip, int port)
|
|||
|
|
{
|
|||
|
|
// TODO: 实现PLC通信读取电压
|
|||
|
|
return 0.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private double ReadCurrentFromPLC(string ip, int port)
|
|||
|
|
{
|
|||
|
|
// TODO: 实现PLC通信读取电流
|
|||
|
|
return 0.0;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 数据更新流程
|
|||
|
|
|
|||
|
|
### 完整充电流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 车辆到达充电站
|
|||
|
|
└─> 分配空闲充电桩
|
|||
|
|
└─> 状态: Idle → Reserved
|
|||
|
|
|
|||
|
|
2. 开始充电
|
|||
|
|
└─> 状态: Reserved → Charging
|
|||
|
|
└─> 设置实时数据初始值
|
|||
|
|
├─> RealTimeVoltage = Voltage * 0.9
|
|||
|
|
└─> RealTimeCurrent = Current * 0.9
|
|||
|
|
|
|||
|
|
3. 充电中(定时更新)
|
|||
|
|
└─> 每3-5秒从PLC读取实时数据
|
|||
|
|
├─> 更新 RealTimeVoltage
|
|||
|
|
├─> 更新 RealTimeCurrent
|
|||
|
|
└─> 检查异常并告警
|
|||
|
|
|
|||
|
|
4. 充电完成
|
|||
|
|
└─> 状态: Charging → Idle
|
|||
|
|
└─> 清零实时数据
|
|||
|
|
├─> RealTimeVoltage = 0.0
|
|||
|
|
└─> RealTimeCurrent = 0.0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 JSON数据格式
|
|||
|
|
|
|||
|
|
保存到文件的数据包含实时字段:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"StationId": "CS20240115123456",
|
|||
|
|
"Name": "1号充电桩",
|
|||
|
|
"Type": 0,
|
|||
|
|
"IpAddress": "192.168.1.100",
|
|||
|
|
"Port": 502,
|
|||
|
|
"Voltage": 220.0,
|
|||
|
|
"Current": 32.0,
|
|||
|
|
"RealTimeVoltage": 215.5,
|
|||
|
|
"RealTimeCurrent": 28.3,
|
|||
|
|
"Status": 1,
|
|||
|
|
"Enabled": true,
|
|||
|
|
"SiteId": 1001,
|
|||
|
|
"Remarks": "南区1号充电桩",
|
|||
|
|
"CreatedTime": "2024-01-15T12:34:56",
|
|||
|
|
"ModifiedTime": "2024-01-15T14:20:30"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 使用检查清单
|
|||
|
|
|
|||
|
|
- [x] 数据模型添加实时电压和电流字段
|
|||
|
|
- [x] 列表移除功率列
|
|||
|
|
- [x] 列表添加实时电压和实时电流列
|
|||
|
|
- [x] 界面移除新增按钮
|
|||
|
|
- [x] 按钮重新排列
|
|||
|
|
- [x] 保留设置电压和电流功能
|
|||
|
|
- [x] 列表正确显示实时数据
|
|||
|
|
- [x] 无编译错误
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 总结
|
|||
|
|
|
|||
|
|
### ✅ 完成的功能
|
|||
|
|
|
|||
|
|
1. **数据模型** - 添加实时电压和电流字段
|
|||
|
|
2. **列表显示** - 移除功率列,添加实时数据列
|
|||
|
|
3. **界面优化** - 移除新增按钮,重新排列其他按钮
|
|||
|
|
4. **功能保留** - 设置电压和电流功能完全保留
|
|||
|
|
|
|||
|
|
### 💡 后续集成建议
|
|||
|
|
|
|||
|
|
1. **与PLC通信集成**
|
|||
|
|
- 实现从PLC读取实时电压和电流
|
|||
|
|
- 定时更新实时数据(建议3-5秒)
|
|||
|
|
|
|||
|
|
2. **异常监控**
|
|||
|
|
- 实时监控电压电流偏差
|
|||
|
|
- 超过阈值时触发告警
|
|||
|
|
|
|||
|
|
3. **数据统计**
|
|||
|
|
- 记录充电过程的电压电流曲线
|
|||
|
|
- 分析充电效率和异常情况
|
|||
|
|
|
|||
|
|
4. **可视化展示**
|
|||
|
|
- 实时数据图表显示
|
|||
|
|
- 历史数据趋势分析
|
|||
|
|
|
|||
|
|
**现在您可以在充电桩管理界面中查看实时电压和电流数据了!** 🎉
|
|||
|
|
|