原标题:PLC如何产生一个随机数(含代码)

JZGKCHINA

尊重原创 勿抄袭

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

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

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

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

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

就是下面这个式子

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

两个子程序

下面的两个子程序是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产品顶级技术专家

工业通讯领域沉浸十数年,深喑各种工业通讯协议和工业网络架构以及国内外多种主流PLC应用和操作、熟知罗克韦尔、施耐德、西门子、GE等知名品牌的冗余系统,对工业无线通讯、工业物联网、工业IT与OT的融合,有着前瞻性的独到见解和务实的实践经验。

现任伟联科技董事长。努力为中国工业信息化、数字化、智能化的深入发展做出贡献。

责任编辑:

c 语言生成一个随机4位数,PLC如何产生一个随机数(含代码)相关推荐

  1. 编辑一个随机4位数的验证码

    随机验证码 在很多网站我们都可以看到登录和注册的时候,会显示出验证码,需要你输入才可以成功的注册或登录,在早期没有验证码的时候,很容易被机器泛滥的注册,注入广告,以一种营销手段来注册宣传,用验证码来验 ...

  2. Java黑皮书课后题第4章:4.16(随机字符)编写一个程序,使用Math.random()方法显示一个随机的大写字母

    4.16(随机字符)编写一个程序,使用Math.random()方法显示一个随机的大写字母 题目 题目概述 破题 生成随机数 随机数与大写字母之间的转换:ASCII 转化为char型 代码 题目 题目 ...

  3. C语言计算一个整数的位数

    C语言计算一个整数的位数 只需要设计一个计时器,因为C语言中除法只留下整数部分,所以可以拿数字/10:数字位数即为循环次数,待n为个位时n/10=0,然后循环结束. #include<stdio ...

  4. 自动点名c语言,编撰一个随机点名系统

    编写一个随机点名系统 1.  编写一个随机点名系统,运行该系统后,按空格键可以显示出一名同学,以前被选中的同学,将不会再次被选中 2.采用C语言 数据结构 数组指针  随机数 文件读写的方式 不必使用 ...

  5. C语言生成一个随机的九行九列数独,一个随机生成数独的C++程序

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. //mySIZE是数独棋盘的边长,棋盘是mySIZE*mySIZE的大小 int mySI ...

  6. java生成随机十位数_随机10位字符串生成

    小于11位的小写字母以及数字随机码生成方法如下 方法一 奇妙的写法 Math.random().toString(36) //0.apnsudpxq0 //10位数字符串 Math.random(). ...

  7. C语言生成0-9的6位数密码递归方法实现

    C语言生成0-9的6位数密码递归方法实现(简单高效) 这东西我想了很久,至少两天,我在百度上也没找到,所以我把我想的与大家分享下:不到位的,请各位大神原谅,大致思路如下:通过一个函数递归生成所的有6位 ...

  8. linux命令编写四位数密码本,详解Linux Shell 实现一个获取任意位数的随机密码的脚本...

    Shell 命令行,实现一个获取任意位数的随机密码的脚本 每次我们想要获得一个密码的时候都很头疼,于是我之前自己用nodejs写了一个 Shell 脚本.这两天在学习 bash Shell 所以,想用 ...

  9. python编写一个软件-python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

最新文章

  1. 《Head First Python》笔记 第四章 持久存储
  2. 2019春季学期第三周编程总结
  3. 不仅搞定“梯度消失”,还让CNN更具泛化性:港科大开源深度神经网络训练新方法
  4. 可以改动的option组件_uni-app WebView 组件通信
  5. jdk的安装与环境变量的配置
  6. 【渝粤题库】国家开放大学2021春2332高等数学基础题目
  7. Spring Boot-使用JDBC连接并检索数据库(Mysql在Docker中)
  8. openmp官方源码_Faiss 源码解析
  9. Delphi关于记录文件的操作-转
  10. 【华为云分享】应用系统迁移华为云评估
  11. Python练习:同符号数学运算
  12. drawpolygon收尾不连接_门窗施工全流程,80%的设计师都不了解!
  13. 用JAVA打出的计算机_如何用Java代码操作计算机文件?
  14. Matlab:实现高斯光束产生
  15. [458]抓取微信公众号(一)
  16. 洛谷 P1348 Couple number
  17. PCIe TLP的格式
  18. 芝麻粒助力,好友辅助攻略,快速获取芝麻粒攒芝麻粒攻略一个月至少30粒
  19. windows已经阻止此软件因为无法验证发行者,然后就是IE的控件iNetOffice5.CAB不能安装?
  20. Python 超简单格式化代码,仅需一行命令

热门文章

  1. linux下区分各种SCSI磁盘类型
  2. Meego系统全面解析
  3. Cosmos的发展之路
  4. linux+bypy 定时上传到百度云盘
  5. 华为AR路由器QOS限速命令
  6. Reddit的发帖注意事项和技巧
  7. 基于emp的 单表查询 练习题及答案
  8. 机器学习入门学习笔记(三)决策树
  9. Elasticsearch7.x 基本查询
  10. 新装EVE-NG使用wireshark出现connection abandoned