在智能制造车间环境中,扫码枪会读取工单编号,这些编号有着特定的格式,例如:"C20250815OK05" 或者 "A20250903NG12"。每个编号固定长度为 13 个字符,其结构包含了生产的关键信息。具体规则如下:
- 第 1 位字符代表生产线,可能是 A、B、C 中的任意一个。第 2 到第 9 位字符为生产日期,例如 20250815 表示 2025 年 8 月 15 日。第 10 到第 11 位字符表示质量状态,"NG" 代表不合格,"OK" 代表合格。第 12 到第 13 位字符是工位编号,如 05、12 等。
我们需要开发一个程序,连续接收最多 20 个扫码结果,并对其进行分类统计。统计内容包括:各生产线(A、B、C)的工单总数;不同质量状态(NG、OK)的工单数量;以及工位编号为 "01" 的工单数量。
涉及的 SCL 知识点
-
- 字符数组转字符串的操作使用 MID 函数进行字符串截取条件判断语句的运用累计计数器的实现上限数组循环(循环队列思想)的应用
SCL 变量接口说明
在这个程序里,我们预先设置了 20 个读取记录的空间。程序会依据记录中的字符串信息,判断该工单属于哪条生产线(A 线、B 线还是 C 线),同时统计合格和不合格产品的数量。
程序实现
下面是完整的 SCL 程序,使用英文变量名,并添加了详细的注解:
// 初始化统计计数器,每次扫描周期开始时清零"DataBlock_1".LineACount := 0; // A生产线工单数量"DataBlock_1".LineBCount := 0; // B生产线工单数量"DataBlock_1".LineCCount := 0; // C生产线工单数量"DataBlock_1".QualityOKCount := 0; // 合格产品工单数量"DataBlock_1".QualityNGCount := 0; // 不合格产品工单数量"DataBlock_1".Station01Count := 0; // 工位编号为01的工单数量// 遍历扫码记录数组(最多20条记录)FOR "DataBlock_1".i := 1 TO 20 DO// 检查当前记录是否为空IF "DataBlock_1".ScanRecords["DataBlock_1".i] <> '' THEN// 1. 提取生产线信息(字符串第1位)"DataBlock_1".TempVariable := MID(IN := "DataBlock_1".ScanRecords["DataBlock_1".i], L := 1, P := 1);// 根据生产线标识累计相应生产线的工单数量IF "DataBlock_1".TempVariable = 'A' THEN"DataBlock_1".LineACount := "DataBlock_1".LineACount + 1;ELSIF "DataBlock_1".TempVariable = 'B' THEN"DataBlock_1".LineBCount := "DataBlock_1".LineBCount + 1;ELSIF "DataBlock_1".TempVariable = 'C' THEN"DataBlock_1".LineCCount := "DataBlock_1".LineCCount + 1;END_IF;// 2. 提取质量状态信息(字符串第10-11位)"DataBlock_1".TempVariable := MID(IN := "DataBlock_1".ScanRecords["DataBlock_1".i], L := 2, P := 10);// 根据质量状态累计相应的数量IF "DataBlock_1".TempVariable = 'NG' THEN"DataBlock_1".QualityNGCount := "DataBlock_1".QualityNGCount + 1;ELSIF "DataBlock_1".TempVariable = 'OK' THEN"DataBlock_1".QualityOKCount := "DataBlock_1".QualityOKCount + 1;END_IF;// 3. 提取工位编号信息(字符串第12-13位)"DataBlock_1".TempVariable := MID(IN := "DataBlock_1".ScanRecords["DataBlock_1".i], L := 2, P := 12);// 统计工位编号为01的工单数量IF "DataBlock_1".TempVariable = '01' THEN"DataBlock_1".Station01Count := "DataBlock_1".Station01Count + 1;END_IF;END_IF;END_FOR;
程序解析
这个程序的核心逻辑是对扫码枪读取的工单编号进行解析和分类统计。主要分为以下几个步骤:
初始化计数器:在程序开始时,将所有统计用的计数器清零,确保每次扫描周期都从 0 开始统计,避免数据重复累加。
遍历扫码记录数组:使用 FOR 循环遍历预设的 20 个记录位置,检查每个位置是否有有效的扫码数据。
生产线统计:通过截取字符串的第 1 位字符,判断该工单属于哪条生产线(A、B 或 C),并相应地增加对应生产线的计数器。
质量状态统计:截取字符串的第 10-11 位字符,判断工单的质量状态是合格(OK)还是不合格(NG),更新对应的计数器。
工位编号统计:截取字符串的第 12-13 位字符,判断工单的工位编号是否为 01,若是则增加相应的计数器。
通过这种方式,程序能够准确地对扫码枪读取的工单信息进行分类统计,为生产管理提供数据支持。
扫描周期问题说明
在 PLC 编程中,程序会以扫描周期的方式循环执行。如果不进行特殊处理,计数器会在每个扫描周期不断累加,导致统计结果错误。在本程序中,我们通过在每次扫描周期开始时将计数器清零,确保每次只统计当前周期内扫码枪读取的新数据,从而解决了扫描周期带来的重复计数问题。
1343