前言
在工业自动化现场摸爬滚打久了,多少都有过这样的体会:PLC那边稳定可靠,但 写个上位机界面总觉得束手束脚;用C#、Python做上位机虽然灵活,但要把通讯、变量管理、界面交互这些零碎东西都从头搭一遍,光是前期准备工作就够折腾人的。
项目它不是一个简单的通讯库,而是一整套带"PLC风格"的上位机开发框架——你可以像配置PLC那样去配置硬件、变量和工艺流程,但又保留了上位机在界面和数据处理上的灵活性。这篇文章就聊聊这个项目是怎么设计的,以及实际用起来是什么感觉。
项目介绍
一个基于.NET Framework和WPF的上位机开发平台,它最核心的设计思路,是把PLC工程化的配置思维搬到了上位机开发里。
什么意思呢?用过PLC的人都知道,编程时先要配置硬件组态、定义变量表、再写逻辑程序——这套流程是固定的、模块化的。PLCSharp把这种体验复刻到了上位机上:你面对的不是一个空白的代码编辑器,而是一个可以配置硬件、拖拽控件、搭建流程的工作环境。项目框架已经帮你把通讯、界面、数据管理这些底层脏活累活都封装好了,你需要做的只是按需配置。
项目功能
项目功能围绕工业现场的几个核心场景来组织,主要的模块和对应的能力如下:
功能模块 | 具体能力 |
硬件配置 | 支持西门子、三菱等主流PLC、运动控制器、工业相机、机器人的快速接入,通过配置IP和端口完成设备互联 |
运动控制 | 内置点位运动、连续轨迹、G代码解析等算法,满足数控和机器人协作场景 |
机器视觉 | 提供相机标定、图像采集、缺陷检测工具包,支持OpenCV算法调用 |
通讯协议 | 兼容Modbus、TCP/IP、OPC UA等工业协议,支持自定义协议扩展 |
人机界面 | 提供状态指示灯、实时表格、动态图表等可视化组件,支持数据绑定和事件触发 |
工作流引擎 | 通过流程图式编排逻辑节点(条件判断、循环、数据运算),搭建自动化流程 |
配方与全局变量 | 统一管理数值、字符串、图像等多种数据类型,支持跨模块共享 |
项目特点
一是"无代码"的流程编排方式。 大多数控制逻辑是通过拖拽节点和连线完成的,不需要一行行敲代码。比如一个简单的分拣流程,就是"相机拍照→图像处理→判断产品类型→气缸动作"这样一串节点连起来就行。
二是全局变量驱动。 所有模块共享同一套变量库,运动控制模块的"当前位置"可以直接绑定到主界面的图表上,数据是实时联动的,不用自己写消息传递逻辑。
三是保留脚本扩展能力。 如果流程图满足不了需求,可以在关键节点嵌入C脚本,兼顾了标准化和灵活性。 项目技术
从代码结构上看,这个项目采用了几层清晰的分层设计。
PLCSharp/│├── Core/ # 基础设施层│ ├── Prism/ # Prism框架相关(依赖注入、导航、模块管理)│ ├── Common/ # 通用数据模型(实体类、枚举、DTO)│ ├── Tools/ # 工具类(日志、加密、转换器、扩展方法)│ ├── UserControls/ # 可复用控件(指示灯、按钮、仪表盘等)│ └── Resources/ # 图标字体及全局样式资源│├── Models/ # 全局数据模型(跨模块共享的数据结构)│└── VVMs/ # 业务模块层(View + ViewModel 成对出现) ├── Authority/ # 用户认证模块(登录、权限校验、会话管理) ├── MainWindow/ # 主窗口容器(标题栏、菜单栏、状态栏布局) ├── Homepage/ # 主页面(概览仪表盘、关键数据监控) ├── Connects/ # 通讯模块(PLC、串口、TCP/IP连接管理) ├── MotionController/ # 运动控制模块(点位运动、轨迹插补、G代码) ├── Vision/ # 机器视觉模块(相机标定、图像采集、缺陷检测) ├── Workflows/ # 工作流引擎(流程图式逻辑编排、节点执行) ├── ModeState/ # 模式状态模块(手动/自动/调试模式切换) ├── GlobalVariables/ # 全局变量管理(变量定义、绑定、实时刷新) ├── Recipe/ # 配方模块(参数配方、工艺配方管理) └── Robots/ # 机器人模块(机器人通讯、指令下发、状态监控)基础设施层(Core)
Core层放的是通用的基础设施:Prism框架相关的封装、通用数据模型、工具类和用户控件。Prism在这里主要承担了MVVM模式下的依赖注入、导航和模块化管理工作,让各个业务模块可以独立开发和加载。
业务模块层(VVMs)
VVMs文件夹里是按业务功能拆分的独立模块:用户认证、主窗口容器、通讯管理、运动控制、视觉处理、工作流引擎、模式状态、全局变量、配方管理、机器人对接等。每个模块都是View和ViewModel成对出现,互不干扰。
主窗口设计
看下MainWindow的XAML代码,有个细节值得提一下。窗口去掉了默认标题栏,用自定义的标题栏替代,同时支持拖拽和双击最大化。右上角的最小化、最大化、关闭按钮分别绑定了对应事件,关闭按钮还通过Command关联了ViewModel里的Exit逻辑:
<Button Grid.Column="3" Command="{Binding Exit}" ToolTip="退出"> <TextBlock Text="&xeca0;" FontFamily="{StaticResource iconfont}" Foreground="LightGray" /><!--Button-->左侧菜单栏通过ListBox绑定Navigate.NavigateListShow,选中的菜单项会通过Prism的区域管理加载到右侧的ContentRegionCore中——这种区域导航是Prism处理页面切换的常用套路。
右下角状态栏展示了当前登录用户、权限等级、CPU占用率和内存使用情况,信息虽简单,但都是现场调试时高频关注的数据。
硬件抽象层(HAL)
项目在底层实现了一个硬件抽象层,把不同厂家设备的接口统一成标准模型。上层开发时只需要调用统一的读写接口,不需要关心对方到底是西门子还是三菱,通讯细节全由底层处理。
项目效果
对于熟悉PLC但不太擅长C的工程师来说,上手门槛明显低了——不需要从头学WPF和MVVM那一整套东西,直接在框架里配置就行。 对于有一定C基础的人来说,最大的价值是省去了重复造轮子的时间。通讯模块、变量管理、界面框架这些基础工作不用自己写了,拿到项目直接在上面搭业务逻辑就行。 项目源码
建议先从MainWindow和Navigate模块入手,把整体框架走通,再根据需要深入到具体业务模块里。
总结
PLCSharp这套框架,本质上是在解决一个很实际的问题:上位机开发能不能像PLC编程那样,配置多于编码、模块化大于自由发挥?
从项目设计和实现来看,它确实把这个思路落地了——硬件抽象层屏蔽了设备差异,工作流引擎降低了编程门槛,全局变量机制简化了模块间通信。当然,它也不是万能的,复杂的业务逻辑还是需要写脚本支撑,但对于大多数中小型自动化项目来说,这套框架能省下不少前期搭建的时间。
关键词
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!