十四、SCL核心应用课项目实战_仓储系统出料优先级控制程序设计


前言

本文是基于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块“仓储”。
在这里插入图片描述

SCL (Structured Control Language) 中,我们可以创建一个程序来管理控制系统优先级,例如在自动化设备中,根据不同的报警级别分配处理顺序。下面是一个简单的示例,展示如何通过SCL实现优先级控制逻辑: ```scl -- 定义数据块来存储报警等级和处理函数 DATASET AlarmPriority { PriorityLevel : INT; "报警级别" HandlingFunction : STRING; "处理函数名称" }; -- 高级别报警处理函数 FC_HighPriorityAlarm(IN [AlarmLevel]) { IF AlarmLevel = 5 THEN HandlingFunction := 'HighPriorityHandler'; Display('High priority alarm detected'); END_IF; } -- 中级别报警处理函数 FC_MediumPriorityAlarm(IN [AlarmLevel]) { IF AlarmLevel >= 3 AND AlarmLevel < 5 THEN HandlingFunction := 'MediumPriorityHandler'; Display('Medium priority alarm detected'); END_IF; } -- 低级别报警处理函数 FC_LowPriorityAlarm(IN [AlarmLevel]) { IF AlarmLevel <= 2 THEN HandlingFunction := 'LowPriorityHandler'; Display('Low priority alarm detected'); END_IF; } -- 主程序 (Main) Program Main { -- 初始化数据块 SET PriorityLevel := 0; -- 设定报警事件 SimulateAlarm(PriorityLevel: 5); -- 示例,模拟高级别报警 WHILE TRUE DO -- 获取当前报警级别 PriorityLevel := GetAlarmLevel(); -- 根据优先级调用对应处理函数 EXECUTE HANDLINGFUNCTION(HandlingFunction); -- 更新显示 Display("Current priority level: ", PriorityLevel); END_WHILE; } -- 相关问题 -- 1. 如何设置报警级别? 2. 这些函数是如何关联到硬件执行的? 3. 如果有多个高优先级的报警同时出现会怎样? ``` 在这个例子中,我们首先定义了报警级别的数据结构,然后创建了针对不同级别的报警调用相应的处理函数。在主程序中,不断获取新的报警级别并根据优先级执行对应的函数。需要注意的是,实际应用中可能需要更复杂的优先级算法,以及与实际设备通信的部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值