作者 | 主题 |
---|---|
shine 至圣 经验值:19840 发帖数:8834 精华帖:39 |
楼主 2020-03-03 12:41:48
主题:一个简单的随机数生成器 有时候会要用到随机数,但PLC并没有随机数指令,网上搜了随机数算法,最常用的是线性同余法,Xn+1=(aXn+c) mod m,但是需要一个种子X0,这个种子最好也要随机,要不每次生成的序列都是一样的,一般取当前时间作为X0。既然是这样,我为啥不用当前时间作为我的随机数呢?之前的CPU,从200到400,其内部时钟分辨率都是ms,除非两次随机数间隔比较大,这个随机效果不好,但是到了1200/1500,其内部时钟的分辨率已经到了10的-10次方了,DTL类型的NANOSECOND域的范围是0~999999999,如果我只取其中的后面几位作为随机数,其效果应该还是很好的。 我做了下面的FC块,输入参数为随机数的上下限(range_hi和range_lo),输出一个包含上下限的随机数,原理就是读取当前时间到一个DTL的变量中,然后对DTL.NANOSECOND取(range_hi- ruange_lo +1)的模。然后将余数加上range_lo。 然后自己做了一个测试程序,将产生的随机数保存到DB块的数组中,然后统计每个数字出现的次数 我是在plcsim上模拟测试的,在线后用python写了个脚本,每隔0.5+随机(0~0.5)秒对M0.0按一次CTRL+F2,使其接通,计算一次随机数,获取了11000个数据,然后统计了一下每个数出现的次数 出现次数最少80多,最多不到140,大多数落在了100到120之间 |