最好的控制
级别: 家园常客
精华主题: 0
发帖数量: 53 个
工控威望: 772 点
下载积分: 1048 分
在线时间: 72(小时)
注册时间: 2023-10-16
最后登录: 2025-10-16
查看最好的控制的 主题 / 回贴
楼主  发表于: 4小时前
前提条件:三个读码器呈360度环形读机器人抓取物料二维码,间隔120度左右,机器人读码期间带物料旋转120°,码数量不固定,1-4个码,在两个读码器同时读到码的情况下去重,或者两个读码器分别读了不同码去重
个人能力有限,想半天想不出程序怎么写,写一点就卡壳,想着问下AI看看,结果如下,分两次提问豆包
提问一:给我实现在12个变量里面,选择不为0的变量进行比较,将其中不相等的变量输出,使用PLC的ST语言进行编程
回答:PROGRAM CompareNonZeroVariables
VAR
    // 定义12个输入变量
    var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12: INT := 0;
    
    // 数组用于存储12个变量的值和索引
    variables: ARRAY[1..12] OF INT;
    indices: ARRAY[1..12] OF INT := [1,2,3,4,5,6,7,8,9,10,11,12];
    
    // 存储非零变量
    nonZeroValues: ARRAY[1..12] OF INT;
    nonZeroIndices: ARRAY[1..12] OF INT;
    nonZeroCount: INT := 0;
    
    // 存储不相等的变量索引
    unequalIndices: ARRAY[1..12] OF INT;
    unequalCount: INT := 0;
    
    // 循环计数器和辅助变量
    i, j: INT;
    hasEqual: BOOL;
END_VAR

// 将12个变量的值存入数组
variables[1] := var1;
variables[2] := var2;
variables[3] := var3;
variables[4] := var4;
variables[5] := var5;
variables[6] := var6;
variables[7] := var7;
variables[8] := var8;
variables[9] := var9;
variables[10] := var10;
variables[11] := var11;
variables[12] := var12;

// 第一步:筛选出所有非零变量
nonZeroCount := 0;
FOR i := 1 TO 12 DO
    IF variables <> 0 THEN
        nonZeroCount := nonZeroCount + 1;
        nonZeroValues[nonZeroCount] := variables;
        nonZeroIndices[nonZeroCount] := indices;
    END_IF;
END_FOR;

// 第二步:比较非零变量,找出不相等的变量
unequalCount := 0;
IF nonZeroCount > 0 THEN
    FOR i := 1 TO nonZeroCount DO
        hasEqual := FALSE;
        
        // 与其他非零变量比较
        FOR j := 1 TO nonZeroCount DO
            IF i <> j AND nonZeroValues = nonZeroValues[j] THEN
                hasEqual := TRUE;
                EXIT;  // 找到相等值,退出内循环
            END_IF;
        END_FOR;
        
        // 如果没有找到相等的值,则记录为不相等变量
        IF NOT hasEqual THEN
            unequalCount := unequalCount + 1;
            unequalIndices[unequalCount] := nonZeroIndices;
        END_IF;
    END_FOR;
END_IF;

// 输出结果处理(此处根据实际需求修改输出方式)
// unequalIndices数组中存储了不相等变量的索引(1-12)
// unequalCount为不相等变量的数量



提问二:在上述程序中修改条件,将同样的变量也需要输出一个
回答:PROGRAM CompareNonZeroVariables
VAR
    // 定义12个输入变量
    var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12: INT := 0;
    
    // 数组用于存储12个变量的值和索引
    variables: ARRAY[1..12] OF INT;
    indices: ARRAY[1..12] OF INT := [1,2,3,4,5,6,7,8,9,10,11,12];
    
    // 存储非零变量
    nonZeroValues: ARRAY[1..12] OF INT;
    nonZeroIndices: ARRAY[1..12] OF INT;
    nonZeroCount: INT := 0;
    
    // 存储结果变量(每个不同值保留一个)
    resultIndices: ARRAY[1..12] OF INT;
    resultCount: INT := 0;
    
    // 辅助变量:记录值是否已被添加到结果中
    valueAdded: ARRAY[1..12] OF BOOL;  // 对应nonZeroValues的标记数组
    
    // 循环计数器和辅助变量
    i, j: INT;
    isDuplicate: BOOL;
END_VAR

// 将12个变量的值存入数组
variables[1] := var1;
variables[2] := var2;
variables[3] := var3;
variables[4] := var4;
variables[5] := var5;
variables[6] := var6;
variables[7] := var7;
variables[8] := var8;
variables[9] := var9;
variables[10] := var10;
variables[11] := var11;
variables[12] := var12;

// 第一步:筛选出所有非零变量
nonZeroCount := 0;
FOR i := 1 TO 12 DO
    IF variables <> 0 THEN
        nonZeroCount := nonZeroCount + 1;
        nonZeroValues[nonZeroCount] := variables;
        nonZeroIndices[nonZeroCount] := indices;
    END_IF;
END_FOR;

// 第二步:为每个不同的非零值保留一个实例
resultCount := 0;
// 初始化标记数组
FOR i := 1 TO 12 DO
    valueAdded := FALSE;
END_FOR;

IF nonZeroCount > 0 THEN
    FOR i := 1 TO nonZeroCount DO
        // 如果当前值未被处理过
        IF NOT valueAdded THEN
            isDuplicate := FALSE;
            
            // 检查之前的结果中是否已有相同值
            FOR j := 1 TO resultCount DO
                IF nonZeroValues = nonZeroValues[resultIndices[j]] THEN
                    isDuplicate := TRUE;
                    EXIT;
                END_IF;
            END_FOR;
            
            // 如果是新值,添加到结果并标记所有相同值
            IF NOT isDuplicate THEN
                resultCount := resultCount + 1;
                resultIndices[resultCount] := nonZeroIndices;
                
                // 标记所有相同值,避免重复添加
                FOR j := 1 TO nonZeroCount DO
                    IF nonZeroValues[j] = nonZeroValues THEN
                        valueAdded[j] := TRUE;
                    END_IF;
                END_FOR;
            END_IF;
        END_IF;
    END_FOR;
END_IF;

// 输出结果处理
// resultIndices数组中存储了每个不同非零值的一个实例索引(1-12)
// resultCount为不同非零值的数量


我在程序中将需要的变量改成字符串类型,然后将重复利用的I,J在for循环后面重新赋值为1,测试可行,感觉AI能方便纯逻辑编程,但是搞完后自己照抄又对个人能力没什么成长,但是确实极大缩减了编程时间。不知道未来会发展成什么样,最后是不是只需要录入工艺,程序一套都能写出来,只需要人去调试硬件了。
话说字节是真的卷,豆包更新频率是我用过的几个AI里面最频繁的,有时候甚至一天一更新,太夸张。