库位:100个,编号0~100
货物品种:4个,编号1~4(流动周期递减)
库区:4个,对应四种不同流动性(1库区50库位,2库区20库位,3库区20库位,4库区10库位)
思路:1、库区分配:1库区流动性最强50个库位距离出口最近,减少搬运时间,以此类推分配库区位置。
2、入库:入库输入品种,根据品种判断库区,库区又余位,找出余位库号,返回库号。初始库区无余位,如果品种非4号则依次向下一个库区查找,至到找到余位输出库号。如果品种为4号,则向上一个库区查找,至到找到余位输出库号。原则上保留高流动性库区余位。
3、提取目标坐标:根据余位库号,提取库位标志点 (两个)及搬运轨道X、Y方向坐标(0~9,0~9)。
4、队列记录:在队列里记录相应的品种号、库区号、库位编号。队列整体采用先进先出编程。
5、开启搬运:方向坐标为0,对应轴搬运不动作。不为0,对应搬运轴动作,并在目标坐标前1坐标减速运行,到达目标坐标停车。
6、推出货物点亮库位占用标志。
7、返回:完成货物推出,X,Y轴搬运快速归位至0点。
楼主最近还看过
库位统计:分别统计4个不同库区
FOR #J := 0 TO 99 DO
IF #J < 50 THEN //统计1库区
IF "C仓库数据".库号[#J] = 0 THEN
#KQ1_NUM := #KQ1_NUM + 1;
END_IF;
ELSIF 50 <= #J AND #J < 70 THEN //统计2库区
IF "C仓库数据".库号[#J] = 0 THEN
#KQ2_NUM := #KQ2_NUM + 1;
END_IF;
ELSIF 70 <= #J AND #J < 90 THEN //统计3库区
IF "C仓库数据".库号[#J] = 0 THEN
#KQ3_NUM := #KQ3_NUM + 1;
END_IF;
ELSE //统计4库区
IF "C仓库数据".库号[#J] = 0 THEN
#KQ4_NUM := #KQ4_NUM + 1;
END_IF;
END_IF;
;
END_FOR;
入库程序:起点在外部,进入库内,Y轴才允许根据库号动作。
#启动(CLK:="C仓库数据".启动,
Q=>#启动_UP);
IF #启动_UP THEN
REGION 判断库区
(*
库区分为4部分1~4分别为常用~不常用
1区:50 2区:20 3区:20 4区:10
对应1~4个品种
*)
#库区 := #品种;
#库区已满 := 0;//复位库区满标志
#ZD库号 := 0;//复位找到库号标志
REPEAT
CASE #库区 OF
1: //查找1区空余库位 编号
IF #KQ1_NUM > 0 THEN
FOR #I := 0 TO 49 DO
IF "C仓库数据".库号[#I] = 0 THEN
"C仓库数据".目标库号 := #I;
#ZD库号 := 1;//找到库位
EXIT;
END_IF;
END_FOR;
ELSE //库区无空余,搜索下一库区
#库区 := 2;
END_IF;
2://查找2区空余库位
IF #KQ2_NUM > 0 THEN
FOR #I := 50 TO 69 DO
IF "C仓库数据".库号[#I] = 0 THEN
"C仓库数据".目标库号 := #I;
#ZD库号 := 1;//找到库位
EXIT;
END_IF;
END_FOR;
ELSE
#库区 := 3;//库区无空余,搜索下一库区
;
END_IF;
3://查找3区空余库位
IF #KQ3_NUM > 0 THEN
FOR #I := 70 TO 89 DO
IF "C仓库数据".库号[#I] = 0 THEN
"C仓库数据".目标库号 := #I;
#ZD库号 := 1;//找到库位
EXIT;
END_IF;
END_FOR;
ELSE
#库区 := 4;//库区无空余,搜索下一库区
END_IF;
4://查找4区空余库位
IF #KQ4_NUM > 0 THEN
FOR #I := 90 TO 99 DO
IF "C仓库数据".库号[#I] = 0 THEN
"C仓库数据".目标库号 := #I;
#ZD库号 := 1;//找到库位
EXIT;
END_IF;
END_FOR;
ELSE //4库区无空余,搜索前面库区
IF #KQ3_NUM > 0THEN
#库区 := 3;
ELSIF #KQ2_NUM > 0 THEN
#库区 := 2;
ELSIF #KQ1_NUM > 0 THEN
#库区 := 1;
ELSE
#库区已满 := 1;
END_IF;
END_IF;
ELSE
#库区已满 := 1;
END_CASE;
UNTIL #ZD库号 OR #库区已满 END_REPEAT; //找到库号或库区已满 退出循环
//空余库号查找完成,提取库号到位标志(仓库位10X10 单面库)
#库号_X := "C仓库数据".目标库号 / 10; //计算X轴坐标
#库号_Y := "C仓库数据".目标库号 MOD 10; //计算Y轴坐标
#FX := 1;
#X_SP := 50.0;
#X_RUN := 1;
#Y_RUN := 0;
END_REGION
END_IF;
REGION 正向驱动输出
// 至到对应库号前面一个标志为1时,停止X,Y方向的速度减半
IF #FX THEN
//在入口之前,X全速,Y保持O位不动作,当入口限位动作,入口标志点亮
IF #入口标志 THEN
#KN运行 := 1;
END_IF;
IF #KN运行 THEN
IF #库号_X = 0 THEN//0号库,入库即减速至到碰到到位标志停止运行
#X_SP := 25.0;
#X_RUN := 1;
IF #库号标志点[0,0] THEN
#X_RUN := 0;
END_IF;
ELSE
IF #库号标志点["C仓库数据".目标库号-1,0] THEN
#X_SP := 25.0;//目标库前一库减速
END_IF;
IF #库号标志点["C仓库数据".目标库号 , 0] THEN
#X_RUN := 0;//目标库停车
END_IF;
END_IF;
IF #库号_Y = 0 THEN//0号库,入库即减速至到碰到到位标志停止运行
#Y_RUN := 0;
ELSE
IF #库号标志点["C仓库数据".目标库号 - 1, 1] THEN
#Y_SP := 25.0;//目标库前一库减速
#Y_RUN := 1;
END_IF;
IF #库号标志点["C仓库数据".目标库号, 1] THEN
#Y_RUN := 0;//目标库停车
END_IF;
END_IF;
ELSE
#Y_RUN := 0;
END_IF;
END_IF;
END_REGION
REGION 到达指定库位推出物料
IF #库号标志点["C仓库数据".目标库号,0] AND #库号标志点["C仓库数据".目标库号,1] THEN
"C仓库数据".目标库号 := 1;//点亮库号标志
#FX := 0;//到达目标库,设备反向
END_IF;
//反向返回
END_REGION
REGION 返回起始点
IF #FX=0 THEN
#X_RUN := 1;
#Y_RUN := 1;
#X_SP := 50.0;
#Y_SP := 50.0;
IF #库号标志点[0,1] THEN
#Y_RUN := 0;
END_IF;
IF #库号标志点[0, 0] THEN//x轴回到0
IF NOT #库号标志点[0, 1] THEN
#X_RUN := 0;
ELSE
#X_RUN := 1;
END_IF;
END_IF;
//到达起始点,停机并切换运行方向
IF #库外起点 THEN
#X_RUN := 0;
#Y_RUN := 0;
#FX := 1;
#ZD库号 := 0;
END_IF;
END_IF;
END_REGION
REGION 货物入库顺序记录
//找到库区,记录品种,库区,库号
#找到库区(CLK:=#ZD库号,
Q=>#ZD_UP);
IF #ZD_UP THEN
IF #队列>=1 THEN
FOR #N := 0 TO #队列-1 DO
"C仓库数据".大库[#队列-#N, 0] := "C仓库数据".大库[#队列-1-#N, 0];
"C仓库数据".大库[#队列-#N, 1] := "C仓库数据".大库[#队列 - 1-#N, 1];
"C仓库数据".大库[#队列-#N, 2] := "C仓库数据".大库[#队列 - 1-#N, 2];
END_FOR;
END_IF;
// 大库队列记录
#队列 := #队列 + 1;
IF #队列>=99 THEN
#队列 := 99;
END_IF;
"C仓库数据".大库[0, 0] := #品种;
"C仓库数据".大库[0, 1] := #库区;
"C仓库数据".大库[0, 2] := "C仓库数据".目标库号;;
END_IF;
END_REGION
货物出库:根据品种号,搜索入库队列,找到最早入库的库位号。然后整理入库队列保证队列连续。
//按下出库按照,根据指定品种搜索入库统计列表,找出最早入库货物
#出库标号(CLK:=#出库,
Q=>#CK_UP);
//查找需要出库的库号
IF #CK_UP THEN
FOR #M := 0 TO 99 DO //逆序遍历队列库
IF "C仓库数据".大库[99-#M,0] = #品种 THEN
#出库号:="C仓库数据".大库[99-#M, 2] ;//确定出库号
#队列 := #队列 + 1;//队列库减一
//输出出库号后,重新排列队列库
FOR #G := 0 TO #M DO
"C仓库数据".大库[99 - (#M-#G), 0] := "C仓库数据".大库[99 - (#M-#G), 0];
"C仓库数据".大库[99 - (#M-#G), 1] := "C仓库数据".大库[99 - (#M-#G), 1];
"C仓库数据".大库[99 - (#M-#G), 2] := "C仓库数据".大库[99 - (#M-#G), 2];
;
END_FOR;
EXIT;
ELSE
// 输出品种错误
;
END_IF;
END_FOR;
END_IF;
// 扫描库区,输出没个库区的余位数和最近余位库号。为入库货物和整理仓库做准备
// K_1,2,3,4为临时变量,每次刷新都从0开始
FOR #I := 0 TO 99 DO
IF #I<49 THEN// 扫描1库区
IF #大库数据[#I] = 0 THEN // 有余位
//首次检索到余位。输出库号
IF #K_1 = 0 THEN
#空余库号[0] := #J;
END_IF;
#K_1 := #K_1 + 1;//余位数加1
END_IF;
#库区余位[0] := #K_1;//输出库区总余位数
ELSIF 50<=#I AND #I<69 THEN// 扫描2库区
IF #大库数据[#I] = 0 THEN // 有余位
//首次检索到余位。输出库号
IF #K_2 = 0 THEN
#空余库号[1] := #J;
END_IF;
#K_2 := #K_2 + 1;//余位数加1
END_IF;
#库区余位[1] := #K_2; //输出库区总余位数
ELSIF 69<=#I AND #I<89 THEN// 扫描3库区
IF #大库数据[#I] = 0 THEN // 有余位
//首次检索到余位。输出库号
IF 3 = 0 THEN
#空余库号[2] := #J;
END_IF;
#K_3 := #K_3 + 1;//余位数加1
END_IF;
#库区余位[2] := #K_3; //输出库区总余位数
ELSE// 扫描4库区
IF #大库数据[#I] = 0 THEN // 有余位
//首次检索到余位。输出库号
IF #K_3 = 0 THEN
#空余库号[3] := #J;
END_IF;
#K_3 := #K_3 + 1;//余位数加1
END_IF;
#库区余位[2] := #K_3;//输出库区总余位数
END_IF;
END_FOR;