c生成随机数_PLC如何产生一个随机数(含代码)

bad541ac7fa476acc322bb5a04956ebe.pngJZGKCHINA 工控技术分享平台

尊重原创 勿抄袭

勿私放其他平台


在剑指工控群里,一群友问PLC如何产生随机数,曾记得除了三菱PLC之外其他常规品牌好像没有提供专门的随机函数。这里就整理两种产生随机数的方法:

第一种最简单直接的方法。

a0834714bdc90f0cd4501c55b94bb720.png

此方法使用的是读取CPU系统时间的纳秒作为随机数。如下图:

7466de23dbff92ec037f7bdd25f77ba3.png

1f9c5e61c9db67509c355914e8595468.png

纳秒的位数越多随机数越无规律。

第二种用得较多的是“线性同余法"

a0834714bdc90f0cd4501c55b94bb720.png

就是下面这个式子

R(n+1) = [R(n) * a + b] mod c 

为使随机数分布尽量均匀,a、b 均为质数, c 一般取值域内的最大值(mod 是求余数)

从这个式了可以看出,每次产生的随机数都跟上一次产生的数有关系,那么,第一个数是怎么来的呢?这就是线性同余法中必须用的的”种子",也就是说,给定某个种子后,所产生的随机数序列是固定的,在计算机编程中,一般使用系统时间来初始化种子,就是前面代码中的 srand((unsigned)time(NULL)); 这一句了。因为每次运行程序的时间肯定不一样,所以产生散列肯定也不一样,从而达到“随机”的目的。

a,b,c 的取值我用的是 a=3373, b=1, c=32768

两个子程序

a0834714bdc90f0cd4501c55b94bb720.png

下面的两个子程序是smart 200中产生随机的系统编号用的,因为编号中只有4位数采用了随机数,所以下面的程序中用的是整型,最大范围为32767。如果需要更宽范围的随机数,可以采用双字类型,并适当修改程序。

使用时在第一个扫描周期调用 Srand 初始种子,需要随机数的地方调用 Random

Random 有了个最大范围参数,可以限制生成的随机数的最大范围,比如我只需要4位随机数,所以一般这样调用 CALL Random, 10000, vw0,生成的数就在 0-9999 范围内

下面是代码:

SUBROUTINE_BLOCK Srand:SBR17

TITLE=初始化随机数种子

//

// 直接使用系统时钟的分秒来作为种子

VAR_OUTPUT

seed:WORD;

END_VAR

BEGIN

Network 1

LD SM0.0

TODR VB1990

Network 2

LD SM0.0

BTI VB1994, AC1

SLW AC1, 8

BTI VB1995, AC3

+I AC3, AC1

MOVW AC1, LW0

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK Random:SBR16

TITLE=随机数发生器

//

// 线性同余法获取伪随机数,范围:0~32767

//

// seed = (seed * 3373 + 1) % 32768;

//

VAR_INPUT

wMax:WORD; // 最大范围

END_VAR

VAR_OUTPUT

wOut:WORD;

END_VAR

BEGIN

Network 1

// wSeed * 3373 + 1 => AC1

LD SM0.0

ITD VW1940, AC1

*D 3373, AC1

INCD AC1

Network 2

// AC1 mod 32768 => wSeed

LD SM0.0

MOVD AC1, AC3

/D +32768, AC3

*D 32768, AC3

-D AC3, AC1

DTI AC1, VW1940

Network 3

// wSeed / 32768 * wMax => wOut

LD SM0.0

DTR AC1, AC1

/R 32768.0, AC1

ITD LW0, AC3

DTR AC3, AC3

*R AC3, AC1

ROUND AC1, AC1

DTI AC1, LW2

END_SUBROUTINE_BLOCK 

作 者 简 介

曹俊义

工业物联网资深构建专家 工厂智能化改造践行专家 资深工业网络通讯专家 工业自动化控制系统专家 ProSoft产品顶级技术专家

bc61e4248da8383d8ea5d5c1dcfc00fe.png

工业通讯领域沉浸十数年,深喑各种工业通讯协议和工业网络架构以及国内外多种主流PLC应用和操作、熟知罗克韦尔、施耐德、西门子、GE等知名品牌的冗余系统,对工业无线通讯、工业物联网、工业IT与OT的融合,有着前瞻性的独到见解和务实的实践经验。 现任伟联科技董事长。 努力为中国工业信息化、数字化、智能化的深入发展做出贡献。

往期精选

07f6c21ad8dd0fa49826be9103a32238.png

ae1f2e2bd8d1685c8be987a1103031da.png

ef62764e7d89ce67889d71a6cb5afeaa.png

40fa2426e6eba70d55ad1eb7aeb97c25.png

d8d075740e65f6d60fb512a8ec663293.png

人气推荐

more+

ebdd9f5564fda9c518b2fa4d95e4f9f1.png eb54811df2867067d46348fbb25f39d9.png 93724c471d1871ab125dd5c02eabc865.png e22552e4d04dec35bf7310393197d304.png

42e540cc13a44d984bd0325d40c10c9e.png

1.Smart200&V90伺服系统:已更新15课

2.贝加莱直播课程:已更新16课

3.力控科技产品培训:已更新5课

4.剑指工控经典公开课:已更新22课 5.新品推荐:已更新3课

6.专家课堂:已更新12课

d91158d343cb647211bd8d7df6b3e943.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值