前言
本文是基于B站上的《SCL核心应用课项目实战》课程,所做的笔记,主要包括程序代码和自己的理解注释。课程链接:SCL核心应用课项目实战(21课全)
陆杰锋老师讲得非常好,有理论讲解也有实战演练,需要具备一定的梯形图编程基础。
有空我会持续更新。
十三、配方功能实现
1.需求分析
功能要求:
A.建立一个通用的表格,里面有设备运行中需要的数据,如下表;
B.编号是指一共有几条配方,名称是指配方的名称,序号是指每条配方包含几条物料数据,重量或配方内容是指配方数据信息;
C.配方应具有如下功能:保存、增加、删除、修改、查找。
分析:
1.需要设置几个按钮,增、删、改、查;
2.需要设置一个序号变量,用于删除或修改第几条配方;
3.需要设置一个名称变量,用于查找配方;
4.需要设置一个设定存储区,用于存储增加或修改的配方的信息;
5.需要设置一个预览存储区,用于显示查找到的配方;
6.需要设置一个空存储区,用于覆盖掉要删除的配方。
2.程序编写
编程步骤:
1.新建一个PLC数据类型“混合”,用于存储某个物料的序号和重量信息;
2.新建一个PLC数据类型“配方”,用于存储配方的名称和物料信息,其中名称长度不能大于10个字符;
3.新建一个DB块“配方存储”;
4.新建一个FB块“配方处理”,并建立如下变量;
5.编写如下程序;
#P1(CLK := "配方存储".增);
#P2(CLK := "配方存储".删);
#P3(CLK := "配方存储".改);
#P4(CLK := "配方存储".查);
//增加配方
IF #P1.Q THEN
#add_err := 0; //首先将错误信息清空
FOR #n := 1 TO 10 DO
IF "配方存储".配方_设置.名称 = "配方存储".配方[#n].名称 THEN
#add_err := 1;//若增加的配方名称等于某条已经存在的配方名称,则触发重命名错误
END_IF;
END_FOR;
IF NOT #add_err THEN
FOR #n := 1 TO 10 DO
IF "配方存储".配方[#n].名称 = '' THEN
"配方存储".配方[#n] := "配方存储".配方_设置;//将设置区赋值给空配方
EXIT; //一定要退出,否则所有名称为空的存储区都会存储上新的配方
END_IF;
END_FOR;
END_IF;
END_IF;
//根据序号删除配方
IF #P2.Q THEN
//间接寻址,例如"配方存储".序号=1,则表示"配方存储".配方[1]中存储的信息
"配方存储".配方["配方存储".序号]:="配方存储".配方_空;//用空配方覆盖要删除的配方
END_IF;
//根据序号修改配方
IF #P3.Q THEN
"配方存储".配方["配方存储".序号] := "配方存储".配方_设置;//将设置区赋值给要修改的配方
END_IF;
//根据配方名称查找配方
IF #P4.Q THEN
FOR #n := 1 TO 10 DO
IF "配方存储".配方[#n].名称 = "配方存储".名称 THEN
"配方存储".配方_预览 := "配方存储".配方[#n];
END_IF;
END_FOR;
END_IF;
6.在主程序块Main中,调用FB块“配方处理”。