.NET 9 + Avalonia UI 工业自动化的 MES桌面版(兼容移动端)转盘数据采集解决方案

前言

工业自动化领域,数据采集系统对于提高生产效率和质量至关重要。苏州诺克汽车零部件有限公司开发的转盘数据采集桌面端项目,正是这样一个旨在提升制造执行系统(MES)数据采集能力的应用。

基于.NET 技术和Avalonia UI框架,该项目不仅实现了高效的数据处理与展示,还提供了跨平台兼容性,支持移动端访问。

项目介绍

苏州诺克汽车零部件有限公司为满足其内部需求而开发的一个开源项目。它主要利用了.NET 9的强大功能以及Avalonia UI的灵活性来开发一个适用于MES系统的桌面应用。

该应用专注于转盘数据的采集和分析,通过实时监控和处理生产线上的各种参数,为企业提供准确的数据支持,从而优化生产流程。

项目技术

.NET 9

作为最新版本的.NET框架,.NET 9带来了许多性能改进和新特性,让开发能够更高效地构建高性能的应用程序。

Avalonia UI

是一个跨平台的UI框架,允许创建适用于Windows、Linux、macOS等操作系统的桌面应用程序。它的出现极大地简化了跨平台UI开发的复杂度。

项目框架

项目具体框架设计如下图所示:

MainView

<UserControl
    x:Class="Digitalmes.AvaloniaUI.Views.MainView"
    xmlns="https://github.com/avaloniaui"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:u="https://irihi.tech/ursa"
    xmlns:converters="using:Digitalmes.AvaloniaUI.Converters"
    xmlns:dataTemplates="using:Digitalmes.AvaloniaUI.DataTemplates"
    xmlns:vm="using:Digitalmes.AvaloniaUI.ViewModels"
    d:DesignHeight="450"
    d:DesignWidth="800"
    x:CompileBindings="True"
    x:DataType="vm:MainViewViewModel"
    mc:Ignorable="d">
    
    <Design.DataContext>
        <vm:MainViewViewModel />
    </Design.DataContext>

    <UserControl.Resources>
        <converters:IconFromResourceConverter x:Key="IconConverter" />
    </UserControl.Resources>

    <Panel>
        <Panel.Styles>
            <Style Selector="Grid.Blur">
                <Setter Property="Effect" Value="blur(10)"></Setter>
            </Style>
            <Style Selector="u|TwoTonePathIcon.normal">
                <Setter Property="Width" Value="16"></Setter>
                <Setter Property="Height" Value="16"></Setter>
            </Style>
            <Style Selector="u|TwoTonePathIcon.large">
                <Setter Property="Width" Value="24"></Setter>
                <Setter Property="Height" Value="24"></Setter>
            </Style>
        </Panel.Styles>
        
        <Grid
            Classes.Blur="{Binding $parent[u:UrsaWindow].(u:OverlayDialogHost.IsInModalStatus)}"
            ColumnDefinitions="Auto, *" >
            <Border
                Padding="8 4"
                VerticalAlignment="Stretch"
                Theme="{DynamicResource CardBorder}">
                <u:NavMenu Name="menu" 
         ItemsSource="{Binding Menus.MenuItems}"
                           ExpandWidth="210"
         IsHorizontalCollapsed="True"
                           CommandBinding="{Binding ActivateCommand}"
                           HeaderBinding="{Binding}"
                           IconBinding="{Binding IconName}">
                    <u:NavMenu.Styles>
                        <Style Selector="u|NavMenuItem" x:DataType="vm:MenuItemViewModel">
                            <Setter Property="IsSeparator" Value="{Binding IsSeparator}"></Setter>
                        </Style>
                    </u:NavMenu.Styles>
                    <!-- 菜单图标 -->
                    <u:NavMenu.IconTemplate>
                        <DataTemplate x:DataType="x:String">
                            <u:TwoTonePathIcon
                                Classes.normal="{Binding !#menu.IsHorizontalCollapsed }"
                                Classes.large="{Binding #menu.IsHorizontalCollapsed }"
                                ActiveForeground="{DynamicResource SemiBlue5}"
                                ActiveStrokeBrush="{DynamicResource SemiBlue5}"
                                Data="{Binding Converter={StaticResource IconConverter}}"
                                Foreground="{DynamicResource SemiGrey5}"
                                IsActive="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=u:NavMenuItem}, Path=IsHighlighted, Mode=TwoWay}"
                                StrokeBrush="{DynamicResource SemiGrey5}" />
                        </DataTemplate>
                    </u:NavMenu.IconTemplate>
                    <!-- 菜单名称 -->
                    <u:NavMenu.HeaderTemplate>
                        <DataTemplate x:DataType="vm:MenuItemViewModel">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock HorizontalAlignment="Left" Text="{Binding MenuHeader}" />
                                <u:Badge
                                    Margin="8,0,0,0"
                                    HorizontalAlignment="Left"
                                    IsVisible="{Binding Badge, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
                                    Header="{Binding Badge}"/>
                            </StackPanel>
                        </DataTemplate>
                    </u:NavMenu.HeaderTemplate>
                    <!-- 菜单顶部 logo -->
                    <u:NavMenu.Header>
                        <DockPanel HorizontalAlignment="Left" Margin="8,8,8,20">
                            <Image
                                Width="24"
                                Height="24"
                                VerticalAlignment="Center"
                                DockPanel.Dock="Left"
                                RenderOptions.BitmapInterpolationMode="HighQuality"
                                Source="../Assets/Icons/logo.ico" />
                            <TextBlock
                                Classes="H5"
                                Margin="8,0,0,0"
                                Text="数字化客户端"
                                FontWeight="Bold"
                                IsVisible="{Binding !#menu.IsHorizontalCollapsed}"
                                VerticalAlignment="Center"
                                Theme="{DynamicResource TitleTextBlock}" />
                        </DockPanel>
                    </u:NavMenu.Header>
                    <!-- 菜单 Footer -->
                    <u:NavMenu.Footer>
                        <DockPanel HorizontalAlignment="Center" Margin="8">
                            <PathIcon
                                Width="16"
                                Height="16"
                                u:NavMenu.CanToggle="True"
                                VerticalAlignment="Center" 
                                DockPanel.Dock="Left"
                                Data="{StaticResource text_continuous_regular}" />
                        </DockPanel>
                    </u:NavMenu.Footer>
                </u:NavMenu>
            </Border>
            <!-- Body 内容-->
            <ContentControl
                Grid.Column="1"
                Margin="12 36 12 12"
                Content="{Binding Content}">
                <ContentControl.ContentTemplate>
                    <dataTemplates:ViewLocator />
                </ContentControl.ContentTemplate>
            </ContentControl>
        </Grid>
    </Panel>
</UserControl>

雪花Id

public static IServiceCollection AddUniqueSetup(this IServiceCollection services)
{
    // 雪花Id
    YitIdHelper.SetIdGenerator(new IdGeneratorOptions
    {
        WorkerId = 1, 
        // 机器码 全局唯一
        WorkerIdBitLength = 1, 
        // 机器码位长 默认值6,取值范围 [1, 19]
        SeqBitLength = 6, 
        // 序列数位长 默认值6,取值范围 [3, 21](建议不小于4,值越大性能越高、Id位数也更长)
    });
    services.AddSingleton<IUnique, UniqueGenerator>();

    return services;
}

项目特点

1、实时数据采集

通过连接到生产设备,实时获取并处理转盘的相关数据。

2、数据分析与展示

提供强大的数据分析工具,帮助用户理解生产过程中的关键指标。

3、跨平台兼容性

得益于Avalonia UI的支持,可以在多种操作系统上运行,增加了使用的灵活性。

4、移动端兼容

虽然主要是桌面应用,但设计时考虑到了移动端的使用场景,确保了良好的用户体验。

项目效果

1、工作台

2、存档数据

3、存档图表

4、实时数据

总结

项目是一个典型的工业自动化项目案例,展示了如何利用最新的技术栈解决实际问题。

通过结合.NET 9和Avalonia UI,苏州诺克汽车零部件有限公司成功打造了一个高效、灵活且易于维护的数据采集系统。这不仅提升了企业的生产效率,也为其他寻求类似解决方案的企业提供了宝贵的参考。

以上仅展示了转盘数据采集解决方案的部分功能。更多实用特性和详细信息,请大家访问项目源码。

希望通过本文能为.NET 在工业自动化开发方面提供有价值的参考。感谢您阅读本篇文章,欢迎在评论区留言交流,分享您的宝贵经验和建议。

关键词:.NET 9、#AvaloniaUI、#工业自动化、#MES系统、#转盘数据采集、#开源项目、#跨平台、#敏捷开发、数据处理与展示。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

作者:小码编匠

出处:gitee.com/smallcore/DotNetCore

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

收藏

点赞

分享

在看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值