做一个100库位的立体库程序 点击:442 | 回复:8



天自

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-06-25 15:29:56
楼主

库位: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点。

                         



楼主最近还看过



天自

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-06-25 15:32:14
1楼

库位统计:分别统计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;


天自

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-06-25 15:34:06
2楼

入库程序:起点在外部,进入库内,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


天自

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-06-25 15:37:00
3楼

货物出库:根据品种号,搜索入库队列,找到最早入库的库位号。然后整理入库队列保证队列连续。

//按下出库按照,根据指定品种搜索入库统计列表,找出最早入库货物

#出库标号(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;


guoket

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 1522回
  • 年度积分:0
  • 历史总积分:699
  • 注册:2011年10月09日
发表于:2022-06-25 19:25:22
4楼

都是高手,感谢分享!

天自

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-06-27 23:35:15
5楼

// 扫描库区,输出没个库区的余位数和最近余位库号。为入库货物和整理仓库做准备

// 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;


天自

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-06-27 23:35:59
6楼

整理库区功能:对应库区无库位,就会出现品种和库区不一致的情况,这时候就需要整理库位,对应库区有余位时及时把货物搬运至对应库区,并保证原来存入时间序列不变,只改变货物库号

WuDianQi

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 82回
  • 年度积分:0
  • 历史总积分:495
  • 注册:2015年12月12日
发表于:2022-07-20 17:47:43
7楼

条理清晰挺好,不知道有用过吗?


天自

  • 精华:0帖
  • 求助:1帖
  • 帖子:4帖 | 54回
  • 年度积分:51
  • 历史总积分:964
  • 注册:2022年5月09日
发表于:2022-07-22 07:53:18
8楼


"WuDianQi" 的回复,发表在7楼
        对内容: 【条理清晰挺好,不知道有用过吗?】进行回复:

        -----------------------------------------------------------------只有模拟画面,干的行业不同,用不到这些东西。这个模拟到了整理仓库了,入库,出库比较简单




热门招聘
相关主题

官方公众号

智造工程师