This commit is contained in:
GukSang.Jin
2026-01-05 16:45:14 +08:00
parent 247a744969
commit 1aac1cb210

View File

@@ -446,15 +446,28 @@ namespace WindowsFormsApp6
// 创建平均值行
DataRow avgRow = dataTable.NewRow();
avgRow["序号"] = "平均时间(s)";
avgRow["序号"] = $"平均时间(s) 试样{startSample}-{endSample}";
// 将平均值显示在该组的第一个试样列
avgRow[$"试样{startSample}"] = groupAvg;
// 将平均值显示在该组的所有试样列(合并显示效果)
for (int i = startSample; i <= endSample; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = groupAvg;
}
}
// 其他列设置为空
for (int i = 1; i <= currentSampleCount; i++)
for (int i = 1; i < startSample; i++)
{
if (i != startSample && dataTable.Columns.Contains($"试样{i}"))
if (dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = DBNull.Value;
}
}
for (int i = endSample + 1; i <= currentSampleCount; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = DBNull.Value;
}
@@ -483,7 +496,7 @@ namespace WindowsFormsApp6
/// <summary>
/// 读取Form2数据液体吸收量
/// PLC地址D420 - 初始重量, D422 - 浸润后重量, D402 - 浸润时间, D406 - 悬挂时间, D310 - 运行速度
/// PLC地址D420 - 初始重量, D422 - 浸润后重量, D402 - 浸润时间, D406 - 悬挂时间, D410 - 运行速度
/// 信号量M252
/// 每次测试动态添加一列显示每5个试样计算平均值、最大值、标准偏差
/// </summary>
@@ -491,26 +504,25 @@ namespace WindowsFormsApp6
{
try
{
// 读取当前试样的数据每次读取1个寄存器 = 2个字节
// 读取初始重量D4201个寄存器
ushort[] initialWeightReg = _modbusMaster.ReadHoldingRegisters(slaveId, 420, 1);
double initialWeight = initialWeightReg[0];
// 读取初始重量D4202个寄存器浮点数单位g精度0.01g
ushort[] initialWeightReg = _modbusMaster.ReadHoldingRegisters(slaveId, 420, 2);
double initialWeight = ConvertRegistersToDouble(initialWeightReg);
// 读取浸润后重量D4221个寄存器)
ushort[] afterWeightReg = _modbusMaster.ReadHoldingRegisters(slaveId, 422, 1);
double afterWeight = afterWeightReg[0];
// 读取浸润后重量D4222个寄存器浮点数单位g精度0.01g
ushort[] afterWeightReg = _modbusMaster.ReadHoldingRegisters(slaveId, 422, 2);
double afterWeight = ConvertRegistersToDouble(afterWeightReg);
// 读取浸润时间D4021个寄存器
// 读取浸润时间D4021个寄存器,整数,单位:秒
ushort[] soakTimeReg = _modbusMaster.ReadHoldingRegisters(slaveId, 402, 1);
int soakTime = soakTimeReg[0];
int soakTime = ConvertSingleRegisterToInt(soakTimeReg[0]);
// 读取悬挂时间D4061个寄存器
// 读取悬挂时间D4061个寄存器,整数,单位:秒
ushort[] hangTimeReg = _modbusMaster.ReadHoldingRegisters(slaveId, 406, 1);
int hangTime = hangTimeReg[0];
int hangTime = ConvertSingleRegisterToInt(hangTimeReg[0]);
// 读取运行速度D3101个寄存器
ushort[] runSpeedReg = _modbusMaster.ReadHoldingRegisters(slaveId, 310, 1);
int runSpeed = runSpeedReg[0];
// 读取运行速度D4101个寄存器整数单位mm/min
ushort[] runSpeedReg = _modbusMaster.ReadHoldingRegisters(slaveId, 410, 1);
int runSpeed = ConvertSingleRegisterToInt(runSpeedReg[0]);
// 使用反射获取Form2的私有字段
var sampleDataTableField = form2Instance.GetType()
@@ -726,7 +738,7 @@ namespace WindowsFormsApp6
{
// 7. 液体吸收量平均值行
DataRow avgRow = dataTable.NewRow();
avgRow["序号"] = "液体吸收量平均值(%)";
avgRow["序号"] = $"液体吸收量平均值(%) 试样{startSample}-{endSample}";
double avgAbsorption = groupAbsorptions.Average();
// 检查NaN
@@ -735,10 +747,25 @@ namespace WindowsFormsApp6
avgAbsorption = 0;
}
avgRow[$"试样{startSample}"] = avgAbsorption;
for (int i = 1; i <= currentSampleCount; i++)
// 将平均值显示在该组的所有试样列(合并显示效果)
for (int i = startSample; i <= endSample; i++)
{
if (i != startSample && dataTable.Columns.Contains($"试样{i}"))
if (dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = avgAbsorption;
}
}
// 其他列设置为空
for (int i = 1; i < startSample; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = DBNull.Value;
}
}
for (int i = endSample + 1; i <= currentSampleCount; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = DBNull.Value;
}
@@ -747,7 +774,7 @@ namespace WindowsFormsApp6
// 8. 液体吸收量最大值行
DataRow maxRow = dataTable.NewRow();
maxRow["序号"] = "液体吸收量最大值(%)";
maxRow["序号"] = $"液体吸收量最大值(%) 试样{startSample}-{endSample}";
double maxAbsorption = groupAbsorptions.Max();
// 检查NaN
@@ -756,10 +783,25 @@ namespace WindowsFormsApp6
maxAbsorption = 0;
}
maxRow[$"试样{startSample}"] = maxAbsorption;
for (int i = 1; i <= currentSampleCount; i++)
// 将最大值显示在该组的所有试样列(合并显示效果)
for (int i = startSample; i <= endSample; i++)
{
if (i != startSample && dataTable.Columns.Contains($"试样{i}"))
if (dataTable.Columns.Contains($"试样{i}"))
{
maxRow[$"试样{i}"] = maxAbsorption;
}
}
// 其他列设置为空
for (int i = 1; i < startSample; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
maxRow[$"试样{i}"] = DBNull.Value;
}
}
for (int i = endSample + 1; i <= currentSampleCount; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
maxRow[$"试样{i}"] = DBNull.Value;
}
@@ -768,7 +810,7 @@ namespace WindowsFormsApp6
// 9. 标准偏差行
DataRow stdDevRow = dataTable.NewRow();
stdDevRow["序号"] = "标准偏差";
stdDevRow["序号"] = $"标准偏差 试样{startSample}-{endSample}";
double stdDev = groupAbsorptions.Count > 1 ? CalculateStandardDeviation(groupAbsorptions.ToArray()) : 0;
// 检查NaN
@@ -777,10 +819,25 @@ namespace WindowsFormsApp6
stdDev = 0;
}
stdDevRow[$"试样{startSample}"] = stdDev;
for (int i = 1; i <= currentSampleCount; i++)
// 将标准偏差显示在该组的所有试样列(合并显示效果)
for (int i = startSample; i <= endSample; i++)
{
if (i != startSample && dataTable.Columns.Contains($"试样{i}"))
if (dataTable.Columns.Contains($"试样{i}"))
{
stdDevRow[$"试样{i}"] = stdDev;
}
}
// 其他列设置为空
for (int i = 1; i < startSample; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
stdDevRow[$"试样{i}"] = DBNull.Value;
}
}
for (int i = endSample + 1; i <= currentSampleCount; i++)
{
if (dataTable.Columns.Contains($"试样{i}"))
{
stdDevRow[$"试样{i}"] = DBNull.Value;
}
@@ -807,7 +864,7 @@ namespace WindowsFormsApp6
}
/// <summary>
/// 将寄存器数据转换为double假设寄存器值为实际值*100
/// 将寄存器数据转换为double用于重量数据,假设寄存器值为实际值*100
/// </summary>
private double ConvertRegistersToDouble(ushort[] registers)
{
@@ -827,7 +884,7 @@ namespace WindowsFormsApp6
}
/// <summary>
/// 将寄存器数据转换为int
/// 将寄存器数据转换为int(用于时间、速度等整数数据)
/// </summary>
private int ConvertRegistersToInt(ushort[] registers)
{
@@ -837,6 +894,14 @@ namespace WindowsFormsApp6
return (registers[0] << 16) | registers[1];
}
/// <summary>
/// 将单个寄存器数据转换为int用于时间等单寄存器整数数据
/// </summary>
private int ConvertSingleRegisterToInt(ushort register)
{
return register;
}
/// <summary>
/// 获取下一个试样索引
/// </summary>
@@ -1052,7 +1117,7 @@ namespace WindowsFormsApp6
/// <summary>
/// 读取Form3数据液体芯吸速率
/// PLC地址D200 - 吸水时间(s)D454 - 吸芯高度(mm)每次测试读取1个试样2个字节
/// PLC地址D200 - 吸水时间(s)D454 - 吸芯高度(mm)每次测试读取1个试样1个寄存器用于时间2个寄存器用于高度
///
/// 数据结构说明:
/// - 每组试样包含3次测试数据试样1_1, 试样1_2, 试样1_3
@@ -1067,11 +1132,11 @@ namespace WindowsFormsApp6
{
try
{
// 读取吸水时间D2001个寄存器 = 2个字节
// 读取吸水时间D2001个寄存器,整数,单位:秒
ushort[] timeRegisters = _modbusMaster.ReadHoldingRegisters(slaveId, 200, 1);
// 读取吸芯高度D4541个寄存器 = 2个字节
ushort[] heightRegisters = _modbusMaster.ReadHoldingRegisters(slaveId, 454, 1);
// 读取吸芯高度D4542个寄存器浮点数单位mm精度0.01mm
ushort[] heightRegisters = _modbusMaster.ReadHoldingRegisters(slaveId, 454, 2);
// 使用反射获取Form3的私有字段
var sampleDataTableField = form3Instance.GetType()
@@ -1099,13 +1164,15 @@ namespace WindowsFormsApp6
return;
}
// 将寄存器值转换为实际数据(直接使用寄存器值)
double wickingTime = timeRegisters[0]; // 吸水时间(秒)
double wickingHeight = heightRegisters[0]; // 吸芯高度mm
// 将寄存器值转换为实际数据
// 吸水时间:单个寄存器,整数,单位:秒
int wickingTime = ConvertSingleRegisterToInt(timeRegisters[0]);
// 吸芯高度2个寄存器浮点数单位mm精度0.01mm
double wickingHeight = ConvertRegistersToDouble(heightRegisters);
// 检查数据有效性
if (double.IsNaN(wickingTime) || double.IsInfinity(wickingTime) ||
double.IsNaN(wickingHeight) || double.IsInfinity(wickingHeight))
if (wickingTime <= 0 || double.IsNaN(wickingHeight) || double.IsInfinity(wickingHeight))
{
System.Diagnostics.Debug.WriteLine("读取的数据无效,跳过本次读取");
return;