1. 项目背景与核心需求
去年接手的新能源电池模组自动排列机项目,算是我做过最棘手的多轴控制案例之一。这个产线设备需要将不同规格的电池模组按照MES系统下发的指令,精确排列到托盘指定位置。核心难点在于四台V90伺服必须通过Profinet实时协同,同时整合RFID识别和MES通讯功能。
传统做法是用脉冲控制,但考虑到新能源行业对数据追溯的严苛要求,我们选择了西门子S7-1500PLC+TIA Portal全集成方案。硬件配置如下:
- CPU 1516-3 PN/DP(6ES7 516-3AN00-0AB0)
- 4台V90 PN伺服(1FL6044-2AF21-1LA1)
- RF610T超高频读写器
- KTP1200 Basic触摸屏
2. 硬件组态关键细节
2.1 Profinet网络配置
V90的Profinet组态有三大陷阱:
- 设备名称必须与GSD文件一致:首次组态时因名称带中文导致设备无法识别
- 报文类型选择:报文3(标准报文,PZD-4/4)适合多数场景,但扭矩控制需用报文102
- IP地址分配策略:采用192.168.1.10~13连续分配,需在路由器设置静态绑定
硬件组态完成后务必执行:
bash复制1. 编译硬件配置
2. 下载到PLC(必须勾选"重新初始化模块")
3. 在V90驱动器上确认PROFINET绿灯常亮
2.2 电气设计避坑指南
- 电源隔离:每台V90单独配置6EP1336-3BA00稳压电源
- 接地规范:
- 编码器电缆屏蔽层单端接地(驱动器侧)
- 动力线(≥2.5mm²)与信号线分槽走线
- 急停回路:双通道安全回路通过继电器(3SK1121-1CB40)硬线连接
3. 运动控制程序开发
3.1 FB284深度定制
标准FB284函数块缺少急停连锁功能,我的改进版主要增加:
scala复制// 急停连锁逻辑
IF #急停 OR (#硬限位正 AND 轴当前位置 > 软限位正)
OR (#硬限位负 AND 轴当前位置 < 软限位负) THEN
#MC_Power.Enable := False;
#轴状态 := 16#8001; //自定义安全故障代码
#故障历史[#故障指针] := #轴状态;
#故障指针 := (#故障指针 + 1) MOD 50;
END_IF;
3.2 多轴协同算法
采用主从同步控制策略:
- 主轴(X轴)接收MES位置指令
- 从轴(Y/Z/U轴)通过MC_GearIn功能同步
scala复制// 齿轮同步示例
"MC_GearIn"(
Master := 'X轴'.ActualPosition,
Slave := 'Y轴',
Ratio := 1.0,
StartMode := 2, //绝对同步
BufferMode := 0);
4. RFID数据交互实现
4.1 SCL读写核心代码
RFID数据块处理采用动态指针访问:
scala复制FUNCTION "RFID_Read" : BOOL
VAR_INPUT
DB_Number : INT;
Offset : INT;
Length : INT;
END_VAR
VAR_TEMP
pData : POINTER;
tempArray : ARRAY[0..255] OF BYTE;
END_VAR
pData := PEEK(area := 16#87,
dbNumber := DB_Number,
byteOffset := Offset,
dest := ADR(tempArray));
// 校验和验证
IF tempArray[Length-1] = Calc_Checksum(tempArray) THEN
MOVE_BLK(IN := tempArray,
OUT := #OutputBuffer,
COUNT := Length);
RETURN TRUE;
END_IF;
4.2 抗干扰措施
- 读写失败时自动重试3次
- 数据块添加CRC16校验
- 电磁屏蔽方案:
- 读写器电源加磁环
- 天线距离金属表面≥50mm
5. MES通讯协议解析
5.1 JSON报文处理
西门子原生库效率低,改用字符串截取法:
scala复制// 解析MES指令示例
#CmdType := MID(IN := #RecvBuffer, LEN := 4, POS := 1);
CASE #CmdType OF
"MOVE":
#TargetPos := STRNG_TO_REAL(MID(#RecvBuffer, 6, 8));
#Speed := STRNG_TO_REAL(MID(#RecvBuffer, 15, 4));
"STOP":
#EmergencyStop := TRUE;
END_CASE;
5.2 断线重连机制
scala复制IF #HeartbeatTimer.Q THEN
"TCP_Send"(Conn_ID := #MES_Conn,
DataLen := 8,
Data := "PING");
#RetryCount := 0;
ELSIF NOT #MES_Connected AND #RetryCount < 3 THEN
"TCP_Connect"(Conn_ID := #MES_Conn,
Rem_Subnet_ID := 16#010203,
Rem_TSAP := 16#0506);
#RetryCount += 1;
END_IF;
6. 调试问题全记录
6.1 典型故障代码速查表
| 代码 | 含义 | 解决方案 |
|---|---|---|
| 16#8001 | 急停触发 | 检查急停回路接线 |
| 16#8082 | 跟随误差超限 | 调整PID参数或降低加速度 |
| 16#8300 | Profinet通讯中断 | 检查网线/交换机端口状态 |
| 16#A010 | RFID校验失败 | 重新标定天线或降低传输速率 |
6.2 接地干扰解决实录
现象:伺服使能时触摸屏闪烁
排查过程:
- 测量PLC与触摸屏地线间有0.8V压差
- 发现伺服动力线与网线平行走线
- 增加隔离变压器(6EP1437-3BA00)
- 重新敷设屏蔽线并单端接地
7. 项目文件架构规范
code复制/Project
├── /PLC
│ ├── FB284_Enhanced(带急停连锁)
│ ├── RFID_Handler(含重试逻辑)
│ └── MES_Interface(心跳监测)
├── /HMI
│ ├── Alarm_Screen(带故障坐标映射)
│ └── Debug_Mode(隐藏监控界面)
└── /Electrical
├── Power_Distribution(含隔离方案)
└── PN_Topology(带终端电阻配置)
8. 实战经验总结
-
报文配置铁律:修改V90的报文类型后,必须执行:
- 硬件编译下载
- 驱动器断电重启
- 在线确认报文号(参数r2089)
-
编码器校准技巧:在V-ASSISTANT中执行:
bash复制1. 进入"Encoder Adjustment" 2. 选择"Auto Tune" 3. 保存参数到ROM -
网络诊断工具:
- Wireshark抓包过滤profinet帧
- PRONETA检测拓扑完整性
- TIA Portal的在线诊断缓冲区
这个项目让我深刻体会到,工业自动化系统60%的问题出在物理层。现在我的调试包里常备:
- 福禄克网络测试仪
- 接地电阻测试仪
- 带屏蔽的Profinet专用线(6XV1840-2AH10)
最后分享一个WinCC的彩蛋:在画面属性中添加以下脚本可实现故障动画:
c复制if (GetTagBit("Alarm_XAxis")) {
SetPropChar("Circle1", "BackColor", "255,0,0");
MoveAnimation("Arrow1", GetTagWord("Fault_PosX"), GetTagWord("Fault_PosY"));
}