无心飞扬 发表于 2025-3-14 08:38:08

CODESYS 实战:实现自守数查找

引言自守数是其平方的末尾数字与该数本身相同的数字。这篇文章通过一个查找自守数的案例,帮助读者学习和理解 ST 语言的基本结构和编程技巧。1 问题描述目标是编写一个程序,遍历从 0 到给定最大值的所有整数,找到其中的自守数,并将其存储在数组中。自守数是指一个数的平方的尾数等于该数自身的自然数。例如, 5²=25,25²=625,76²=5776,9376²=87 909376。求 n 以内的自守数并储存。2 程序设计思路
[*]输入输出变量:定义输入变量 N,输出变量 NumberArray。
[*]初始化:初始化存储数组。
[*]主循环:遍历范围内的每个数字,计算其平方,并检查是否为自守数。
[*]存储结果:如果找到自守数,存储在数组中并更新计数器。

3 程序代码
FUNCTION_BLOCK WG_SelfPowerNumbers
VAR_INPUT
    N : DINT := 100000;          // 定义范围
END_VAR_INPUT

VAR_OUTPUT
    NumberArray : ARRAY OF DINT; // 用于存储自守数的数组
END_VAR_OUTPUT

VAR
    i : DINT;                  // 循环变量
    Count : DINT := 0;      // 自守数计数器
    Square : DINT;            // 存储平方结果
    Temp : STRING;            // 临时字符串变量,用于比较
END_VAR

(*
版本记录:
版本          日期             作者
V1         2024-10-27       工控老王
*)

// 初始化
FOR i := 1 TO 100 BY 1 DO
    NumberArray := 0;
END_FOR

// 查找自守数
FOR i := 0 TO N DO
    // 计算平方
    Square := i * i;
   
    // 将数和平方转换为字符串
    Temp := DINT_TO_STRING(i);
   
    // 检查自守数的条件
    IF LEN(Temp) <= LEN(DINT_TO_STRING(Square)) THEN
      // 检查平方的尾数是否等于原数
      IF RIGHT(DINT_TO_STRING(Square), LEN(Temp)) = Temp THEN
            Count := Count + 1; // 计数自守数
            NumberArray := i; // 存储自守数
      END_IF
    END_IF
END_FOR

END_FUNCTION_BLOCK
4 代码说明输入和输出:
[*]N: 定义搜索的上限,默认值为 100000。
[*]NumberArray: 用于存储找到的自守数。
变量定义:
[*]i: 用于循环的计数器。
[*]Count: 记录自守数的数量。
[*]Square: 存储当前数字的平方。
[*]Temp: 临时字符串,用于字符串比较。
初始化数组:
[*]使用一个 FOR 循环将 NumberArray 初始化为 0。
自守数查找:
[*]循环从 0 到 N,计算每个数字的平方,并检查它是否为自守数。
[*]如果是自守数,将其存入 NumberArray 中并更新计数。
注意事项
[*]可以根据需求调整 NumberArray 的大小。
[*]代码中已确保变量的初始化和逻辑的正确性,建议在实际项目中测试以确保符合预期。

5 运行结果运行程序后,NumberArray 中将包含所有在范围内找到的自守数。例如,输入 N = 100000 时,典型的自守数包括 0、1、5、6、25、76、376、625、9376 等。6 开源说明该程序遵循开源原则,任何人都可以使用、修改和分发此代码。在使用前应进行充分的测试,修改代码时,请秉持分享精神,将您的改进和成果进行分享,以便更多人受益。总结通过这个案例,读者可以学习如何使用 ST 语言编写循环、条件判断以及字符串操作等基本编程技巧。这种技术不仅适用于自守数的查找,还可以扩展到其他数值计算场景,为工业自动化编程提供了实用的参考。
页: [1]
查看完整版本: CODESYS 实战:实现自守数查找