更新
This commit is contained in:
@@ -297,69 +297,151 @@ 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();
|
||||||
|
|
||||||
|
// 计算平均值:每5个试样计算一次平均值
|
||||||
|
int totalSamples = timeRows.Count;
|
||||||
|
int groupCount = (int)Math.Ceiling(totalSamples / 5.0);
|
||||||
|
|
||||||
|
for (int groupIndex = 0; groupIndex < groupCount; groupIndex++)
|
||||||
{
|
{
|
||||||
totalAvg += registers[i] / 10.0;
|
int startSample = groupIndex * 5 + 1;
|
||||||
count++;
|
int endSample = Math.Min(startSample + 4, totalSamples);
|
||||||
|
|
||||||
|
// 计算该组的平均值
|
||||||
|
double groupSum = 0;
|
||||||
|
int validCount = 0;
|
||||||
|
|
||||||
|
for (int i = startSample; i <= endSample; i++)
|
||||||
|
{
|
||||||
|
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; // 每行只取一个有效值
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count > 0)
|
if (validCount > 0)
|
||||||
{
|
{
|
||||||
|
double groupAvg = groupSum / validCount;
|
||||||
|
|
||||||
|
// 创建平均值行
|
||||||
DataRow avgRow = dataTable.NewRow();
|
DataRow avgRow = dataTable.NewRow();
|
||||||
avgRow["序号"] = "平均时间(s)";
|
avgRow["序号"] = "平均时间(s)";
|
||||||
avgRow["试样1"] = totalAvg / count;
|
|
||||||
|
|
||||||
for (int i = 2; i <= 5; i++)
|
// 将平均值显示在该组的第一个试样列
|
||||||
|
avgRow[$"试样{startSample}"] = groupAvg;
|
||||||
|
|
||||||
|
// 其他列设置为空
|
||||||
|
for (int i = 1; i <= currentSampleCount; i++)
|
||||||
|
{
|
||||||
|
if (i != startSample && dataTable.Columns.Contains($"试样{i}"))
|
||||||
{
|
{
|
||||||
avgRow[$"试样{i}"] = DBNull.Value;
|
avgRow[$"试样{i}"] = DBNull.Value;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dataTable.Rows.Add(avgRow);
|
dataTable.Rows.Add(avgRow);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 刷新显示
|
// 刷新显示
|
||||||
dataTable.AcceptChanges();
|
dataTable.AcceptChanges();
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user