大型源码C# MES WPF CS/BS两套 1, 整体程序由WPF(c#)开发; 2,各个文...

大型源码C# MES WPF CS/BS两套 1, 整体程序由WPF(c#)开发; 2,各个文档齐全; 3,需要您对WPF和程序架构有比较深入理解; 4,包含服务程序; 5,包含SCADA数据采集系统; 6,包含数据看板; 7,包含各种组件; 8, 包含完整的各个处理脚本。 9, 由多个产品线程序组成。 10, 数据库的使用。 11, 远程服务器的调用。 12, 分多个生产文件夹,都是一个项目。 环境: vs2019 数据库: oracle

这坨WPF写的MES系统有点东西,十几个产品线在同一个解决方案里折腾,Oracle数据库扛着每秒上千条的生产数据。先看主界面这个三维看板,XAML里直接嵌套了HelixToolkit的视口,实时渲染设备状态:

xml 复制代码
<helix:HelixViewport3D x:Name="viewport">
    <helix:SunLight/>
    <ModelVisual3D Content="{Binding MachineModel}"/>
    <CoordinateSystemVisual3D/>
</helix:HelixViewport3D>

配合着MVVM模式,数据绑定直接甩给Prism的BindableBase。看这个车间状态聚合器,用TPL数据流处理实时更新,比传统事件驱动骚气多了:

csharp 复制代码
var bufferBlock = new BufferBlock<DeviceData>();
var actionBlock = new ActionBlock<IEnumerable<DeviceData>>(data =>
{
    Dispatcher.Invoke(() => Machines.ObserveReplacements(d => d.Update(data)));
}, new ExecutionDataflowBlockOptions{ MaxDegreeOfParallelism = 4 });
bufferBlock.LinkTo(actionBlock);

SCADA采集层更野,OPC UA客户端直接硬核封装成Windows服务。注意这个异步订阅的骚操作,避免UI线程卡成狗:

csharp 复制代码
var subscription = await _session.CreateSubscriptionAsync(1000);
subscription.DataChangeReceived += (_, e) => 
{
    var cache = new DataPointCache();
    Parallel.ForEach(e.NotificationMessage.NotificationData, dp => 
    {
        cache.QueueRawData(dp.Value);
    });
    _dataPipeline.Enqueue(cache);
};

数据库操作别傻乎乎用EF,直接上OracleCommand暴力执行存储过程。看这个批量插入的姿势,用ArrayBindingSize直接干翻Dapper:

csharp 复制代码
var cmd = new OracleCommand("insert_production_data") {
    CommandType = CommandType.StoredProcedure,
    ArrayBindCount = data.Count
};
cmd.Parameters.Add("p_values", OracleDbType.Double).Value = data.Select(d => d.Value).ToArray();
conn.ExecuteNonQuery(cmd);

服务层用Topshelf裹着WCF双工通信,回调机制处理实时报警。注意这个双向绑定的坑,得用SynchronizationContext.Post绕开线程问题:

csharp 复制代码
OperationContext.Current.GetCallbackChannel<IMesCallback>().OnAlertReceived(
    new AlertPacket {
        Level = AlertLevel.Critical,
        Message = $"设备{deviceId}温度超限"
    });

产品线差异处理才是真功夫,用条件编译+策略模式组合拳。比如食品线和电子线不同的质检流程:

csharp 复制代码
#if FOOD_LINE
    new VisionInspector(new FoodSpecValidator()).Execute();
#elif ELECTRONIC_LINE
    await new XrayScanner().ScanAsync(ct);
#endif

项目结构分成二十几个模块化工程,每个产品线独立成文件夹。解决方案文件里玩条件引用,Jenkins打包时动态替换配置文件:

xml 复制代码
<ProjectReference Condition="'$(ProductLine)'=='A'" Include="..\ProductA\ProductA.csproj"/>

这套玩意最难搞的是WPF的内存泄漏,尤其是那个自定义的GanttChart控件。得用Snoop抓泄露对象,最后发现是静态事件没解注册。现在看板数据刷新时强制GC.Collect,虽然有点脏但管用。

(完)

相关推荐
Geek 研究僧2 天前
致态灵·潮流版 PSSD:iPhone 的 ProRes RAW 专业影像进阶之路
智能手机·iphone·智能硬件
Digitally2 天前
iPhone 无法向安卓设备发送图片:轻松解决
android·ios·iphone
2501_915918412 天前
iOS 开发中证书创建与管理中的常见问题
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张2 天前
IOScer 开发环境证书包括哪些,证书、描述文件与 App ID 的协同管理实践
android·ios·小程序·https·uni-app·iphone·webview
2501_915921433 天前
iPhone HTTPS 抓包在真机环境下面临的常见问题
android·ios·小程序·https·uni-app·iphone·webview
2501_915918413 天前
iOS 图片资源保护方法,分析图片在二次打包和资源篡改中的实际风险
android·ios·小程序·https·uni-app·iphone·webview
TheNextByte13 天前
如何通过 7 种方式将视频从 iPhone 传输到 U 盘?
ios·音视频·iphone
2501_916008893 天前
iPhone 耗电异常检测的思路,从系统电池统计、克魔(KeyMob)、Instruments等工具出发
android·ios·小程序·uni-app·cocoa·iphone·webview
2501_915921433 天前
App Store 上架流程中常见的关键问题
android·ios·小程序·https·uni-app·iphone·webview
TheNextByte13 天前
无需iTunes将语音备忘录从iPhone传输到计算机的方法
ios·iphone