WMS 核心模块 / 工业通讯协议 / SCADA
WMS 仓库管理系统
WMS 系统概述
仓库管理系统(Warehouse Management System, WMS)是仓储物流体系的核心信息系统,通过对入库、出库、库存、库位、波次、补货等环节的精细化管理,实现仓库作业的标准化、自动化和智能化。
核心模块
| 模块 | 功能职责 | 关键业务规则 |
|---|---|---|
| 入库管理 | 预约、ASN、收货、质检、上架、确认 | 支持预约排程、ASN 预录入、扫码收货、抽检/全检、自动推荐上架库位 |
| 出库管理 | 订单接收、波次、拣货、复核、打包、发货、交接 | 支持订单合并/拆分、波次策略、多种拣货模式、发货确认 |
| 库存管理 | 库存查询、库存调整、库存冻结、库存转移 | 实时库存可视化、多维度库存查询、批次/序列号追溯 |
| 盘点 | 循环盘点、静态盘点、动碰盘点、盲盘 | 支持盘点计划自动生成、差异分析、复盘与调整 |
| 库位管理 | 库位编码、库位类型、库位状态、库位容量 | 库位生命周期管理、库位占用率分析、库位热力图 |
| 波次管理 | 波次规则、波次创建、波次释放、波次监控 | 支持按路线/时效/订单类型/配送方式自动建波 |
| 补货策略 | 库存警戒、自动补货、移库补货、紧急补货 | 支持 Max-Min / 按订单 / 按频率多种补货策略 |
核心数据表设计
入库单表 (asn_header)
CREATE TABLE asn_header (
asn_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'ASN 主键',
asn_code VARCHAR(32) NOT NULL COMMENT 'ASN 编号',
supplier_id BIGINT NOT NULL COMMENT '供应商 ID',
warehouse_id BIGINT NOT NULL COMMENT '仓库 ID',
asn_type TINYINT NOT NULL COMMENT '入库类型:1-采购入库 2-退货入库 3-调拨入库 4-生产入库',
expect_arrive_time DATETIME NOT NULL COMMENT '预计到货时间',
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0-待预约 1-已预约 2-已到货 3-收货中 4-已收货 5-已上架 6-已完成',
total_sku_count INT NOT NULL DEFAULT 0 COMMENT 'SKU 总数',
total_qty DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT '总数量',
remark VARCHAR(500) COMMENT '备注',
create_by VARCHAR(32) NOT NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_by VARCHAR(32),
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_warehouse_status (warehouse_id, status),
INDEX idx_supplier (supplier_id),
UNIQUE KEY uk_asn_code (asn_code)
) COMMENT '入库单头表';库存表 (inventory)
CREATE TABLE inventory (
inventory_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '库存 ID',
warehouse_id BIGINT NOT NULL COMMENT '仓库 ID',
location_id BIGINT NOT NULL COMMENT '库位 ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
lot_no VARCHAR(64) COMMENT '批次号',
serial_no VARCHAR(128) COMMENT '序列号',
qty DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT '可用数量',
frozen_qty DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT '冻结数量',
allocated_qty DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT '已分配数量',
total_qty DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT '总数量 = qty + frozen_qty + allocated_qty',
production_date DATE COMMENT '生产日期',
expiry_date DATE COMMENT '过期日期',
inbound_time DATETIME NOT NULL COMMENT '入库时间',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0-无效 1-正常 2-冻结 3-锁定',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_warehouse_location_sku_lot (warehouse_id, location_id, sku_id, lot_no),
INDEX idx_sku_warehouse (sku_id, warehouse_id),
INDEX idx_expiry (expiry_date)
) COMMENT '库存明细表';入库流程
入库流程从供应商预约到最终上架确认,涵盖以下关键环节:
预约 ASN 收货 质检 上架 确认
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│供应商 │-->│ ASN │-->│扫码 │-->│质检 │-->│系统 │-->│入库 │
│预约 │ │预录入 │ │收货 │ │判定 │ │推荐 │ │确认 │
│到货 │ │(单据) │ │(PDA) │ │(抽检/ │ │库位 │ │记账 │
│时间 │ │ │ │ │ │全检) │ │上架 │ │ │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘环节说明:
- 预约:供应商通过门户或接口提交到货预约,WMS 依据仓库产能和时段分配预约时间窗口。
- ASN:供应商或采购系统预录入 ASN(Advanced Shipping Notice),包括 SKU、数量、批次等信息。WMS 根据 ASN 预占库位资源。
- 收货:到货后现场人员通过 PDA 扫描物流单号或 ASN 码,逐件或批量扫码确认收货。支持按托盘/按箱/按件三种粒度。
- 质检:根据质检规则决定抽检比例或全检,质检结果分为合格、不合格、让步接收。不合格品进入不良品库位,触发退货流程。
- 上架:WMS 根据上架策略自动推荐目标库位,操作人员通过 PDA 引导上架,扫描库位码确认绑定关系。
- 确认:上架完成后系统更新库存数据,更新 ASN 状态为已完成,触发财务结算接口。
出库流程
出库流程从订单接入到装车交接,形成完整的正向物流链路:
订单接收 波次 拣货 复核 打包 发货 交接
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│OMS │-->│波次 │-->│拣货 │-->│复核 │-->│打包 │-->│发货 │-->│装车 │
│下发 │ │策略 │ │(PDA/ │ │(PDA/ │ │(装箱 │ │确认 │ │交接 │
│出库 │ │合并 │ │DAS) │ │扫码) │ │/贴标) │ │(出库) │ │签收 │
│订单 │ │订单 │ │ │ │ │ │ │ │ │ │ │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘环节说明:
- 订单接收:OMS(订单管理系统)下发出库订单至 WMS,WMS 校验库存可满足后锁定库存,否则触发缺货标记。
- 波次:WMS 按波次规则(配送路线、承运商、时效等级、订单类型)将多个订单组合为波次,生成拣货任务。支持按波次拣货(Batch Picking)和按单拣货(Single Order Picking)。
- 拣货:分配拣货任务至操作员 PDA,支持按库位序号的路径优化。拣货模式包括 RF 拣货、语音拣货、DAS(数字拣货系统)、灯光拣货等。
- 复核:对已拣货品进行逐件扫码校验,核对 SKU、数量、批次,差异系统实时提示并要求纠正。
- 打包:复核通过后进行装箱打包,称重获取实际重量录入系统,打印并粘贴面单/运单。
- 发货:确认发货,WMS 扣减库存,释放波次,生成发货单,回调 OMS 更新状态。
- 交接:承运商交接确认,扫描运单号批量装车,生成交接清单。
库存策略
ABC 分类
基于帕累托法则对 SKU 进行分级管理,指导库位分配、盘点频次和补货策略。
| 分类 | 销售占比 | SKU 占比 | 管理策略 |
|---|---|---|---|
| A 类 | 占总销售额 70-80% | 占总 SKU 10-20% | 高频盘点、优先库位(靠近出货口)、高安全库存、严格批次管理 |
| B 类 | 占总销售额 15-25% | 占总 SKU 20-30% | 正常盘点、中间库位、标准补货策略 |
| C 类 | 占总销售额 5% 以下 | 占总 SKU 50-60% | 低频盘点、远端库位、低安全库存、可采用定期补货 |
安全库存
安全库存(Safety Stock)用于吸收需求波动和供应不确定性。
SS = Z * sigma_d * sqrt(LT)
其中:
SS = 安全库存量
Z = 服务水平系数(95% 服务率取 1.65,99% 取 2.33)
sigma_d = 需求标准差
LT = 补货提前期(天)安全库存预警等级:
| 预警等级 | 库存水位 | 触发动作 |
|---|---|---|
| 绿色 | 库存 > SS * 2 | 正常监控,无需动作 |
| 黄色 | SS < 库存 <= SS * 2 | 触发计划补货建议 |
| 橙色 | 0 < 库存 <= SS | 触发紧急补货,通知采购 |
| 红色 | 库存 = 0 | 触发缺货告警,锁定订单 |
FIFO / FEFO 出库策略
| 策略 | 全称 | 适用范围 | 拣货排序规则 |
|---|---|---|---|
| FIFO | First In, First Out | 通用货物、无明确保质期要求 | 按入库时间升序,先入库先出库 |
| FEFO | First Expired, First Out | 食品、医药、化工等有保质期要求的货物 | 按有效期升序,先到期先出库 |
WMS 在分配库存时,按照 FIFO/FEFO 策略锁定批次,结合库位路径优化,在满足策略优先级的前提下减少拣货行走距离。
条码与 RFID 批次追溯
条码方案:
- 一维码(Code 128 / EAN-128):应用于库位码、托盘码、SKU 码,编码规则遵循 GS1-128 标准。
- 二维码(QR Code / Data Matrix):应用于序列号追溯、电子标签、质检追溯码,可存储更多信息。
RFID 方案:
- 在托盘/周转箱上粘贴无源 UHF RFID 标签(EPC Class 1 Gen2),读写距离 3-8 米。
- 在库门口、输送线节点部署固定式读写器,实现出入库自动采集。
- 手持 RFID 终端用于盘点,单次可批量读取 200+ 标签。
批次追溯数据模型:
CREATE TABLE traceability_record (
trace_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '追溯 ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
lot_no VARCHAR(64) NOT NULL COMMENT '批次号',
serial_no VARCHAR(128) COMMENT '序列号(RFID 唯一标识)',
operation_type TINYINT NOT NULL COMMENT '操作类型:1-入库 2-出库 3-盘点 4-移库 5-退货',
operation_time DATETIME NOT NULL COMMENT '操作时间',
operator_id VARCHAR(32) NOT NULL COMMENT '操作人',
source_location VARCHAR(32) COMMENT '源库位',
target_location VARCHAR(32) COMMENT '目标库位',
order_no VARCHAR(64) COMMENT '关联单据号',
qty DECIMAL(12,3) NOT NULL COMMENT '操作数量',
rfid_tag VARCHAR(64) COMMENT 'RFID 标签 ID',
INDEX idx_sku_lot (sku_id, lot_no),
INDEX idx_serial_no (serial_no),
INDEX idx_operation_time (operation_time)
) COMMENT '批次追溯记录表';WMS 库位管理
库位编码规则
库位编码采用"区-排-层-位"四级编码体系,确保每个库位在全仓库范围内唯一标识。
编码格式:ZZ-AAA-BB-CC-DD
示例:A1-012-03-04
含义分解:
ZZ = 仓库代码(如 A1 = 一号仓库)
AAA = 区域代码(如 012 = A 区第 12 巷道)
BB = 排架号(如 03 = 第 3 排货架)
CC = 层号(如 04 = 第 4 层)
DD = 位号(如 00 = 整位,01/02/03 为细分位)编码规则细则:
| 编码段 | 长度 | 取值范围 | 说明 |
|---|---|---|---|
| 仓库代码 | 2 位 | A1-Z9 | 字母 + 数字组合 |
| 区域代码 | 3 位 | 001-999 | 按功能区域顺序编码 |
| 排架号 | 2 位 | 01-99 | 每巷道双侧货架,单数左侧双数右侧 |
| 层号 | 2 位 | 01-10 | 地坪层为 01,向上递增 |
| 位号 | 2 位 | 00-99 | 00 表示整托盘位,01-99 表示散货位 |
库位类型
| 库位类型 | 代码 | 用途 | 存储特点 |
|---|---|---|---|
| 存储库位 | STORAGE | 长期存储整托盘/整箱货物 | 高位货架、驶入式货架、穿梭车货架 |
| 拣货库位 | PICKING | 拣货作业使用的流动库位 | 流利货架、搁板货架、VNA 货架 |
| 暂存库位 | STAGING | 到货暂存、发货暂存、中转暂存 | 地面堆码、缓冲区 |
| 发货库位 | SHIPPING | 已打包待发货货物集中存放 | 按线路/承运商分区 |
| 不良品库位 | DEFECT | 质检不合格、退货待处理、报废品 | 隔离区域,严格权限控制 |
| 退货库位 | RETURN | 退货验收前暂存 | 查验区附近 |
| 设备库位 | EQUIPMENT | 存储托盘、周转箱等物流容器 | 靠近出入库口 |
库位状态
┌──────────┐
│ 空闲 │
│ (EMPTY) │
└────┬─────┘
│ 入库上架
▼
┌──────────┐
┌────>│ 占用 │<────┐
│ │ (OCCUPIED)│ │
│ └────┬─────┘ │
│ │ │
拣货完成 库存调整 分配锁定
│ │ │
│ ┌────▼─────┐ │
│ │ 锁定 │─────┘
│ │ (LOCKED) │
│ └────┬─────┘
│ │
│ ┌────▼─────┐
│ │ 冻结 │
└─────│ (FROZEN) │
└──────────┘| 状态 | 说明 | 可否入库 | 可否出库 | 可否盘点 |
|---|---|---|---|---|
| 空闲 (EMPTY) | 库位无库存,可分配使用 | 是 | 否 | 否 |
| 占用 (OCCUPIED) | 库位有库存,正常作业中 | 否 | 是 | 是 |
| 锁定 (LOCKED) | 库位被出库/移库任务锁定,不可分配给其他任务 | 否 | 受控 | 否 |
| 冻结 (FROZEN) | 库位因维护、损坏、安全原因不可用 | 否 | 否 | 否 |
上架策略
上架策略决定入库货物应存放至哪个库位,直接影响仓库空间利用率和出库效率。
| 策略名称 | 策略描述 | 适用场景 | 算法复杂度 |
|---|---|---|---|
| 关联库位 | 将经常同时出库的 SKU 分配至相邻库位或同巷道,减少拣货路径 | A 类高频关联商品 | 需历史订单数据分析 |
| 随机空位 | 在空闲库位中随机选择,追求空间利用率均衡 | C 类低频商品、临时存储 | O(1) |
| 按体积/重量 | 根据 SKU 体积和重量匹配库位容积,大件放大库位,小件放小库位 | 异形件、SKU 体积差异大 | O(n) |
| 按品类 | 按商品分类规划区域,同品类集中存放 | 医药/化工等品类隔离要求严格的行业 | 区域映射查找 |
| ABC 分类 | A 类品靠近出货口,B 类品中间区域,C 类品远端 | 高周转品先出场景 | 分类匹配 + 路径计算 |
| 按温区 | 根据存储温度要求匹配对应温控库位 | 冷链仓储 | 温区映射 |
上架策略引擎伪代码:
function recommend_location(sku, qty, warehouse):
strategy = get_strategy_by_sku_category(sku)
if strategy == 'ASSOCIATED':
associated_skus = get_associated_skus(sku, top_n=20)
candidates = get_locations_by_skus(associated_skus, warehouse)
elif strategy == 'ABC':
abc_class = get_abc_class(sku)
candidates = get_candidates_by_zone(warehouse, abc_class_to_zone[abc_class])
elif strategy == 'VOLUME':
sku_volume = get_sku_volume(sku)
candidates = get_locations_by_volume(sku_volume, warehouse)
elif strategy == 'CATEGORY':
category = get_sku_category(sku)
candidates = get_locations_by_category(category, warehouse)
else:
candidates = get_empty_locations(warehouse)
// 过滤条件
candidates = filter_by_status(candidates, 'EMPTY')
candidates = filter_by_capacity(candidates, qty)
candidates = sort_by_path_optimization(candidates)
return candidates[0]工业通讯协议
Profinet
Profinet 是西门子主导的工业实时以太网标准,基于标准以太网(IEEE 802.3)实现现场总线级别的实时通信。
协议层级
┌─────────────────────────────────────────────────────────────┐
│ Profinet 应用层 (APIs) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Acyclic 服务 │ │ Cyclic 服务 │ │ Alarm 处理 │ │
│ │ (Record Data) │ │ (Process │ │ (诊断/中断) │ │
│ │ │ │ Data) │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ RPC (DCE/RPC) / CM (Context Management) │
├─────────────────────────────────────────────────────────────┤
│ Profinet IO 数据链路 │
│ ┌──────────────────┐ ┌──────────────────────┐ │
│ │ RT (实时) │ │ IRT (等时实时) │ │
│ │ 优先级 6/7 VLAN │ │ 时间槽调度 / TSN │ │
│ └──────────────────┘ └──────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 标准以太网 MAC 层 │
│ IEEE 802.3 / 802.1Q VLAN │
├─────────────────────────────────────────────────────────────┤
│ 物理层 (100BASE-TX / 1000BASE-T) │
└─────────────────────────────────────────────────────────────┘实时通信等级
| 等级 | 全称 | 循环周期 | 抖动 | 应用场景 |
|---|---|---|---|---|
| RT (Class 1) | Real-Time | 1-10 ms | < 1 ms | 一般工厂自动化、传感器/执行器数据交换 |
| IRT (Class 2) | Isochronous Real-Time | 31.25 us - 1 ms | < 1 us | 运动控制、CNC、机器人同步 |
| IRT (Class 3) | Isochronous Real-Time with Flex | 同 IRT,支持带宽动态分配 | < 1 us | 混合场景,部分端口传输标准 TCP/IP |
等时同步机制
IRT 通过时间槽划分实现确定性通信,在 Profinet 交换机中同步所有节点的时钟:
- 相位分配:通信周期分为红色阶段(IRT 数据)、橙色阶段(RT 数据)、绿色阶段(TCP/IP 数据)。
- 时钟同步:基于 IEEE 1588 (PTP) 精确时间协议,主站通过 Sync 和 Follow_Up 报文同步从站时钟。
- 时间槽:IRT 数据在每个周期内固定时间槽传输,交换机硬件调度保证无冲突。
EtherCAT
EtherCAT(Ethernet for Control Automation Technology)由 Beckhoff 开发,采用"从站逐级转发"的通信理念,实现极低的循环周期和抖动。
通信原理
EtherCAT 采用集总帧(Sum Frame)技术:主站发送一个数据帧,该帧依次经过每个从站,从站在数据帧经过时实时读写对应的数据子报文,最后由末端的从站或开放端口将帧返回主站。
主站 ──> 从站1 ──> 从站2 ──> 从站3 ──> ... ──> 从站N ──> 返回主站
│ │ │ │
▼ ▼ ▼ ▼
读取/写入 读取/写入 读取/写入 读取/写入
子报文 子报文 子报文 子报文数据帧结构
┌───────────────────────────────────────────────────────────────┐
│ EtherCAT 数据帧 (Ethernet Type 0x88A4) │
├───────────────────────────────────────────────────────────────┤
│ 以太网头 (14 bytes) │
│ ┌──────────┬──────────┬──────────┬────────────────────────┐ │
│ │ 目的 MAC │ 源 MAC │ 0x88A4 │ EtherCAT 头 (2 bytes) │ │
│ │ (6 bytes) │ (6 bytes)│ (2 bytes)│ Len(11 bits)+Type(1bit)│ │
│ └──────────┴──────────┴──────────┴────────────────────────┘ │
├───────────────────────────────────────────────────────────────┤
│ Datagram 1 │ 子报文头 (10 bytes) + 数据区 (1-1498 bytes) │
│ Datagram 2 │ 子报文头 (10 bytes) + 数据区 │
│ ... │ ... │
│ Datagram N │ 子报文头 (10 bytes) + 数据区 │
├───────────────────────────────────────────────────────────────┤
│ FCS (4 bytes) │
└───────────────────────────────────────────────────────────────┘子报文结构:
| 字段 | 长度 | 说明 |
|---|---|---|
| CMD | 1 byte | 命令类型:APRD(0x01)/APWR(0x02)/FPRD(0x04)/FPWR(0x05)/BRD(0x07)/BWR(0x08) |
| IDX | 1 byte | 帧索引,用于匹配请求与响应 |
| Address | 4 bytes | 从站地址(位置寻址/节点寻址/逻辑寻址) |
| Len | 2 bytes | 数据长度 bit10=1 表示最后一个子报文 |
| R | 3 bits | 保留位 |
| M | 1 bit | More 位,标识后续子报文 |
| IRQ | 2 bytes | 中断请求标志 |
| Data | 0-1486 bytes | 过程数据或参数数据 |
| WKC | 2 bytes | 工作计数器,从站每成功操作一次递增 |
分布式时钟 (DC)
EtherCAT 的分布式时钟机制使所有从站时钟与参考时钟同步,精度可达 100 ns 以内。
- 时钟结构:每个从站包含一个 64 位本地时钟(纳秒级精度),主站选择一个从站时钟作为参考时钟。
- 同步过程:主站通过 ARMW/FRMW 命令连续测量传播延迟和时钟偏移,写入从站的 System Time Offset 寄存器。
- 同步中断:从站根据本地时钟设定的同步中断时间(SYNC 信号)触发数据采样或 PWM 输出,确保所有从站同步动作。
DC 参数计算:
传播延迟 T_prop = (T2 - T1 + T4 - T3) / 2
时钟偏移 T_offset = T2 - T1 - T_prop
其中:
T1 = 参考时钟发送时间戳
T2 = 从站时钟接收时间戳
T3 = 从站时钟回送时间戳
T4 = 参考时钟回送接收时间戳EtherNet/IP
EtherNet/IP(Ethernet Industrial Protocol)由 ODVA 维护,基于标准 TCP/IP 和 UDP/IP,采用 CIP(Common Industrial Protocol)对象模型。
CIP 对象模型
CIP 使用面向对象的设计,每个设备被建模为对象的集合,对象结构分为三类:
| 对象类型 | 示例 | 说明 |
|---|---|---|
| 必需对象 (Required) | Identity、Message Router、Assembly、Connection Manager | 每个设备必须实现 |
| 应用对象 (Application) | Motor、Valve、Drive、Sensor | 与具体设备功能相关 |
| 网络对象 (Network) | TCP/IP Interface、Ethernet Link | 管理与网络配置相关的参数 |
对象属性结构(以 Identity 对象为例):
对象类: 0x01 (Identity)
实例: 1 (每个设备只有一个实例)
属性列表:
1 (UINT) Vendor ID - 供应商编码
2 (UINT) Device Type - 设备类型编码
3 (UINT) Product Code - 产品代码
4 (STRUCT) Revision - 版本号 (Major + Minor)
5 (SHORT_STRING) Status - 设备状态
6 (UINT) Serial Number - 序列号
7 (SHORT_STRING) Product Name - 产品名称
8 (USINT) State - 设备当前状态消息类型
| 消息类型 | 传输协议 | 特性 | 用途 |
|---|---|---|---|
| 显式消息 (Explicit) | TCP (UCMM) | 非实时、请求-响应模式、可变长度 | 参数配置、诊断、非周期性数据访问 |
| 隐式消息 (Implicit) | UDP (I/O 连接) | 实时、生产者-消费者模式、固定长度 | 周期性 I/O 数据交换(控制指令、传感器值) |
隐式消息连接建立流程:
Scanner (主站) Adapter (从站)
│ │
│ Forward Open (配置连接参数) │
│ - 请求包率 (RPI) │
│ - 连接类型 (点对点/组播) │
│ - 输入/输出数据大小 │
│─────────────────────────────────────>│
│ │
│ Forward Open Response │
│ - O->T 网络连接 ID │
│ - T->O 网络连接 ID │
│ - 实际包率 │
│<─────────────────────────────────────│
│ │
│ I/O 数据连接 (UDP, 按 RPI 周期) │
│═════════════════════════════════════>│
│<═════════════════════════════════════│关键连接参数 (Forward Open Request):
| 参数 | 说明 | 典型值 |
|---|---|---|
| RPI (Requested Packet Interval) | 期望的数据包发送间隔 | 2-100 ms |
| Connection Type | 连接类型:点对点(0x01)、组播(0x02) | 0x01 |
| Priority | 连接优先级:低(0)/高(1)/调度(2) | 1 |
| O->T Size | 输出方向(主站到从站)数据大小(字节) | 4-500 |
| T->O Size | 输入方向(从站到主站)数据大小(字节) | 4-500 |
Powerlink
Powerlink 由 B&R 和 Ethernet POWERLINK 标准组织 (EPSG) 维护,采用轮询和时隙结合的确定性通信机制。
通信周期
Powerlink 的 MN(Managing Node)负责整个网络的时间同步和数据调度,每个通信周期分为三个阶段:
┌─────────────────────────────────────────────────────────────────┐
│ Powerlink 通信周期 │
├──────────────┬────────────────────┬─────────────────────────────┤
│ Start │ Poll / Async │ Idle / Next │
│ Phase │ Phase │ Phase │
├──────────────┼────────────────────┼─────────────────────────────┤
│ SoC 广播 │ PReq (MN→CN) │ SoA 广播,开启异步 │
│ 时钟同步 │ PRes (CN→MN) │ 时段,用于非周期数据 │
│ 所有节点对齐 │ 轮询所有 CN │ 如参数配置、诊断 │
│ 约 10-20 us │ 约 80-400 us │ 约 20-100 us │
└──────────────┴────────────────────┴─────────────────────────────┘阶段详细说明:
- Start Phase:MN 广播 SoC(Start of Cycle)帧,包含精确时间戳,所有 CN(Controlled Node)以此校准本地时钟,实现同步。
- Poll/Async Phase:MN 逐个向 CN 发送 PReq(Poll Request)帧,CN 在收到后立即回复 PRes(Poll Response)帧,携带过程数据。此阶段保证数据确定的收发顺序。
- Async Phase:MN 广播 SoA(Start of Async)帧,开放异步通道,允许非实时数据的传输(如 TCP/IP、FTP、配置数据)。
关键帧结构
| 帧类型 | 功能 | 长度 | 传输方式 |
|---|---|---|---|
| SoC (Start of Cycle) | 周期开始同步 | 最小 12 bytes | 广播 |
| PReq (Poll Request) | MN 轮询 CN 请求数据 | 12 + 数据长度 | 定向 |
| PRes (Poll Response) | CN 响应 MN 的轮询 | 12 + 数据长度 | 定向 |
| SoA (Start of Async) | 异步时段开始 | 最小 12 bytes | 广播 |
| ASnd (Async Send) | 异步数据传输 | 可变 | 定向或组播 |
协议对比
| 对比维度 | Profinet IRT | EtherCAT | EtherNet/IP | Powerlink |
|---|---|---|---|---|
| 标准化组织 | PI (Profibus International) | EtherCAT Technology Group (ETG) | ODVA | EPSG |
| 物理层 | 100BASE-TX / 1000BASE-T | 100BASE-TX | 100BASE-TX / 1000BASE-T | 100BASE-TX |
| 线速度 | 100 Mbps / 1 Gbps | 100 Mbps | 100 Mbps / 1 Gbps | 100 Mbps |
| 最小循环周期 | 31.25 us (IRT) | 10-31.25 us | 0.5-2 ms | 100-400 us |
| 同步精度 | < 1 us (IRT) | < 100 ns (DC) | < 1 ms | < 1 us |
| 抖动 | < 1 us | < 50 ns | < 1 ms | < 0.5 us |
| 最大从站数 | 约 256 | 65535 (理论上) | 约 256 | 约 240 |
| 拓扑结构 | 星型、环型、树型 | 线型、环型、星型、树型 | 星型 (标准以太网) | 星型、树型、总线型 |
| 通信机制 | 时间槽 (TSN-based) | 集总帧逐级转发 | 生产者-消费者 | 轮询 + 时隙 |
| 标准以太网兼容 | 需专用交换机 (IRT) | 需专用从站芯片 | 标准交换机即可 | 需专用 Hub |
| 从站实现成本 | 中等 | 低 (专用 ESC 芯片) | 中等 | 中等 |
| 主要厂商 | Siemens, Phoenix Contact | Beckhoff, Omron | Rockwell, Cognex | B&R, Lenze |
| 典型应用 | 工厂自动化、运动控制、驱动 | 高速运动控制、CNC、机器人 | 离散制造、过程控制 | 运动控制、印刷、包装 |
SCADA 系统
SCADA 系统架构
SCADA(Supervisory Control and Data Acquisition)是工业过程监控与数据采集的核心系统,采用分层分布式架构。
五层架构模型
┌─────────────────────────────────────────────────────────────────────┐
│ 企业层 (Enterprise) │
│ ERP / MES / 生产调度 / 数据分析平台 │
└──────────────────────────┬──────────────────────────────────────────┘
│ OPC UA / Web API / 数据库接口
┌──────────────────────────▼──────────────────────────────────────────┐
│ 监控层 (Supervisory) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 中央监控站 │ │ 操作员站 │ │ 工程师站 │ │
│ │ (MTU 主站) │ │ (HMI 客户端) │ │ (组态/维护) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 实时数据库 │ │ 历史数据库 │ │ 通信服务器 │ │
│ │ (RTDB) │ │ (Historian) │ │ (协议网关) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
│ 工业以太网 (Profinet / Modbus TCP / OPC UA)
┌──────────────────────────▼──────────────────────────────────────────┐
│ 控制层 (Control) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PLC │ │ RTU │ │ 边缘控制器 │ │
│ │ 逻辑控制/ PID │ │ 远程遥测 │ │ 协议转换/本地 │ │
│ │ 运动控制 │ │ 数据采集 │ │ 闭环控制 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
│ 现场总线 (Profibus / Modbus RTU / CAN)
┌──────────────────────────▼──────────────────────────────────────────┐
│ 现场层 (Field) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 传感器/ │ │ 执行器/ │ │ 变频器 │ │ 智能仪表 │ │ 视觉 │ │
│ │ 变送器 │ │ 阀门 │ │ │ │ │ │ 相机 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────────┘核心组件说明
MTU(Master Terminal Unit,主站终端单元):
- 位于中央监控中心,作为 SCADA 系统的核心调度节点。
- 负责与所有 RTU/PLC 通信,收集遥测数据,下发遥调指令。
- 运行实时数据库,维护全系统状态快照。
- 典型 MTU 产品:Wonderware System Platform、WinCC OA、Ignition SCADA。
RTU(Remote Terminal Unit,远程终端单元):
- 部署于现场远程站点,用于数据采集和控制指令执行。
- 支持多种通信接口(RS-232/485、以太网、4G/5G、LoRa、卫星)。
- 具备本地自主控制能力和断网缓存功能(存储转发)。
- 典型 RTU 产品:SEL RTAC、Motorola ACE3600、国产四方/南瑞 RTU。
PLC(Programmable Logic Controller,可编程逻辑控制器):
- 部署于车间/产线现场,用于高速逻辑控制、顺序控制、运动控制。
- 扫描周期通常为 1-50 ms,支持梯形图/ST/FBD 等多种编程语言(IEC 61131-3)。
- 通过工业以太网(Profinet/EtherCAT/EtherNet/IP)与上位机通信。
- 典型 PLC 产品:Siemens S7-1500、Rockwell ControlLogix、Beckhoff CX。
HMI(Human-Machine Interface,人机界面):
- 工业触摸屏或工业平板,提供现场级的人机交互操作界面。
- 显示工艺流程、实时数据、报警信息,支持操作员输入控制指令。
- 分辨率通常为 1024x768 到 1920x1080,防护等级 IP65 以上。
- 典型 HMI 产品:Siemens WinCC Comfort/Unified、Rockwell PanelView、Weintek cMT。
通信服务器:
- 担任协议转换网关角色,将多种工业协议统一转换为 OPC UA / Modbus TCP / MQTT。
- 支持多协议并发接入,数据格式标准化,时间戳统一校准。
- 双机冗余配置确保通信链路高可用。
数据采集
三种采集模式
| 采集模式 | 原理 | 适用场景 | 优缺点 |
|---|---|---|---|
| 轮询 (Polling) | 主站按固定周期逐个向从站发送请求,从站响应数据 | 传统 SCADA、站点数量较少 (< 200) | 实现简单,但带宽利用率低,扩展性受限 |
| 事件驱动 (Event-Driven) | 从站仅在检测到事件时主动上报 | 告警、状态突变、设备故障 | 实时响应快,系统负载低,但需保证上报可靠性 |
| 变化检测 (Change Detection) | 从站仅当数据变化量超过死区阈值时才上报 | 模拟量采集(温度、压力、流量) | 有效降低通信负载和数据存储量 |
轮询时序
主站 (MTU) 从站 (RTU/PLC)
│ │
│ 请求帧 (Function Code 03, 地址, 数量) │
│─────────────────────────────────────────>│
│ │ T1 = 响应时间
│ 响应帧 (Data bytes, CRC) │
│<─────────────────────────────────────────│
│ │
│ 轮询间隔 (Polling Interval) │
│ x ms │
│ │
│ 请求帧 (下一个从站 / 下一个寄存器) │
│─────────────────────────────────────────>│
│ │
... ...轮询参数配置建议:
| 数据类型 | 轮询间隔 | 死区设置 | 描述 |
|---|---|---|---|
| 模拟量(温度/压力) | 500-2000 ms | 0.5-1% 量程 | 变化平缓,长周期轮询 + 变化检测 |
| 数字量(开关/状态) | 200-500 ms | 无死区 | 状态变化需要及时采集 |
| 电量(电压/电流) | 1000-5000 ms | 1-2% 量程 | 稳定量测数据,长周期 |
| 告警信号 | 事件驱动 | 无死区 | 采用主动上报模式 |
OPC UA 数据采集示例
OPC UA 客户端 (SCADA) OPC UA 服务器 (PLC/设备)
│ │
│ 1. Discover Endpoints │
│────────────────────────────────────────>│
│ Endpoints Response │
│<────────────────────────────────────────│
│ │
│ 2. Create Session (安全通道建立) │
│────────────────────────────────────────>│
│ Session Response │
│<────────────────────────────────────────│
│ │
│ 3. Browse / Read 变量节点 │
│ NodeId: ns=2;i=1001 (温度) │
│────────────────────────────────────────>│
│ DataValue (Value, Timestamp, Quality) │
│<────────────────────────────────────────│
│ │
│ 4. Subscribe 订阅 │
│ MonitoredItem: NodeId, SamplingInterval │
│────────────────────────────────────────>│
│ Subscribe Response (SubscriptionId) │
│<────────────────────────────────────────│
│ │
│ 5. Publish 通知 (周期性推送) │
│<════════════════════════════════════════│
│ DataChange Notification │
│<════════════════════════════════════════│OPC UA 地址空间节点示例 (JSON 格式):
{
"NodeId": "ns=2;i=1001",
"BrowseName": "Line1.ProductionZone.Temperature",
"DisplayName": "产线1 生产区 温度",
"Description": "1号产线生产区环境温度传感器",
"NodeClass": "Variable",
"DataType": "Double",
"Value": {
"Value": 25.6,
"SourceTimestamp": "2026-07-12T14:30:00.123Z",
"StatusCode": 0
},
"AccessLevel": "CurrentRead",
"MinimumSamplingInterval": 500.0,
"EngineeringUnits": {
"DisplayName": "°C",
"UnitId": 4408652
}
}