注塑机上位机源码数据追溯:C#编写,S7_1500 PLC支持,双重数据库(本地+远程MSSQ...
·
注塑机上位机源码数据追溯 1, 采用C#编写。 2, plc为s7_1500。 3, 双重数据库,本地和远程同时存取,mssql2012。 4, 同时使用OPCDA和OPCUA。 OPCDA链接 1500,OPCUA链接注塑机。 5, 使用多线程,界面流畅有好。 6, 数据查询与导出。

最近在搞注塑机上位机开发,系统用C#怼了个全栈方案。通信层既要对接西门子S7-1500,又要直连注塑机本体,双OPC协议混搭确实有点意思。先上个PLC通信的代码片段:
var daConnector = new OpcDaConnector("S7.OPCDAServer.1");
daConnector.AddGroup("InjectionData", 200,
new[] { "DB101.DBD0", "DB101.DBD4", "DB101.DBD8" });
var uaClient = new OpcUaClient("opc.tcp://192.168.1.100:4840");
await uaClient.ConnectAsync();
var moldTemp = uaClient.ReadNode("ns=3;s=Mold.Temperature");
OPC DA这边用经典的SiemensDAAuto.dll封装,注意1500系列默认数据块偏移量要+4字节。UA协议用OpcFoundation的官方库,异步连接避免界面卡死。实测DA的读取速度比UA快30ms左右,但UA跨网段部署确实香。

数据库双重存储有点讲究,本地库存实时工艺参数,远程库做批次记录。看这个骚操作:
public void SaveData(InjectionData data)
{
Task.Run(() => {
lock (_localDbLock) {
using var conn = new SqlConnection(localConnStr);
conn.Execute("INSERT INTO Realtime...");
}
using var remoteConn = new SqlConnection(remoteConnStr);
remoteConn.Execute("UPDATE Batch SET...");
});
}
注意本地库操作必须加锁,防止多线程写冲突。用Dapper做ORM比EF快不是一点半点,特别是批量插入注塑周期数据时,速度差三倍以上。

界面流畅的秘诀在于DispatcherTimer和BackgroundWorker的混用。实时曲线用OxyPlot绘制,数据绑定要这样玩:
PlotModel.InvalidatePlot(true);
Application.Current.Dispatcher.BeginInvoke(new Action(() => {
// 更新不超过50ms的UI元素
}), DispatcherPriority.Background);
数据导出模块有个坑——Excel互操作会锁死线程。后来改用ClosedXML生成xlsx,效率直接起飞:
using var workbook = new XLWorkbook();
var ws = workbook.AddWorksheet("ShotData");
ws.Cell(1, 1).Value = "射出压力";
ws.Cell(1, 2).Value = "保压时间";
// 十万级数据写入5秒内搞定
workbook.SaveAs("export.xlsx");
遇到最坑爹的问题还是OPC DA的自动重连,后来用了个土法子——心跳检测+备用通道切换:
private void CheckDaConnection()
{
if (_lastUpdateTime < DateTime.Now.AddSeconds(-10)) {
_logger.Warning("OPC DA心跳丢失,启动备用通道");
SwitchToBackupEndpoint();
}
}
这套方案在产线跑了大半年,200ms级的数据采集精度,MySQL和MSSQL双活架构扛住了每天20万次的写入操作。有老铁要源码可以私我,不过记得改连接字符串里的密码哈。





更多推荐


所有评论(0)