c#上位机开发项目 c#语言编写的上位机控制软件,空压机项目 采用modbus rtu协议与西...

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里再恢复,不然用户乱点容易崩。整个项目搞下来最大的收获是:工业软件既要技术硬核,又得让操作工用着顺手,这平衡点得在车间多蹲点才能找准。

相关推荐
xiaoyaohou112 天前
025、分布式计算实战:Spark Core与Spark SQL
sql·ajax·spark
Henb9292 天前
# Spark 内核级调优源码分析
大数据·ajax·spark
3秒一个大5 天前
Cookie/Session vs JWT 双 Token:登录认证方案的演进与对比
前端·安全·ajax
华科易迅5 天前
Vue通过Ajax获取后台路由信息
vue.js·ajax·okhttp
用户8113581881206 天前
【AJAX-Day2】Promise与回调地狱
前端·ajax
酉鬼女又兒11 天前
零基础快速入门前端蓝桥杯 Web 备考:AJAX 与 XMLHttpRequest 核心知识点及实战(可用于备赛蓝桥杯Web应用开发)
前端·ajax·职场和发展·蓝桥杯·css3·js
HP-Patience12 天前
【Python爬虫常见错误】- AJAX动态加载数据爬取
爬虫·python·ajax
Hello.Reader12 天前
Spark 4.0 新特性Python Data Source API 快速上手
python·ajax·spark
独断万古他化13 天前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
Hello.Reader14 天前
Spark Connect 快速入门远程连接 Spark 集群实战
javascript·ajax·spark