using GSModbus.Config;
namespace GSModbus
{
///
/// 配置驱动Modbus系统演示程序
///
public static class ConfigDemo
{
///
/// 演示配置系统的使用
///
public static async Task RunDemoAsync()
{
Console.WriteLine("=== GSModbus 通用配置系统演示 ===\n");
// 1. 创建配置管理器
var configManager = new ConfigurationManager();
// 订阅配置事件
configManager.ConfigurationLoaded += (sender, e) =>
{
Console.WriteLine($"✅ 配置加载成功: {e.Configuration.ProjectName}");
Console.WriteLine($" 配置文件路径: {e.ConfigPath}");
Console.WriteLine($" PLC地址: {e.Configuration.Connection.IpAddress}:{e.Configuration.Connection.Port}");
};
configManager.ConfigurationError += (sender, e) =>
{
Console.WriteLine($"❌ 配置错误: {e.ErrorMessage}");
};
// 2. 尝试加载默认配置
Console.WriteLine("1. 正在加载默认配置文件...");
var loaded = await configManager.LoadDefaultConfigurationAsync();
if (!loaded)
{
Console.WriteLine("⚠️ 默认配置文件不存在,创建示例配置...\n");
await CreateExampleConfigurationAsync();
// 重试加载
loaded = await configManager.LoadDefaultConfigurationAsync();
}
if (!loaded)
{
Console.WriteLine("❌ 无法加载配置文件,演示终止");
return;
}
// 3. 显示配置信息
Console.WriteLine("\n2. 配置信息摘要:");
DisplayConfigurationSummary(configManager.CurrentConfiguration!);
// 4. 创建通用Modbus管理器
Console.WriteLine("\n3. 创建通用Modbus管理器...");
using var modbusManager = new UniversalModbusManager(configManager.CurrentConfiguration);
// 订阅事件
modbusManager.ConnectionStatusChanged += (sender, isConnected) =>
{
Console.WriteLine($"🔗 连接状态: {(isConnected ? "已连接" : "未连接")}");
};
modbusManager.DataReceived += (sender, data) =>
{
Console.WriteLine($"📊 接收到数据: {data.GetDataSummary()}");
};
modbusManager.ErrorOccurred += (sender, error) =>
{
Console.WriteLine($"⚠️ 通信错误: {error}");
};
modbusManager.StatsUpdated += (sender, stats) =>
{
Console.WriteLine($"📈 统计信息: {stats.GetSummary()}");
};
// 5. 演示连接(注意:实际PLC可能不存在)
Console.WriteLine("\n4. 尝试连接到PLC...");
Console.WriteLine(" 注意:这只是演示,实际PLC可能不存在");
var connected = await modbusManager.ConnectAsync();
if (connected)
{
Console.WriteLine("✅ 连接成功!数据读取将开始...");
// 等待一段时间观察数据
Console.WriteLine(" 正在读取数据,按任意键停止...");
Console.ReadKey();
}
else
{
Console.WriteLine("❌ 连接失败(这是正常的,因为演示环境中可能没有实际PLC)");
}
// 6. 显示字段映射
Console.WriteLine("\n5. 字段映射信息:");
DisplayFieldMappings(configManager.CurrentConfiguration!);
Console.WriteLine("\n=== 演示结束 ===");
}
///
/// 创建示例配置文件
///
private static async Task CreateExampleConfigurationAsync()
{
Console.WriteLine("正在创建示例配置文件...");
try
{
// 确保配置目录存在
var configDir = Path.GetDirectoryName(ConfigurationManager.DEFAULT_CONFIG_PATH);
if (!string.IsNullOrEmpty(configDir) && !Directory.Exists(configDir))
{
Directory.CreateDirectory(configDir);
}
// 配置文件已经存在了(我们之前创建的)
if (File.Exists(ConfigurationManager.DEFAULT_CONFIG_PATH))
{
Console.WriteLine("✅ 配置文件已存在");
return;
}
// 创建默认配置
var defaultConfig = ConfigurationManager.CreateDefaultConfiguration();
var configManager = new ConfigurationManager();
await configManager.SaveConfigurationAsync(ConfigurationManager.DEFAULT_CONFIG_PATH);
Console.WriteLine($"✅ 已创建示例配置文件: {ConfigurationManager.DEFAULT_CONFIG_PATH}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ 创建配置文件失败: {ex.Message}");
}
}
///
/// 显示配置摘要信息
///
private static void DisplayConfigurationSummary(ModbusConfiguration config)
{
Console.WriteLine($" 项目名称: {config.ProjectName}");
Console.WriteLine($" 配置版本: {config.ConfigVersion}");
Console.WriteLine($" PLC地址: {config.Connection.IpAddress}:{config.Connection.Port}");
Console.WriteLine($" 心跳间隔: {config.Communication.HeartbeatIntervalMs}ms");
Console.WriteLine($" 数据轮询: {config.Communication.DataPollingIntervalMs}ms");
Console.WriteLine($" 自动重连: {(config.Communication.EnableAutoReconnect ? "启用" : "禁用")}");
// 统计字段数量
var controlFields = config.InputAddresses.ControlSignals.Count;
var productFields = config.InputAddresses.ProductData.Count;
var measurementFields = config.InputAddresses.MeasurementData.Count;
var totalFields = controlFields + productFields + measurementFields;
Console.WriteLine($" 数据字段: {totalFields}个 (控制:{controlFields}, 产品:{productFields}, 测量:{measurementFields})");
}
///
/// 显示字段映射信息
///
private static void DisplayFieldMappings(ModbusConfiguration config)
{
Console.WriteLine(" 输出地址 (MES → PLC):");
Console.WriteLine($" 心跳包: D{config.OutputAddresses.HeartbeatAddress.Address}");
Console.WriteLine($" 数据确认: D{config.OutputAddresses.DataConfirmationAddress.Address}");
Console.WriteLine("\n 输入地址 (PLC → MES):");
if (config.InputAddresses.ControlSignals.Any())
{
Console.WriteLine(" 控制信号:");
foreach (var field in config.InputAddresses.ControlSignals)
{
Console.WriteLine($" {field.Value.DisplayName}: D{field.Value.Address} ({field.Value.DataType})");
}
}
if (config.InputAddresses.ProductData.Any())
{
Console.WriteLine(" 产品数据:");
foreach (var field in config.InputAddresses.ProductData)
{
Console.WriteLine($" {field.Value.DisplayName}: D{field.Value.Address} ({field.Value.DataType}, 长度:{field.Value.Length})");
}
}
if (config.InputAddresses.MeasurementData.Any())
{
Console.WriteLine(" 测量数据:");
foreach (var field in config.InputAddresses.MeasurementData)
{
var unit = !string.IsNullOrEmpty(field.Value.Unit) ? $" {field.Value.Unit}" : "";
Console.WriteLine($" {field.Value.DisplayName}: D{field.Value.Address} ({field.Value.DataType}{unit})");
}
}
}
///
/// 演示动态数据访问
///
public static void DemoDynamicDataAccess(DynamicModbusData data)
{
Console.WriteLine("\n=== 动态数据访问演示 ===");
// 获取所有字段
foreach (var fieldName in data.FieldNames)
{
var config = data.GetFieldConfiguration(fieldName);
var value = data.GetFieldValue(fieldName);
var displayValue = config != null ? ModbusDataParser.FormatDisplayValue(value, config) : value?.ToString();
Console.WriteLine($" {config?.DisplayName ?? fieldName}: {displayValue}");
}
// 演示类型安全的访问
Console.WriteLine("\n类型安全访问示例:");
Console.WriteLine($" 字符串字段示例: '{data.GetString("ProductModel", "未知")}'");
Console.WriteLine($" 整数字段示例: {data.GetInt("TestStation", 0)}");
Console.WriteLine($" 布尔字段示例: {data.GetBool("TestResult", false)}");
Console.WriteLine($"\n数据读取时间: {data.ReadTime:yyyy-MM-dd HH:mm:ss}");
}
///
/// 测试数据解析逻辑 - 使用原始值.txt中的样本数据
///
public static void TestDataParsing()
{
Console.WriteLine("\n=== 数据解析测试(基于原始值.txt样本数据)===");
// 创建测试用的字段配置
var minInstallSizeConfig = new DataField
{
Address = 6033,
DataType = "Integer",
Length = 2,
Scale = 0.01,
Unit = "mm",
DecimalPlaces = 2,
DisplayName = "最小安装尺寸"
};
var maxInstallSizeConfig = new DataField
{
Address = 6035,
DataType = "Integer",
Length = 2,
Scale = 0.01,
Unit = "mm",
DecimalPlaces = 2,
DisplayName = "最大安装尺寸"
};
var workingVoltageConfig = new DataField
{
Address = 6041,
DataType = "Integer",
Length = 2,
Scale = 0.01,
Unit = "V",
DecimalPlaces = 2,
DisplayName = "工作电压"
};
var workingPressureConfig = new DataField
{
Address = 6045,
DataType = "Integer",
Length = 2,
Scale = 0.01,
Unit = "bar",
DecimalPlaces = 2,
DisplayName = "工作压力"
};
// 原始值.txt中的测试数据
Console.WriteLine("\n测试样本数据:");
TestSingleField("最小安装尺寸", new int[] { -31513, 0 }, minInstallSizeConfig);
TestSingleField("最大安装尺寸", new int[] { -18440, 0 }, maxInstallSizeConfig);
TestSingleField("工作电压", new int[] { 2891, 0 }, workingVoltageConfig);
TestSingleField("工作压力", new int[] { -31039, 1 }, workingPressureConfig);
// 额外的测试数据
TestSingleField("速度", new int[] { 541, 0 }, new DataField
{
DataType = "Integer", Length = 2, Scale = 0.01, Unit = "mm/s", DecimalPlaces = 2, DisplayName = "速度"
});
TestSingleField("工作电流", new int[] { 125, 0 }, new DataField
{
DataType = "Integer", Length = 2, Scale = 0.01, Unit = "A", DecimalPlaces = 2, DisplayName = "工作电流"
});
}
private static void TestSingleField(string testName, int[] registers, DataField config)
{
Console.WriteLine($"\n--- 测试 {testName} ---");
Console.WriteLine($"原始寄存器: [{string.Join(", ", registers)}]");
try
{
var result = ModbusDataParser.ParseFieldData(registers, config);
var displayValue = ModbusDataParser.FormatDisplayValue(result, config);
Console.WriteLine($"解析结果: {result}");
Console.WriteLine($"显示值: {displayValue}");
}
catch (Exception ex)
{
Console.WriteLine($"解析失败: {ex.Message}");
}
}
}
}