工业互联网集成应用赛项样题全链路拆解:从PLC采集到MQTT上云与组态看板
简介这份PDF是2024年上海高职院校学生技能大赛“工业互联网集成应用师生同赛”赛项的样题资料面向备战该赛项的高职师生及工业互联网集成应用方向的学习者帮助其熟悉竞赛流程、任务结构与考核重点。资源包共1个PDF文件约360KB内容涵盖竞赛须知、职业素养与安全规范、扣分项说明以及加盖拧盖单元、智能物流单元和工业互联网平台三大工作过程的完整任务描述。读者可从中获取RFID读写器安装调试、PLC与读写器通讯编程、IP地址分配、物料分拣规则及平台启停复位控制等具体技术要点并了解截图提交与现场核验的评分方式。目前已有272人学习适合用于赛前模拟训练、教学案例拆解与实操排错参考。1. 工业互联网集成应用赛项样题从设备层到云端的全链路拆解2024 年上海高职院校学生技能大赛“工业互联网集成应用师生同赛”赛项样题.pdf这份文件在不少职业院校的实训群里被反复转发。很多人第一反应是“这不就是个比赛题”但真正打开看过的人会发现它其实是一份浓缩的工业互联网集成应用落地清单——从边缘网关配置、PLC 数据采集、MQTT 上云到云端组态看板和告警联动全链路都给了明确的场景约束。这份样题解决的核心问题是在有限硬件条件下如何把一台模拟产线的数据完整、稳定地送到云端并可视化。它适合两类人一类是准备带学生备赛的指导老师需要快速摸清评分点和实现路径另一类是刚接触工业互联网集成、想找一个完整项目练手的工程师。下面我按实际复现顺序把这份样题拆成能直接抄作业的步骤。2. 样题里的三层架构设备层、边缘层、云端各要做什么2.1 设备层PLC 与模拟产线的信号映射样题里设备层通常由一台小型 PLC 和若干传感器、执行机构组成模拟一条分拣或装配产线。常见做法是用西门子 S7-1200 或三菱 FX 系列作为主控通过数字量输入采集光电开关、限位开关状态通过数字量输出控制气缸、电机启停。关键点在于样题不会让你从零写 PLC 程序而是给定 I/O 分配表要求你完成变量映射和通信配置。我一般会先做一张 I/O 映射表把物理地址和业务变量名对应起来。比如物理地址变量名数据类型说明I0.0Sensor_FeedBool进料检测光电I0.1Sensor_SortBool分拣到位检测Q0.0Motor_ConveyorBool传送带电机Q0.1Cylinder_SortBool分拣气缸MW10Count_TotalInt累计产量这张表是后续所有配置的基础。边缘网关采集时变量名要和这张表严格一致否则云端组态时会出现“数据点找不到”的玄学问题。样题里通常还会要求对模拟量做简单处理比如 4-20mA 信号转工程量这一步在 PLC 侧用 SCALE 指令完成不要留到边缘层做否则采样周期一抖动数据就跳得没法看。2.2 边缘层网关选型与协议转换边缘层是样题里最容易翻车的地方。常见方案是用一台工业边缘网关支持 Modbus TCP、OPC UA、MQTT 三种协议。选型时重点看三个参数是否支持同时做 Modbus 主站和 MQTT 客户端、是否支持边缘计算脚本、是否支持断网续传。样题里一般会指定网关型号但如果你自己练手随便找一台支持 Node-RED 或 Python 脚本的 ARM 网关就能跑通。配置流程分三步。第一步在网关里建立 Modbus TCP 连接指向 PLC 的 IP 和端口 502设置轮询周期 200ms。第二步把 I/O 映射表里的变量逐个添加到采集点注意数据类型要和 PLC 侧一致Bool 对 BoolInt 对 Int16。第三步配置 MQTT 上报把采集点打包成 JSON主题格式一般是factory/line1/{device_id}/data。# 边缘网关上的数据打包脚本示例Python 伪代码 import json import paho.mqtt.client as mqtt # 采集点定义与 PLC I/O 映射表一致 points { Sensor_Feed: {addr: I0.0, type: bool}, Sensor_Sort: {addr: I0.1, type: bool}, Motor_Conveyor: {addr: Q0.0, type: bool}, Count_Total: {addr: MW10, type: int} } def build_payload(values): # 按业务语义组装 JSON不要直接透传原始地址 payload { device_id: line1_plc01, timestamp: int(time.time() * 1000), data: { feed_detected: values[Sensor_Feed], sort_ready: values[Sensor_Sort], conveyor_running: values[Motor_Conveyor], total_count: values[Count_Total] } } return json.dumps(payload) # MQTT 连接与发布 client mqtt.Client(client_idedge_gw_01) client.connect(cloud_broker_ip, 1883, 60) client.publish(factory/line1/plc01/data, build_payload(current_values), qos1)这段脚本的逻辑说明points字典定义了采集点与 PLC 地址的对应关系build_payload把原始值转成带业务语义的 JSONqos1保证至少送达一次。参数上轮询周期建议 200-500ms太快了网关 CPU 扛不住太慢了云端看板会卡顿。MQTT 的client_id要唯一否则同一 broker 上多个网关会互相踢下线这是血泪经验。2.3 云端数据存储与组态看板云端部分样题一般要求实现三个功能实时数据展示、历史数据查询、异常告警。常见做法是用一个轻量级 IoT 平台或者自己搭 EMQX InfluxDB Grafana。如果只是备赛建议直接用平台自带组态工具省去前端开发时间。数据存储方面实时数据走 MQTT 订阅历史数据落时序库。InfluxDB 的 measurement 建议按device_id分field 用业务变量名tag 用产线编号。这样查询时SELECT mean(total_count) FROM line1_plc01 WHERE time now() - 1h就能直接出趋势图。组态看板上样题评分点通常包括实时数值刷新、设备状态指示灯、产量趋势曲线、告警弹窗。注意刷新周期不要设成 100ms浏览器渲染跟不上设 1s 足够。告警规则一般用阈值判断比如total_count连续 3 个周期不变化就报“产线停滞”这个逻辑放在云端规则引擎里做不要放在边缘层否则改规则还得重新下发脚本。3. 从零复现样题网关配置、数据上云、看板搭建的完整命令3.1 网关侧 Modbus 采集配置以常见的边缘网关为例配置 Modbus 主站通常通过 Web 界面或配置文件完成。如果是配置文件方式一般是一个 JSON 或 YAML。下面是一个 Modbus 采集配置的示例# modbus_polling.yaml modbus: mode: tcp host: 192.168.1.10 port: 502 timeout: 3 interval: 200 # 轮询周期单位 ms points: - name: Sensor_Feed address: 0 slave: 1 function: 1 # 读线圈 type: bool - name: Sensor_Sort address: 1 slave: 1 function: 1 type: bool - name: Count_Total address: 10 slave: 1 function: 3 # 读保持寄存器 type: int16逻辑说明function: 1读线圈对应 PLC 的 Q 区function: 3读保持寄存器对应 MW 区。interval设 200ms 是平衡实时性和网关负载的结果。如果样题里 PLC 的寄存器地址是从 40001 开始编的注意在网关里要减 1变成 0 基地址这个偏移量坑过很多人。3.2 MQTT 上云与断网续传MQTT 配置里Broker 地址、端口、用户名密码按样题给定填。重点说断网续传网关一般有本地缓存队列网络恢复后按时间顺序补发。配置项通常叫store_and_forward或cache_size建议缓存 10000 条以上否则断网超过 10 分钟数据就丢了。# 用 mosquitto_sub 验证数据是否上云 mosquitto_sub -h cloud_broker_ip -p 1883 -u user -P passwd \ -t factory/line1/plc01/data -q 1 -v # 输出示例 factory/line1/plc01/data {device_id:line1_plc01,timestamp:1710000000000,data:{feed_detected:true,sort_ready:false,conveyor_running:true,total_count:128}}这条命令用来在云端侧验证数据是否正常到达。-q 1表示 QoS 1-v显示主题名。如果订阅不到先检查网关的 MQTT 连接状态再看主题是否匹配最后查防火墙 1883 端口是否放行。3.3 云端看板与告警规则配置以 Grafana 为例数据源选 InfluxDB查询语句按业务需求写。实时数值用 Singlestat 面板趋势曲线用 Graph 面板。告警规则在 Grafana 的 Alert 模块里配条件表达式类似SELECT last(total_count) FROM line1_plc01 WHERE time now() - 5m如果这个值在 5 分钟内没有变化触发告警。通知渠道可以配 Webhook推送到企业微信或钉钉群。样题里通常只要求弹窗告警但实际产线上会要求推送到手机这一步可以提前练熟。4. 避坑指南样题复现中最容易翻车的五个点4.1 现象网关显示采集正常云端就是没数据原因MQTT 主题大小写不一致或者网关的client_id和另一个设备冲突被踢下线。解决先用mosquitto_sub -t #订阅所有主题看网关到底发了什么主题再检查client_id是否唯一建议加上设备序列号后缀。4.2 现象PLC 数据跳变严重产量计数忽大忽小原因Modbus 轮询周期太短PLC 扫描周期和网关轮询周期不同步读到中间状态。解决把轮询周期从 100ms 调到 200-500ms或者在 PLC 侧加一个数据稳定标志位网关只在标志位为 1 时读取。4.3 现象断网恢复后历史数据出现重复原因网关的断网续传队列和实时上报队列没有做去重恢复后同一时间戳的数据发了两次。解决在云端入库前按timestamp device_id做唯一约束或者在网关侧给每条数据加序列号云端按序列号去重。4.4 现象组态看板刷新时页面卡死原因刷新周期设得太短或者一次查询返回了太多历史数据。解决实时刷新周期设 1s历史查询加时间范围限制比如只查最近 1 小时并且用聚合函数降采样。4.5 现象告警规则误报频繁原因阈值设得太敏感或者没有加持续时间条件。解决告警条件里加FOR 3m表示连续 3 分钟满足条件才触发。另外阈值要根据实际产线节拍调整不要直接抄样题里的示例值。5. 进阶技巧用边缘脚本做数据预处理和本地联动样题的基础要求是数据上云但真正拉开差距的是边缘侧的数据预处理和本地联动。我一般会在网关上跑一段 Python 脚本做三件事第一对模拟量做滑动平均滤波消除传感器抖动第二在本地判断简单逻辑比如“进料检测到但传送带没启动”就立即触发本地蜂鸣器不等云端下发指令第三对上报数据做压缩只上报变化量减少流量。# 边缘侧滑动平均滤波与变化上报 from collections import deque class Filter: def __init__(self, window5): self.buf deque(maxlenwindow) def update(self, value): self.buf.append(value) return sum(self.buf) / len(self.buf) # 变化上报只有值变化超过阈值才发 MQTT last_reported {} def should_report(key, value, threshold0.5): if key not in last_reported: last_reported[key] value return True if abs(value - last_reported[key]) threshold: last_reported[key] value return True return False这段代码的逻辑Filter类用固定长度队列做滑动平均窗口大小 5 是经验值太小滤波效果差太大响应滞后。should_report函数做变化上报阈值 0.5 适合温度、压力这类缓变量开关量直接设 0 就行。这样能把 MQTT 消息量降下来一半以上云端存储压力也小很多。验证方法上我习惯在网关本地先跑一遍数据流用tcpdump抓包看 MQTT 报文确认没有多余的空包和重复包。然后在云端用 InfluxDB 的SHOW MEASUREMENTS和SELECT COUNT(*)核对数据条数和网关侧的上报计数对得上才算真正跑通。最后一步是模拟断网拔掉网线等 5 分钟再插上看历史数据是否完整补发这个测试过了基本就能上赛场了。希望帮到你。本文还有配套的精品资源点击获取