每周一个编程小例子:自定义种子生成随机数
引言
在自动化控制系统中,随机数生成是一项非常有用的功能,尤其是在模拟信号、测试环境或者控制算法中,随机数常常用于模拟不同的工作条件或增加系统的复杂性。本文将介绍如何利用 PLC 编程语言实现一个随机数生成功能块PM_RandomNumber_v2,该功能块可以生成指定范围内的随机数,并可以通过外部信号或硬件输入进行种子的设定(之前介绍过使用系统时间作为随机种子的程序),适应不同的应用需求。
1 程序代码
下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):
- FUNCTION_BLOCK PM_RandomNumber_v2
- VAR_INPUT
- Trigger : BOOL; (* 上升沿触发信号 *)
- UpperLimit : REAL; (* 随机数上限 *)
- LowerLimit : REAL; (* 随机数下限 *)
- ExternalSeed : DWORD; (* 外部输入作为种子, 可以是硬件计数器或传感器的值 *)
- END_VAR
- VAR_OUTPUT
- RandomNumber : REAL; (* 输出的随机数 *)
- END_VAR
- VAR
- LastTrigger : BOOL; (* 上一次的触发信号状态 *)
- RandomSeed : DWORD; (* 随机种子 *)
- END_VAR
- // 初始化随机种子
- IF RandomSeed = 0 THEN
- RandomSeed := ExternalSeed; // 使用外部输入作为种子
- 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;
2 代码说明
此功能块的核心功能是生成一个指定范围内的随机数,具体实现步骤如下:
输入变量说明:
-
Trigger:一个布尔型输入信号,表示是否触发随机数的生成。程序利用上升沿触发生成。
-
UpperLimit 和 LowerLimit:控制生成随机数的上下限,决定生成随机数的范围。
-
ExternalSeed:外部输入的种子值,可以来自硬件计数器或传感器的数据,用于初始化随机数的种子。
内部逻辑:
-
随机种子初始化:如果RandomSeed为 0,表示未初始化种子,程序将使用ExternalSeed作为初始种子。
-
上升沿检测:程序检测Trigger信号的上升沿,当Trigger由0变为1时,触发生成随机数的操作。
-
随机数生成:通过基于线性同余算法(LCG)的方法生成 0 到 1 之间的随机数,然后通过缩放将其转换到指定的上下限范围内。
-
随机数输出:生成的随机数将通过RandomNumber输出。
种子更新:每次触发时,RandomSeed会根据公式进行更新,从而保证每次生成的随机数具有较好的随机性。
3 应用场景
测试与模拟:在自动化生产线或工业设备的测试过程中,生成随机数可以模拟不同的工作环境或工况。这对于验证设备在各种条件下的稳定性、准确性等非常有帮助。
系统调试:当进行 PLC 控制系统调试时,使用随机数可以测试系统的响应速度、鲁棒性和精确度。例如,模拟传感器的输入信号以测试自动控制系统的反应。
数据加密与安全性:随机数在密码学中也有广泛应用,尤其是生成密钥、随机数种子等,确保数据加密过程的安全性。
4 拓展思考
在实际应用中,生成的随机数质量和种子选择至关重要。尽管本示例使用了较为简单的线性同余算法(LCG),但在某些应用场景中,可能需要更高质量的随机数。例如,可以引入硬件随机数生成器(如基于热噪声或光子噪声的生成器),或者采用更复杂的伪随机数生成算法(如 Mersenne Twister)来提高随机性的可靠性。
此外,外部种子的引入,可以使随机数的生成更加灵活。例如,使用系统的时钟、模拟量传感器的数据或其他动态输入作为种子,可以避免每次启动 PLC 时产生相同的随机数序列,这对于测试和模拟更加有意义。
总结
本文介绍了一个基于 PLC 的随机数生成功能块PM_RandomNumber_v2,该功能块能够根据外部触发信号生成指定范围内的随机数,并通过外部种子确保生成的随机数具有足够的随机性。该功能块的应用场景广泛,既可以用于系统测试与调试,也可以用于更复杂的工业应用或数据加密任务。通过进一步优化算法和种子选择,未来的随机数生成器可以为更多的自动化控制系统提供支持。
你来出 我来答


欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。
往期回顾
每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比
每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用
2025年10月