无心飞扬 发表于 2024-9-6 08:49:50

CODESYS 实战:实现随机数生成功能

引言在自动化控制系统中,随机数生成器常用于模拟测试、随机选择等场景。本文将通过一个简单的 CODESYS 函数块示例,讲解如何实现一个可配置上下限的随机数生成器。1   程序设计思路
我们的目标是创建一个可以在特定范围内生成随机数的函数块。该函数块接受触发信号和上下限参数,输出一个在范围内的随机数。为了确保随机性,我们将使用当前时间初始化种子,并在每次触发时更新种子。
2   程序代码


FUNCTION_BLOCK PM_RandomNumber
VAR_INPUT
Trigger : BOOL; (* 上升沿触发信号 *)
    UpperLimit : REAL; (* 随机数上限 *)
    LowerLimit : REAL; (* 随机数下限 *)
END_VAR
VAR_OUTPUT
RandomNumber : REAL; (* 输出的随机数 *)
END_VAR
VAR
LastTrigger : BOOL; (* 上一次的触发信号状态 *)
RandomSeed : DWORD; (* 随机种子 *)
END_VAR

(*
版本记录:
版本          日期          作者
V1         2024-3-09
*)

// 初始化随机种子
IF RandomSeed = 0 THEN
    RandomSeed := TO_DWORD(TIME_TO_TOD(TIME())); // 使用当前时间作为种子
END_IF

// 检测上升沿
IF Trigger AND NOT LastTrigger THEN
    // 生成 0 到 1 之间的随机数
    RandomSeed := RandomSeed * 1664525 + 1013904223;
    RandomNumber := TO_REAL(RandomSeed MOD 10000) / 10000.0;
   
    // 缩放到指定的上下限范围
    RandomNumber := LowerLimit + RandomNumber * (UpperLimit - LowerLimit);
END_IF

// 更新上一次的触发信号状态
LastTrigger := Trigger;
3   代码解释

输入输出变量:
Trigger:控制随机数生成的触发信号。UpperLimit 和 LowerLimit:定义生成随机数的范围。RandomNumber:输出结果。

内部变量:
LastTrigger:用于检测信号的上升沿。RandomSeed:用于生成随机数的种子。

随机数生成逻辑:
初始时,使用当前时间初始化随机种子。在检测到触发信号的上升沿时,更新随机种子并生成随机数。随机数缩放至指定范围内。
4   应用场景
该随机数生成器可以用于模拟动态输入、创建测试用例、或者在需要随机选择的场合。通过配置上下限,用户能够灵活地调整输出范围。
5   拓展思考
在实际应用中,可以考虑使用不同的随机种子生成算法以提高随机性,例如:PLC扫描时间,PLC循环计数或外部模拟量传感器,如温湿度压力等。还可以实现对种子的外部设置功能,从而在不同的运行场景中实现可重复的随机序列。
6   开源版本说明
该程序遵循开源原则,任何人都可以使用、修改和分发此代码。在使用前应进行充分的测试,修改代码时,请秉持分享精神,将您的改进和成果进行分享,以便更多人受益。
总结
通过本文的介绍,我们实现了一个基本的随机数生成器,并探讨了它的应用场景和可能的拓展方向。这为在 CODESYS 环境中实现更复杂的功能提供了一个良好的起点。希望这能为您的项目带来帮助。

zerox 发表于 2024-9-13 12:32:14

学习学习
页: [1]
查看完整版本: CODESYS 实战:实现随机数生成功能