利用AI做工业Web上位机-001创建项目
1.确定技术路线
- 前端:Blazor
- 后端:ASP.NET Core Minimal API
- 实时:SignalR
- 采集:Worker Service
- 数据库:MySql
- 历史:TimescaleDB
- 采集扩展:Abstractions + Core + Runtime + Plugins + Protocols + Driver + Worker
2.准备环境
先装好:
- Visual Studio 2022
- 工作负载勾选:
- ASP.NET and web development
- NET desktop development
- 需要的话再勾 Desktop development with C++(如果后面某些驱动库依赖原生组件时更方便)
3.先创建空解决方案
操作步骤
1)打开 Visual Studio
点击:
Create a new project
2)搜索模板
搜索:
Blank Solution
3)填写名称
建议:
Project name: IndustrialWebScada
Location: 你的代码目录
三、先建解决方案文件夹
为了让 Solution Explorer 里更清晰,建议先建这些 Solution Folder。
操作步骤
在解决方案节点上右键:
Add > New Solution Folder
依次创建:
src
tests
build
docs
deploy
然后再在 src 下面继续建:
Collector
Protocols
Drivers
注意:
- 这里的 Solution Folder 只是解决方案里的逻辑分组
- 它不是 .csproj 项目
- 它也不会自动创建磁盘上的项目引用关系
这样做只是为了管理方便。Visual Studio 对多项目解决方案就是建议这样组织的。
4.创建第一批核心项目
我建议你先创建第一批,不要一口气全建完。
1)创建 IndustrialWebScada.Shared
在 src 上右键:
Add > New Project
搜索:
Class Library
选择:
C# Class Library
项目名填:
IndustrialWebScada.Shared
框架建议选:
.NET 8 或 .NET 9
如果你想稳一点,工业项目我更建议你第一版用 .NET 8 LTS。
Blazor 从 .NET 8 开始是统一的全栈 Web UI
方案之一,继续在后续版本演进。
2)按同样方式创建下面这些类库项目
继续在 src 下创建:
IndustrialWebScada.Contracts
IndustrialWebScada.Domain
IndustrialWebScada.Application
IndustrialWebScada.Infrastructure
IndustrialWebScada.Realtime
IndustrialWebScada.Persistence.SqlServer
IndustrialWebScada.Persistence.Timescale
这些都选:
Class Library
3)创建 Web 主项目 IndustrialWebScada.WebHost
在 src 上右键:
Add > New Project
搜索:
Blazor Web App
项目名:
IndustrialWebScada.WebHost
建议:
- Authentication 先选 None 或按你需要选账号体系
- Interactive render mode 可先选默认
- 后面你自己再接 Minimal API、SignalR、权限系统
Blazor Web App 是微软当前 .NET Web UI 的主要方案之一。
4)创建采集宿主 IndustrialWebScada.Collector.Worker
在 Collector 解决方案文件夹上右键:
Add > New Project
搜索:
Worker Service
项目名:
IndustrialWebScada.Collector.Worker
Worker Service 是 .NET 官方用于长时间运行后台服务的模板,适合做工业采集进程。
5.创建采集层核心项目
接着在 Collector 文件夹下添加 4 个类库:
IndustrialWebScada.Collector.Abstractions
IndustrialWebScada.Collector.Core
IndustrialWebScada.Collector.Runtime
IndustrialWebScada.Collector.Plugins
都选:
Class Library
6.创建协议定义项目
在 Protocols 解决方案文件夹下,依次创建这些类库:
IndustrialWebScada.Protocols.Modbus
IndustrialWebScada.Protocols.SiemensS7
IndustrialWebScada.Protocols.OpcUa
IndustrialWebScada.Protocols.Mqtt
IndustrialWebScada.Protocols.Http
IndustrialWebScada.Protocols.SerialPort
都选:
Class Library
7.创建驱动实现项目
在 Drivers 解决方案文件夹下,依次创建这些类库:
IndustrialWebScada.Driver.Modbus
IndustrialWebScada.Driver.SiemensS7
IndustrialWebScada.Driver.OpcUa
IndustrialWebScada.Driver.Mqtt
IndustrialWebScada.Driver.Http
IndustrialWebScada.Driver.SerialPort
也都选:
Class Library
8.创建测试项目
在 tests 文件夹下右键:
Add > New Project
建议选:
xUnit Test Project
依次创建:
IndustrialWebScada.Domain.Tests
IndustrialWebScada.Application.Tests
IndustrialWebScada.Infrastructure.Tests
IndustrialWebScada.Realtime.Tests
IndustrialWebScada.Collector.Core.Tests
IndustrialWebScada.Collector.Runtime.Tests
IndustrialWebScada.Driver.Modbus.Tests
IndustrialWebScada.Driver.SiemensS7.Tests
IndustrialWebScada.Driver.OpcUa.Tests
9.给项目创建物理目录
有一点很重要:
Visual Studio 的 Solution
Folder 和磁盘上的真实目录不是一回事。
你最好在建项目时就把 Location 指到对应文件夹,这样目录能和你规划一致。否则后面文件在磁盘上可能全挤在一起。这个区别是 Visual Studio 解决方案/项目模型本身决定的。
建议你的物理目录这样放:
IndustrialWebScada
├─ src
│ ├─ IndustrialWebScada.WebHost
│ ├─ IndustrialWebScada.Application
│ ├─ IndustrialWebScada.Domain
│ ├─ IndustrialWebScada.Infrastructure
│ ├─ IndustrialWebScada.Contracts
│ ├─ IndustrialWebScada.Realtime
│ ├─ IndustrialWebScada.Persistence.SqlServer
│ ├─ IndustrialWebScada.Persistence.Timescale
│ ├─ IndustrialWebScada.Shared
│ ├─ Collector
│ ├─ Protocols
│ └─ Drivers
└─ tests
比如创建 IndustrialWebScada.Driver.Modbus 时,Location 最好选到:
...\IndustrialWebScada\src\Drivers
这样生成出来就是:
...\IndustrialWebScada\src\Drivers\IndustrialWebScada.Driver.Modbus
10.创建项目内部文件夹
项目建好后,开始在每个项目里建文件夹。
在项目里创建文件夹的方法
右键项目:
Add > New Folder
然后按你前面定的结构建。
1)例如在 IndustrialWebScada.Domain 里建
Entities
Enums
ValueObjects
Events
Specifications
Repositories
Services
2)在 IndustrialWebScada.Application 里建
Interfaces
Services
Commands
Queries
Validators
Mapping
Authorization
Events
3)在 IndustrialWebScada.WebHost 里建
Components
Endpoints
Hubs
Middleware
Extensions
Options
Services
wwwroot
如果手工在资源管理器里建了文件夹但 VS 没显示,可以右键项目添加现有项,或者把文件夹拖进项目。
11.添加项目引用
这是最关键的一步。
Visual Studio 里项目之间的依赖,建议都通过 Add Project Reference 来做。带 Dependencies 节点的项目,可以直接右键该节点添加项目引用。
操作方法
例如:
在 IndustrialWebScada.Application 上展开:
Dependencies
右键:
Add Project Reference
勾选它依赖的项目。
建议这样加引用
1)IndustrialWebScada.Application
引用:
IndustrialWebScada.Domain
IndustrialWebScada.Contracts
IndustrialWebScada.Shared
IndustrialWebScada.Realtime
2)IndustrialWebScada.Infrastructure
引用:
IndustrialWebScada.Domain
IndustrialWebScada.Shared
IndustrialWebScada.Contracts
3)IndustrialWebScada.Persistence.SqlServer
引用:
IndustrialWebScada.Domain
IndustrialWebScada.Shared
IndustrialWebScada.Infrastructure
4)IndustrialWebScada.Persistence.Timescale
引用:
IndustrialWebScada.Contracts
IndustrialWebScada.Shared
5)IndustrialWebScada.Realtime
引用:
IndustrialWebScada.Contracts
IndustrialWebScada.Shared
6)IndustrialWebScada.WebHost
引用:
IndustrialWebScada.Application
IndustrialWebScada.Contracts
IndustrialWebScada.Infrastructure
IndustrialWebScada.Realtime
IndustrialWebScada.Persistence.SqlServer
IndustrialWebScada.Persistence.Timescale
IndustrialWebScada.Shared
7)IndustrialWebScada.Collector.Abstractions
引用:
IndustrialWebScada.Shared
IndustrialWebScada.Contracts
8)IndustrialWebScada.Collector.Core
引用:
IndustrialWebScada.Collector.Abstractions
IndustrialWebScada.Shared
9)IndustrialWebScada.Collector.Runtime
引用:
IndustrialWebScada.Collector.Abstractions
IndustrialWebScada.Collector.Core
IndustrialWebScada.Collector.Plugins
IndustrialWebScada.Contracts
IndustrialWebScada.Shared
IndustrialWebScada.Persistence.SqlServer
IndustrialWebScada.Persistence.Timescale
IndustrialWebScada.Realtime
10)IndustrialWebScada.Collector.Worker
引用:
IndustrialWebScada.Collector.Runtime
IndustrialWebScada.Driver.Modbus
IndustrialWebScada.Driver.SiemensS7
IndustrialWebScada.Driver.OpcUa
IndustrialWebScada.Driver.Mqtt
IndustrialWebScada.Driver.Http
IndustrialWebScada.Driver.SerialPort
11)驱动项目引用关系
IndustrialWebScada.Driver.Modbus
引用:
IndustrialWebScada.Protocols.Modbus
IndustrialWebScada.Collector.Abstractions
IndustrialWebScada.Collector.Core
IndustrialWebScada.Shared
IndustrialWebScada.Driver.SiemensS7
引用:
IndustrialWebScada.Protocols.SiemensS7
IndustrialWebScada.Collector.Abstractions
IndustrialWebScada.Collector.Core
IndustrialWebScada.Shared
其他驱动照这个模式加。
12.设置启动项目
如果你现在先做 Web,直接把 IndustrialWebScada.WebHost 设为启动项目。
操作
右键项目:
Set as Startup Project
如果你想同时启动 Web 和 Worker:
右键解决方案:
Configure Startup Projects
选择:
Multiple startup projects
然后把:
- IndustrialWebScada.WebHost
- IndustrialWebScada.Collector.Worker
都设为 Start
Visual Studio 支持一个解决方案包含多个项目并配置多启动项目。
13.先装常用 NuGet 包
在项目上右键:
Manage NuGet Packages
或者用 Dependencies > Manage NuGet Packages
建议你先装这些。
1)IndustrialWebScada.WebHost
常见会用到:
- Microsoft.AspNetCore.SignalR
- Swashbuckle.AspNetCore
- FluentValidation.AspNetCore
- Microsoft.AspNetCore.Authentication.JwtBearer
2)IndustrialWebScada.Persistence.SqlServer
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Design
SQL Server 的 EF
Core provider 是微软官方支持的。
3)IndustrialWebScada.Persistence.Timescale
一般你会用 PostgreSQL/Timescale 对应的 ADO.NET 或 EF/Npgsql 相关包。
4)IndustrialWebScada.Driver.Modbus
按你最终选的通信库装,例如 HslCommunication 或其他库。
14.建议你在 VS 里的实际建项目顺序
最稳的顺序是:
第一轮
IndustrialWebScada.Shared
IndustrialWebScada.Contracts
IndustrialWebScada.Domain
IndustrialWebScada.Application
IndustrialWebScada.Infrastructure
IndustrialWebScada.Realtime
IndustrialWebScada.Persistence.SqlServer
IndustrialWebScada.Persistence.Timescale
IndustrialWebScada.WebHost
第二轮
IndustrialWebScada.Collector.Abstractions
IndustrialWebScada.Collector.Core
IndustrialWebScada.Collector.Runtime
IndustrialWebScada.Collector.Plugins
IndustrialWebScada.Collector.Worker
第三轮
IndustrialWebScada.Protocols.Modbus
IndustrialWebScada.Driver.Modbus
IndustrialWebScada.Protocols.SiemensS7
IndustrialWebScada.Driver.SiemensS7
IndustrialWebScada.Protocols.Mqtt
IndustrialWebScada.Driver.Mqtt
你第一版先把:
- Modbus
- SiemensS7
- Mqtt
这三个优先做出来最实用。
15.你最容易踩的坑
1)解决方案文件夹不等于物理文件夹
所以建项目时一定注意 Location。
2)不要一上来把 20 个项目全写代码
先建空壳、加好引用、保证能编译通过。
3)不要让 WebHost 直接引用 Driver 细节
驱动只应该在 Collector.Worker / Collector.Runtime 那边使用。
4)不要把所有驱动都写进一个项目
后面协议多了非常难维护。
AI提示词:
1、我需要利用c#做工业行业的web上位机,选用什么技术路线比较合适。
2、我下一步可以直接给你画一套工业 Web 上位机的项目架构图,或者直接给你一份 C# 可落地的项目目录结构方案。 给我提供一下
3、
前端:Blazor
后端:ASP.NET Core Minimal API
实时:SignalR
采集:Worker Service
数据库:SQL Server
历史:TimescaleDB 给我按照这个做工业 Web 上位机标准项目目录树
4、
IndustrialWebScada.sln
│
├─ build
│ ├─ powershell
│ ├─ publish
│ └─ sql
│
├─ docs
│ ├─ architecture
│ ├─ api
│ ├─ deployment
│ └─ database
│
├─ src
│ │
│ ├─ IndustrialWebScada.WebHost
│ │
│ ├─ IndustrialWebScada.Application
│ │
│ ├─ IndustrialWebScada.Domain
│ │
│ ├─ IndustrialWebScada.Infrastructure
│ │
│ ├─ IndustrialWebScada.Contracts
│ │
│ ├─ IndustrialWebScada.Realtime
│ │
│ ├─ IndustrialWebScada.Collector.Abstractions
│ │
│ ├─ IndustrialWebScada.Collector.Modbus
│ │
│ ├─ IndustrialWebScada.Collector.Siemens
│ │
│ ├─ IndustrialWebScada.Collector.OpcUa
│ │
│ ├─ IndustrialWebScada.Collector.Mqtt
│ │
│ ├─ IndustrialWebScada.Collector.Worker
│ │
│ ├─ IndustrialWebScada.Persistence.SqlServer
│ │
│ ├─ IndustrialWebScada.Persistence.Timescale
│ │
│ └─ IndustrialWebScada.Shared
│
├─ tests
│ ├─ IndustrialWebScada.Domain.Tests
│ ├─ IndustrialWebScada.Application.Tests
│ ├─ IndustrialWebScada.Infrastructure.Tests
│ ├─ IndustrialWebScada.Realtime.Tests
│ └─ IndustrialWebScada.Collector.Tests
│
└─ deploy
├─ dev
├─ test
└─ prod IndustrialWebScada.Collector 把这个分开,保证以后可以扩容多种协议
5、给我完整到文件级别的目录树,
6、告诉我如何利用virsual studio 创建
好了然后就是按照AI指导,完成上述解决方案创建。

浙公网安备 33010602011771号