
车间级工业数据平台这个方向这几年问的人特别多但真正能落地、能扛住产线长期运行的项目其实不算多。我前两年参与过一套基于西门子WinCC OA搭的车间级数据平台项目代号Siplant从前期规划到调试上线再到后期运维踩了不少坑也总结了一些可复用的套路。这篇文章就把整个项目的设计思路、技术选型、落地过程以及排错经验完整写出来给正在做同类项目的同行一个参考。1. 为什么偏偏选WinCC OA做车间级平台1.1 车间级的数据需求到底长什么样很多人一提数据平台第一反应是上MES、上工业互联网平台。但真正到了车间现场你会发现需求根本不是那一套。一个典型的加工车间可能有三五十台数控机床、两条装配线、几台检测设备还有一堆辅助设备比如空压机、电控柜、温湿度传感器。这些设备品牌杂乱通信协议五花八门有的走S7协议有的走Modbus RTU有的是OPC服务器等着你连甚至还有一两台老设备只能靠硬接点信号采集。车间级平台要干的事第一是采把设备状态、产量、工艺参数实时捞上来第二是看让班组长在监控室大屏上看到当班产量、设备开动率、故障报警第三是存把历史数据留够三个月一年做追溯和简单分析第四是给向上游的MES系统、ERP系统提供数据接口。这套需求的特点很明显实时性要求不算极限秒级足够点位数量通常是几千到几万点不会到几十万点那种大型SCADA的规模但复杂性在于协议五花八门而且车间网络环境往往不如变电站、水厂那种专用网络干净。选型时如果拿大型电网SCADA的标准去上太贵太重拿单机HMI的标准去做又撑不起多设备、多画面的并发访问。WinCC OA恰好卡在这两者之间。1.2 WinCC OA相比传统HMI和组态软件的优势WinCC OA最初源自ETM公司的PVSS系统被西门子收购后归入WinCC家族全称WinCC Open Architecture。它和传统WinCC V7、WinCC Unified不是一个技术路线最核心的差异是跨平台、分布式、事件驱动。我在实际项目中感受最深的有这么几点事件驱动而非轮询轮询。WinCC OA的数据刷新是基于变化的点位值不变就不产生通讯一变就立刻推送。对比传统HMI几百毫秒的周期采集事件驱动在点位数上来之后优势太明显了CPU占用和网络流量都小一个量级。分布式的原生能力。多台服务器、多台客户端天生就是一套体系不需要额外做网关和中间件。主服务器挂了备用机自动接管这一块在车间级项目里基本可以当冗余方案直接交付。数据点Data Point简称DP的设计灵活。它不像传统组态那样一个点一个点绑定到画面而是可以定义一个数据点类型DPT把设备参数、状态、报警全部做成一个结构体比如一台机床就是一个DP这个DP下面挂转速、温度、进给量、报警码、运行状态等。一台设备对应一个结构体新增设备就是复制结构体工程效率完全不一样。二次开发边界很宽。自带CTRL脚本语言类似C语言的精简版同时提供完整的.NET和C API可以嵌到C#程序里做业务逻辑、报表、对接外部系统。这一点对我们后来做Siplant的应用层扩展起到了决定性作用。当然WinCC OA也不是没有缺点。它的学习曲线比普通HMI陡得多资料相对少国内做这块的人员难得找。许可授权也偏贵得按功能模块和客户机数量买。但如果是车间级平台这种体量的项目综合考虑性能和扩展性这笔账是算得过来的。2. Siplant平台架构从设备层到车间层怎么打通2.1 整体分层设计Siplant的整体架构我们分了三层设备接入层、核心服务层、应用展示层。设备接入层负责把所有异构设备的数据统一接进来。核心服务层跑在一台Windows Server上的WinCC OA主服务器上承担数据采集、报警、归档、接口服务。应用展示层包括监控大屏、工程师站、Web客户端甚至移动端查看。有一点要专门说不要把采集逻辑全部塞进WinCC OA里。我们的做法是能走硬件网关的先在网关层面做一次协议转换把Modbus、Profibus之类尽量统一成OPC UA出来。WinCC OA侧只对接两种源一是西门子S7协议的PLC二是OPC UA的服务器。这样核心服务层的负担小很多排查问题时的变量也少。2.2 设备接入层S7协议、OPC UA、Profinet怎么选设备接入是整个项目中最多坑的部分务必要在设计阶段就确定每个设备的接入方式。我们实际用到的方案大致如下表设备类型接入方式说明西门子S7-200 SMARTWinCC OA的Siemens TCP/IP驱动走S7协议老版200smart不支持以太网时只能串口或第三方网关西门子S7-1200/1500S7协议直连或PLC侧开OPC UA服务器1500的CPU自带OPC UA服务端选型时更推荐用OPC UAABB变频器、第三方仪表先接入C型网关转为OPC UA变频器走Modbus RTU的网关可配置周期写入和读取老设备硬接点远程IO模块采集后通过Profinet接入PLC硬接点信号统一汇总到PLC再通过PLC上送单台PC上的老组态软件安装OPC DA转OPC UA网关采用经典方案不动原有系统只架一座桥关于S7-1500我特别提一下。1500系列的PLC从固件版本开始就原生支持OPC UA服务器。如果项目条件允许对1500一律建议直接启用其OPC UA功能不要再用S7协议。原因很实际WinCC OA对S7协议的读写有连接数限制而且点位多了之后S7协议报文效率明显下降。我们有一台1500管着一条装配线的全部信号总共600多个点用S7协议跑的时候CPU到了18%后来改成UA ServerCPU直接降到6%。差异非常直观。如果你手头是1200情况稍微麻烦一点。部分固件版本不完整支持UA或需要额外授权。我建议遇到1200且点位不超过两三百个的话S7协议完全够用不用折腾UA。2.3 数据模型设计点表和数据点类型的规划WinCC OA虽然叫数据点但它和传统HMI的变量Tag完全是两个物种。一个DP是一个对象实例它的类型由DPTData Point Type决定。车间级平台能不能平滑运维一半取决于DPT设计得怎么样。我们Siplant项目的DPT设计原则是一设备一结构同车间同模板。举一个实际的模板例子用伪代码展示我们定义的机床数据点类型_Tool.Machine { _I_STATUS : int; // 整机状态待机/运行/故障/离线 _I_ALARM_CODE : int; // 当前报警码 _I_SPEED : float; // 主轴转速 _I_FEED : float; // 进给量 _I_POWER : float; // 实时功率 _I_TEMP_AXIS : float; // 轴温 _F_RESULT : int; // 当前刀次结果合格/不合格 }一台机床在WinCC OA中就是一个继承了这个类型的DP比如M0003。所有画面、报表、趋势曲线都基于这个结构去绑定。以后如果增加了新设备直接cp一个DP并重命名改改地址配置就行不需要动画面。这和传统HMI里一个点位一个电路图式绑定的工作量天差地别。我们的点表规整步骤是按设备编号建立清单标注每台设备的通信方式、IP、寄存器区、采集频率。定义标准DPT尽量用统一的命名前缀例如设备类型缩写加下划线。写一个Excel导入工具把点表映射成WinCC OA的DP结构避免手工在界面上敲几百个DP。校验点表重点是地址重叠、数据类型不一致、单位混乱这几类问题。这里必须给一个提醒点表是整个项目的主心骨不把点表理清楚后面每件事都会出幺蛾子。我见过太多项目因为点表混乱到了调试阶段才发现地址位对不上、设备名字混乱、重复点位一堆。Siplant项目在最开始花了整整两周梳理点表当时觉得慢后期靠这个基础省了巨量的调试时间。3. 核心功能模块的落地实现3.1 实时监控图形画面与数据刷新的平衡实时监控是车间的面子工程也是第一个被领导验收的功能。但我们做画面的时候不能只顾着好看技术上藏着几个关键点。WinCC OA的画面引擎支持矢量图形、图层、动态动画画个设备卡通图、做个翻页效果都没问题。但是监控画面的数据刷新机制和性能关系极大。一个重要原则是画面只关心进入视口的元素。使用WinCC OA的可见性筛选在页面不可见时不请求点位数据使用面板Panel技术做设备列表每台设备占用独立的动画逻辑避免整个页面一次性刷新几百个DP。第二点是区分实时数据与准实时数据。主轴转速、功率这种需要秒级刷新的走WinCC OA的事件驱动而产量统计、班次累计这类数据没必要实时到毫秒我们采用5秒一次的周期刷新或由PLC在整点生产时异步写入大大降低了画面侧的负载。我们的实际监控画面布局是总览页放车间地图显示各产线的总体状态二级页面显示单线体含所有设备状态、关键参数、报警摘要三级页面进入单台设备细节显示完整参数、趋势、配方信息。三级跳的模式对操作工和班组长都友好同时减少单画面点位数。3.2 报警与事件从铃响到精准定位报警系统是车间用户最依赖的功能也是WinCC OA里形态最重的一块。它分为两层报警发生时实时推送的弹窗、报警台账和事件归档的查询界面。WinCC OA的报警系统支持报警组、优先级、确认机制、滤波一套做下来功能非常健全。我们的做法是报警信息统一从PLC侧下发PLC编程时先维护好每台设备的报警代码表通过一个DB块发给WinCC OAWinCC OA收到代码后在消息文件中查表映射成中文描述。这样车间故障处理不会出现代码值和实际含义对不上的情况。报警级别分三级提示级如参数越限不打扰、一般级如短时停机弹窗确认、严重级如安全门打开、轴超温声音加灯闪。确认超时自动升级如果报警在60秒内无人确认系统向值班长客户端弹窗升级。报警配置过程中最容易忽略的是报警文本的编码。WinCC OA的消息文件默认情况下对中文支持不算友好一定要在项目配置中设置UTF-8编码并且在仿真测试阶段验证中文报警能正常显示、正常导出。我们第一批报警消息导入时中文全部变问号就是因为消息文件的字符集没选对。3.3 历史数据与报表数据服从中需要考虑的两件事历史数据归档这一块WinCC OA自带的Storage Manager会把数据存在SQL Server或Oracle里。车间级平台建议直接上SQL Server性能够用维护人员也相对熟悉。做归档前必须决策两件事哪些点需要归档、归档粒度是多少。我们没有全量归档所有DP而是按点的重要程度区分三种粒度高频变化参数如转速、功率按1秒归档设备状态、报警状态按变化归档产量、能耗等汇总值按分钟起档。这样一个5000点规模的车间归档数据量完全可以控制在稳定水平不会把存储空间轻易耗光。报表功能我们做了一套体系班报、日报、月报设备开动率、产量统计、故障时长统计关键参数趋势的导图导出。报表数据不直接从WinCC OA的归档表里取而是WinCC OA将SPD数据同步到我们自建的数据库表再由C#报表服务来做查询和导出。好处是查询逻辑可控而且MES、OA系统将来要用数据时可以直接读我们同步出的表不会去碰SCADA的实时库。4. 二次开发与系统集成C#、数据库、MES4.1 WinCC OA的API体系和脚本语言CTRLWinCC OA的二次开发体系是它区别于普通组态软件的最大护城河。CTRL脚本语法类似C可跑在事件、定时器、用户操作等触发条件下。实际项目中我们用CTRL解决了很多标准功能做不到的业务需求比如根据订单号切换配方后自动重算并下发设备参数。读取上一班次的产量数据拼成交接班短信推送。对设备关键参数做简单越限趋势预判提前给维护人员发通知。CTRL脚本虽然灵活但毕竟脚本不是编译型程序写得多了不好调试。我们的规矩是涉及核心业务逻辑的代码尽量放在外部C#程序里通过API调WinCC OA的数据CTRL只做一些轻量级的联动、画面控制。4.2 C#如何对接WinCC OA和PLC数据C#对接WinCC OA最直接的方式是使用西门子提供的.NET API库。这个API精简下来有两类接口读实时/归档数据、执行命令请求。它通过API连接WinCC OA的服务端可以查询DP的值、历史SQL方便也支持向系统发送事件、请求报警确认等。一个典型的场景Siplant的C#程序中需要实时读取某条产线上的产量并计算每分钟的产能均值。我们是这样实现的// 伪代码示例从WinCC OA读DP值 using Siemens.Simatic.SimaticWinCCOA.Api; var session new Session(localhost, 4567); session.Login(ApiUser, ******); var dpList new DataPointList(Line1.Output.Total); session.DpGetValue(ref dpList, new Timeout(5000)); double total (double)dpList[0].Value.Value; double rate total / elapsedMinutes;当然这套API在WinCC OA不同版本上接口名有差异但整体模式一致。实际做的时候一定先确认你手上的WinCC OA版本对应哪版API文档否则对着老版本的示例代码敲编译时全是红线。有一种情况需要特别提醒C#程序与WinCC OA服务端之间的网络稳定性。API调用如果频繁断连会让WinCC OA的服务端日志疯狂记录错误甚至影响主进程性能。建议把API调用封装成独立服务加断线重连机制查询频率控制在合理范围不要用循环1秒查询的写法。4.3 集成边界MES、ERP、办公系统Siplant在车间级平台定位中不仅要自用还要向外部系统喂数据。我们通过两种方式做了对接数据库直连和WebService接口。数据库直连最直接我们把计算好的中间表开放给MES系统MES周期读取即可。这种方式简单高效但要注意权限控制和只读账号。WebService接口用于ERP系统和办公系统读取生产状态、设备开动率等数据。C#写个web API从WinCC OA读到数据后封装成JSON接口文档对好字段对方系统按需调用。集成过程中最大的坑是数据语义不一致。比如产量这个字段我们按件计MES那边按批次计设备开动率我们按运转时间占比算MES按节拍估算。两边口径不一致系统一对接立马就出矛盾。项目中期我们把所有对外字段都做了一张语义映射表列出字段名、单位、计算方式、更新频率让MES和ERP的人确认签过字才算把这件事压下去。5. 排错实录通信故障、性能优化、权限安全5.1 典型的通信掉线问题Siplant上线后最折腾人的一类问题是通信掉线。尤其是S7-200 SMART和部分老PLC经常出现时好时坏的假象。排查顺序我形成了一套固定打法先看WinCC OA的诊断日志锁定是哪个DP地址通信失败。从现场PLC侧ping通不通通则继续不通则查网线、交换机、IP配置。检查PLC侧通信资源是否耗尽。S7-200 SMART默认允许同时打开的连接通道有限如果除了WinCC OA还有触摸屏、编程电脑同时在访问连接数一爆新连接直接被拒。这个问题当时查了整整一个晚上最后是给触摸屏改成了Profinet接入另一台PLC释放连接数问题消失。关于防火墙这一点几乎每个项目都会遇到。WinCC OA的驱动通信端口不是固定的S7协议可能需要放行102端口OPC UA不仅需要放行4840端口还要注意UA的Discovery机制。如果现场办公网和车间设备网之间有防火墙一定要在调试初期让对方把通信端口全部放行否则你会发现白天一切正常晚上一过防火墙策略变更时间全线掉线。5.2 数据量大时的性能调优车间级平台运行一段时间后数据量积累很快。我们遇到了历史归档查询越来越慢以及画面联动卡顿的问题。逐项排查后主要做了三件事。第一归档存储的空间管理。SQL Server的自动增长如果不设置上限会导致碎片越堆越多查询性能急剧下降。我们给数据库做了定期的索引重建和收缩并将归档文件按天分区每天的归档数据独立存储查询时直接切分区速度快了不止一个量级。第二WinCC OA的通讯驱动并发数。WinCC OA对同一型号PLC的S7连接默认有并发上限多台PLC同时请求时可能排队。我们把客户机的轮询优化为事件驱动只订阅变化点尽量降低无关的请求量。如果你发现点位数并不高但CPU居高不下很大概率是某些点位被设置了周期刷新但实际并没有变化。第三画面端的性能。我们遇到过监控大屏切到总览页时明显掉帧的情况原因是页面里放了太多历史趋势组件。趋势组件在初始化时默认会加载历史数据。我们的解决方案是趋势图点击后才加载模式页面初始化时不查询数据等操作员点击对应设备才发起归档查询场景切换的卡顿现象立刻消除了。5.3 权限与安全的几个坑车间级平台的权限管理不能只靠IT部门的网络策略SCADA系统自身也必须管起来。WinCC OA的权限模型是基于用户组和区域Area的。项目中的使用角色大致分为操作员只能看、确认报警、班组长能在授权区域内操作设备手自动切换、工程师可修改参数、下配方、管理员系统配置。我们的建议是区域和角色分开建把不同产线设为不同区域操作工只能看到自己所在产线的数据。权限管理有一个经常被忽视的地方WinCC OA的API接口也是有权限的。我们曾遇到一个第三方系统通过API读取了所有DP值包括我们没有开放的数据。排查后发现是API Key配置错误给了管理员级别的权限。后来我们为每类外部系统建了独立的API用户并且限定可访问的DP前缀。这一步非常重要否则外部系统出问题时可能波及整个数据平台。安全方面还有一个细节运行期间不要瞎改WinCC OA项目中的DP结构。WinCC OA运行会对DP类型结构加锁如果你在运行态去改结构要么不生效要么直接报错影响工程服务。所有结构变更必须在工程师站上打开发布IMPORT流程停机维护窗口再重启系统服务。6. 项目落地经验与后期运维建议Siplant项目从合同签订到最终验收前后大概是七个月的时间。其中真正写组态和脚本只占不到两个月大量的时间被沟通、点表确认和现场调试占据。我总结了几条对后续项目最有参考价值的经验第一前期花大力气梳理点表和通信方案永远值得。车间里设备五花八门通信协议、寄存器地址、数据格式这些信息分散在设备手册、PLC程序注释、电工的笔记本里。我们专门安排了一名电气工程师和一名自动化工程师一起做点表两个人互相核对两周时间产出的点表后面基本没有大规模返工。第二多留测试环境。WinCC OA的工程组织方式允许多套环境并存。我们把开发环境、测试环境、生产环境分成三个独立连接配置开发画面和脚本不会影响生产系统。车间生产不能随便停所以测试环境是救命稻草。我见过有些项目直接在运行系统上调画面结果一个误操作把整条产线数据中断了这种事不值得再犯。第三运维文档从第一天开始写不要等到验收前补。我们从架构设计阶段就维护一份运维手册内容包括服务器拓扑、数据库连接串、通信驱动配置、重启流程、数据备份策略、常见故障处理步骤。到项目后期这份文档已经有60多页运维人员接手时基本不用我再解释什么。第四备份机制要固化。WinCC OA的工程文件、数据库、许可证、报警消息文件这些如果不同步备份一旦服务器硬件故障恢复一套系统要热锅蚂蚁一样找资料。我们给WinCC OA服务器做了每日自动备份备份文件传到另一台机器同时每周做一次完整导出另存到安全位置。上线了一年多真的遇到过一次硬盘故障靠备份半天时间就恢复了整套系统。我在实际项目中的体会是像Siplant这样的车间级数据平台它在技术层次上不是最前沿但恰恰是制造业数字化中承上启下的关键一环。做好了车间这一层上面的MES、ERP才有干净的数据可用下面的PLC、HMI才有统一的数字化出口。WinCC OA这个底座帮我们把很多底层复杂问题消化了剩下的主要考验其实是工程管理和现场协调能力。如果这篇文章的经验能帮你少走几步弯路少熬几个夜那就值了。