线下实训
HOME
线下实训
正文内容
plc产生随机数编程 西门子SCL编程实例——产生随机数的算法
发布时间 : 2026-03-23
作者 : 小编
访问数量 : 23
扫码分享至微信

西门子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型槽铝...

[回答]创新技术企业。佛山美冠铝业口碑也一直很不错,排名靠前,产...佛山美冠铝业口碑也一直很不错,排名靠前,产品质量好,深受客户的喜爱,有兴趣的可以去...

 鼻立通  华夏心理教育网 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2026  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部