c#上位机开发项目 c#语言编写的上位机控制软件,空压机项目 采用modbus rtu协议与西门子plc s7200smart进行通讯 联合SQL server数据库进行数据存储,针对数据库操作增删改查功能。 数据存储,报表导出,曲线绘制,自定义控件,用户登录验证,动态水管动画,通讯协议等等全都有。

最近在车间折腾了个挺有意思的C#上位机项目,给空压机控制系统搞了个带劲的操作界面。这玩意儿既要跟西门子PLC S7200Smart实时对话,又要把数据存到SQL Server里,还搞了动态水管动画效果,属实是既要当技术宅又要兼职美术生。

c#上位机开发项目 c#语言编写的上位机控制软件,空压机项目 采用modbus rtu协议与西门子plc s7200smart进行通讯 联合SQL server数据库进行数据存储,针对数据库操作增删改查功能。 数据存储,报表导出,曲线绘制,自定义控件,用户登录验证,动态水管动画,通讯协议等等全都有。

先说和PLC的通讯,Modbus RTU协议用起来是真香。咱们得先用SerialPort组件配置串口参数,注意停止位和奇偶校验要和PLC那边对齐。这里有个坑要注意:西门子PLC的寄存器地址需要转成Modbus地址。比如DB1.DBW10对应的地址是400011,这个转换逻辑得在代码里处理:
csharp
// Modbus地址转换示例
string GetModbusAddress(int dbBlock, int offset)
{
return $"4{((dbBlock-1)*100 + offset).ToString().PadLeft(5,'0')}";
}
数据库操作这块,建议用Dapper来简化ADO.NET操作。比如往报警记录表里插数据,用参数化查询防SQL注入:
csharp
public void InsertAlarm(string deviceId, string message)
{
using (var conn = new SqlConnection(_connStr))
{
conn.Execute("INSERT INTO AlarmLogs (DeviceID, AlarmTime, Message)
VALUES (@did, GETDATE(), @msg)",
new { did = deviceId, msg = message });
}
}
曲线绘制推荐用LiveCharts这个库,动态更新压力曲线的时候效果很丝滑。关键是要处理好时间轴,建议用DateTime.ToOADate()转成double值方便绘图:
csharp
var pressureSeries = new LineSeries
{
Values = new ChartValues<ObservablePoint>(),
PointGeometry = DefaultGeometries.Circle,
StrokeThickness = 2
};
动态水管动画用GDI+的GraphicsPath实现最合适。根据压力值实时改变管道颜色和流速效果,记得在Panel的Paint事件里重绘:
csharp
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
using (var path = new GraphicsPath())
{
path.AddEllipse(10, 10, Width-20, Height-20);
using (var brush = new LinearGradientBrush(...))
{
e.Graphics.FillPath(brush, path);
}
}
}
用户登录验证这块别直接用明文存密码,至少搞个盐值加密。用ASP.NET Core的Identity库有点杀鸡用牛刀,咱们自己实现个简单的:
csharp
public string HashPassword(string password)
{
using (var sha = SHA256.Create())
{
var salted = password + _salt;
return Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(salted)));
}
}
做报表导出时发现ClosedXML比NPOI好用,导出Excel的时候还能保持样式。特别是合并单元格这种需求,几行代码就能搞定:
csharp
using (var wb = new XLWorkbook())
{
var ws = wb.Worksheets.Add("报表");
ws.Range("A1:D1").Merge().Value = "空压机运行日报";
ws.Cell(2, 1).Value = DateTime.Now.ToString("yyyy-MM-dd");
//...保存操作
}
开发这类工业上位机最头疼的还是通讯稳定性。建议在串口通讯层加个重试机制,用Polly这个重试库处理超时问题。比如连续三次读取失败才报通讯中断:
csharp
var policy = Policy.Handle<TimeoutException>()
.WaitAndRetry(3, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
policy.Execute(() =>
{
// 执行Modbus读取操作
});
最后提醒下界面线程的问题,用BackgroundWorker处理耗时操作时,千万别忘了在DoWork事件里禁用控件,在RunWorkerCompleted里再恢复,不然用户乱点容易崩。整个项目搞下来最大的收获是:工业软件既要技术硬核,又得让操作工用着顺手,这平衡点得在车间多蹲点才能找准。
