搞工控上位机的兄弟,估计都遇到过这个场景:设备在车间里,人不在旁边,客户一个电话打过来问“现在温度多少?运行正常不?”,你只能打开电脑、连上PLC编程软件慢慢看。要是能在手机上像点外卖一样直接看到现场数据,甚至点点按钮就能操作,那体验完全不一样。这个项目做的就是这件事——用C#写一个手机组态APP,通过WiFi无线通信,随时随地监控西门子S7-1200 PLC。
我拿到这套源码的时候,第一反应是“这不就是组态软件的移动端降级版嘛”,但仔细看完后发现,它其实把C#上位机开发、Modbus TCP通信、S7-1200配置、Android端界面组态、WiFi网络排障这些环节全都串起来了。适合正在学C#上位机、或者手头有S7-1200项目想加手机监控功能的工程师参考。这篇文章我会把整套方案从头拆到尾,从PLC侧配置到VS2019里的Android工程创建,再到核心通信代码和实际踩过的坑,一步步说清楚。
1. 项目整体拆解:这套源码到底解决了什么问题
1.1 需求本质:从手机看PLC,不只是“远程”
先说结论:这个项目的本质不是“远程控制”,而是“移动监视 + 有限控制”。很多刚入行的朋友一听到手机监控PLC,脑海里就是“把组态软件做成APP”,但实际做过的都懂,这里面的核心矛盾在于——组态软件帮你把PLC协议、屏幕刷新、画面绘制全包了,而自己用C#写,等于要把这层封装全部手动解开。
从现场工程角度看,S7-1200作为西门子小型PLC的主力,几乎每个中小型设备上都有它的身影。传统做法是HMI触摸屏放在柜门,或者上位机组态软件跑在工控机上。可一旦设备分布在多个车间、多个场地,或者你是设备供应商,要远程查看售后设备的运行状态,固定点位就不好使了。手机APP天然是这种场景的补充,哪怕只是把启停状态、温度、压力、故障码推送到手机上,也能省下大量现场往返的成本。
这个项目里最值得关注的一点,是它走的是“手机直连PLC”的路线,也就是WiFi通信方案,而不是先把数据传到云平台、再从云平台推给手机。直连的好处是实时性高、几乎没有中间层延迟、局域网内丢包率低,而且不需要购买云服务,也不需要处理数据上云的权限和合规。缺点也很明显,就是手机和PLC必须在一个局域网里,无法跨公网访问。这个取舍在工控项目里其实非常常见,客户要的常常就是“我在车间里走到哪都能看到设备状态”,而不是“我在家也能看”,所以直连方案完全够用。
1.2 方案选型:为什么是C# + Modbus TCP + WiFi
这套源码的技术栈选型很有代表性。C#在工控上位机领域早就不是新鲜事,从WinForm到WPF,再到现在的跨平台方案,C#做设备端监控软件成熟度很高。VS2019作为IDE,上至.NET Core下至老Framework项目都能搞定,它身上带一个经常被忽略的利器——可以开发Android应用,也就是Xamarin.Forms,这正是手机APP能通过C#一套代码跑起来的基础。
通信协议方面,S7-1200本身原生支持多种以太网协议,Profinet、S7协议、Modbus TCP都可以。这套源码选的是Modbus TCP,这是很务实的决定。S7协议虽然功能强、效率高,但它是西门子的私有协议,跨平台和第三方库的支持相对要小心处理;Modbus TCP却是工业界的“普通话”,几乎所有PLC和上位机都认,而且C#领域里封装好、测试充分的Modbus库非常多,比如NModbus、HslCommunication。尤其HslCommunication,我在这类监控项目里用过很多次,它对西门子PLC的支持非常完善,读DB块、读M区、写线圈都很顺手,还顺便把Modbus和S7协议都封装了,代码量能省一大截。
为什么选WiFi而不是蓝牙或者4G?蓝牙连接距离短,穿墙能力弱,顶多做个调试工具用;4G走公网网关,要做NAT穿透、做安全认证,工程复杂度指数上升。WiFi刚好卡在合理区间:覆盖一个车间没有问题,手机和PLC通过同一个局域网路由交换,只需要保证IP能互相ping通,剩下的TCP通信完全按标准来,对开发者和使用者来说都是最简单的模式。这套源码把WiFi直连作为主线,思路是对的。
1.3 系统架构速览
把整套源码拆开看,逻辑其实非常清晰。最底层是物理设备层,S7-1200 PLC通过以太网线连接到一个工业无线路由器或者AP,PLC分配到一个固定IP。中间是通信链路层,手机通过WiFi接入同一个局域网,获得与PLC同网段的IP地址,两者之间的网络路径就是“手机 → WiFi AP → 网线 → PLC以太网口”。最上层是应用层,APP内部采用“连接管理类 + 数据读写类 + UI绑定类”的经典三层结构,连接管理负责建立和维持Modbus TCP会话,数据读写类封装了HslCommunication对PLC寄存器的访问方法,UI绑定类把读到的数据通过事件和属性通知实时更新到组态控件上。
这套结构的好处在哪里?它把“通信”和“展示”彻底解耦了。就算你后面把底层的Modbus TCP换成S7协议,或者把直连改成走云平台中转,界面和逻辑部分几乎不用动,只需要改数据访问层。对维护来说,这也是救命的,因为现场最常见的问题就是通信断、数据不刷新,如果通信代码和UI代码扭成一团,排查起来会非常痛苦。这套源码在这一点上做得很规矩。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件与PLC侧准备:通信的基础
2.1 S7-1200侧:MB_SERVER要这样配
手机APP要读到PLC的数据,PLC这一端必须先把Modbus TCP服务器功能打开。S7-1200里实现这个功能的方式是调用两个指令块:MB_SERVER和MB_CLIENT。在这个项目里,PLC是作为Modbus服务器,所以只需要在OB1里调用MB_SERVER指令块。
MB_SERVER的配置有几个关键点。首先是背景数据块DB100,每个MB_SERVER调用必须有一个独立的背景DB,这个DB用于存储通信状态,你不能复用多个连接。第二是IP Port端口,默认一般是502,现场如果和别的设备冲突可
