前提条件:三个读码器呈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里面最频繁的,有时候甚至一天一更新,太夸张。