# PLC梯形图设计及仿真软件 **Repository Path**: chilliziehen/plc ## Basic Information - **Project Name**: PLC梯形图设计及仿真软件 - **Description**: PLC编译器及梯形图设计 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-09-05 - **Last Updated**: 2025-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PLC 集成开发系统 一个完整的工业 PLC(可编程逻辑控制器)集成开发系统,包含梯形图编译器、运行时引擎、Web 后端服务和可视化前端界面。本项目实现了 IEC 61131-3 标准的梯形图编程语言的编译、执行和可视化编辑功能。 ## 项目概述 本系统采用前后端分离架构,结合 C++ 原生编译器实现高性能的 PLC 逻辑处理: - **Native C++ 编译器与运行时**:实现梯形图到中间语言(IL)的编译和解释执行 - **Spring Boot 后端**:提供 RESTful API 服务,管理 PLC 项目和梯形图数据 - **Vue 3 前端**:提供可视化的梯形图编辑器和 PLC 控制界面 ### 核心特性 ✅ **完整的梯形图支持** - 触点(常开/常闭/上升沿/下降沿) - 线圈(标准/置位/复位/脉冲) - 逻辑汇合(AND/OR) - 定时器(TON - 接通延时) - 常量和比较运算 ✅ **高性能编译执行** - 图状 IR 到线性 IL 指令转换 - 拓扑排序优化的编译算法 - 解释器运行时引擎 - 符号表和变量管理 ✅ **现代 Web 界面** - 基于 SVG 的梯形图可视化编辑器 - 实时 PLC 状态监控 - 变量面板和调试工具 - 响应式布局设计 ## 项目结构 ``` plc_integrated/ ├── backend/ # Spring Boot 后端服务 │ ├── src/main/java/ # Java 源代码 │ │ └── org/plc/backend/ # 主应用包 │ ├── src/main/resources/ # 配置文件 │ ├── native/ # C++ 原生编译器和运行时 │ │ ├── core/ # 核心编译器和运行时实现 │ │ ├── utility/ # 工具类(JSON处理、错误处理等) │ │ ├── Headers/ # 头文件 │ │ ├── src/ # 主程序入口 │ │ └── CMakeLists.txt # CMake 构建配置 │ ├── scripts/ # 构建脚本 │ └── pom.xml # Maven 配置 │ └── frontend/ # Vue 3 前端应用 ├── src/ │ ├── components/ # Vue 组件 │ │ ├── ladder/ # 梯形图编辑器组件 │ │ ├── plc/ # PLC 控制组件 │ │ └── layout/ # 布局组件 │ ├── views/ # 页面视图 │ ├── store/ # Pinia 状态管理 │ ├── router/ # Vue Router 路由 │ ├── services/ # API 服务 │ └── styles/ # 样式文件 ├── docs/ # 文档 │ └── API.md # API 接口文档 ├── vite.config.ts # Vite 配置 └── package.json # NPM 依赖 ``` ## 技术栈 ### 后端 (Backend) - **Java**: JDK 17 - **框架**: Spring Boot 3.5.6 - Spring Web (RESTful API) - Spring Data JPA (数据持久化) - Spring Security (安全认证) - **认证**: JWT (JSON Web Token) - jjwt 0.11.5 - **数据库**: MySQL - **构建工具**: Maven ### 原生编译器 (Native) - **语言**: C++20 - **构建系统**: CMake 3.16+ - **依赖库**: nlohmann/json (header-only) - **编译器支持**: GCC/Clang/MSVC ### 前端 (Frontend) - **框架**: Vue 3 (Composition API) - **构建工具**: Vite 5 - **语言**: TypeScript 5 - **UI 库**: Element Plus 2.8 - **状态管理**: Pinia 2.2 - **路由**: Vue Router 4.4 - **HTTP 客户端**: Axios 1.7 - **样式**: SCSS ## 依赖项详细说明 ### 后端依赖 #### Maven 依赖 (pom.xml) ```xml spring-boot-starter-web # Web MVC 支持 spring-boot-starter-data-jpa # JPA 数据访问 spring-boot-starter-security # 安全框架 mysql-connector-j # MySQL 驱动 jjwt-api (0.11.5) # JWT API jjwt-impl (0.11.5) # JWT 实现 jjwt-jackson (0.11.5) # JWT JSON 处理 spring-boot-devtools # 热重载 lombok # 代码简化注解 spring-boot-starter-test # 测试框架 ``` #### C++ 编译器依赖 - **CMake** 3.16 或更高版本 - **C++ 编译器**:支持 C++20 标准 - GCC 10+ / Clang 11+ / MSVC 2019+ - **nlohmann/json**:JSON 序列化(已包含在项目中) ### 前端依赖 #### 运行时依赖 (dependencies) ```json "vue": "^3.4.38" // Vue 3 核心框架 "vue-router": "^4.4.5" // 路由管理 "pinia": "^2.2.6" // 状态管理 "axios": "^1.7.7" // HTTP 请求 "element-plus": "^2.8.4" // UI 组件库 ``` #### 开发依赖 (devDependencies) ```json "vite": "^5.4.8" // 构建工具 "typescript": "^5.6.2" // TypeScript 支持 "@vitejs/plugin-vue": "^5.1.3" // Vue 插件 "unplugin-auto-import": "^0.17.8" // 自动导入 "unplugin-vue-components": "^0.27.4" // 组件自动导入 "sass": "^1.79.3" // SCSS 预处理器 "vue-tsc": "^2.1.6" // TypeScript 类型检查 ``` ## 系统要求 ### 开发环境 - **操作系统**: Windows 10/11, Linux, macOS - **Java**: JDK 17 或更高版本 - **Node.js**: 16.x 或更高版本 - **npm**: 8.x 或更高版本 - **CMake**: 3.16 或更高版本 - **C++ 编译器**: 支持 C++20 标准 - **MySQL**: 5.7+ 或 8.0+ ### 运行环境 - **Java**: JRE 17+ - **MySQL**: 5.7+ 或 8.0+ - **浏览器**: Chrome 90+, Firefox 88+, Safari 14+, Edge 90+ ## 部署方法 ### 1. 数据库配置 #### 创建数据库 ```sql CREATE DATABASE plc CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` #### 配置数据库连接 编辑 `backend/src/main/resources/application.properties`: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/plc?serverTimeZone=UTC spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` ### 2. 编译 C++ 原生编译器 #### Windows (使用 CMake) ```powershell cd backend\native mkdir build cd build cmake .. -G "Visual Studio 17 2022" # 或使用 Ninja cmake --build . --config Release ``` 编译产物位于 `backend/cxxbuild/bin/LC.exe` #### Linux/macOS ```bash cd backend/native mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release make ``` 编译产物位于 `backend/cxxbuild/bin/LC` ### 3. 构建后端服务 #### 使用 Maven ```powershell cd backend .\mvnw clean package ``` 或者使用系统安装的 Maven: ```powershell mvn clean package ``` 生成的 JAR 文件位于 `backend/target/backend-0.0.1-SNAPSHOT.jar` ### 4. 构建前端应用 #### 安装依赖 ```powershell cd frontend npm install ``` #### 构建生产版本 ```powershell npm run build ``` 生成的静态文件位于 `frontend/dist/` ### 5. 部署配置 #### 前端环境配置 创建 `frontend/.env.production`: ```env VITE_API_BASE_URL=http://your-backend-domain:6657/api ``` #### 后端部署 **方式 1: 直接运行 JAR** ```powershell java -jar backend/target/backend-0.0.1-SNAPSHOT.jar ``` **方式 2: 使用 systemd (Linux)** 创建服务文件 `/etc/systemd/system/plc-backend.service`: ```ini [Unit] Description=PLC Backend Service After=network.target [Service] Type=simple User=plc WorkingDirectory=/opt/plc-backend ExecStart=/usr/bin/java -jar /opt/plc-backend/backend-0.0.1-SNAPSHOT.jar Restart=on-failure [Install] WantedBy=multi-user.target ``` 启动服务: ```bash sudo systemctl enable plc-backend sudo systemctl start plc-backend ``` #### 前端部署 **使用 Nginx** 配置示例 `/etc/nginx/sites-available/plc-frontend`: ```nginx server { listen 80; server_name your-domain.com; root /var/www/plc-frontend; index index.html; location / { try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:6657; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` ## 使用方法 ### 开发环境运行 #### 1. 启动后端服务 ```powershell cd backend .\mvnw spring-boot:run ``` 后端服务将在 `http://localhost:6657` 启动 #### 2. 启动前端开发服务器 创建 `frontend/.env.local`: ```env VITE_API_BASE_URL=http://localhost:6657/api ``` 启动开发服务器: ```powershell cd frontend npm run dev ``` 前端应用将在 `http://localhost:5173` 启动,并自动打开浏览器 ### 主要功能使用 #### 梯形图编辑 1. **打开梯形图编辑器** - 访问首页,进入梯形图编辑区域 2. **添加元件** - 选择工具栏中的元件类型(触点/线圈/分支) - 在网格上点击放置元件 3. **配置元件** - 点击元件打开属性面板 - 设置标签名称(如 X0, Y0, M0 等) - 配置参数(如定时器时间) 4. **保存梯形图** - 点击保存按钮将梯形图保存到后端 #### PLC 控制 1. **编译程序** - 点击"编译"按钮,系统将调用 C++ 编译器编译梯形图 2. **运行程序** - 编译成功后,点击"运行"启动 PLC 扫描周期 3. **监控状态** - 变量面板实时显示所有变量的当前值 - 梯形图上高亮显示通电状态 4. **调试程序** - 在变量面板中手动修改输入变量 - 观察输出和内部变量的变化 ### API 使用 详细的 API 文档请参考 `frontend/docs/API.md` #### 主要接口 ``` GET /api/project # 获取项目信息 GET /api/ladder # 获取梯形图数据 POST /api/ladder # 保存梯形图数据 POST /api/plc/compile # 编译梯形图程序 POST /api/plc/start # 启动 PLC 运行 POST /api/plc/stop # 停止 PLC 运行 GET /api/plc/status # 获取 PLC 状态 GET /api/variables # 获取所有变量值 PUT /api/variables/:name # 设置变量值 ``` ## C++ 编译器原理 ### 编译架构 系统采用三层架构: 1. **IR 层(中间表示)** - 图状结构表示梯形图 - 节点(Node)、引脚(Pin)、连接(Connection) - 网络(Rung)、程序(Program)、符号表 2. **编译器层** - 将图状 IR 编译为线性 IL(中间语言)指令 - 拓扑排序处理组合逻辑 - 顺序处理有状态元件(线圈、定时器) 3. **运行时层** - 解释执行 IL 指令 - 维护标签镜像、临时寄存器 - 定时器实例管理 ### 核心特性 - **沿触发实现**:使用影子标签机制(`__prev__X`)实现上升沿和下降沿检测 - **定时器模型**:支持 TON(接通延时定时器) - **高效符号表**:name ↔ TagIndex 双向映射 - **指令集**:LD/ST/AND/OR/NOT/MOV/TON/LD_TQ 等 详细文档: - `backend/native/README.md` - 完整的编译器和运行时文档 - `backend/native/COMPILE_TIP.MD` - IL 指令生成原理 - `backend/native/RUNTIME_TIP.MD` - 运行时执行模型 - `backend/native/ERROR_HANDLING.MD` - 错误处理机制 ## 开发指南 ### 目录约定 - **后端 Java 代码**: `backend/src/main/java/org/plc/backend/` - **C++ 编译器核心**: `backend/native/core/` - **C++ 工具类**: `backend/native/utility/` - **前端组件**: `frontend/src/components/` - **前端页面**: `frontend/src/views/` - **API 服务**: `frontend/src/services/` ### 代码规范 #### Java - 遵循 Spring Boot 最佳实践 - 使用 Lombok 简化代码 - Controller/Service/Repository 分层架构 #### C++ - C++20 标准 - 使用智能指针管理内存 - 遵循 RAII 原则 - 详细的注释和文档 #### TypeScript/Vue - Composition API 优先 - TypeScript 类型安全 - 组件化开发 - 响应式设计 ### 扩展开发 #### 添加新的梯形图元件 1. 在 `backend/native/Headers/include.h` 中定义新的 `NodeKind` 2. 在 `backend/native/core/src/LadderCompiler.cpp` 中实现编译逻辑 3. 在 `backend/native/core/src/LadderRuntime.cpp` 中实现运行时逻辑 4. 在 `frontend/src/components/ladder/LadderEditor.vue` 中添加可视化支持 #### 添加新的 IL 指令 1. 在 `backend/native/Headers/include.h` 中定义新的 `ILOpcode` 2. 在 `LadderCompiler` 中生成该指令 3. 在 `LadderRuntime::step()` 中实现指令解释 ## 测试 ### 后端测试 ```powershell cd backend .\mvnw test ``` ### C++ 编译器测试 编译器内置了示例程序测试: ```powershell cd backend\native\build\bin .\LC.exe ``` 将运行内置的 demo_program 并输出执行结果。 ### 前端测试 ```powershell cd frontend npm run test # 如果配置了测试框架 ``` ## 常见问题 ### Q: 编译 C++ 代码时找不到编译器? **A**: 确保安装了支持 C++20 的编译器: - Windows: 安装 Visual Studio 2019 或更高版本 - Linux: 安装 GCC 10+ 或 Clang 11+ - macOS: 安装 Xcode Command Line Tools ### Q: 后端启动失败,提示数据库连接错误? **A**: 检查以下内容: 1. MySQL 服务是否运行 2. `application.properties` 中的数据库配置是否正确 3. 数据库用户是否有足够的权限 4. 数据库是否已创建 ### Q: 前端无法连接到后端 API? **A**: 检查: 1. 后端服务是否正常运行(默认端口 6657) 2. `.env.local` 中的 API 地址是否正确 3. 浏览器控制台是否有 CORS 错误 4. 防火墙是否阻止了连接 ### Q: C++ 编译器执行失败? **A**: 确认: 1. 编译器可执行文件路径正确 2. 输入的 JSON 格式符合 IR 规范 3. 查看错误日志了解具体问题 ## 性能优化 ### 后端优化 - 使用连接池配置优化数据库连接 - 启用 Spring Boot 缓存 - 配置 JVM 参数(堆大小、GC 策略) ### 前端优化 - 使用 Vite 的代码分割 - 按需加载 Element Plus 组件 - 懒加载路由组件 - 压缩和缓存静态资源 ### C++ 编译器优化 - 使用 Release 模式编译 - 启用编译器优化选项(-O3) - 考虑使用编译缓存 ## 安全性 ### 后端安全 - JWT 令牌认证 - Spring Security 访问控制 - SQL 注入防护(JPA/Hibernate) - HTTPS 传输加密(生产环境) ### 前端安全 - XSS 防护(Vue 自动转义) - CSRF 令牌验证 - 安全的 HTTP 头配置 ## 许可证 本项目代码仅供学习和研究使用。具体许可协议待定。 ## 贡献指南 欢迎提交 Issue 和 Pull Request! ### 提交 Issue - 清楚描述问题或建议 - 提供复现步骤(如果是 bug) - 附上相关日志和截图 ### 提交 Pull Request 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request ## 联系方式 - **项目维护者**: 刘陈文君 - **项目仓库**: d:\Repositories\CLionProjects\plc_integrated ## 更新日志 ### v0.1.0 (当前版本) **初始版本特性**: - ✅ C++ 梯形图编译器和运行时引擎 - ✅ Spring Boot RESTful API 后端 - ✅ Vue 3 + Element Plus 前端界面 - ✅ 基本的梯形图元件支持 - ✅ JWT 认证和授权 - ✅ MySQL 数据持久化 **已知限制**: - 前端梯形图编辑器功能仍在完善中 - 暂不支持复杂的功能块(FB) - 缺少完整的测试覆盖 ## 路线图 ### 近期计划 - [ ] 完善前端梯形图编辑器的连线功能 - [ ] 添加更多梯形图元件(计数器、比较器等) - [ ] 实现在线调试和断点功能 - [ ] 添加项目导入/导出功能 ### 中期计划 - [ ] 支持更多定时器类型(TOF, TP) - [ ] 实现功能块(FB)支持 - [ ] 添加结构化文本(ST)编程语言 - [ ] 实时数据趋势图 ### 远期计划 - [ ] 多用户协作功能 - [ ] 移动端支持 - [ ] 硬件 PLC 连接支持 - [ ] AI 辅助编程 --- **最后更新**: 2025年10月16日