c#上位机,C# CSharp Modbus Rtu协议上位机源码,包括存储,数据到SQL S...
·
c#上位机,C# CSharp Modbus Rtu协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报表,实时和历史报警界面,用户管理

搞C#上位机开发的兄弟们都懂,Modbus RTU这玩意儿就像车间里的老电工——虽然有点年头但确实靠谱。今天咱们不整虚的,直接上干货,从协议解析到数据落地,手把手撸个能打的上位机。

先看Modbus通信这茬,用NModbus库省事得飞起:
var factory = new ModbusFactory();
using var master = factory.CreateRtuMaster(new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One));
ushort[] registers = master.ReadHoldingRegisters(1, 40001, 10); // 读40001开始的10个寄存器
注意串口参数要和下位机对得上,不然就像对牛弹琴。读写数据时建议用Task.Run,别把UI线程卡成PPT。

数据存SQL Server这块,别整那些花里胡哨的ORM,直连更带劲:
using var conn = new SqlConnection("Server=.;Database=SCADA;Trusted_Connection=True;");
await conn.OpenAsync();
var cmd = new SqlCommand("INSERT INTO RealData (Address, Value) VALUES (@addr, @val)", conn);
cmd.Parameters.AddWithValue("@addr", 40001);
cmd.Parameters.AddWithValue("@val", registers[0]);
await cmd.ExecuteNonQueryAsync();
建议用SqlBulkCopy做批量插入,实测每秒万条数据跟玩儿似的。记得给表加时间戳和索引,要不查历史数据时能急死你。

趋势曲线用LiveCharts2是真香警告:
CartesianChart chart = new CartesianChart();
var series = new LineSeries<float> {
Values = dbContext.HistoryData
.Where(x => x.TagId == 1001)
.OrderBy(x => x.Timestamp)
.Select(x => x.Value)
.AsEnumerable()
};
chart.Series = new ObservableCollection<ISeries> { series };
Y轴自适应记得开,要不然遇到个跳变值整个曲线就成心电图了。鼠标滚轮缩放功能要自己实现,官方文档藏着呢。

报警处理得搞个双缓冲队列:
ConcurrentQueue<Alarm> realtimeAlarms = new ConcurrentQueue<Alarm>();
void OnDataReceived(object sender, DataEventArgs e) {
if(e.Value > 100) {
realtimeAlarms.Enqueue(new Alarm{
Level = AlarmLevel.Critical,
Message = $"爆表了!地址:{e.Address} 值:{e.Value}"
});
}
}
历史报警查询记得分页,别傻乎乎全加载。DataGridView的虚拟模式得会玩,不然十万条记录能卡到妈都不认识。
用户权限这套路,RBAC模型整起来:
class User {
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string PasswordHash { get; set; }
public List<Role> Roles { get; set; }
}
[Authorize(Roles = "Admin")] // 这个特性管权限
public void DeleteAlarm(int id) {
// 只有管理员能删报警
}
密码别明文存!SHA256加盐是底线。操作日志必须记,锅来了有证据。
最后说几个坑:
- Modbus超时设置别用默认值,根据设备响应调整
- SQL连接池要配置,默认100不够车间用
- 界面刷新用Dispatcher.BeginInvoke
- 异常处理要到位,特别是串口拔插的情况
- 安装包记得带.NET框架合并模块
源码结构建议这么分:
- Comm(通信层)
- Database(数据访问)
- UI(界面控件)
- Business(业务逻辑)
- Reports(报表模板)
这玩意儿真要全撸出来得两万行起步,但拆成模块逐个击破也没那么吓人。记住,好上位机都是迭代出来的,别指望第一版就完美。车间老师傅们的需求就像女生的心思,得慢慢品...
更多推荐
所有评论(0)