No.831 基于S7-200 PLC和MCGS组态的机械手控制系统0
在工业自动化领域,机械手控制是个经典课题。去年给某食品厂做包装线改造时,碰上个有意思的需求——用老古董S7-200 PLC搭配MCGS组态软件实现五轴机械手的精准控制。别看S7-200现在算爷爷辈PLC,搭配好了照样能打。
先说说硬件配置:CPU 224XP自带两个高速脉冲输出口正好驱动两轴步进电机,扩展EM253定位模块解决剩下三轴。机械手的夹爪气缸用普通DO点控制,末端加装了个压力传感器反馈夹取状态。重点在于要让MCGS触摸屏既能实时显示机械臂坐标,又能随时切换手动/自动模式。
梯形图编程时遇到个坑——手动模式下的点动控制需要处理方向信号自锁。后来用了这样的结构:
Network1 LD 手动模式选择位 O 自动运行标志 AN 急停信号 = EN使能输出 Network2 LD 点动上升按钮 A EN使能 TON T37, 50 //防抖计时 = Q0.0脉冲输出 Network3 LD 点动下降按钮 A EN TON T38, 50 = Q0.1脉冲输出这个逻辑里T37/T38的定时器防抖特别关键,现场调试时发现操作工按按钮容易产生抖动信号,导致电机跳步。后来在MCGS界面里加了实时脉冲计数显示,方便观察实际发出的脉冲数。
MCGS组态部分最有趣的是三维坐标映射。通过脚本把PLC寄存器里的脉冲数转换成实际位移量:
! 在数据改变脚本中写入:
if Device.ReadTag("轴1脉冲") then
currentX = (脉冲值 - 原点偏移) * 0.02 //每脉冲0.02mm
SetTagValue("显示坐标X", currentX)
endif
这个转换公式里的0.02是丝杠导程除以步进电机细分后的结果,调试时拿着游标卡尺实测了三次才校准准确。
自动流程中物料抓取的联锁逻辑最烧脑。PLC程序里用了个状态机结构:
MOV_B 16#01, VB200 //初始化状态 状态_等待物料: CMP= VB200, 16#01 JMP 下一步 CALL 光电检测子程序 若检测到物料,MOV_B 16#02, VB200 状态_下降抓取: CMP= VB200, 16#02 JMP 下一步 触发Z轴下降至设定位置 压力传感器达到阈值时,MOV_B 16#03, VB200 ...对应的MCGS画面里做了个状态指示灯矩阵,用不同颜色显示当前执行到第几步。有次生产线卡料,就是通过这个状态显示快速锁定到真空吸盘气压不足导致的状态停滞。
通讯配置踩过最大的雷是S7-200的PPI协议。后来改用Modbus RTU反而稳定了,在MCGS的设备窗口里配置时,注意波特率设成18750这个奇葩数值才能兼容老PLC。有个小技巧:在PLC端加个定时器,每200ms把关键数据批量写入保持寄存器,能显著降低通讯负载。
调试时最爽的时刻是看到MCGS上的虚拟机械手和实际设备完全同步动作。特别是做圆弧插补运动时,画面上用SVG矢量图形做的轨迹曲线和实体机械手的运动轨迹完美重合,那一刻感觉头发没白掉。不过老板后来要求加个生产计数功能,又在MCGS里用Lua脚本写了个月产量预测算法,算是给这个传统控制方案加了点智能化的料。
这套系统连续跑了两年多,中间只换过两次限位开关。老工程师说的没错,稳定性这事,合适的架构比堆砌新器件更重要。下次如果再搞升级,可能考虑把视觉定位嵌进去,不过那就是另一个故事了。