资讯动态

工厂SCADA数据采集全解析:从PLC通讯到厂务监控落地

发布时间:2026/10/11 3:17:20 来源:尧图企业网站定制
简介《数字化智能工厂数据采集与厂务监控系统SCADA建设方案》由郎丰利于2023年8月整理制作是一份面向智能工厂规划与厂务管理人员的系统性建设方案重点解决设备、人员和材料等要素的实时监控及各生产环节的协调运转问题。资源包内为单个PPTX演示文稿大小约8.55MB目前已有41人在线学习。方案以厂务集中监控为主线详细介绍了以分布式实时数据库和工业控制消息总线为核心的系统架构支持面向服务的集成方式可灵活构建不同规模的监控平台。内容同时涵盖远程空调控制、空压机远程运维、消防联动、视频监控、设备管理、能源分析等子系统并说明了生产车间电子看板、短信报警、历史数据查询、设备故障报告、操作员权限管理等功能设计能够帮助读者从数据采集、网关传输到平台集成与远程管控形成完整认知适用于智能工厂相关方案设计、技术选型与实际落地参考。1. 一份SCADA建设方案先解决的是工厂数据怎么「漏」的问题做数字化智能工厂的人多半是从一块中控大屏开始的。屏上画着水电气、洁净间温湿度、空压机、冷站、废水站数据一秒一刷像模像样。但真正到了验收时才发现系统能看、能存、能报警唯独不敢拿它做生产决策——因为现场仪表和SCADA画面上显示的数经常对不上。这不是软件 bug而是数据采集这条链路从设计之初就没人认真管过。数字化智能工厂数据采集与厂务监控系统SCADA建设方案本质上就是回答一个问题从车间设备、传感器、PLC里把数抠出来送到中控再让生产、设备、厂务三拨人愿意信它。SCADA在这里不只是画面上按钮闪烁而是工厂数据的地基。适合正在做新建厂或老厂改造、被“数据不准、连接不通、组态无从下手”困扰的设备工程师、自控工程师和厂务负责人。2. 数据采集层的四级架构从PLC传感器到中控SCADA的路径与选型2.1 设备层到SCADA的数据链路为什么说OPC UA是主流而Modbus TCP够用SCADA的数据采集最常见的做法不是直接连仪表而是按“设备层—控制层—采集层—监控层”四级来搭。设备层是变频器、电表、温湿度传感器、水流量计控制层是PLC或者成套设备的控制器采集层是SCADA服务器或前置采集网关监控层才是中控大屏和客户端。这么分层的原因很实在直接去轮询仪表点位一多就会把现场总线拖垮而且仪表往往没有标准协议逐台适配工作量极大。让PLC先把数据汇总SCADA只管找PLC要数链路才可控。协议选型上我一般建议优先考虑OPC UA特别是新采购的设备或新建产线。OPC UA自带信息模型能把设备的铭牌、量程、单位、报警阈值一起带上来而不是裸奔的裸标签。像西门子、罗克韦尔、倍福这些主流控制器的上位接口都支持OPC UA打通后数据维护成本低。但老厂改造就务实点Modbus TCP依然是性价比最高的选择。几乎所有PLC和仪表都带Modbus TCP从站或主站功能或者加一个几十块钱的串口转以太网模块就能接入。前提是要把数据映射表吃透寄存器地址、数据类型、字节顺序这三样错一个SCADA上看到的就是负数或者乱码。还有一种常见场景是设备自带数据接口但协议私有比如一些进口空压机、冷水机组只给一个RS485口跑私有协议。这种情况我通常不碰——不要试图在SCADA里硬解私有协议那是无底洞。正确做法是要求设备供应商提供OPC UA或Modbus映射表或者加一台协议转换网关由网关厂家负责把私有协议翻译成标准协议SCADA只认标准协议。2.2 点位表设计数据采集方案的「地基」一张表管住三件套数据采集方案里最繁重但最关键的一步不是写驱动、也不是组画面而是做点位表。点位表就是一张Excel每一行定义一个采集变量列包括系统名称、设备名称、点位描述、PLC或仪表的寄存器地址、数据类型、读写属性、采集周期、量程、单位、报警阈值、历史存储策略。这份表决定了后续SCADA组态能不能顺利落地而很多项目恰恰是跳过点位表直接上手做画面最后搞得一团糟。点位表里最容易埋坑的是地址和数据类型。同一台PLC同一个寄存器地址按16位整数和32位浮点读出来的结果完全不同。更麻烦的是字节顺序——有些设备按ABCD排列有些按CDAB排列如果点位表上没有标注字节序后期联调就会来回猜。我习惯在点位表里加一列“字节顺序”并严格按“低位在前/高位在前”写明规则。凡是点位表上说不清楚的一律先搁置不动等供应商给出书面确认再往下做。点位表的粒度也要控制。不是越多越好颗粒度太细会让监控画面变成天文台操作工看不过来太粗又会丢信息。比如空压机一般采运行状态、故障状态、排气压力、排气温度、累计运行时间、加载/卸载状态这几个点就够了而冷站里冷冻水供水温度、回水温度、冷冻水流量、冷却水进出水温度则每个都是必采项。设计标准是中控室画面上的每一个数字都必须在点位表里找得到来源点位表里的每一个点都必须能回答“采它干嘛用”。2.3 采集网关与SCADA的接口参数IP、端口、节点路径怎么设点位表定完之后进入实际配置。SCADA采集数据的软件实现常见有两种一种是直接用SCADA自带的驱动比如Intouch的DAServer、WinCC的通信驱动、组态王的设备驱动另一种是用独立采集网关或边缘采集器先采集再通过OPC UA转发给SCADA。我建议中等规模以上的厂用后者原因在于SCADA服务器重启时采集链路不会跟着断而且网关可以做协议转换和本地缓存中控断线也不丢数。网关配置里最常见的参数就是连接PLC的IP和端口。以Modbus TCP为例默认端口502连接超时一般设3000毫秒响应超时500毫秒重试次数3次。不要把这些参数当作玄学随手填。超时设太短网络抖动一下就把链路误判为失效设太长故障时切换要等半天。在厂内千兆局域网里PLC响应基本都在10毫秒以内500毫秒的响应超时已经留足了余量。连接超时设3秒是因为PLC可能在停机状态但设备模块仍然在线握手慢一点是正常的只要不是累计多次超时就不该判定链路断。网关往SCADA转发的OPC UA节点路径也有讲究。不要用默认的“Server/Channel/Device/Tag”那样点位一多SCADA里压根找不到数在哪。规范做法是按“厂区—系统—设备—参数”四级建节点例如“Plant1/Utility/AirCompressor/DischargePressure”。这样SCADA工程师拿到一个变量名就能反查它的物理位置排查故障时效率能差出一大截。注意网关和SCADA之间的通信必须设置“看门狗”变量。在网关里选一个PLC里变化最快的计数器或心跳位让SCADA周期性判断它是否在跳动超过设定时间未变化就判定链路中断并触发中控室报警而不是等操作工自己发现画面卡住了。3. 厂务监控的层级体系哪些系统该接、哪些不该接、先做哪段3.1 厂务监控管什么水电气、洁净间、废气废液与公共动力厂务监控系统英文叫Facility Monitoring System和纯生产型SCADA的不同之处在于生产型SCADA记录的是工艺参数比如温度、压力、流量、液位、转速厂务SCADA管的是保障生产运行的公用工程范围包括变配电、给排水、纯水、空压、真空、氮气、空调暖通MAU/AHU/冷站、洁净室环境温湿度、压差、尘埃粒子、废气处理、废水处理以及电梯、照明等公共设施。如果想看清一个工厂的能耗结构厂务监控就是那个唯一能报出准确数字的账本。这个范围如果不框死很容易失控。我遇到过客户要求把锅炉烟气在线监测、余热回收、光伏发电全部纳入第一期理由是“反正都是数据”。这种需求不是不行而是优先级错了。第一期的厂务监控应当只接直接影响生产稳定或能耗占比最大的系统。经验法则是按“断供损失”排序——机器停了会停产的系统优先比如空压、纯水、冷站耗能占比大的系统其次比如中央空调、空压机环保合规要求的系统最后比如废水、废气。这样排序的理由很直接厂务系统的核心使命是保障生产不是展示数据之多。3.2 监控层级设备现场层、区域控制层、厂务中控层的数据流向厂务监控的数据流不是一步到位的多数成熟工厂是三层结构。第一层是设备现场层配电柜里的电表、管路上的传感器、空压机自带的控制器第二层是区域控制层比如空压站房里的PLC、冷站里的楼宇控制器DDC、洁净间里的环境监控器第三层才是厂务中控层也就是SCADA服务器和大屏。这三层之间的关系决定了数字化智能工厂厂务系统好不好用。最常见的设计错误是SCADA直接去读最底层仪表绕过区域控制器。比如SCADA直接去读空压机内部的控制器数据虽然也能读到但区域层的PLC本身就在做联锁控制比如三台空压机的轮换、备用机的自动启动。一旦SCADA和PLC同时去写这个设备轻则数据发现延迟重则触发设备保护逻辑。正确做法是SCADA只读取区域层PLC集中后的数据区域控制器负责设备协调SCADA只负责监督和记录两层各司其职。3.3 中央监控画面怎么组织按区域分页按报警分级按班次记录中控画面是SCADA系统的门面但很多项目死就死在画面上一屏放了几百个点位操作工找不到自己要的那个数据点。我常用的组织粒度是按“系统分页设备子页关键参数总览”做三级导航。第一级总览页展示水电气瞬时负荷、重点设备的运行状态、当天报警数量第二级按系统分页空压站、冷站、废水站各一页第三级才是设备细节页展示该设备的所有点位和实时曲线。报警分级是厂务监控里最容易和“监控”打架的地方。报警数量一旦失控操作工会直接静音声光报警器整个报警体系形同虚设。我的做法是把报警分为三类联锁报警必须停机的、越限报警超过安全阈值的、提示报警软性提醒。提示报警只能出现在报警记录里不触发声光越限报警可以弹窗但自动确认只有联锁报警才强制推送到大屏上且必须在15分钟内由班组长确认。这样设计后报警的有效性会高很多因为操作工知道每条报警都是真的。厂务监控还有一个生产SCADA不太强调的需求——班次记录。厂务系统常涉及跨班组交接班设备启停、异常处置若没有班次签名出了问题互相推诿。多数SCADA组态软件都支持事件记录把登录用户和班次绑在操作事件上谁在什么时间点了哪个按钮记录可追溯。这块在建设方案里必须写进软件需求否则后期补会非常难受。4. SCADA如何与PLC连接一套可落地的通讯配置与数据块规划4.1 通讯参数配置从PLC到SCADA低代码接入以Modbus TCP为例厂务监控最常见的PLC是西门子S7-1200/S7-1500、三菱FX/Q系列、施耐德M221/M241以及一些国产PLC。无论品牌只要它支持Modbus TCP接入SCADA的路径都比较直接。接下来给出一段在采集网关上通过Python脚本实现标准Modbus TCP接入PLC、并把数据转发给SCADA的最小实现这个案例在实际项目中可以直接改吧改吧用在测试环境。# modbus_to_scada_bridge.py # 功能从PLC采集Modbus TCP数据通过OPC UA转发给SCADA # 依赖pyModbus、opcua、schedule import time import schedule from pymodbus.client import ModbusTcpClient from opcua import Server # ---------- 配置区 ---------- PLC_IP 192.168.1.10 PLC_PORT 502 READ_REG_START 100 # 起始寄存器地址对应点位表里的地址 READ_REG_COUNT 20 # 一次性读取20个连续寄存器 SCAN_INTERVAL 2 # 采集周期秒按点位重要性调整 OPC_SERVER_PORT 4840 OPC_NODE_NAME Plant1/Utility/AirCompressor # ---------- 配置区结束 ---------- client ModbusTcpClient(PLC_IP, portPLC_PORT, timeout3) if not client.connect(): raise RuntimeError(f连接PLC失败: {PLC_IP}:{PLC_PORT}) # 初始化OPC UA ServerSCADA端只需指向本机IP:4840 server Server() server.set_endpoint(fopc.tcp://0.0.0.0:{OPC_SERVER_PORT}) idx server.register_namespace(OPC_NODE_NAME) objects server.get_objects_node() discharge_pressure objects.add_variable(idx, DischargePressure, 0.0) discharge_temp objects.add_variable(idx, DischargeTemp, 0.0) running_state objects.add_variable(idx, RunningState, False) discharge_pressure.set_writable(False) discharge_temp.set_writable(False) running_state.set_writable(False) server.start() def poll_and_publish(): # 读取PLC寄存器注意Modbus地址是从0开始的偏移量 result client.read_holding_registers(READ_REG_START, READ_REG_COUNT, unit1) if result.isError(): print(f[日志] 读取失败: {result}) return raw_values result.registers # 32位浮点的两个相邻寄存器合并A B C D字节序 pressure_raw (raw_values[0] 16) | raw_values[1] temp_raw (raw_values[2] 16) | raw_values[3] # 按点位表写入实际工程值和量程换算 discharge_pressure.set_value(pressure_raw * 0.01) # 0.01bar/LSB discharge_temp.set_value(temp_raw * 0.1) # 0.1℃/LSB running_state.set_value(bool(raw_values[4])) # 定时调度防止while True里阻塞导致OPC UA心跳中断 schedule.every(SCAN_INTERVAL).seconds.do(poll_and_publish) while True: schedule.run_pending() time.sleep(0.2)这段代码演示了Modbus TCP到OPC UA桥接的完整链路。逻辑上分三步第一步连接PLC并读取连续寄存器第二步是把32位浮点从两个16位寄存器中拼出来第三步是发布为OPC UA节点供SCADA订阅。关键点是第26行的“unit1”这是PLC从站地址出厂默认通常是1但如果现场有多台从站串联在同一口上就需要按点位表核对每台设备的unit号填错会读到别的设备或直接超时。第34行、35行的32位浮点拼接是翻车高发区——两个寄存器的先后顺序和字节序以PLC点位表为准不同品牌定义可能相反。这种脚本化的采集方案最大的价值是随时可改哪个点位不对直接改脚本重新跑不用重启SCADA服务器。如果现场规模大、点位上千则建议换成商业采集网关如Kepware、ThingsBoard Gateway。它们自带图形化的地址配置界面维护交给IT也能上手。但对于采购受限的厂Python脚本足够撑起空压、冷站这类点数中等、逻辑清晰的子站。4.2 数据块规划与采集周期模拟量、状态量、累积量分开整定SCADA和PLC的连接不只是把通讯配通更关键的是数据块的规划——在PLC里把哪些数据放在连续寄存器区域直接决定采集效率。常见的做法是让PLC工程师在DB块里专门开一个“SCADA数据区”把需要给SCADA读取的变量连续排布而不是让SCADA在PLC庞大的数据区里大海捞针。这一个排布习惯往往能把采集周期从秒级拉到亚秒级。采集周期的设置我的经验是按变量类型区分而不是一刀切。模拟量如温度、压力、流量按25秒采集即可因为用过程变量的惯性比较大1秒以内的变化对于厂务监控没有意义。状态量如运行、停止、故障、手自动状态1秒以内甚至事件触发。累积量如电度、水流量累积值只需要每分钟采一次快照SCADA端保存小时和日累计就行。记住这个原则周期性平滑的数据不是越频繁越好采集频率只会白白堆高系统负载并不会让数据更准确。存储策略和数据块规划一样重要。历史存储不能全采全存否则数据库会膨胀到不可收拾。常规做法是对模拟量做死区变化存储——只有在数值变化超过死区比如温度变化0.5℃、压力变化0.01bar时才写一条历史记录状态量按事件变化存储累积量按整点存储。这套“死区事件”的存储策略能让历史库缩小到全量存储的10%20%而趋势图看起来几乎没有差别。4.3 断线重连与数据缺口处理让采集链路不至于“一次断线就出黑匣子”SCADA运行中最让人头大的不是PLC挂了而是通信链路抖动——PLC还在跑但交换机一个端口松了或者网关进程卡死导致SCADA出现一小段数据缺口。操作工看历史趋势图的时候会发现一条断线然后质问“这一段时间设备状态是什么”。要处理数据缺口首先在采集端解决连接可靠性的问题。Modbus TCP连接的本质是TCP长连接如果长时间没有数据往来中间的网络设备可能会回收这条连接。所以我的做法是在采集脚本或网关里加一个心跳帧每30秒读一次PLC里固定的心跳寄存器哪怕数据没有变化也照读不误。一旦心跳连续3次超时判定为断线触发重连重连成功后再把断线期间累积的数据从PLC侧的历史缓冲区补采。需要留意的是多数PLC的寄存器区并不带时间戳补采回来的数据只能打到当前时间或者按采集周期倒推估算。这意味着SCADA对于采集断档期间的精确数值是存在先天盲区的。这个盲区应该在系统设计阶段就明说而不是等使用后暴露。我习惯在SCADA里对每一路数据点设置“数据有效性标志”——通信中断期间的数据标记为“无效”趋势图上用灰色虚线表示报表里默认排除无效数据并做备注。这么做的好处是把SCADA的诚信度放在第一位宁可图上有缺口也不把估算数据冒充真实数据写进报表里。中控室考核能耗时数据缺口有记录可查责任界定也清清楚楚。5. SCADA建设常见的坑数据不对、画面卡、备份失效的现场排查5.1 现象采集到的数据漂移厉害和现场仪表差了一大截建好后第一周厂务主管一眼看出空压机排气压力SCADA显示7.2bar而压力表显示6.8bar。查仪表、查传感器都正常问题出在PLC内部的数据换算。原因基本集中在两点一是量程换算系数错PLC里工程量是原始数值乘以系数SCADA这边又按点位表的量程做了一次换算导致重复缩放二是数据类型错位比如PLC里是32位浮点SCADA按16位整数读读出来的数自然和现场对不上。解决方法是做一次两两核对用PLC编程软件在线监控一个变量的原始整型值和工程值再看SCADA上同一个变量的显示值三点对齐才说明链路无误。如果原始值对、工程值对、SCADA显示不对那问题就在SCADA侧的量程配置或者驱动数据类型设置上。这一步虽然繁琐但每个点位都要做不能抽样抽样必漏。5.2 现象监控画面点击响应迟滞中控室大屏直接“翻车”辛辛苦苦把画面做完交付演示时中控室大屏切换页面要等三五秒操作工点一个按钮半天没反应。原因通常不是SCADA软件性能不行而是采集周期和画面刷新周期互相拖累。常见情况是每个画面的数据刷新时间都设成了500毫秒甚至更短画面上的几百个数据点同时轮询服务器负担自然重。解决方法是分级设置刷新周期总览页只放关键参数刷新周期可以设1秒系统分页的普通模拟量设23秒历史趋势图反而没有必要实时刷新。另外扫描周期和存储周期要分开设——显示扫描是1秒历史存储按死区策略5秒以上二者互不干扰。若画面里嵌了大量历史趋势控件务必给每个趋势控件设置查询范围上限防止操作工一打开就是半年数据量直接把客户端拖死。5.3 现象报表里的数据有缺口恰好集中在交接班时段厂务早班交班报告经常发现昨晚23:50到00:10这段时间的能耗数据缺失刚查监控历史库确实没有记录。这不是采集链路断了而是SCADA服务器在午夜做了数据归档或数据库自动备份同期占了服务器资源把采集线程拖住了。原因在双服务器架构里更隐蔽主服务器重启或切换时采集网关继续向备用服务器写入但备用服务器没有正确配置归档导致数据丢失。解决方法是先确认服务器重启、备份时间错开采集中时段其次在采集网关里启用本地历史缓存至少24小时一旦SCADA恢复就自动补传。这里也是采购时最容易被忽略的隐藏成本——网关是否自带缓存直接决定断线超过几分钟之后的数据能不能找回。没有缓存的网关断线期间的数据就是永久性的黑匣子。5.4 现象历史数据库膨胀飞快一年不到磁盘报警厂务SCADA跑了一年C盘空间告急。查了一下历史数据库文件发现有几十GB。原因基本可以锁定在存储策略上——要么是全量存储没有启用死区过滤要么是将“秒级采集”配置成了“秒级存储”导致海量冗余数据被写入磁盘。解决方法是按曾提到的“死区事件”策略重做存储配置。模拟量设置死区温度0.5℃、压力0.01bar状态量只在变化时记录累积量按整点记录。同时给历史数据库设置保留周期实时数据保留90天、小时汇总保留2年、日汇总永久保存。这样既满足趋势查询需求又能把历史库体积控制在合理范围。这里提醒一句有些SCADA项目喜欢把所有数据永久保存以为越全越好实际上没人会翻三年前的温度曲线保留全量只会拖慢查询速度。6. 验证边界与进阶打通“数据能用”到“数据值钱”的最后一段6.1 最小可用验证先看数据对不对再看报警准不准最后看报表全不全厂务SCADA能不能验收我建议按三个层次验证每一层过了再进下一层。第一层是数据准确性选1020个关键点位与现场仪表/PLC在线值逐一比对误差应在仪表精度范围内。第二层是报警有效性故意断开一路现场信号或短接模拟量输入确认SCADA能在设定时间内弹窗并且操作工能定位到具体设备和参数。第三层是报表完整性连续跑一个班次或一周检查日报、月报、交接班记录的缺失情况——通常做完这三步系统能不能用、哪里还需要补就心里有数了。6.2 进阶报警阈值分级整定与能效数据的二次计算系统跑稳后才是真正产生价值的时候。厂务SCADA最有潜力的不是在画面做得好看而是把采集到的数据变成可执行的决策。比如空压机的排气压力和加载率可以用来计算比功率kW/m³/min一旦发现某台空压机的比功率明显高于同批次的其它机组说明它该保养了。这些二次计算不需要额外硬件在SCADA里的趋势计算引擎或报表脚本里就能实现——前提是点位表当初把电度、压力、流量这些原始量都采全了。最后一条经验SCADA建设里最容易被低估的是时间。点位核对、通讯联调、画面测试每一项都需要干活的人蹲在现场和PLC工程师、设备供应商来回确认。我见过不少方案做得很漂亮但就是没留足联调时间最后匆匆上线、后续补丁不断。如果你也在推进类似的项目别指望一步到位先把第2章的架构和第4章的通讯配置打通稳住数据链路再往画面和报表上添砖加瓦——地基稳了上层才敢越做越厚。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑