每周一个编程小例子:自定义种子生成随机数

引言

在自动化控制系统中,随机数生成是一项非常有用的功能,尤其是在模拟信号、测试环境或者控制算法中,随机数常常用于模拟不同的工作条件或增加系统的复杂性。本文将介绍如何利用 PLC 编程语言实现一个随机数生成功能块PM_RandomNumber_v2,该功能块可以生成指定范围内的随机数,并可以通过外部信号或硬件输入进行种子的设定(之前介绍过使用系统时间作为随机种子的程序),适应不同的应用需求。

程序代码

下面是完整的 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 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

图片

2025年10月