This commit is contained in:
GukSang.Jin
2026-01-04 18:16:52 +08:00
parent 0b3ced2528
commit e50e051921

View File

@@ -297,68 +297,150 @@ namespace WindowsFormsApp6
/// <summary> /// <summary>
/// 读取Form1数据液体吸收时间 /// 读取Form1数据液体吸收时间
/// PLC地址D200 - 时间(s) /// PLC地址D200 - 时间(s)每次测试读取1个试样2个字节1个寄存器
/// 信号量M103 /// 信号量M103
/// 每次测试添加一个试样,试样数量动态增长
/// </summary> /// </summary>
private void ReadForm1Data(byte slaveId) private void ReadForm1Data(byte slaveId)
{ {
try try
{ {
// 读取D200寄存器时间数据) // 每次只读取1个寄存器1个试样的数据)
// 假设有5个试样每个试样1个时间值 ushort[] registers = _modbusMaster.ReadHoldingRegisters(slaveId, 200, 1);
ushort[] registers = _modbusMaster.ReadHoldingRegisters(slaveId, 200, 5);
// 使用反射获取Form1的私有字段 // 使用反射获取Form1的私有字段
var sampleDataTableField = form1Instance.GetType() var sampleDataTableField = form1Instance.GetType()
.GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (sampleDataTableField != null) var currentSampleCountField = form1Instance.GetType()
.GetField("currentSampleCount", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (sampleDataTableField != null && currentSampleCountField != null)
{ {
DataTable dataTable = sampleDataTableField.GetValue(form1Instance) as DataTable; DataTable dataTable = sampleDataTableField.GetValue(form1Instance) as DataTable;
int currentSampleCount = (int)currentSampleCountField.GetValue(form1Instance);
if (dataTable != null) if (dataTable != null)
{ {
// 除旧的平均值行 // 除旧的平均值行
var avgRows = dataTable.Select("序号 = '平均时间(s)'"); var avgRows = dataTable.Select("序号 = '平均时间(s)'");
foreach (var row in avgRows) foreach (var row in avgRows)
{ {
dataTable.Rows.Remove(row); dataTable.Rows.Remove(row);
} }
// 创建新数据 // 获取所有现有的时间
var timeRows = dataTable.AsEnumerable()
.Where(r => r.Field<string>("序号") == "时间(s)")
.ToList();
// 计算当前已有的试样数量
int existingSampleCount = timeRows.Count;
int newSampleIndex = existingSampleCount + 1;
// 如果新试样索引超过当前列数,需要动态添加列
if (newSampleIndex > currentSampleCount)
{
// 动态扩展DataTable列
if (!dataTable.Columns.Contains($"试样{newSampleIndex}"))
{
dataTable.Columns.Add($"试样{newSampleIndex}", typeof(double));
}
// 更新currentSampleCount
currentSampleCountField.SetValue(form1Instance, newSampleIndex);
currentSampleCount = newSampleIndex;
// 重新初始化DataGridView以显示新列
this.Invoke(new Action(() =>
{
var initMethod = form1Instance.GetType()
.GetMethod("InitializeDataGridView", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
initMethod?.Invoke(form1Instance, null);
}));
}
// 创建新数据行(添加新试样)
DataRow dataRow = dataTable.NewRow(); DataRow dataRow = dataTable.NewRow();
dataRow["序号"] = "时间(s)"; dataRow["序号"] = "时间(s)";
// 填充时间数据(将寄存器值转换为实际时间,假设寄存器值为整数秒*10 // 将新读取的时间值转换并填充到对应的试样列
for (int i = 0; i < Math.Min(registers.Length, 5); i++) double timeValue = registers[0] / 10.0; // 转换为秒
dataRow[$"试样{newSampleIndex}"] = timeValue;
// 其他列设置为空
for (int i = 1; i < newSampleIndex; i++)
{ {
double timeValue = registers[i] / 10.0; // 转换为秒 if (dataTable.Columns.Contains($"试样{i}"))
dataRow[$"试样{i + 1}"] = timeValue; {
dataRow[$"试样{i}"] = DBNull.Value;
}
} }
// 添加新数据行
dataTable.Rows.Add(dataRow); dataTable.Rows.Add(dataRow);
// 计算并添加平均值行 // 重新获取所有时间行(包括刚添加的)
double totalAvg = 0; timeRows = dataTable.AsEnumerable()
int count = 0; .Where(r => r.Field<string>("序号") == "时间(s)")
for (int i = 0; i < Math.Min(registers.Length, 5); i++) .ToList();
{
totalAvg += registers[i] / 10.0;
count++;
}
if (count > 0) // 计算平均值每5个试样计算一次平均值
{ int totalSamples = timeRows.Count;
DataRow avgRow = dataTable.NewRow(); int groupCount = (int)Math.Ceiling(totalSamples / 5.0);
avgRow["序号"] = "平均时间(s)";
avgRow["试样1"] = totalAvg / count;
for (int i = 2; i <= 5; i++) for (int groupIndex = 0; groupIndex < groupCount; groupIndex++)
{
int startSample = groupIndex * 5 + 1;
int endSample = Math.Min(startSample + 4, totalSamples);
// 计算该组的平均值
double groupSum = 0;
int validCount = 0;
for (int i = startSample; i <= endSample; i++)
{ {
avgRow[$"试样{i}"] = DBNull.Value; var row = timeRows[i - 1]; // 索引从0开始
// 找到该行中有值的列
for (int col = 1; col <= currentSampleCount; col++)
{
if (dataTable.Columns.Contains($"试样{col}") &&
row[$"试样{col}"] != DBNull.Value)
{
double value = Convert.ToDouble(row[$"试样{col}"]);
if (value > 0)
{
groupSum += value;
validCount++;
break; // 每行只取一个有效值
}
}
}
} }
dataTable.Rows.Add(avgRow); if (validCount > 0)
{
double groupAvg = groupSum / validCount;
// 创建平均值行
DataRow avgRow = dataTable.NewRow();
avgRow["序号"] = "平均时间(s)";
// 将平均值显示在该组的第一个试样列
avgRow[$"试样{startSample}"] = groupAvg;
// 其他列设置为空
for (int i = 1; i <= currentSampleCount; i++)
{
if (i != startSample && dataTable.Columns.Contains($"试样{i}"))
{
avgRow[$"试样{i}"] = DBNull.Value;
}
}
dataTable.Rows.Add(avgRow);
}
} }
// 刷新显示 // 刷新显示
@@ -373,7 +455,7 @@ namespace WindowsFormsApp6
} }
} }
System.Diagnostics.Debug.WriteLine($"Form1数据读取成功{registers.Length}个寄存器"); System.Diagnostics.Debug.WriteLine($"Form1数据读取成功试样 #{timeRows.Count + 1}");
} }
catch (Exception ex) catch (Exception ex)
{ {