1. 项目概述
去年接手了一个码垛产线改造项目,需要将ABB机器人、基恩士视觉系统、西门子PLC、伺服驱动和变频器等多个设备整合成一套协同控制系统。这种多品牌设备联动的项目在工业现场很常见,但调试过程中的坑也不少。今天我就把整个系统的搭建过程和关键技巧整理出来,特别是SCL和梯形图混编的实践经验,希望能给同行们一些参考。
这个系统的核心是两台西门子S7-1215 PLC,它们需要与以下设备通信:
- 基恩士CV-X系列视觉系统(MODBUS TCP)
- ABB IRC5机器人控制器(MODBUS RTU)
- 4台西门子G120变频器(PROFINET)
- 1台伺服驱动器(PROFINET)
- 2台西门子TP700触摸屏
2. 通信系统设计与实现
2.1 视觉系统通信
基恩士相机通过MODBUS TCP协议与PLC通信,主要用于传送视觉定位坐标。在SCL中实现的通信功能块如下:
pascal复制FUNCTION_BLOCK FB_VisionCom
VAR_INPUT
IP : STRING[15] := '192.168.1.100';
END_VAR
VAR
mbClient : TCON_Config := (interface := 'Ethernet', connectionType := 11);
reqBuffer : ARRAY[0..5] OF BYTE := [16#00, 16#10, 16#00, 16#00, 16#00, 16#08];
END_VAR
// 触发读取指令
IF NOT mbClient.Connected THEN
mbClient(REQ := TRUE, DEST_IP := IP);
ELSE
SEND(REQ := TRUE, DATA := reqBuffer);
END_IF
注意事项:
- TCON_Config的connectionType必须设为11(MODBUS协议)
- 字节序需要手动转换
- 必须添加心跳保活机制
实际调试中发现相机对通信超时非常敏感,我们最终在OB35组织块中每200ms发送一次心跳指令才稳定了通信。
2.2 机器人通信
ABB机器人采用MODBUS RTU协议,SCL的指针操作在这里发挥了重要作用:
pascal复制VAR
pData : POINTER TO BYTE;
robotPos : ARRAY[1..6] OF REAL;
END_VAR
pData := ADR(MB_DataBlock.DATA);
FOR i := 1 TO 6 DO
robotPos[i] := DWORD_TO_REAL(
SHL(IN := pData^[i*4-3], VAL := 24) |
SHL(IN := pData^[i*4-2], VAL := 16) |
SHL(IN := pData^[i*4-1], VAL := 8) |
pData^[i*4]
);
END_FOR;
这段代码将MODBUS寄存器的4字节数据流转换为浮点数坐标,比使用标准库函数快了0.8ms。调试时要特别注意指针越界问题,建议先屏蔽输出进行测试。
3. 运动控制实现
3.1 伺服控制
伺服轴控制使用梯形图更为直观。在工艺对象中配置完PROFINET后,直接使用MC_Power指令块:
code复制L #Servo_Enable
O "MC_Power_1".Status
= "MC_Power_1".Enable
血泪教训:伺服使能信号必须与机械限位联锁!有次测试时急停回路没接好,导致机械臂异常动作,差点造成设备损坏。
3.2 变频器控制
G120变频器通过PROFINET组网,在设备视图中按住Ctrl键拖动变频器图标可以快速生成菊花链拓扑。程序中使用LCom库处理周期通信:
pascal复制CASE DriveState OF
0: // 初始化
LCom_Open(Drive := 1, Mode := 3);
1: // 运行
IF NOT LCom_Write(Drive := 1, Index := 16#2031, SubIndex := 1, Value := REAL_TO_DWORD(50.0)) THEN
Alarm := TRUE;
END_IF;
END_CASE;
注意16#2031对应的是转速设定值的对象字典索引,不同固件版本可能有所不同。我们曾遇到固件升级后索引号变化导致控制失灵的问题。
4. HMI交互设计
两台TP700触摸屏通过区域指针实现双屏互动。在PLC中建立如下UDT:
pascal复制TYPE UDT_ScreenShare :
STRUCT
CurrentPage : INT; // 当前页面索引
AlarmCode : ARRAY[1..2] OF DINT; // 跨屏报警代码
RecipeSelect : BYTE; // 配方选择位
END_STRUCT
END_TYPE
触摸屏脚本中使用VBS定时获取区域指针数据,实现"甲屏操作乙屏同步跳转"的效果。调试时曾遇到指针地址对不齐导致花屏的问题,最终通过设置WinCC的地址偏移量属性解决。
5. 编程风格建议
5.1 SCL与梯形图的配合
在这个项目中,我们采用了SCL和梯形图混编的策略:
- 算法处理使用SCL:如坐标变换、数据转换等
- 逻辑连锁使用梯形图:如安全回路、急停控制等
例如码垛位置计算使用SCL:
pascal复制// 三维坐标变换
FOR layer := 0 TO layers-1 DO
posX[layer] := baseX + (layer MOD 2) * deltaX;
posY[layer] := baseY + (layer / 2) * deltaY;
posZ[layer] := baseZ + layer * deltaZ;
END_FOR;
而安全互锁部分则用梯形图直接连接硬件点:
code复制A "光幕_OK"
AN "急停_触发"
= "系统使能"
5.2 通信超时管理
多设备通信必须实现超时管理!我们在每个通信功能块中都添加了看门狗机制:
pascal复制IF T#5S <= COMM_TIMER THEN
Fault := TRUE;
COMM_TIMER := 0;
// 触发重连机制
mbClient(REQ := FALSE);
END_IF;
这套机制在连续72小时压力测试中成功拦截了6次网络闪断故障,保证了系统稳定性。
6. 调试经验分享
6.1 常见问题排查
-
通信不稳定:
- 检查物理连接(网线、终端电阻等)
- 确认IP地址和端口设置
- 添加通信超时处理
-
数据异常:
- 检查字节序设置
- 验证数据格式转换
- 确认寄存器映射关系
-
运动控制故障:
- 检查使能回路
- 验证限位开关状态
- 确认工艺对象配置
6.2 实用调试技巧
-
分阶段调试:先单独测试每个设备通信,再逐步整合
-
使用Trace功能:记录关键变量变化过程
-
添加调试输出:在关键节点设置状态指示灯
-
做好版本管理:每次修改前备份程序
这个项目最大的收获是掌握了SCL和梯形图混编的开发模式,既保证了复杂算法的实现效率,又确保了基础逻辑的可靠性。对于工业现场的多设备联动项目,合理的架构设计和严谨的调试流程同样重要。
