西门子 1200立体仓库,博图写的立体仓库机器人码垛系统/码垛机;博图15.1及以上可以打开; #SIEMENS/西门子
先说硬件配置,这套系统核心是1215C DC/DC/DC带两个SM1223数字量扩展。重点在于TM Pulse 2轴模块,这玩意儿驱动伺服电机控制货叉升降和平移。这里有个坑要注意:轴参数配置里的"Positioning time"千万别直接默认,得按实际加速度算,不然急停时负载晃动能让你怀疑人生。
仓库的仓位管理我用的是SCL写的二维数组:
VAR Storage_Rack : ARRAY[1..10, 1..5] OF Struct PalletID : DINT; Status : BOOL; //True表示有货 END_STRUCT; END_VAR配合DB块做持久化存储,每次断电重启自动从DB恢复现场。这里用指针操作比直接寻址快得多,特别是处理多层货架时:
#P_Storage := "StorageData".Storage_Rack[1,1]; FOR #i := 1 TO 50 DO IF #P_Storage.PalletID = 0 THEN //空位处理 END_IF #P_Storage := ADR("StorageData".Storage_Rack[1,1]) + SIZEOF(Storage_Rack[1,1]) * #i; END_FOR;运动控制部分最费脑细胞。用到了FB284标准库控制伺服轴,但原生的绝对定位指令在多层堆垛时精度会漂移。后来自己改了套相对定位+光电校正的算法:
IF "PhotoSensor_OK" THEN "Axis".MC_Home(... Mode := 3, //参考点模式 Position := 0.0); WAIT UNTIL "Axis".StatusHomed; ELSE "Axis".MC_MoveRelative( Distance := 300.0, Velocity := 50.0); END_IF;通讯方面踩过大坑——Profinet IO设备偶尔丢包。后来在OB85里加了重连机制才稳下来:
IF #OB85_EVENT_CLASS = 16#39 THEN //IO访问错误 "Drive_1".Reconnect(); "Drive_2".Reconnect(); SFC13(...); //触发DP诊断 END_IF;调试时强烈推荐用博图的Trace功能,特别是抓取轴的实际位置曲线。有次Z轴抖动问题就是靠Trace发现定位完成后还有0.5mm的微动,最后在扭矩限制参数里加了滤波才解决。
这套系统现在稳定运行的关键在于异常处理机制。比如货叉防撞检测不仅用到了力传感器,还在程序里做了速度预测:
IF "Actual_Speed" > ("Set_Speed" * 0.8) AND "Current_Load" > 50 THEN "Axis".MC_Stop(...); GenerateAlarm(1024); //过载预警 END_IF;最后给个忠告:定期用"Check Block Consistency"功能扫一遍项目,特别是移植到V16以上版本时。有次升级后TM Pulse模块的硬件标识符变了,差点酿成撞机事故...