前言
本文是基于B站上的《SCL核心应用课项目实战》课程,所做的笔记,主要包括程序代码和自己的理解注释。课程链接:SCL核心应用课项目实战(21课全)
陆杰锋老师讲得非常好,有理论讲解也有实战演练,需要具备一定的梯形图编程基础。
有空我会持续更新。
十四、仓储系统出料优先级控制程序设计
1.需求分析
如图所示,是一个4行7列的仓储系统,每一个存储位有一个行程开关,可用于判断存储区状态位。
功能要求:
A.需要自动判断仓储系统中的存储情况;
B.按照从下到上,从右到左的顺序出料;
分析:
1.可用二维数组映射每个仓储区的地址变量;
2.先建立数组Storage,数据类型是Array[1…7, 1…4] of Bool;
3.然后建立一个DWord变量DI,表示每个仓储区的地址变量;
4.将DI变量拆分成由28个Bool型变量组成的数组DI_Array;
5.利用for循环将数组DI_Array里的数据赋值给数组Storage。
6.注意:多层for循环嵌套时,先执行最内层的循环,即先变化的写最里面,后变化的写外面。
关于变量的拆分,需要用到AT指令,可以参考文章:十二、SCL核心应用课项目实战_运行设备累计功能实现。
2.程序编写
编程步骤:
1.新建一个FB块“仓储”;
根据上述分析,建立如下变量:
2.做变量映射;
假设右下角的仓储区的输入地址从I0.0开始,从下到上,从右到左依次增加,则DI_Array[1] - DI_Array[28]分别对应I0.0 - I3.3,并将DI_Array[1] - DI_Array[28]映射到Storage[1,1] - Storage[7,4]中。
IO点示例:
用于映射IO点的DI_Array数组:
对应的二维坐标数组:
编写如下程序:
#n := 1;
FOR #X_DI := 1 TO 7 DO
FOR #Y_DI := 1 TO 4 DO
#Storage[#X_DI, #Y_DI] := #DI_Array[#n];
#n := #n + 1;
END_FOR;
END_FOR;
3.假设一次出一个料,需要告知码垛机器人下一个取料点[X,Y]的坐标;
先从下到上,再从右到左,所以最里面一层的for循环是循环Y坐标,外面一层时循环X坐标。如果某个坐标为1,说明该坐标位有料,则退出循环。
注意:一个EXIT只能退出一个循环,而此程序有两个for循环,需要双重退出。
编写如下程序:
FOR #X_DI := 1 TO 7 DO
FOR #Y_DI := 1 TO 4 DO
IF #Storage[#X_DI, #Y_DI] THEN //如果某个坐标为1,说明该坐标位有料,则退出循环(内外都退)
EXIT; //一个EXIT只能退出一个循环
END_IF;
END_FOR;
//EXIT; //不能直接在这里写一个EXIT退出循环,因为这样当内部循环执行完一轮后就会直接退出
IF #Storage[#X_DI, #Y_DI] THEN
EXIT;
END_IF;
END_FOR;
4.将上一步得到的[X,Y]坐标赋值给输出值,得到要出库的料位坐标;
#X_DO := #X_DI;
#Y_DO := #Y_DI;
5.判定货架上有没有料,需要在程序最外层加上if判断;
完整程序如下:
IF #DI <> 0 THEN//先判断货架上有没有货
//IO映射
#n := 1;
FOR #X_DI := 1 TO 7 DO
FOR #Y_DI := 1 TO 4 DO
#Storage[#X_DI, #Y_DI] := #DI_Array[#n];
#n := #n + 1;
END_FOR;
END_FOR;
//若X,Y坐标有料,则出库
FOR #X_DI := 1 TO 7 DO
FOR #Y_DI := 1 TO 4 DO
IF #Storage[#X_DI, #Y_DI] THEN //如果某个坐标为1,说明该坐标位有料,则退出循环(内外都退)
EXIT; //一个EXIT只能退出一个循环
END_IF;
END_FOR;
//EXIT; //不能直接在这里写一个EXIT退出循环,因为这样当内部循环执行完一轮后就会直接退出
IF #Storage[#X_DI, #Y_DI] THEN
EXIT;
END_IF;
END_FOR;
//得到要出库的料位坐标
#X_DO := #X_DI;
#Y_DO := #Y_DI;
END_IF;
6.在主程序块Main中,调用FB块“仓储”。