1. 自动化部署方案设计核心思路
自动化部署的本质是将软件交付过程中的重复性操作标准化、流程化。我们团队在汽车制造行业的轮毂分拣系统升级项目中,设计了一套基于PLC控制与Jenkins流水线的混合部署方案。这个方案最核心的创新点在于将工业控制逻辑与IT部署流程无缝衔接,实现了从代码提交到产线设备更新的端到端自动化。
1.1 系统架构分层设计
整个系统采用三层架构:
- 控制层:西门子S7-1200 PLC作为主控制器,通过PROFINET与机器人、传感器组网
- 执行层:包含库卡机械臂、SMC气动元件、SEW变频驱动皮带输送机
- 管理层:Jenkins部署服务器通过OPC UA与PLC通信,实现程序热更新
这种架构的关键在于:
- PLC程序采用模块化设计,每个功能块(FB)对应一个物理单元
- Jenkins构建产物不是传统war包,而是经过编译的PLC逻辑块文件(.awl)
- 部署时自动校验硬件签名,确保程序与设备匹配
1.2 功能块(FB)标准化设计
以分拣通道选择功能为例,我们创建了FB501_SortingChannel功能块:
FUNCTION_BLOCK FB501_SortingChannel VAR_INPUT HMI_ChannelSelect : INT; // 触摸屏通道选择1-3 Sensor_Ready : BOOL; // 物料到位信号 END_VAR VAR_OUTPUT Robot_GripCmd : BOOL; // 机械手抓取指令 Belt_Start : BOOL; // 皮带启动信号 END_VAR VAR InternalTimer : TON; // 延时定时器 END_VAR // 主逻辑 IF HMI_ChannelSelect >0 AND HMI_ChannelSelect <4 THEN Robot_GripCmd := Sensor_Ready; InternalTimer(IN:=Robot_GripCmd, PT:=T#2S); Belt_Start := InternalTimer.Q; END_IF;这种设计带来三个优势:
- 输入输出引脚标准化,便于多通道复用
- 内部逻辑封装,避免主程序过于复杂
- 带参数注释,维护时可快速理解接口定义
2. 持续集成流水线搭建
2.1 Jenkins主从架构配置
我们在产线网络隔离区部署了Jenkins Master,通过Docker容器运行。关键配置参数:
pipeline { agent { label 'plc-builder' } environment { TIA_PORTAL_PATH = 'C:\\Program Files\\Siemens\\TIAPortal\\V17' PLC_IP = '192.168.100.10' } stages { stage('Checkout') { steps { git branch: 'main', url: 'http://gitlab.example.com/plc/sorting-system.git' } } stage('Build') { steps { bat "${TIA_PORTAL_PATH}\\TIAPortal.exe /Build /Project sorting.smart /Config 'Release'" } } stage('Deploy') { steps { bat "powershell -command \"Copy-Item 'Output\\*.awl' -Destination \\\\${PLC_IP}\\plc_upload\"" bat "${TIA_PORTAL_PATH}\\TIAPortal.exe /Download /Project sorting.smart /Device S7-1200 /IP ${PLC_IP}" } } } }2.2 安全防护机制
工业环境部署需要特别注意:
- 网络隔离:部署服务器与产线设备间设置防火墙,仅开放OPC UA所需端口(4840/tcp)
- 版本回滚:每个构建版本自动备份到NAS存储,保留最近10个版本
- 硬件校验:部署前验证PLC的MAC地址与项目配置匹配
- 操作审计:所有部署操作记录到Splunk日志系统
3. 分拣单元控制逻辑实现
3.1 主程序OB1组织块
主程序采用事件驱动架构,关键部分代码如下:
ORGANIZATION_BLOCK OB1 VAR_TEMP ChannelSelect : INT; END_VAR NETWORK 1 // 读取HMI选择通道 CALL FB501_HMI_Interface HMI_Input := "HMI_DB".ChannelSelect, Channel_Out => ChannelSelect; NETWORK 2 // 调用分拣功能块 CALL FB501_SortingChannel HMI_ChannelSelect := ChannelSelect, Sensor_Ready := "DI_DB".MaterialReady, Robot_GripCmd => "DO_DB".GripperCmd, Belt_Start => "DO_DB".ConveyorStart; NETWORK 3 // 气缸控制连锁 IF "DO_DB".ConveyorStart THEN CALL FB502_CylinderControl Start_Signal := "DI_DB".PositionSensor, Stop_Cmd => "DO_DB".CylinderCmd; END_IF;3.2 气缸控制功能块
FB502_CylinderControl实现三阶段控制:
- 挡停气缸(延时0.5秒伸出)
- 推料气缸(皮带运行2秒后动作)
- 入库气缸(推料完成1秒后动作)
FUNCTION_BLOCK FB502_CylinderControl VAR_INPUT Start_Signal : BOOL; END_VAR VAR_OUTPUT Stop_Cmd : BOOL; Push_Cmd : BOOL; Store_Cmd : BOOL; END_VAR VAR Timer1 : TON; Timer2 : TON; Timer3 : TON; END_VAR // 挡停气缸控制 Stop_Cmd := Start_Signal; // 推料气缸延时启动 Timer1(IN:=Stop_Cmd, PT:=T#2S); Push_Cmd := Timer1.Q; // 入库气缸延时启动 Timer2(IN:=Push_Cmd, PT:=T#1S); Store_Cmd := Timer2.Q; // 总运行时间监控 Timer3(IN:=Start_Signal, PT:=T#10S); IF Timer3.Q THEN Stop_Cmd := 0; Push_Cmd := 0; Store_Cmd := 0; END_IF;4. 部署验证与问题排查
4.1 自动化测试方案
我们设计了三级测试体系:
- 单元测试:使用PLCTester模拟器验证每个FB逻辑
- 集成测试:在实验室模拟产线验证机械联动
- 现场测试:实际带料运行验证
测试用例表示例:
| 测试项 | 输入条件 | 预期结果 | 实际结果 |
|---|---|---|---|
| 通道1选择 | HMI输入1 | 机械手抓取A工位轮毂 | 通过 |
| 皮带超时 | 持续运行15秒 | 自动急停并报警 | 通过 |
| 气源异常 | 关闭气阀 | 气缸动作超时报警 | 通过 |
4.2 典型问题处理记录
问题1:部署后气缸动作不同步
- 现象:推料气缸有时在皮带停止后才动作
- 排查:检查Timer1的PT参数,发现实验室与产线设备时间基准不一致
- 解决:统一使用S7-1200的系统时钟同步所有定时器
问题2:Jenkins部署失败
- 现象:TIAPortal编译时报证书错误
- 排查:发现构建节点未安装西门子授权管理器
- 解决:在Dockerfile中添加安装步骤:
RUN msiexec /i "S7Licensing.msi" /quiet /norestart问题3:HMI通道选择失效
- 现象:触摸屏输入后PLC未响应
- 排查:使用Wireshark抓包发现OPC UA通信丢包
- 解决:调整Jenkins节点的QoS策略,优先保障4840端口带宽
5. 系统优化经验
5.1 性能提升技巧
- 内存优化:将频繁访问的HMI数据放在单独的DB块,启用"仅存储在装载内存"属性
- 扫描周期:将气缸控制逻辑放在循环中断OB35中(默认100ms)
- 通信优化:对Jenkins的OPC UA订阅设置死区(Deadband),减少不必要的数据传输
5.2 维护建议
- 版本管理:每次变更都打Tag,命名规则:设备型号_日期_版本(如WH-200_20260311_v2)
- 文档规范:要求每个FB块头部必须包含:
// 功能:轮毂分拣通道控制 // 作者:自动化部 // 修改记录: // 2026-03-10 v1.0 初始版本 // 2026-03-11 v1.1 增加超时保护- 备份策略:除了程序备份,还需定期导出硬件配置(.hw文件)
这套系统实施后,轮毂分拣线的换型时间从原来的30分钟缩短到2分钟以内,而且彻底消除了人为操作失误导致的设备故障。最大的收获是形成了可复用的工业自动化部署框架,后续在焊接、喷涂工位推广时,只需替换对应的功能块即可快速部署。