带相机PLC1200 SCL梯形图混编立体库机器人码垛机伺服视觉程序 包括2台西门子PLC1215程序和2台西门子触摸屏TP700程序 PLC和基恩士相机视觉定位Modbus TCP通讯(SCL语言) PLC和ABB机器人Modbus TCP通讯(SCL语言) PLC和码垛机Modbus TCP通讯(SCL语言) PLC和4台G120变频器Profinet通讯 1个伺服轴 SCL语言和梯形图混编,经典程序,知识点丰富,注释全。

工业现场里PLC和一堆设备搞对象这事儿,玩的就是心跳。今天咱们拆的这个立体库项目,PLC1200带着两个小弟(触摸屏TP700),左手牵着基恩士相机,右手拽着ABB机械臂,背上还驮着四个G120变频器,活脱脱个设备界的海王。别被这复杂关系吓着,关键得看他们怎么用Modbus TCP和Profinet眉来眼去。

先说视觉定位这出戏。基恩士CV-X系列相机通过网线直连PLC,这年头谁还走串口啊?咱们用SCL写了个数据收发模块,比梯形图处理字节流利索多了。看这段数据解析的骚操作:

// 视觉坐标转换
VAR_TEMP
    RawData : ARRAY[1..8] OF BYTE;
END_VAR
X_Coordinate := REAL_TO_DINT(RAW_BYTE_TO_REAL(ADDR:=ADR(RawData[1]))) / 1000.0;
Y_Coordinate := REAL_TO_DINT(RAW_BYTE_TO_REAL(ADDR:=ADR(RawData[5]))) / 1000.0;
IF (X_Coordinate < 0) OR (Y_Coordinate > MAX_PALLET_WIDTH) THEN
    FaultCounter += 1;
    Alarm_1502 := TRUE; 
END_IF;

这代码干了两件缺德事:第一,把相机发来的8字节数据直接按浮点格式强转,省了字节拼装;第二,坐标校验直接带自锁报警。工业现场的数据就得这么简单粗暴,搞什么优雅处理纯属给自己挖坑。

机械臂通讯藏着个坑——ABB的Modbus寄存器是32位大端模式。PLC这边得用SCL的移位大法:

// 机械臂目标位置合成
TargetPosition := SHL(IN:=DB_ABB.DataBuffer[1], N:=16) OR DB_ABB.DataBuffer[2];
IF TargetPosition > SAFE_RANGE THEN
    // 急停连锁直接写在数据处理层
    EStop_Execute := TRUE;
    FB_SafetyTrigger(REQ:=TRUE);
END_IF;

移位指令和或运算配合,把两个16位寄存器拼成32位整数。注意那个急停连锁直接嵌套在数据处理里,这招是老师傅压箱底的——数据异常直接触发安全逻辑,比在OB1里轮询快三倍不止。

带相机PLC1200 SCL梯形图混编立体库机器人码垛机伺服视觉程序 包括2台西门子PLC1215程序和2台西门子触摸屏TP700程序 PLC和基恩士相机视觉定位Modbus TCP通讯(SCL语言) PLC和ABB机器人Modbus TCP通讯(SCL语言) PLC和码垛机Modbus TCP通讯(SCL语言) PLC和4台G120变频器Profinet通讯 1个伺服轴 SCL语言和梯形图混编,经典程序,知识点丰富,注释全。

说到变频器控制,四个G120用Profinet组网才是正解。但老设备改造硬要Modbus TCP怎么办?咱们在PLC里做了个协议转换器:

// 梯形图处理启停命令
       M10.0                         M20.1
------| |----------------------------( )
       |           M10.1              |
------| |-----------|/|---------------(MOV_DW)
       |  P#DB5.DBX30.0 BYTE 8        |
------|MOVE_BLK|---EN---------------

梯形图负责处理硬线信号和块传输,SCL包办协议转换算法。这种混编就像鸳鸯锅——数字量处理用梯形图直观看,复杂算法交给SCL。注意MOVE_BLK指令的参数写法,绝对地址直接怼,现场调试改起来比符号访问快得多。

伺服定位有个魔鬼细节:原点搜索时遇到光电信号抖动。咱们用SCL写了带时间窗的滤波逻辑:

// 原点信号抗干扰
IF Home_Sensor THEN
    Signal_Duration += T#1MS;
    IF Signal_Duration > T#200MS THEN
        ActualPosition := 0;
        Home_Finished := TRUE;
    END_IF;
ELSE
    Signal_Duration := T#0S;
END_IF;

200毫秒时间窗过滤掉干扰信号,比用硬件滤波器省两百块钱。这里用SCL的时间变量直接操作,比用定时器模块省了三个DB块。

最后说触摸屏的骚操作。TP700的报警页面用位变量触发,但五十多个报警点总不能挨个关联吧?咱们用SCL生成报警代码:

// 报警代码生成
Alarm_Code := 0;
FOR i := 0 TO 15 DO
    IF Alarm_Bits[i] THEN
        Alarm_Code := Alarm_Code OR SHL(1,i);
    END_IF;
END_FOR;

把报警位打包成整型传给触摸屏,HMI那边用位图控件解析。省了五十多个报警变量关联,组态小哥差点跪下叫爸爸。

这个项目最损的是在FB里埋彩蛋——某个功能块的注释里写着"此处不要动,动了送你上夜班"。设备交付半年后客户自己改程序,结果真在这中招,后来乖乖把注释当圣旨供着。所以说,工业代码的注释要么不写,要写就得写成免责声明。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐