目录
一 上章回顾
二 安装NuGet包
LiveCharts2 支持多种 .NET 平台,为便于学习上手,这里我们选择较为简单的Winform应用程序 。虽然通过 NuGet 搜索仍然能找到旧版本的 LiveCharts,但 LiveCharts2 相对于 V0 进行了许多改进和修复。所以我们在这里学习更新的LiveCharts2,虽然LiveCharts2 目前仍处于开发测试阶段,我们仍然可以通过以下流程进行安装:
- 解决方案资源管理器
- 项目属性
- 管理NuGet程序包
- 选择包括预发行版
- 搜索LiveChartsCore.SkiaSharpView.WinForms
- 选择进行安装
三 定义日志实体类
1 创建LogEntry
创建LogEntry实体类,包括以下属性:
- Timestamp 时间戳,用于保存从Json文件中读取的时间
- YKData 仪控数据实体,包含了记录的仪控数据变量值
public class LogEntry
{
public DateTimeOffset Timestamp { get; set; }
public YKData Data { get; set; }
}
四 解析Json日志
调用解析日志函数,将指定路径日志文件解析成数值,并作为属性创建LogEntry对象
var logEntries = ParseLogFile("E:\\DownLoad\\WeChat Files\\wxid_wpjpzyzskcqw22\\FileStorage\\File\\2025-06\\CollectData\\CollectData\\bin\\Debug\\Serilogs\\20250630.json");
五 ParseLogFile
解析日志函数具体功能如下所示:
- 新建LogEntry集合
- 根据传入文件路径读取日志文件,返回JsonLines字符串数组
- 遍历JsonLines
- 将遍历到的每个Jason对象转换为JsonDocument对象
- 获取JsonDocument对象根目录元素
- 获取根目录下@t属性,并将时间转化为字符串类型
- 将时间解析为DateTimeOffset类型
- 增加八个小时,将时间转化为北京标准时间
- 获取根目录下YKData属性各子属性,解析为对应数据类型
- 将Jsond对象解析出的各子属性创建YKData对象,作为LogEntry子属性
- 将创建的LogEntry对象添加到集合中
static List<LogEntry> ParseLogFile(string filePath)
{
//定义日志实体集合
var entries = new List<LogEntry>();
//读取日志文件
var jsonLines = File.ReadAllLines(filePath);
//遍历JsonLines文件中每个JsonLines对象
foreach (var line in jsonLines)
{
try
{
//转化JsonLines对象为JsonDocument对象
using JsonDocument doc = JsonDocument.Parse(line);
//获取JsonDocument根元素
JsonElement root = doc.RootElement;
var entry = new LogEntry
{
//获取根元素时间戳属性,转化为事件类型并转换为北京时间
Timestamp = DateTimeOffset.Parse(root.GetProperty("@t").GetString()).AddHours(8),
//获取YKData实体各属性
Data = new YKData
{
GasTotal = root.GetProperty("YKData").GetProperty("GasTotal").GetUInt32(),
Heat1Gas = root.GetProperty("YKData").GetProperty("Heat1Gas").GetUInt32(),
Heat2Gas = root.GetProperty("YKData").GetProperty("Heat2Gas").GetUInt32(),
Heat3Gas = root.GetProperty("YKData").GetProperty("Heat3Gas").GetUInt32(),
SoakGas = root.GetProperty("YKData").GetProperty("SoakGas").GetUInt32(),
Heat1Air = root.GetProperty("YKData").GetProperty("Heat1Air").GetUInt32(),
Heat2Air = root.GetProperty("YKData").GetProperty("Heat2Air").GetUInt32(),
Heat3Air = root.GetProperty("YKData").GetProperty("Heat3Air").GetUInt32(),
SoakAir = root.GetProperty("YKData").GetProperty("SoakAir").GetUInt32(),
BlowerFrequency = root.GetProperty("YKData").GetProperty("BlowerFrequency").GetUInt32(),
GasIDFanFrequency = root.GetProperty("YKData").GetProperty("GasIDFanFrequency").GetUInt32(),
AirIDFanFrequency = root.GetProperty("YKData").GetProperty("AirIDFanFrequency").GetUInt32(),
Heat1TopTemp = root.GetProperty("YKData").GetProperty("Heat1TopTemp").GetUInt32(),
Heat2TopTemp = root.GetProperty("YKData").GetProperty("Heat2TopTemp").GetUInt32(),
Heat3TopTemp = root.GetProperty("YKData").GetProperty("Heat3TopTemp").GetUInt32(),
SoakTopTemp = root.GetProperty("YKData").GetProperty("SoakTopTemp").GetUInt32(),
Heat1SetTemp = root.GetProperty("YKData").GetProperty("Heat1SetTemp").GetUInt32(),
Heat2SetTemp = root.GetProperty("YKData").GetProperty("Heat2SetTemp").GetUInt32(),
Heat3SetTemp = root.GetProperty("YKData").GetProperty("Heat3SetTemp").GetUInt32(),
SoakSetTemp = root.GetProperty("YKData").GetProperty("SoakSetTemp").GetUInt32(),
Heat1FeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1FeedBackTemp").GetUInt32(),
Heat2FeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2FeedBackTemp").GetUInt32(),
Heat3FeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3FeedBackTemp").GetUInt32(),
SoakFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakFeedBackTemp").GetUInt32(),
Heat1AirSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1AirSmokeFeedBackTemp").GetUInt32(),
Heat2AirSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2AirSmokeFeedBackTemp").GetUInt32(),
Heat3AirSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3AirSmokeFeedBackTemp").GetUInt32(),
SoakAirSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakAirSmokeFeedBackTemp").GetUInt32(),
Heat1GasSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1GasSmokeFeedBackTemp").GetUInt32(),
Heat2GasSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2GasSmokeFeedBackTemp").GetUInt32(),
Heat3GasSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3GasSmokeFeedBackTemp").GetUInt32(),
SoakGasSmokeFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakGasSmokeFeedBackTemp").GetUInt32(),
Heat1GasPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1GasPositionFeedBackTemp").GetUInt32(),
Heat2GasPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2GasPositionFeedBackTemp").GetUInt32(),
Heat3GasPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3GasPositionFeedBackTemp").GetUInt32(),
SoakGasPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakGasPositionFeedBackTemp").GetUInt32(),
Heat1AirPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1AirPositionFeedBackTemp").GetUInt32(),
Heat2AirPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2AirPositionFeedBackTemp").GetUInt32(),
Heat3AirPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3AirPositionFeedBackTemp").GetUInt32(),
SoakAirPositionFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakAirPositionFeedBackTemp").GetUInt32(),
Heat1GasSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1GasSmokePositionFeedBackTemp").GetUInt32(),
Heat2GasSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2GasSmokePositionFeedBackTemp").GetUInt32(),
Heat3GasSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3GasSmokePositionFeedBackTemp").GetUInt32(),
SoakGasSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakGasSmokePositionFeedBackTemp").GetUInt32(),
Heat1AirSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat1AirSmokePositionFeedBackTemp").GetUInt32(),
Heat2AirSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat2AirSmokePositionFeedBackTemp").GetUInt32(),
Heat3AirSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("Heat3AirSmokePositionFeedBackTemp").GetUInt32(),
SoakAirSmokePositionFeedBackTemp = root.GetProperty("YKData").GetProperty("SoakAirSmokePositionFeedBackTemp").GetUInt32(),
}
};
//添加日志实体到集合
entries.Add(entry);
}
catch (Exception ex)
{
Console.WriteLine($"解析错误: {ex.Message}");
}
}
return entries;
}
六 创建数据源数组
创建时间戳集合和双精度属性集合,
// 2. 准备图表数据
var timeValues = new List<DateTime>();
var GasTotal = new List<double>();
var Heat1Gas = new List<double>();
var Heat2Gas = new List<double>();
var Heat3Gas = new List<double>();
var SoakGas = new List<double>();
var Heat1Air = new List<double>();
var Heat2Air = new List<double>();
var Heat3Air = new List<double>();
var SoakAir = new List<double>();
var BlowerFrequency = new List<double>();
var GasIDFanFrequency = new List<double>();
var AirIDFanFrequency = new List<double>();
var Heat1TopTemp = new List<double>();
var Heat2TopTemp = new List<double>();
var Heat3TopTemp = new List<double>();
var SoakTopTemp = new List<double>();
var Heat1SetTemp = new List<double>();
var Heat2SetTemp = new List<double>();
var Heat3SetTemp = new List<double>();
var SoakSetTemp = new List<double>();
var Heat1FeedBackTemp = new List<double>();
var Heat2FeedBackTemp = new List<double>();
var Heat3FeedBackTemp = new List<double>();
var SoakFeedBackTemp = new List<double>();
var Heat1AirSmokeFeedBackTemp = new List<double>();
var Heat2AirSmokeFeedBackTemp = new List<double>();
var Heat3AirSmokeFeedBackTemp = new List<double>();
var SoakAirSmokeFeedBackTemp = new List<double>();
var Heat1GasSmokeFeedBackTemp = new List<double>();
var Heat2GasSmokeFeedBackTemp = new List<double>();
var Heat3GasSmokeFeedBackTemp = new List<double>();
var SoakGasSmokeFeedBackTemp = new List<double>();
var Heat1GasPositionFeedBackTemp = new List<double>();
var Heat2GasPositionFeedBackTemp = new List<double>();
var Heat3GasPositionFeedBackTemp = new List<double>();
var SoakGasPositionFeedBackTemp = new List<double>();
var Heat1AirPositionFeedBackTemp = new List<double>();
var Heat2AirPositionFeedBackTemp = new List<double>();
var Heat3AirPositionFeedBackTemp = new List<double>();
var SoakAirPositionFeedBackTemp = new List<double>();
var Heat1GasSmokePositionFeedBackTemp = new List<double>();
var Heat2GasSmokePositionFeedBackTemp = new List<double>();
var Heat3GasSmokePositionFeedBackTemp = new List<double>();
var SoakGasSmokePositionFeedBackTemp = new List<double>();
var Heat1AirSmokePositionFeedBackTemp = new List<double>();
var Heat2AirSmokePositionFeedBackTemp = new List<double>();
var Heat3AirSmokePositionFeedBackTemp = new List<double>();
var SoakAirSmokePositionFeedBackTemp = new List<double>();
七 初始化数据源数组
遍历LogEntry数组,依次读取所有属性,并分类存入对应的数据源数组中
foreach (var entry in logEntries)
{
timeValues.Add(entry.Timestamp.DateTime);
GasTotal.Add(entry.Data.GasTotal);
Heat1Gas.Add(entry.Data.Heat1Gas);
Heat2Gas.Add(entry.Data.Heat2Gas);
Heat3Gas.Add(entry.Data.Heat3Gas);
SoakGas.Add(entry.Data.SoakGas);
Heat1Air.Add(entry.Data.Heat1Air);
Heat2Air.Add(entry.Data.Heat2Air);
Heat3Air.Add(entry.Data.Heat3Air);
SoakAir.Add(entry.Data.SoakAir);
BlowerFrequency.Add(entry.Data.BlowerFrequency);
GasIDFanFrequency.Add(entry.Data.GasIDFanFrequency);
AirIDFanFrequency.Add(entry.Data.AirIDFanFrequency);
Heat1TopTemp.Add(entry.Data.Heat1TopTemp);
Heat2TopTemp.Add(entry.Data.Heat2TopTemp);
Heat3TopTemp.Add(entry.Data.Heat3TopTemp);
SoakTopTemp.Add(entry.Data.SoakTopTemp);
Heat1SetTemp.Add(entry.Data.Heat1SetTemp);
Heat2SetTemp.Add(entry.Data.Heat2SetTemp);
Heat3SetTemp.Add(entry.Data.Heat3SetTemp);
SoakSetTemp.Add(entry.Data.SoakSetTemp);
Heat1FeedBackTemp.Add(entry.Data.Heat1FeedBackTemp);
Heat2FeedBackTemp.Add(entry.Data.Heat2FeedBackTemp);
Heat3FeedBackTemp.Add(entry.Data.Heat3FeedBackTemp);
SoakFeedBackTemp.Add(entry.Data.SoakFeedBackTemp);
Heat1AirSmokeFeedBackTemp.Add(entry.Data.Heat1AirSmokeFeedBackTemp);
Heat2AirSmokeFeedBackTemp.Add(entry.Data.Heat2AirSmokeFeedBackTemp);
Heat3AirSmokeFeedBackTemp.Add(entry.Data.Heat3AirSmokeFeedBackTemp);
SoakAirSmokeFeedBackTemp.Add(entry.Data.SoakAirSmokeFeedBackTemp);
Heat1GasSmokeFeedBackTemp.Add(entry.Data.Heat1GasSmokeFeedBackTemp);
Heat2GasSmokeFeedBackTemp.Add(entry.Data.Heat2GasSmokeFeedBackTemp);
Heat3GasSmokeFeedBackTemp.Add(entry.Data.Heat3GasSmokeFeedBackTemp);
SoakGasSmokeFeedBackTemp.Add(entry.Data.SoakGasSmokeFeedBackTemp);
Heat1GasPositionFeedBackTemp.Add(entry.Data.Heat1GasPositionFeedBackTemp);
Heat2GasPositionFeedBackTemp.Add(entry.Data.Heat2GasPositionFeedBackTemp);
Heat3GasPositionFeedBackTemp.Add(entry.Data.Heat3GasPositionFeedBackTemp);
SoakGasPositionFeedBackTemp.Add(entry.Data.SoakGasPositionFeedBackTemp);
Heat1AirPositionFeedBackTemp.Add(entry.Data.Heat1AirPositionFeedBackTemp);
Heat2AirPositionFeedBackTemp.Add(entry.Data.Heat2AirPositionFeedBackTemp);
Heat3AirPositionFeedBackTemp.Add(entry.Data.Heat3AirPositionFeedBackTemp);
SoakAirPositionFeedBackTemp.Add(entry.Data.SoakAirPositionFeedBackTemp);
Heat1GasSmokePositionFeedBackTemp.Add(entry.Data.Heat1GasSmokePositionFeedBackTemp);
Heat2GasSmokePositionFeedBackTemp.Add(entry.Data.Heat2GasSmokePositionFeedBackTemp);
Heat3GasSmokePositionFeedBackTemp.Add(entry.Data.Heat3GasSmokePositionFeedBackTemp);
SoakGasSmokePositionFeedBackTemp.Add(entry.Data.SoakGasSmokePositionFeedBackTemp);
Heat1AirSmokePositionFeedBackTemp.Add(entry.Data.Heat1AirSmokePositionFeedBackTemp);
Heat2AirSmokePositionFeedBackTemp.Add(entry.Data.Heat2AirSmokePositionFeedBackTemp);
Heat3AirSmokePositionFeedBackTemp.Add(entry.Data.Heat3AirSmokePositionFeedBackTemp);
SoakAirSmokePositionFeedBackTemp.Add(entry.Data.SoakAirSmokePositionFeedBackTemp);
}
八 总结
以上我给大家介绍了安装NuGet包、定义日志实体类、解析Json日志、ParseLogFile、创建属性数据源数组、初始化数据源数组等内容。
九 下章预告
下一章我会教大家如何根据完成初始化的数据源数组生成PLC数据趋势。
博主RaymondLeigh:如果您觉得本文为您提供了结局思路或解决了您的实际问题,麻烦您🙏帮忙点赞、收藏、评论、关注一键四连,您的举手之劳将为我写作提供动力源泉!🤞
print('Hello,RaymondLeigh!') # 每日问候,跟大家问好!
🌞精品前端UI设计专栏:MaterialDesign专栏 LiveCharts2专栏
💾精品数据库专栏:SqlServer专栏 EFCore专栏 Oracle专栏
💻精品程序开发专栏 VisualStudio专栏
💻精品后端专栏 Scoket专栏 SiemensS7数采 TIA Portal编程 OPCUA专栏
💾精品解析专栏 Serilog日志解析 FormatConverter