暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SCL编程实例100例-034-利用系统时间生成随机数

工控老炮儿 2022-12-03
413

1 | 题目



利用PLC系统时间构造一个生成随机数的函数(范围0-1之间的浮点数)。本例摘自西门子LGF通用函数库中的一个基本随机数生成函数。



2 | 设计分析



读取PLC的系统时间会得到一个长度12字节的数据类型为DTL的日期和时间值,该值的8-11四个字节为纳秒,由于纳秒的快速变化很难预测到下一个值是什么,认为其为一个随机数。



3 | 创建功能或功能块



创建功能块FB,命名为“RandomNumReal”。




4 | 定义接口变量



具体接口变量定义见下图:

静态变量#statByte0-#statByte3和#statCountQ用来做测试用,和生成随机数本身无关。常量#MIN_UDINT和#MAX_UDINT用来将随机数线性映射到0-1之间。



5 | 程序代码



编写程序代码。如下图:


程序中注意到纳秒占用了四个字节,随机值并未直接使用纳秒的无符号双整型数(UDINT),而是将四个字节进行了反序,这个是因为纳秒最大值为999_999_999,而无符号双整型数(UDINT)最大值是4_294_967_295,所以如果不进行反序直接使用的话映射到0-1之间得到的最大随机数为0.2328,不能满足要求。如果对999_999_999进行反序最大值就变为4_288_457_139,这个就非常接近4_294_967_295,这样得到的最大随机数为0.9985,非常接近1。需要强调的是以上生成的是随机性并不高的伪随机数,下一篇将介绍另外一种随机性稍有提高的伪随机数的生成方法。



6 | 代码测试



在循环OB中调用FB-“RadomNumReal”,调用时会自动创建背景数据块,命名为“InstRadomNumReal”,该背景数据块可以用来监视和修改数据。转至在线并监控程序。如下图:

以上创建了一个快照,刚好记录到了纳秒的第0字节达到最大值255,得到的随机数为0.997867。



7 | 总结



学习IF..ELSE条件语句;

学习多赋值的方法;

学习读取系统时间指令RD_SYS_T的使用方法;

学习线性标准化NORM_X的使用方法

- END -

工控老炮儿


分享 | 咨询 | 合作 | 共赢

文章转载自工控老炮儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论