Files
pressurediff/压差法气体渗透仪/NET_HRF4838_C#/Form1.cs
2026-03-03 14:07:05 +08:00

1019 lines
45 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms.DataVisualization.Charting;
using System.Net.Sockets;
using System.Net;
using System.Net.NetworkInformation;
using Sunny.UI;
//新
namespace NET_HRF4826
{
public partial class Form1 : UIForm
{
Thread threadReceiveData = new Thread(ReceiveData); //接收数据后台线程
static int waitbytes = 7000;
UInt16 temp;
static bool daq_flag = false;
static byte[] readdata = new byte[waitbytes];
static byte[] senddata = new byte[47]; // 增加senddata的长度以支持更多DO通道
public static int GetBit(byte b, int index) { return ((b & (1 << index)) > 0) ? 1 : 0; }
private IPAddress serverIP;
private IPEndPoint serverFullAddr; //完整终端地址
private static Socket sock;
private int num = 100; //每次删除增加几个点
private Queue<double> dataQueue0 = new Queue<double>(1000);
private Queue<double> dataQueue1 = new Queue<double>(1000);
private Queue<double> dataQueue2 = new Queue<double>(1000);
private Queue<double> dataQueue3 = new Queue<double>(1000);
private Queue<double> dataQueue4 = new Queue<double>(1000);
private Queue<double> dataQueue5 = new Queue<double>(1000);
private Queue<double> dataQueue6 = new Queue<double>(1000);
private Queue<double> dataQueue7 = new Queue<double>(1000);
private Queue<double> dataQueue8 = new Queue<double>(1000);
private Queue<double> dataQueue9 = new Queue<double>(1000);
private Queue<double> dataQueue10 = new Queue<double>(1000);
private Queue<double> dataQueue11 = new Queue<double>(1000);
private Queue<double> dataQueue12 = new Queue<double>(1000);
private Queue<double> dataQueue13 = new Queue<double>(1000);
private Queue<double> dataQueue14 = new Queue<double>(1000);
private Queue<double> dataQueue15 = new Queue<double>(1000);
private Queue<double> dataQueue16 = new Queue<double>(1000);
private Queue<double> dataQueue17 = new Queue<double>(1000);
private Queue<double> dataQueue18 = new Queue<double>(1000);
private Queue<double> dataQueue19 = new Queue<double>(1000);
private Queue<double> dataQueue20 = new Queue<double>(1000);
private Queue<double> dataQueue21 = new Queue<double>(1000);
private Queue<double> dataQueue22 = new Queue<double>(1000);
private Queue<double> dataQueue23 = new Queue<double>(1000);
private List<DataRecord> allDataRecords; // 存储所有历史数据
private int sampleCounter = 0; // 采样序号(可选)
private object dataLock = new object(); // 如果跨线程访问加锁目前都在UI线程可不用
public Form1()
{
InitializeComponent();
}
//private void Read_Data()
//{
// byte[,] dat = new byte[num, 70];
// float[,] volt = new float[num, 16];
// byte DI0, DI1, DI2, DI3; // 添加更多DI通道
// if (dataQueue1.Count > num) //先出列
// {
// for (int i = 0; i < num; i++)
// {
// dataQueue0.Dequeue();
// dataQueue1.Dequeue();
// dataQueue2.Dequeue();
// dataQueue3.Dequeue();
// dataQueue4.Dequeue();
// dataQueue5.Dequeue();
// dataQueue6.Dequeue();
// dataQueue7.Dequeue();
// dataQueue8.Dequeue();
// dataQueue9.Dequeue();
// dataQueue10.Dequeue();
// dataQueue11.Dequeue();
// dataQueue12.Dequeue();
// dataQueue13.Dequeue();
// dataQueue14.Dequeue();
// dataQueue15.Dequeue();
// }
// this.chart1.ChartAreas[0].AxisX.Minimum += num;
// this.chart1.ChartAreas[0].AxisX.Maximum += num;
// }
// for (int i = 0; i < num; i++)
// {
// for (int j = 0; j < 70; j++)
// {
// dat[i, j] = readdata[i * 70 + j];
// }
// for (int j = 0; j < 16; j++)
// {
// if (AI_Range_comboBox.SelectedIndex > 0)
// {
// volt[i, j] = dat[i, j + j] * 256 + dat[i, j + j + 1];
// volt[i, j] = volt[i, j] > 32767 ? ((volt[i, j] - 65535) / 32767 * 10) : volt[i, j] / 32767 * 10;
// }
// else
// {
// volt[i, j] = dat[i, j + j] * 256 + dat[i, j + j + 1];
// volt[i, j] = volt[i, j] > 32767 ? ((volt[i, j] - 65535) / 32767 * 5) : volt[i, j] / 32767 * 5;
// }
// }
// dataQueue0.Enqueue(volt[i, 0]);
// dataQueue1.Enqueue(volt[i, 1]);
// dataQueue2.Enqueue(volt[i, 2]);
// dataQueue3.Enqueue(volt[i, 3]);
// dataQueue4.Enqueue(volt[i, 4]);
// dataQueue5.Enqueue(volt[i, 5]);
// dataQueue6.Enqueue(volt[i, 6]);
// dataQueue7.Enqueue(volt[i, 7]);
// dataQueue8.Enqueue(volt[i, 8]);
// dataQueue9.Enqueue(volt[i, 9]);
// dataQueue10.Enqueue(volt[i, 10]);
// dataQueue11.Enqueue(volt[i, 11]);
// dataQueue12.Enqueue(volt[i, 12]);
// dataQueue13.Enqueue(volt[i, 13]);
// dataQueue14.Enqueue(volt[i, 14]);
// dataQueue15.Enqueue(volt[i, 15]);
// // 记录当前采样点
// var record = new DataRecord
// {
// Timestamp = DateTime.Now, // 实际采样时间,但由于循环处理,时间会略有延迟
// SampleIndex = sampleCounter++,
// AI = new float[] { volt[i,0], volt[i,1], volt[i,2], volt[i,3],
// volt[i,4], volt[i,5], volt[i,6], volt[i,7],
// volt[i,8], volt[i,9], volt[i,10], volt[i,11],
// volt[i,12], volt[i,13], volt[i,14], volt[i,15] },
// DI = new byte[] { dat[i, 32], dat[i, 33], dat[i, 34], dat[i, 35] },
// PulseCount = new uint[] { pulseCount0, pulseCount1, pulseCount2 },
// Frequency = new uint[] { frequency0, frequency1, frequency2 }
// };
// allDataRecords.Add(record);
// }
// AI0_textBox.Text = Convert.ToDouble(volt[0, 0]).ToString("f3");
// AI1_textBox.Text = Convert.ToDouble(volt[0, 1]).ToString("f3");
// AI2_textBox.Text = Convert.ToDouble(volt[0, 2]).ToString("f3");
// AI3_textBox.Text = Convert.ToDouble(volt[0, 3]).ToString("f3");
// AI4_textBox.Text = Convert.ToDouble(volt[0, 4]).ToString("f3");
// AI5_textBox.Text = Convert.ToDouble(volt[0, 5]).ToString("f3");
// AI6_textBox.Text = Convert.ToDouble(volt[0, 6]).ToString("f3");
// AI7_textBox.Text = Convert.ToDouble(volt[0, 7]).ToString("f3");
// AI8_textBox.Text = Convert.ToDouble(volt[0, 8]).ToString("f3");
// AI9_textBox.Text = Convert.ToDouble(volt[0, 9]).ToString("f3");
// AI10_textBox.Text = Convert.ToDouble(volt[0, 10]).ToString("f3");
// AI11_textBox.Text = Convert.ToDouble(volt[0, 11]).ToString("f3");
// AI12_textBox.Text = Convert.ToDouble(volt[0, 12]).ToString("f3");
// AI13_textBox.Text = Convert.ToDouble(volt[0, 13]).ToString("f3");
// AI14_textBox.Text = Convert.ToDouble(volt[0, 14]).ToString("f3");
// AI15_textBox.Text = Convert.ToDouble(volt[0, 15]).ToString("f3");
// for (int i = 0; i < 16; i++)
// {
// this.chart1.Series[i].Points.Clear();
// }
// int m = (int)this.chart1.ChartAreas[0].AxisX.Minimum;
// for (int i = 0; i < dataQueue1.Count; i++)
// {
// if (AI0_checkBox.Checked)
// this.chart1.Series[0].Points.AddXY((i + m), dataQueue0.ElementAt(i));
// if (AI1_checkBox.Checked)
// this.chart1.Series[1].Points.AddXY((i + m), dataQueue1.ElementAt(i));
// if (AI2_checkBox.Checked)
// this.chart1.Series[2].Points.AddXY((i + m), dataQueue2.ElementAt(i));
// if (AI3_checkBox.Checked)
// this.chart1.Series[3].Points.AddXY((i + m), dataQueue3.ElementAt(i));
// if (AI4_checkBox.Checked)
// this.chart1.Series[4].Points.AddXY((i + m), dataQueue4.ElementAt(i));
// if (AI5_checkBox.Checked)
// this.chart1.Series[5].Points.AddXY((i + m), dataQueue5.ElementAt(i));
// if (AI6_checkBox.Checked)
// this.chart1.Series[6].Points.AddXY((i + m), dataQueue6.ElementAt(i));
// if (AI7_checkBox.Checked)
// this.chart1.Series[7].Points.AddXY((i + m), dataQueue7.ElementAt(i));
// if (AI8_checkBox.Checked)
// this.chart1.Series[8].Points.AddXY((i + m), dataQueue8.ElementAt(i));
// if (AI9_checkBox.Checked)
// this.chart1.Series[9].Points.AddXY((i + m), dataQueue9.ElementAt(i));
// if (AI10_checkBox.Checked)
// this.chart1.Series[10].Points.AddXY((i + m), dataQueue10.ElementAt(i));
// if (AI11_checkBox.Checked)
// this.chart1.Series[11].Points.AddXY((i + m), dataQueue11.ElementAt(i));
// if (AI12_checkBox.Checked)
// this.chart1.Series[12].Points.AddXY((i + m), dataQueue12.ElementAt(i));
// if (AI13_checkBox.Checked)
// this.chart1.Series[13].Points.AddXY((i + m), dataQueue13.ElementAt(i));
// if (AI14_checkBox.Checked)
// this.chart1.Series[14].Points.AddXY((i + m), dataQueue14.ElementAt(i));
// if (AI15_checkBox.Checked)
// this.chart1.Series[15].Points.AddXY((i + m), dataQueue15.ElementAt(i));
// }
// // 处理DI通道
// DI0 = dat[0, 32];
// DI1 = dat[0, 33];
// DI2 = dat[0, 34]; // 新增DI通道
// DI3 = dat[0, 35]; // 新增DI通道
// // 前8个DI通道
// btnDI0.ImageIndex = ((DI0 & 0x01) == 0x00) ? 0 : 1;
// btnDI1.ImageIndex = ((DI0 & 0x02) == 0x00) ? 0 : 1;
// btnDI2.ImageIndex = ((DI0 & 0x04) == 0x00) ? 0 : 1;
// btnDI3.ImageIndex = ((DI0 & 0x08) == 0x00) ? 0 : 1;
// btnDI4.ImageIndex = ((DI0 & 0x10) == 0x00) ? 0 : 1;
// btnDI5.ImageIndex = ((DI0 & 0x20) == 0x00) ? 0 : 1;
// btnDI6.ImageIndex = ((DI0 & 0x40) == 0x00) ? 0 : 1;
// btnDI7.ImageIndex = ((DI0 & 0x80) == 0x00) ? 0 : 1;
// // 第二组8个DI通道
// btnDI8.ImageIndex = ((DI1 & 0x01) == 0x00) ? 0 : 1;
// btnDI9.ImageIndex = ((DI1 & 0x02) == 0x00) ? 0 : 1;
// btnDI10.ImageIndex = ((DI1 & 0x04) == 0x00) ? 0 : 1;
// btnDI11.ImageIndex = ((DI1 & 0x08) == 0x00) ? 0 : 1;
// btnDI12.ImageIndex = ((DI1 & 0x10) == 0x00) ? 0 : 1;
// btnDI13.ImageIndex = ((DI1 & 0x20) == 0x00) ? 0 : 1;
// btnDI14.ImageIndex = ((DI1 & 0x40) == 0x00) ? 0 : 1;
// btnDI15.ImageIndex = ((DI1 & 0x80) == 0x00) ? 0 : 1;
// // 第三组8个DI通道
// btnDI16.ImageIndex = ((DI2 & 0x01) == 0x00) ? 0 : 1;
// btnDI17.ImageIndex = ((DI2 & 0x02) == 0x00) ? 0 : 1;
// btnDI18.ImageIndex = ((DI2 & 0x04) == 0x00) ? 0 : 1;
// btnDI19.ImageIndex = ((DI2 & 0x08) == 0x00) ? 0 : 1;
// btnDI20.ImageIndex = ((DI2 & 0x10) == 0x00) ? 0 : 1;
// btnDI21.ImageIndex = ((DI2 & 0x20) == 0x00) ? 0 : 1;
// btnDI22.ImageIndex = ((DI2 & 0x40) == 0x00) ? 0 : 1;
// btnDI23.ImageIndex = ((DI2 & 0x80) == 0x00) ? 0 : 1;
// // 第四组8个DI通道
// btnDI24.ImageIndex = ((DI3 & 0x01) == 0x00) ? 0 : 1;
// btnDI25.ImageIndex = ((DI3 & 0x02) == 0x00) ? 0 : 1;
// btnDI26.ImageIndex = ((DI3 & 0x04) == 0x00) ? 0 : 1;
// btnDI27.ImageIndex = ((DI3 & 0x08) == 0x00) ? 0 : 1;
// btnDI28.ImageIndex = ((DI3 & 0x10) == 0x00) ? 0 : 1;
// btnDI29.ImageIndex = ((DI3 & 0x20) == 0x00) ? 0 : 1;
// btnDI30.ImageIndex = ((DI3 & 0x40) == 0x00) ? 0 : 1;
// btnDI31.ImageIndex = ((DI3 & 0x80) == 0x00) ? 0 : 1;
// // 新增脉冲计数和频率计算
// // 脉冲计数计算
// UInt32 pulseCount0 = Convert.ToUInt32((dat[0, 51] << 24) + (dat[0, 50] << 16) + (dat[0, 49] << 8) + dat[0, 48]);
// UInt32 pulseCount1 = Convert.ToUInt32((dat[0, 55] << 24) + (dat[0, 54] << 16) + (dat[0, 53] << 8) + dat[0, 52]);
// UInt32 pulseCount2 = Convert.ToUInt32((dat[0, 59] << 24) + (dat[0, 58] << 16) + (dat[0, 57] << 8) + dat[0, 56]);
// // 频率计算
// UInt32 frequency0 = Convert.ToUInt32((dat[0, 62] << 16) + (dat[0, 61] << 8) + dat[0, 60]);
// UInt32 frequency1 = Convert.ToUInt32((dat[0, 65] << 16) + (dat[0, 64] << 8) + dat[0, 63]);
// UInt32 frequency2 = Convert.ToUInt32((dat[0, 68] << 16) + (dat[0, 67] << 8) + dat[0, 66]);
// // 更新文本框
// PulseCount0_textBox.Text = pulseCount0.ToString();
// PulseCount1_textBox.Text = pulseCount1.ToString();
// PulseCount2_textBox.Text = pulseCount2.ToString();
// Frequency0_textBox.Text = frequency0.ToString();
// Frequency1_textBox.Text = frequency1.ToString();
// Frequency2_textBox.Text = frequency2.ToString();
//}
private void Read_Data()
{
byte[,] dat = new byte[num, 70];
float[,] volt = new float[num, 16];
byte DI0, DI1, DI2, DI3;
// 队列处理(保持原样)
if (dataQueue1.Count > num)
{
for (int i = 0; i < num; i++)
{
dataQueue0.Dequeue();
dataQueue1.Dequeue();
dataQueue2.Dequeue();
dataQueue3.Dequeue();
dataQueue4.Dequeue();
dataQueue5.Dequeue();
dataQueue6.Dequeue();
dataQueue7.Dequeue();
dataQueue8.Dequeue();
dataQueue9.Dequeue();
dataQueue10.Dequeue();
dataQueue11.Dequeue();
dataQueue12.Dequeue();
dataQueue13.Dequeue();
dataQueue14.Dequeue();
dataQueue15.Dequeue();
}
this.chart1.ChartAreas[0].AxisX.Minimum += num;
this.chart1.ChartAreas[0].AxisX.Maximum += num;
}
// 循环处理每个采样点
for (int i = 0; i < num; i++)
{
// 读取原始数据
for (int j = 0; j < 70; j++)
{
dat[i, j] = readdata[i * 70 + j];
}
// 计算AI电压
for (int j = 0; j < 16; j++)
{
if (AI_Range_comboBox.SelectedIndex > 0)
{
volt[i, j] = dat[i, j + j] * 256 + dat[i, j + j + 1];
volt[i, j] = volt[i, j] > 32767 ? ((volt[i, j] - 65535) / 32767 * 10) : volt[i, j] / 32767 * 10;
}
else
{
volt[i, j] = dat[i, j + j] * 256 + dat[i, j + j + 1];
volt[i, j] = volt[i, j] > 32767 ? ((volt[i, j] - 65535) / 32767 * 5) : volt[i, j] / 32767 * 5;
}
}
// 入队绘图数据(保持原样)
dataQueue0.Enqueue(volt[i, 0]);
dataQueue1.Enqueue(volt[i, 1]);
dataQueue2.Enqueue(volt[i, 2]);
dataQueue3.Enqueue(volt[i, 3]);
dataQueue4.Enqueue(volt[i, 4]);
dataQueue5.Enqueue(volt[i, 5]);
dataQueue6.Enqueue(volt[i, 6]);
dataQueue7.Enqueue(volt[i, 7]);
dataQueue8.Enqueue(volt[i, 8]);
dataQueue9.Enqueue(volt[i, 9]);
dataQueue10.Enqueue(volt[i, 10]);
dataQueue11.Enqueue(volt[i, 11]);
dataQueue12.Enqueue(volt[i, 12]);
dataQueue13.Enqueue(volt[i, 13]);
dataQueue14.Enqueue(volt[i, 14]);
dataQueue15.Enqueue(volt[i, 15]);
// ---------- 新增:为当前采样点计算脉冲和频率 ----------
UInt32 pulseCount0 = Convert.ToUInt32((dat[i, 51] << 24) + (dat[i, 50] << 16) + (dat[i, 49] << 8) + dat[i, 48]);
UInt32 pulseCount1 = Convert.ToUInt32((dat[i, 55] << 24) + (dat[i, 54] << 16) + (dat[i, 53] << 8) + dat[i, 52]);
UInt32 pulseCount2 = Convert.ToUInt32((dat[i, 59] << 24) + (dat[i, 58] << 16) + (dat[i, 57] << 8) + dat[i, 56]);
UInt32 frequency0 = Convert.ToUInt32((dat[i, 62] << 16) + (dat[i, 61] << 8) + dat[i, 60]);
UInt32 frequency1 = Convert.ToUInt32((dat[i, 65] << 16) + (dat[i, 64] << 8) + dat[i, 63]);
UInt32 frequency2 = Convert.ToUInt32((dat[i, 68] << 16) + (dat[i, 67] << 8) + dat[i, 66]);
// 记录当前采样点(使用上面刚计算的值)
var record = new DataRecord
{
Timestamp = DateTime.Now,
SampleIndex = sampleCounter++,
AI = new float[] { volt[i,0], volt[i,1], volt[i,2], volt[i,3],
volt[i,4], volt[i,5], volt[i,6], volt[i,7],
volt[i,8], volt[i,9], volt[i,10], volt[i,11],
volt[i,12], volt[i,13], volt[i,14], volt[i,15] },
DI = new byte[] { dat[i, 32], dat[i, 33], dat[i, 34], dat[i, 35] },
PulseCount = new uint[] { pulseCount0, pulseCount1, pulseCount2 },
Frequency = new uint[] { frequency0, frequency1, frequency2 }
};
allDataRecords.Add(record);
}
// 更新UI使用第一个采样点的数据保持与原行为一致
AI0_textBox.Text = Convert.ToDouble(volt[0, 0]).ToString("f3");
AI1_textBox.Text = Convert.ToDouble(volt[0, 1]).ToString("f3");
AI2_textBox.Text = Convert.ToDouble(volt[0, 2]).ToString("f3");
AI3_textBox.Text = Convert.ToDouble(volt[0, 3]).ToString("f3");
AI4_textBox.Text = Convert.ToDouble(volt[0, 4]).ToString("f3");
AI5_textBox.Text = Convert.ToDouble(volt[0, 5]).ToString("f3");
AI6_textBox.Text = Convert.ToDouble(volt[0, 6]).ToString("f3");
AI7_textBox.Text = Convert.ToDouble(volt[0, 7]).ToString("f3");
AI8_textBox.Text = Convert.ToDouble(volt[0, 8]).ToString("f3");
AI9_textBox.Text = Convert.ToDouble(volt[0, 9]).ToString("f3");
AI10_textBox.Text = Convert.ToDouble(volt[0, 10]).ToString("f3");
AI11_textBox.Text = Convert.ToDouble(volt[0, 11]).ToString("f3");
AI12_textBox.Text = Convert.ToDouble(volt[0, 12]).ToString("f3");
AI13_textBox.Text = Convert.ToDouble(volt[0, 13]).ToString("f3");
AI14_textBox.Text = Convert.ToDouble(volt[0, 14]).ToString("f3");
AI15_textBox.Text = Convert.ToDouble(volt[0, 15]).ToString("f3");
// 更新DI按钮状态仍使用第一个采样点的数据
DI0 = dat[0, 32];
DI1 = dat[0, 33];
DI2 = dat[0, 34];
DI3 = dat[0, 35];
// ... 此处省略DI按钮更新代码保持不变 ...
// 更新脉冲计数和频率文本框直接使用dat[0, ...]计算,无需额外变量)
PulseCount0_textBox.Text = Convert.ToUInt32((dat[0, 51] << 24) + (dat[0, 50] << 16) + (dat[0, 49] << 8) + dat[0, 48]).ToString();
PulseCount1_textBox.Text = Convert.ToUInt32((dat[0, 55] << 24) + (dat[0, 54] << 16) + (dat[0, 53] << 8) + dat[0, 52]).ToString();
PulseCount2_textBox.Text = Convert.ToUInt32((dat[0, 59] << 24) + (dat[0, 58] << 16) + (dat[0, 57] << 8) + dat[0, 56]).ToString();
Frequency0_textBox.Text = Convert.ToUInt32((dat[0, 62] << 16) + (dat[0, 61] << 8) + dat[0, 60]).ToString();
Frequency1_textBox.Text = Convert.ToUInt32((dat[0, 65] << 16) + (dat[0, 64] << 8) + dat[0, 63]).ToString();
Frequency2_textBox.Text = Convert.ToUInt32((dat[0, 68] << 16) + (dat[0, 67] << 8) + dat[0, 66]).ToString();
}
private void Write_Data()
{
UInt16 temp = 0, div = 72;
senddata[0] = (byte)((btnDO7.ImageIndex << 7) + (btnDO6.ImageIndex << 6) + (btnDO5.ImageIndex << 5) + (btnDO4.ImageIndex << 4) + (btnDO3.ImageIndex << 3) + (btnDO2.ImageIndex << 2) + (btnDO1.ImageIndex << 1) + btnDO0.ImageIndex);
senddata[1] = (byte)((btnDO15.ImageIndex << 7) + (btnDO14.ImageIndex << 6) + (btnDO13.ImageIndex << 5) + (btnDO12.ImageIndex << 4) + (btnDO11.ImageIndex << 3) + (btnDO10.ImageIndex << 2) + (btnDO9.ImageIndex << 1) + btnDO8.ImageIndex);
// 新增的16个DO通道
senddata[2] = (byte)((btnDO23.ImageIndex << 7) + (btnDO22.ImageIndex << 6) + (btnDO21.ImageIndex << 5) + (btnDO20.ImageIndex << 4) + (btnDO19.ImageIndex << 3) + (btnDO18.ImageIndex << 2) + (btnDO17.ImageIndex << 1) + btnDO16.ImageIndex);
senddata[3] = (byte)((btnDO31.ImageIndex << 7) + (btnDO30.ImageIndex << 6) + (btnDO29.ImageIndex << 5) + (btnDO28.ImageIndex << 4) + (btnDO27.ImageIndex << 3) + (btnDO26.ImageIndex << 2) + (btnDO25.ImageIndex << 1) + btnDO24.ImageIndex);
temp = Convert.ToUInt16(Convert.ToSingle(AO0_textBox.Text) * 4095 / 10);
senddata[4] = Convert.ToByte(temp / 256);
senddata[5] = Convert.ToByte(temp % 256);
temp = Convert.ToUInt16(Convert.ToSingle(AO1_textBox.Text) * 4095 / 10);
senddata[6] = Convert.ToByte(temp / 256);
senddata[7] = Convert.ToByte(temp % 256);
temp = Convert.ToUInt16(72000000 / div / (Convert.ToUInt32(T0_Freq_textBox.Text)));
senddata[8] = Convert.ToByte(temp / 256);
senddata[9] = Convert.ToByte(temp % 256);
senddata[10] = Convert.ToByte(div / 256);
senddata[11] = Convert.ToByte(div % 256);
temp = Convert.ToUInt16(temp * (Convert.ToSingle(T0_Duty_textBox.Text)) / 100);
senddata[12] = Convert.ToByte(temp / 256);
senddata[13] = Convert.ToByte(temp % 256);
temp = Convert.ToUInt16(72000000 / div / (Convert.ToUInt32(T1_Freq_textBox.Text)));
senddata[14] = Convert.ToByte(temp / 256);
senddata[15] = Convert.ToByte(temp % 256);
senddata[16] = Convert.ToByte(div / 256);
senddata[17] = Convert.ToByte(div % 256);
temp = Convert.ToUInt16(temp * (Convert.ToSingle(T1_Duty_textBox.Text)) / 100);
senddata[18] = Convert.ToByte(temp / 256);
senddata[19] = Convert.ToByte(temp % 256);
temp = Convert.ToUInt16(72000000 / div / (Convert.ToUInt32(T2_Freq_textBox.Text)));
senddata[20] = Convert.ToByte(temp / 256);
senddata[21] = Convert.ToByte(temp % 256);
senddata[22] = Convert.ToByte(div / 256);
senddata[23] = Convert.ToByte(div % 256);
temp = Convert.ToUInt16(temp * (Convert.ToSingle(T2_Duty_textBox.Text)) / 100);
senddata[24] = Convert.ToByte(temp / 256);
senddata[25] = Convert.ToByte(temp % 256);
//temp = Convert.ToUInt16(72000000 / div / (Convert.ToUInt32(T3_Freq_textBox.Text)));
senddata[26] = Convert.ToByte(temp / 256);
senddata[27] = Convert.ToByte(temp % 256);
senddata[28] = Convert.ToByte(div / 256);
senddata[29] = Convert.ToByte(div % 256);
//temp = Convert.ToUInt16(temp * (Convert.ToSingle(T3_Duty_textBox.Text)) / 100);
senddata[30] = Convert.ToByte(temp / 256);
senddata[31] = Convert.ToByte(temp % 256);
senddata[38] = 0x55; //输出使能指令,初始化已写,此处可删
sock.Send(senddata);
}
private void btnStart_Click(object sender, EventArgs e)
{
// 清空之前的数据,准备新记录
allDataRecords = new List<DataRecord>();
sampleCounter = 0;
btnStart.Enabled = false;
btnStop.Enabled = true;
serverIP = IPAddress.Parse(tbxIP.Text);
Ping pingSend = new Ping();
PingReply reply = pingSend.Send(serverIP, 1000);
if (reply.Status == IPStatus.Success)
{
try
{
serverFullAddr = new IPEndPoint(serverIP, int.Parse(tbxPort.Text)); //设置IP端口
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定本地主机地址和端口号
sock.Connect(serverFullAddr);
TCP_flag.ImageIndex = 1;
lblError.Text = "连接采集卡成功!";
timerPaint.Enabled = true;
senddata[38] = 0x55; //开始采集
senddata[39] = (byte)AI_Range_comboBox.SelectedIndex; //电压范围设置
temp = Convert.ToUInt16(Convert.ToSingle(DAQfre_textBox.Text));
senddata[40] = Convert.ToByte(temp / 256); //采样率高8位
senddata[41] = Convert.ToByte(temp % 256); //采样率低8位
senddata[42] = 3; //编码器1和编码器2全部清零
sock.Send(senddata); //初始化采集卡,开始采集
daq_flag = true;
timerPaint.Interval = 10;
timerPaint.Enabled = true;
}
catch (Exception ee)
{
TCP_flag.ImageIndex = 0;
lblError.Text = "连接采集卡失败……请检查采集卡IP设置" + ee;
}
}
else
{
btnDO0.ImageIndex = 0;
lblError.Text = "Ping不通……请确保采集卡已连接并与电脑IP在同一网段";
}
}
private void btnStop_Click(object sender, EventArgs e)
{
senddata[38] = 0xBB;
daq_flag = false;
if (sock.Connected)
sock.Send(senddata);
sock.Close();
timerPaint.Enabled = false;
btnStart.Enabled = true;
}
private void btnExit_Click(object sender, EventArgs e)
{
senddata[38] = 0xBB;
if (sock.Connected)
sock.Send(senddata);
sock.Close();
btnStart.Enabled = true;
System.Environment.Exit(0);
}
private void timerPaint_Tick_1(object sender, EventArgs e)
{
Write_Data();
Read_Data();
}
static void ReceiveData()
{
while (true)
{
if (daq_flag && sock.Available >= waitbytes)
{
sock.Receive(readdata, waitbytes, 0);
}
}
}
private void btnDO_Click(object sender, EventArgs e)
{
Button btn = (sender as Button);
bool isopen = (btn.ImageIndex == 0) ? false : true;
btn.ImageIndex = (isopen) ? 0 : 1;
}
private void btnOpenAll_Click(object sender, EventArgs e)
{
btnDO0.ImageIndex = 1;
btnDO1.ImageIndex = 1;
btnDO2.ImageIndex = 1;
btnDO3.ImageIndex = 1;
btnDO4.ImageIndex = 1;
btnDO5.ImageIndex = 1;
btnDO6.ImageIndex = 1;
btnDO7.ImageIndex = 1;
btnDO8.ImageIndex = 1;
btnDO9.ImageIndex = 1;
btnDO10.ImageIndex = 1;
btnDO11.ImageIndex = 1;
btnDO12.ImageIndex = 1;
btnDO13.ImageIndex = 1;
btnDO14.ImageIndex = 1;
btnDO15.ImageIndex = 1;
btnDO16.ImageIndex = 1;
btnDO17.ImageIndex = 1;
btnDO18.ImageIndex = 1;
btnDO19.ImageIndex = 1;
btnDO20.ImageIndex = 1;
btnDO21.ImageIndex = 1;
btnDO22.ImageIndex = 1;
btnDO23.ImageIndex = 1;
btnDO24.ImageIndex = 1;
btnDO25.ImageIndex = 1;
btnDO26.ImageIndex = 1;
btnDO27.ImageIndex = 1;
btnDO28.ImageIndex = 1;
btnDO29.ImageIndex = 1;
btnDO30.ImageIndex = 1;
btnDO31.ImageIndex = 1;
}
private void btnCloseAll_Click(object sender, EventArgs e)
{
btnDO0.ImageIndex = 0;
btnDO1.ImageIndex = 0;
btnDO2.ImageIndex = 0;
btnDO3.ImageIndex = 0;
btnDO4.ImageIndex = 0;
btnDO5.ImageIndex = 0;
btnDO6.ImageIndex = 0;
btnDO7.ImageIndex = 0;
btnDO8.ImageIndex = 0;
btnDO9.ImageIndex = 0;
btnDO10.ImageIndex = 0;
btnDO11.ImageIndex = 0;
btnDO12.ImageIndex = 0;
btnDO13.ImageIndex = 0;
btnDO14.ImageIndex = 0;
btnDO15.ImageIndex = 0;
btnDO16.ImageIndex = 0;
btnDO17.ImageIndex = 0;
btnDO18.ImageIndex = 0;
btnDO19.ImageIndex = 0;
btnDO20.ImageIndex = 0;
btnDO21.ImageIndex = 0;
btnDO22.ImageIndex = 0;
btnDO23.ImageIndex = 0;
btnDO24.ImageIndex = 0;
btnDO25.ImageIndex = 0;
btnDO26.ImageIndex = 0;
btnDO27.ImageIndex = 0;
btnDO28.ImageIndex = 0;
btnDO29.ImageIndex = 0;
btnDO30.ImageIndex = 0;
btnDO31.ImageIndex = 0;
}
private void InitChart()
{
//定义图表区域
this.chart1.ChartAreas.Clear();
ChartArea chartArea1 = new ChartArea("C0");
this.chart1.ChartAreas.Add(chartArea1);
this.chart1.BackColor = Color.WhiteSmoke;
//定义存储和显示点的容器
this.chart1.Series.Clear();
Series series0 = new Series("S0"); //定义24条曲线分别显示8个通道电压
Series series1 = new Series("S1");
Series series2 = new Series("S2");
Series series3 = new Series("S3");
Series series4 = new Series("S4");
Series series5 = new Series("S5");
Series series6 = new Series("S6");
Series series7 = new Series("S7");
Series series8 = new Series("S8");
Series series9 = new Series("S9");
Series series10 = new Series("S10");
Series series11 = new Series("S11");
Series series12 = new Series("S12");
Series series13 = new Series("S13");
Series series14 = new Series("S14");
Series series15 = new Series("S15");
Series series16 = new Series("S16");
Series series17 = new Series("S17");
Series series18 = new Series("S18");
Series series19 = new Series("S19");
Series series20 = new Series("S20");
Series series21 = new Series("S21");
Series series22 = new Series("S22");
Series series23 = new Series("S23");
series0.ChartArea = "C0";
this.chart1.Series.Add(series0);
this.chart1.Series.Add(series1);
this.chart1.Series.Add(series2);
this.chart1.Series.Add(series3);
this.chart1.Series.Add(series4);
this.chart1.Series.Add(series5);
this.chart1.Series.Add(series6);
this.chart1.Series.Add(series7);
this.chart1.Series.Add(series8);
this.chart1.Series.Add(series9);
this.chart1.Series.Add(series10);
this.chart1.Series.Add(series11);
this.chart1.Series.Add(series12);
this.chart1.Series.Add(series13);
this.chart1.Series.Add(series14);
this.chart1.Series.Add(series15);
this.chart1.Series.Add(series16);
this.chart1.Series.Add(series17);
this.chart1.Series.Add(series18);
this.chart1.Series.Add(series19);
this.chart1.Series.Add(series20);
this.chart1.Series.Add(series21);
this.chart1.Series.Add(series22);
this.chart1.Series.Add(series23);
//设置图表显示样式
this.chart1.ChartAreas[0].AxisX.Minimum = 0;
this.chart1.ChartAreas[0].AxisX.Maximum = 200;
this.chart1.ChartAreas[0].AxisX.Interval = 20;
this.chart1.ChartAreas[0].AxisY.Minimum = -10;
this.chart1.ChartAreas[0].AxisY.Maximum = 10;
this.chart1.ChartAreas[0].AxisY.Interval = 5;
this.chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
this.chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
//设置图表曲线颜色和显示样式
this.chart1.Series[0].Color = Color.Red;
this.chart1.Series[1].Color = Color.Black;
this.chart1.Series[2].Color = Color.Orange;
this.chart1.Series[3].Color = Color.MediumVioletRed;
this.chart1.Series[4].Color = Color.Blue;
this.chart1.Series[5].Color = Color.Green;
this.chart1.Series[6].Color = Color.Sienna;
this.chart1.Series[7].Color = Color.Teal;
this.chart1.Series[8].Color = Color.Red;
this.chart1.Series[9].Color = Color.Black;
this.chart1.Series[10].Color = Color.Orange;
this.chart1.Series[11].Color = Color.MediumVioletRed;
this.chart1.Series[12].Color = Color.Blue;
this.chart1.Series[13].Color = Color.Green;
this.chart1.Series[14].Color = Color.Sienna;
this.chart1.Series[15].Color = Color.Teal;
this.chart1.Series[16].Color = Color.Red;
this.chart1.Series[17].Color = Color.Black;
this.chart1.Series[18].Color = Color.Orange;
this.chart1.Series[19].Color = Color.MediumVioletRed;
this.chart1.Series[20].Color = Color.Blue;
this.chart1.Series[21].Color = Color.Green;
this.chart1.Series[22].Color = Color.Sienna;
this.chart1.Series[23].Color = Color.Teal;
for (int i = 0; i < 24; i++)
{
this.chart1.Series[i].ChartType = SeriesChartType.FastLine;
this.chart1.Series[i].Points.Clear();
}
this.chart1.Series[0].Points.AddXY(0, 0);
}
private void Init_AO()
{
AO0_textBox.Text = Convert.ToDouble(0).ToString("f3");
AO1_textBox.Text = Convert.ToDouble(0).ToString("f3");
}
private void Init_DAQ_set()
{
AI_Range_comboBox.SelectedIndex = 0;
DAQfre_textBox.Text = Convert.ToString(1000);
}
private void Init_PWM()
{
T0_Freq_textBox.Text = Convert.ToString(1000);
T0_Duty_textBox.Text = Convert.ToString(50);
T1_Freq_textBox.Text = Convert.ToString(1000);
T1_Duty_textBox.Text = Convert.ToString(50);
T2_Freq_textBox.Text = Convert.ToString(1000);
T2_Duty_textBox.Text = Convert.ToString(50);
// T3_Freq_textBox.Text = Convert.ToString(1000);
// T3_Duty_textBox.Text = Convert.ToString(50);
Encoder0_textBox.Text = Convert.ToString(0);
Encoder1_textBox.Text = Convert.ToString(0);
PulseCount0_textBox.Text = Convert.ToString(0);
PulseCount1_textBox.Text = Convert.ToString(0);
PulseCount2_textBox.Text = Convert.ToString(0);
Frequency0_textBox.Text = Convert.ToString(0);
Frequency1_textBox.Text = Convert.ToString(0);
Frequency2_textBox.Text = Convert.ToString(0);
}
private void Init_checkBox()
{
AI0_checkBox.Checked = true;
AI1_checkBox.Checked = true;
AI2_checkBox.Checked = true;
AI3_checkBox.Checked = true;
AI4_checkBox.Checked = true;
AI5_checkBox.Checked = true;
AI6_checkBox.Checked = true;
AI7_checkBox.Checked = true;
AI8_checkBox.Checked = true;
AI9_checkBox.Checked = true;
AI10_checkBox.Checked = true;
AI11_checkBox.Checked = true;
AI12_checkBox.Checked = true;
AI13_checkBox.Checked = true;
AI14_checkBox.Checked = true;
AI15_checkBox.Checked = true;
}
private void btnClear_Click(object sender, EventArgs e)
{
senddata[42] |= (byte)(1 << 0); //编码器0清零
if (sock.Connected)
sock.Send(senddata);
senddata[42] = 0;
Encoder0_textBox.Text = "0";
}
private void btnClearEn1_Click(object sender, EventArgs e)
{
senddata[42] |= (byte)(1 << 1); //编码器1清零
if (sock.Connected)
sock.Send(senddata);
senddata[42] = 0;
Encoder1_textBox.Text = "0";
}
private void btnClearCounter0_Click(object sender, EventArgs e)
{
// 设置字节42的bit2为1清零计数0
senddata[42] |= (byte)(1 << 2);
// 发送数据
if (sock.Connected)
sock.Send(senddata);
senddata[42] = 0;
// 重置计数0文本框
PulseCount0_textBox.Text = "0";
}
private void btnClearCounter1_Click(object sender, EventArgs e)
{
// 设置字节42的bit3为1清零计数1
senddata[42] |= (byte)(1 << 3);
// 发送数据
if (sock.Connected)
sock.Send(senddata);
senddata[42] = 0;
// 重置计数1文本框
PulseCount1_textBox.Text = "0";
}
private void btnClearCounter2_Click(object sender, EventArgs e)
{
// 设置字节42的bit4为1清零计数2
senddata[42] |= (byte)(1 << 4);
// 发送数据
if (sock.Connected)
sock.Send(senddata);
senddata[42] = 0;
// 重置计数2文本框
PulseCount2_textBox.Text = "0";
}
private void Form1_Load(object sender, EventArgs e)
{
Init_DAQ_set();
Init_AO();
Init_PWM();
Init_checkBox();
InitChart();
threadReceiveData.IsBackground = true; //后台运行
threadReceiveData.Start(); //采集线程开始
this.Resize += new EventHandler(Form1_Resize);//窗体调整大小时引发事件
X = this.Width;//获取窗体的宽度
Y = this.Height;//获取窗体的高度
setTag(this);//调用方法
}
private float X;//当前窗体的宽度
private float Y;//当前窗体的高度
//将控件的宽左边距顶边距和字体大小暂存到tag属性中
private void setTag(Control cons)
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
if (con.Controls.Count > 0)
setTag(con);
}
}
//根据窗体大小调整控件大小
private void setControls(float newx, float newy, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//获取控件的Tag属性值并分割后存储字符串数组
float a = System.Convert.ToSingle(mytag[0]) * newx;//根据窗体缩放比例确定控件的值,宽度
con.Width = (int)a;//宽度
a = System.Convert.ToSingle(mytag[1]) * newy;//高度
con.Height = (int)(a);
a = System.Convert.ToSingle(mytag[2]) * newx;//左边距离
con.Left = (int)(a);
a = System.Convert.ToSingle(mytag[3]) * newy;//上边缘距离
con.Top = (int)(a);
Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);
}
}
}
private void Form1_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / X; //窗体宽度缩放比例
float newy = (this.Height) / Y; //窗体高度缩放比例
setControls(newx, newy, this); //随窗体改变控件大小
}
private void button1_Click(object sender, EventArgs e)
{
// 检查是否有数据
if (allDataRecords == null || allDataRecords.Count == 0)
{
MessageBox.Show("没有可导出的数据。请先开始采集。", "提示");
return;
}
// 选择保存路径
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "CSV文件|*.csv";
sfd.FileName = $"采集数据_{DateTime.Now:yyyyMMdd_HHmmss}.csv";
if (sfd.ShowDialog() == DialogResult.OK)
{
try
{
ExportToCsv(sfd.FileName);
MessageBox.Show($"导出成功!共 {allDataRecords.Count} 条记录。", "完成");
}
catch (Exception ex)
{
MessageBox.Show($"导出失败:{ex.Message}", "错误");
}
}
}
private void ExportToCsv(string filePath)
{
using (var writer = new System.IO.StreamWriter(filePath, false, Encoding.UTF8))
{
// 写入表头
var header = new List<string>
{
"序号", "时间"
};
// AI通道
for (int i = 0; i < 16; i++) header.Add($"AI{i}(V)");
// DI通道32位
for (int i = 0; i < 32; i++) header.Add($"DI{i}");
// 脉冲计数
for (int i = 0; i < 3; i++) header.Add($"PulseCount{i}");
// 频率
for (int i = 0; i < 3; i++) header.Add($"Frequency{i}(Hz)");
writer.WriteLine(string.Join(",", header));
// 写入数据
foreach (var record in allDataRecords)
{
var row = new List<string>
{
record.SampleIndex.ToString(),
record.Timestamp.ToString("yyyy-MM-dd HH:mm:ss.fff")
};
// AI
for (int i = 0; i < 16; i++) row.Add(record.AI[i].ToString("F4"));
// DI将4个字节拆分为32个位
int bitIndex = 0;
for (int b = 0; b < 4; b++)
{
byte diByte = record.DI[b];
for (int bit = 0; bit < 8; bit++)
{
int bitValue = (diByte >> bit) & 1;
row.Add(bitValue.ToString());
}
}
// 脉冲计数
for (int i = 0; i < 3; i++) row.Add(record.PulseCount[i].ToString());
// 频率
for (int i = 0; i < 3; i++) row.Add(record.Frequency[i].ToString());
writer.WriteLine(string.Join(",", row));
}
}
}
}
public class DataRecord
{
public DateTime Timestamp { get; set; } // 采样时间
public int SampleIndex { get; set; } // 采样序号(可选)
public float[] AI { get; set; } = new float[16]; // 16个模拟输入通道电压
public byte[] DI { get; set; } = new byte[4]; // 4个字节的DI状态共32位
public uint[] PulseCount { get; set; } = new uint[3]; // 3个脉冲计数器
public uint[] Frequency { get; set; } = new uint[3]; // 3个频率值
}
}