[西门子] SCL编程实例100例-034-利用系统时间生成随机数

[复制链接]
查看111 | 回复0 | 2024-12-11 08:10:18 | 显示全部楼层 |阅读模式
>

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的使用方法

-

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则