利用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指导,完成上述解决方案创建。

posted @ 2026-04-29 20:58  SuwenLab  阅读(29)  评论(0)    收藏  举报