西门子SCL编程实例——产生随机数的算法
今天这篇文章给大家介绍下我编写的产生随机数的函数。
函数FC5006_RandomReal可根据需要产生一个指定范围内的随机数,它采用线性同余算法产生随机数,其公式如下:
X[n+1]=(a*X[n] +c) % m
这是一个递归公式,利用X[n]产生X[n+1]。其中:
a:系数,取值范围:0<a<m;c:增量,取值范围:0<=c<m;m:模,取值范围:m>0;说明:①m应尽可能的大,通常至少大于2^30(2的30次方);②如果m选取为2的幂(即m=2^n),则a的值通常应满足a mod 8=5;③当m和a的选取比较合理时,对于c的约束并不强,但要保证c与m互质,例如c可以选择1或11;这个递归公式中,X[n]用来产生X[n+1],因此,X[n]被称为种子。也就是说,前一个随机数是后一个随机数的种子。在实际使用时,第一个种子一般是作为参数赋值给函数的。这种递归公式计算对于C/C++等语言很适合,但是对于PLC的编程语言有所困难。因此,在实际PLC编程时,可以使用系统时间戳作为种子,即:
randomNumber=(a*seed +c) % m;
下面介绍下我编写的函数FC5006_RandomReal,它有两个输入参数:
minValue:需要产生随机数范围的最小值;maxValue:需要产生随机数范围的最大值;三个常数:
M_MOD:公式中的m;A_FACTOR:公式中的a;C_INCREMENT:公式中的c;所有参数如下图所示:
代码如下:
我编写了一个函数测试随机数算法,产生一个1~1000之间的实数,代码如下:
多次测试结果如下:
如果你对这个函数有任何问题,欢迎留言讨论。
我的书《西门子S7-1200/1500 PLC SCL语言编程》比较详细的介绍了SCL的编程,感兴趣的话可以看看下面的链接:
#pgc-card .pgc-card-href { text-decoration: none; outline: none; display: block; width: 100%; height: 100%; } #pgc-card .pgc-card-href:hover { text-decoration: none; } /*pc 样式*/ .pgc-card { box-sizing: border-box; height: 164px; border: 1px solid #e8e8e8; position: relative; padding: 20px 94px 12px 180px; overflow: hidden; } .pgc-card::after { content: " "; display: block; border-left: 1px solid #e8e8e8; height: 120px; position: absolute; right: 76px; top: 20px; } .pgc-cover { position: absolute; width: 162px; height: 162px; top: 0; left: 0; background-size: cover; } .pgc-content { overflow: hidden; position: relative; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } .pgc-content-title { font-size: 18px; color: #222; line-height: 1; font-weight: bold; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pgc-content-desc { font-size: 14px; color: #444; overflow: hidden; text-overflow: ellipsis; padding-top: 9px; overflow: hidden; line-height: 1.2em; display: -webkit-inline-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .pgc-content-price { font-size: 22px; color: #f85959; padding-top: 18px; line-height: 1em; } .pgc-card-buy { width: 75px; position: absolute; right: 0; top: 50px; color: #406599; font-size: 14px; text-align: center; } .pgc-buy-text { padding-top: 10px; } .pgc-icon-buy { height: 23px; width: 20px; display: inline-block; background: url(https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/pgc/v2/pgc_tpl/static/image/commodity_buy_f2b4d1a.png); } 西门子S7-1200/1500 PLC SCL语言编程从入门到精通 ¥69 购买西门子PLC用TIA博途SCL语言写的一个产生随机实数的指令块
这是西门子的一个功能FC,我们可以用它来学习SCL语言,也可以用来分析和学习怎样做一个比较合理且完整的功能FC。
1. 在设计该功能时,先确定好,它的具体功能,比如:此例的功能是获取一个随机实数,该随机实数是可以定义在自己想要的数值范围内的,还要考虑一些错误代码的定义,该例子定义了三个错误状态码,16#7000(无当前任务)、16#0000(任务完成)、16#8200(最大值小于最小值)。 2. 这里使用一个FC块,首先定义变量。如下图:
由于变量名称很清晰地描述了变量功能,所以不逐一解释。
3. 程序段1。如下图:
块内变量初始化,三个变量分别赋值0、1、16#7000。
4. 程序段2。如下图:
检查输入范围变量,是否出现最小值大于最大值的情况。
5. 程序段3。如下图:
读系统时间,用纳秒,使用纳秒的随机性。判断读系统时间是否有误,如果有误,给状态变量赋值。
6. 程序段4。如下图:
无符号长整型数需要四个字节,每个字节和系统时间纳秒的四个字节分别对应,实际上#tempRandomValue就已经是一个随机的无符号整型数了。
7. 程序段5。如下图:
对#tempRandomValue进行标准化操作,使其变成0.0~1.0之间的一个数据,然后再逆标准化,使这个随机数产生于我们要求的最小值和最大值之间。
8. 功能调用。如下图:
要生成100.0~1000.0之间的随机数,以上为效果,每个扫描周期产生一个随机实数,监控显示随机数468.7597。
相关问答
PLC随机生成数?
解:1.利用时间寄存器,年月日时分,做加减乘除运算后,取出的值作为随机数。2.利用时间寄存器,年月日时分,做CRC算后,取出的值作为随机数。3.利用时间寄存...
PLC能产生随机数吗
[最佳回答]PLC是不能的,它工作时根据你输入的梯形图工作。还有外电路输入的模拟量,这些都不是随机的。
西门子PLCS7-200226CPU产生随机数?
您好:您可以用一个定时器,然后比较定时器的时间值去MOV一个数值产生一个随机数,比如当时间到达10秒的时候把1给VW12时间到达20秒的时候把15给VW12,当定时器...
set0什么意思?
在stata中,并没有set0这个指令。可能是您误解了某个stata命令的使用方法。以下是stata中常见的一些指令,供参考:1.setseed:设置随机数种子,用于生成随机...
三菱FX3G系列有哪些配置?
三菱FX3U系列PLC处理速度业内领先,达到了0.065us/基本指令,内置64K大容量存储器,大幅增加了内部软元件的数量。晶体管型主机内置3轴最高100kHz定位功能,并...
麻烦大神们!谁能帮忙 重庆专业的U型槽铝材加工厂,U型槽铝...
[回答]创新技术企业。佛山美冠铝业口碑也一直很不错,排名靠前,产...佛山美冠铝业口碑也一直很不错,排名靠前,产品质量好,深受客户的喜爱,有兴趣的可以去...
扫一扫微信交流