首页 > 自考资讯 > 自考知识

plc编程随机指令,plc随机输出

头条共创 2024-06-27

某些测试要求可能需要在模拟中生成数据。目前,您可以通过调用指令或编写自己的程序来生成这些随机数据。

以下是一些生成随机数的方法,以博客为例:

一、读取系统时间的纳秒作为随机数

定期将系统时间的纳秒直接输出到相应的变量。

13be9f8cfe844524bd92a8802c04ea40~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=MNYqwvhIkhpIhIPU6njqwYKlhTA%3D 系统时间中的纳秒是UDINT类型,转换为INT会丢弃高字部分。

2b1718f2f3014907be09343deae2eb53~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=M3zWy6JPJumBd775dOojo3sLp00%3D 监控实时系统时间并获取纳秒(NANOSECOND,1秒=10^9纳秒)

f10f0c96f9f242c983017b451e9b63c6~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=%2BZcjlOLDtDAkIW33wDXSRoH1uD4%3D 监控生成的随机数范围:-32258-32751(5分钟)

您可以稍后继续处理该数据并将其缩放到所需的范围。

二、由LGF库(官方提供的通用函数库)内的随机数程序生成

该命令的原理同样采用纳秒,但处理过程更加详细和完善。

f108a870b36e44c182a47d9ee6b07a43~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=6BQQ9b9nBaI7drGAmOQxODsRG%2F0%3DLGF 库

随机数生成程序如下(仅示出密钥计算过程)。

REGION 随机数计算//将纳秒转换为双字以进行单字节寻址#tempNanoSecondInDWord :=UDINT_TO_DWORD(#tempTime.NANOSECOND); //片段访问中的字节交换纳秒#tempRandomValue.% B3 :=#tempNanoSecondInDWord.%B0;%B2 :=#tempNanoSecondInDWord.%B1; #tempRandomValue.%B2; #tempRandomValue.%B0 :=#tempNormReal :=UDINT _TO_REAL omValue))/UDINT_TO_REAL (#MAX_UDINT); //随机数缩放#LGF_RandomRange_Real 3336 0=( (#tempNormReal * (#maxValue - #minValue) + (#minValue)); # 错误:=#STATUS_FINISHED_NO_ERROR; #subfunctionStatus :=#SUB_STATUS_NO_ERROR ; //未使用ENO 机制ENO :=TRUE;END_REGION 37775069db064b3693c99babdd429e0b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=mfFXQugeDkmfwFaD%2F55reKBY3xQ%3D 主程序中调用设置上下限

三、线性同余法(LCG,Linear Congruential Method)

这个方法的核心是下面的递归表达式:

随机数=(A * 随机数+ B)% M

A、B、M均为常数,A为乘数,B为增量,M为系数,RandNum为初始值。 A、C、M的值生成高质量的随机数。

您可以看到生成的每个新随机数都与最后一个数字相关。随机数序列的初始值通常称为种子。必须设置种子来生成随机数。否则,每次运行的随机数结果都将相同。通常使用纳秒的系统时间作为种子(有时这是默认设置)。这为种子的唯一性提供了一定的保证。

由于计算过程以余数M结束,因此余数的范围是0-(M-1),这决定了生成的随机数是周期性的。 M的大小决定了最大周期长度,通常取值范围中的最大值,并且A和B也会影响周期。 A、B、M有多种选择,只要生成的随机数具有良好的均匀性和随机性即可。

cba00aeb50744690a6455bfffd5f0a87~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=OaBpM9N5t6L7EQBjJLRp5N17Z6c%3DFC 块中,变量被定义为双精度整数。模数M的最大值范围为2^32。

f1fdbacc1d6b4ddda6a6252aa9afa42b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=fsovMH5bmiNQ9SHDPBkiQBsxSZg%3D 种子可以使用系统时间或自己设置

936ac24643d2487a82df51d269db49a2~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=DDqRrkdX%2Ftn8QmdwF6FwHD%2Bn%2F0M%3D 随机数曲线

一旦线性同余法的初始值确定,输出序列就固定了。一旦获得随机数序列,其初始值A、B、M也逆向计算。

针对这个缺点的一个可能的改进是,每次生成n个数字时,使用从当前时钟值MOD M获得的余数作为新的种子。

四、平方取中法

中值法由冯·诺依曼提出。原理是先得到一个2位整数(种子),将其平方得到一个4位整数,然后得到4位整数的中间2位,如下:下一步操作的种子。重复此过程即可获得一系列随机数。 (序列中的每个数字都缩放到0.0 到1.0 的范围)

例如,取种子365,平方得到133225,高位补0,得到中间1332,平方得到1774224,高位补0,得到7742。

783e1b4bb3d947519164029e626706c7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720036371&x-signature=HJmy7XhC%2Frlr%2BnVzZS7aIvkwbjo%3D#RandInt :=SQR(#Seed);#Seed :=(#RandInt MOD 1000000 - #RandInt MOD 100)/100;#RandReal :=DINT_TO_REAL(#Seed)/9999.0; 509个随机数测试结果

在实践中,这种方法效果不是很好。很难知道要消耗哪些种子才能确保足够长的周期。以种子123为例,经过40个周期后,种子的最后一位退化为00,之后的随机数将是某个固定值,使得周期非常短。算法也有改进的空间。

梅森旋转算法_Mersenne Twister

梅森旋转算法可以高效地生成高质量的伪随机数,弥补了上述伪随机数生成器的缺陷和不足。用于C++、Python等编程语言。

在了解该算法之前,您需要了解许多带前缀的名词,例如线性反馈移位寄存器、阶段、反馈函数、抽头序列和本原多项式。如果你真的有兴趣,就去搜索一下吧。我放弃。

浅谈梅森旋转:算法及其爆发- 知乎

伪随机数生成算法——Mersenne Twister/MT算法介绍_秦岭熊猫博客-CSDN博客_Mersenne Twister算法

当我们想到随机数时,我们不禁会想起因果律。也就是说,果是因产生的,一切都是有依据的,事情都是需要去做的。

所谓“随机性”无非就是个体对事物发展的感知受到有偏见的信息的限制。

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢