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

相关推荐
TTGGGFF1 天前
控制系统建模仿真(十):实战篇——从工具掌握到工程化落地
前端·javascript·ajax
W.KN2 天前
AJAX 基础学习笔记
笔记·学习·ajax
tkevinjd3 天前
3-Vue&Ajax
前端·vue.js·ajax
HIT_Weston5 天前
104、【Ubuntu】【Hugo】搭建私人博客:搜索功能(AJAX请求)
ubuntu·ajax·okhttp
啥都不懂的小小白5 天前
Vue Ajax与状态管理完全指南:从数据请求到全局状态控制
vue.js·ajax·vuex·插槽系统
岁岁种桃花儿8 天前
XMLHttpRequest 从入门到实战:GET/POST 请求完整案例
ajax·okhttp
m0_7482546610 天前
AJAX 基础实例
前端·ajax·okhttp
波波鱼દ ᵕ̈ ૩10 天前
AJAX(1)
前端·javascript·ajax
帅次10 天前
Web应用系统全面解析:从架构设计到测试部署的核心要点
前端·javascript·ajax·html5