目录
一 设计原型
二 后台源码
using SimpleTCP;
using SqlSugar;
using System.IO.Ports;
using System.Text;
namespace 自动化上位机设计
{
public partial class Form1 : Form
{
SqlHelper sqlHelper = new SqlHelper();
SqlSugarClient dbContent = null;
bool IsRun = false;
int Count = 0;
//数据收集对象
EntryClass Datas = new EntryClass();
//网络通讯客户端:长度测试仪器
SimpleTcpClient client = new SimpleTcpClient(); //设备1
SimpleTcpClient client2 = new SimpleTcpClient();//设备2
SimpleTcpClient client3 = new SimpleTcpClient();//设备3
SimpleTcpClient client4 = new SimpleTcpClient();//设备4
//串口设备
SerialPort serialPort = new SerialPort();
SerialPort serialPort2 = new SerialPort();
SerialPort serialPort3 = new SerialPort();
SerialPort serialPort4 = new SerialPort();
//网络服务端设备
SimpleTcpServer server = new SimpleTcpServer();
SimpleTcpServer server2 = new SimpleTcpServer();
SimpleTcpServer server3 = new SimpleTcpServer();
SimpleTcpServer server4 = new SimpleTcpServer();
public Form1()
{
InitializeComponent();
dbContent = sqlHelper.db;
timer1.Enabled = true;
timer1.Tick += Timer1_Tick;
Task.Run(() =>
{
//设置编码格式,默认是UTF8
client.StringEncoder = System.Text.ASCIIEncoding.UTF8;
//设置分隔符,默认是0x13
client.Delimiter = Encoding.ASCII.GetBytes("\r")[0];
//设置编码格式,默认是UTF8
client2.StringEncoder = System.Text.ASCIIEncoding.UTF8;
//设置分隔符,默认是0x13
client2.Delimiter = Encoding.ASCII.GetBytes("\r")[0];
//设置编码格式,默认是UTF8
client3.StringEncoder = System.Text.ASCIIEncoding.UTF8;
//设置分隔符,默认是0x13
client3.Delimiter = Encoding.ASCII.GetBytes("\r")[0];
//设置编码格式,默认是UTF8
client4.StringEncoder = System.Text.ASCIIEncoding.UTF8;
//设置分隔符,默认是0x13
client4.Delimiter = Encoding.ASCII.GetBytes("\r")[0];
//初始化串口设备
serialPort.PortName = "COM1";
serialPort.BaudRate = 115200;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.DataReceived += (a, b) =>
{
byte[] buffer = new byte[1024];
serialPort.Read(buffer, 0, buffer.Length);
string data = Encoding.UTF8.GetString(buffer);
//重量
Datas.Weit = data;
};
//初始化串口设备
serialPort2.PortName = "COM3";
serialPort2.BaudRate = 115200;
serialPort2.Parity = Parity.None;
serialPort2.DataBits = 8;
serialPort2.StopBits = StopBits.One;
serialPort2.DataReceived += (a, b) =>
{
byte[] buffer = new byte[1024];
serialPort.Read(buffer, 0, buffer.Length);
string data = Encoding.UTF8.GetString(buffer);
//噪音
Datas.ZY = data;
};
//初始化串口设备
serialPort3.PortName = "COM5";
serialPort3.BaudRate = 115200;
serialPort3.Parity = Parity.None;
serialPort3.DataBits = 8;
serialPort3.StopBits = StopBits.One;
serialPort3.DataReceived += (a, b) =>
{
byte[] buffer = new byte[1024];
serialPort.Read(buffer, 0, buffer.Length);
string data = Encoding.UTF8.GetString(buffer);
//电压
Datas.DC = data;
};
//初始化串口设备
serialPort4.PortName = "COM7";
serialPort4.BaudRate = 115200;
serialPort4.Parity = Parity.None;
serialPort4.DataBits = 8;
serialPort4.StopBits = StopBits.One;
serialPort4.DataReceived += (a, b) =>
{
byte[] buffer = new byte[1024];
serialPort.Read(buffer, 0, buffer.Length);
string data = Encoding.UTF8.GetString(buffer);
//内阻
Datas.DR = data;
};
//收到分割数据的事件,遇到分隔符就会触发事件
client.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
client.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录长度数据
Datas.Len = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
client2.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
client2.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录长度数据
Datas.Width = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
client3.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
client3.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录长度数据
Datas.Hight = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
client4.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
client4.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录数据
Datas.R = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
server.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
server.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录数据
Datas.YL = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
server2.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
server2.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录数据
Datas.WD = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
server3.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
server3.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录数据
Datas.SD = msg.MessageString;
};
//收到分割数据的事件,遇到分隔符就会触发事件
server4.DelimiterDataReceived += (sender, msg) =>
{
AddLog("DelimiterStr-" + DateTime.Now.ToString() + msg.MessageString);
};
//收到数据的事件,可以在这里实现自己的协议
server4.DataReceived += (sender, msg) =>
{
//字节数组
AddLog("字节数组Data:" + BitConverter.ToString(msg.Data));
//字符串消息
AddLog("字符串消息RDataseivedStr:" + msg.MessageString);
//记录数据
Datas.LJ = msg.MessageString;
};
client.Connect("127.0.0.1", 8899);
client2.Connect("127.0.0.1", 8899);
client3.Connect("127.0.0.1", 8899);
client4.Connect("127.0.0.1", 8899);
serialPort.Open();
serialPort2.Open();
serialPort3.Open();
serialPort4.Open();
server.Start(9900);
server.Start(9901);
server.Start(9902);
server.Start(9903);
});
}
private void Timer1_Tick(object? sender, EventArgs e)
{
this.Invoke(() =>
{
uiLedDisplay1.Text = DateTime.Now.ToString("HH:mm:ss");
});
}
private void Form1_Load(object sender, EventArgs e)
{
sqlHelper.CreateTable<EntryClass>();
//开始批量插入数据
Task.Run(() => { AddData(); });
}
private void AddData()
{
while (true)
{
if (!IsRun) continue;
//Datas.Len = new Random().Next(200, 300).ToString();
//Datas.Width = new Random().Next(40, 300).ToString();
//Datas.Hight = new Random().Next(150, 250).ToString();
// Datas.R = new Random().Next(10, 360).ToString();
// Datas.Weit = new Random().Next(20, 30).ToString();
//Datas.ZY = new Random().Next(50, 90).ToString();
//Datas.DC = new Random().Next(40, 300).ToString();
//Datas.DR = new Random().Next(400, 600).ToString();
//Datas.YL = new Random().Next(28, 88).ToString();
//Datas.WD = new Random().Next(89, 900).ToString();
//Datas.SD = new Random().Next(234, 454).ToString();
//Datas.LJ = new Random().Next(67, 89).ToString();
//没有测量长度则不增加数据
if (string.IsNullOrEmpty(Datas.Len) || string.IsNullOrEmpty(Datas.Width)
|| string.IsNullOrWhiteSpace(Datas.Hight) || string.IsNullOrWhiteSpace(Datas.R) ||
string.IsNullOrWhiteSpace(Datas.Weit) || string.IsNullOrWhiteSpace(Datas.ZY) ||
string.IsNullOrWhiteSpace(Datas.DC) || string.IsNullOrWhiteSpace(Datas.DR) ||
string.IsNullOrWhiteSpace(Datas.YL) || string.IsNullOrWhiteSpace(Datas.WD) ||
string.IsNullOrWhiteSpace(Datas.SD) || string.IsNullOrWhiteSpace(Datas.LJ)) continue;
//数据放入数据库中
dbContent.Insertable(Datas).ExecuteCommand();
this.Invoke(() =>
{
//同步展示参数
CD.Text = Datas.Len;
KD.Text = Datas.Width;
GD.Text = Datas.Hight;
JD.Text = Datas.R;
ZL.Text = Datas.Weit;
ZY.Text = Datas.ZY;
DY.Text = Datas.DC;
NZ.Text = Datas.DR;
PRESS.Text = Datas.YL;
CC.Text = Datas.WD;
SD.Text = Datas.SD;
LJJ.Text = Datas.LJ;
//参数展示到集合中
Data.Rows.Add(Datas.Len, Datas.Width, Datas.Hight, Datas.R, Datas.Weit, Datas.ZY,
Datas.DC, Datas.DR, Datas.YL, Datas.WD, Datas.SD, Datas.LJ,
DateTime.Now.ToShortTimeString(), "OK", "测试数据");
//计数
Count++;
uiLedDisplay2.Text = Count.ToString();
//打印日志
RunLog.AppendText("设备运行中,数据已加入到数据库\r\n");
ErorrLog.AppendText("设备运行中,数据已加入到数据库\r\n");
Log.AppendText("设备运行中,数据已加入到数据库\r\n");
//清空已经记录的数据
Datas.Len = "";
Datas.Width = "";
Datas.Hight = "";
Datas.R = "";
Datas.Weit = "";
Datas.ZY = "";
Datas.DC = "";
Datas.DR = "";
Datas.YL = "";
Datas.WD = "";
Datas.SD = "";
Datas.LJ = "";
});
Thread.Sleep(2000);
}
}
private void uiSwitch1_ValueChanged(object sender, bool value)
{
if (uiSwitch1.Active)
{
uiLight1.OnColor = Color.Green;
IsRun = true;
RunLog.AppendText("设备启动。。。\r\n");
ErorrLog.AppendText("设备启动。。。\r\n");
Log.AppendText("设备启动。。。\r\n");
}
else
{
uiLight1.OnColor = Color.Red;
IsRun = false;
RunLog.AppendText("设备停止。。。\r\n");
ErorrLog.AppendText("设备停止。。。\r\n");
Log.AppendText("设备停止。。。\r\n");
}
}
private void AddLog(string msg)
{
this.Invoke(() =>
{
//打印日志
RunLog.AppendText($"{msg}\r\n");
ErorrLog.AppendText($"{msg}\r\n");
Log.AppendText($"{msg}\r\n");
});
}
}
}
using SqlSugar;
namespace 自动化上位机设计
{
public class SqlHelper
{
public SqlSugarClient db = GetSql();
/// <summary>
/// 获得数据库对象
/// </summary>
/// <returns></returns>
private static SqlSugarClient GetSql()
{
string FilePath = Environment.CurrentDirectory + @"\Config\Data.db";
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = $"Data Source={FilePath}", // SQLite 连接字符串
DbType = DbType.Sqlite, // 指定数据库类型为 SQLite
IsAutoCloseConnection = true, // 自动关闭连接
InitKeyType = InitKeyType.Attribute//从实体特性中读取主键自增列信息
});
// 创建数据库
db.DbMaintenance.CreateDatabase();
return db;
}
/// <summary>
/// 创建数据表
/// </summary>
public void CreateTable<T>()
{
//两种方法都能创建表
//db.CodeFirst.InitTables(typeof(Student));
db.CodeFirst.InitTables<T>();
}
}
}
using SqlSugar;
namespace 自动化上位机设计
{
//实体与数据库结构一样
//数据是自增需要加上IsIdentity
//数据库是主键需要加上IsPrimaryKey
//注意:要完全和数据库一致2个属性
[SugarTable("EntryClass")]
public class EntryClass
{
public string Len { get; set; }
public string Width { get; set; }
public string Hight { get; set; }
public string R { get; set; }
public string Weit { get; set; }
public string ZY { get; set; }
public string DC { get; set; }
public string DR { get; set; }
public string YL { get; set; }
public string WD { get; set; }
public string SD { get; set; }
public string LJ { get; set; }
}
}