随机数生成器,支持Udint和Char两个格式

读取本地时间的纳秒时间,计算取余数得到随机数

1. 变量声明,定义

2. 模式选择,支持UDINT和CHAR

  • CHAR仓库定义了72个字符,由自定的字符串长度决定的
  • char没有从0开始;PLC字符串长度为(2+n);第一个byte保存的是最大长度,第二个是当前长度,后面才是用户指定的长度,如string[78]总占用长度80个bytes。
    1
    2
    3
    4
    5
    6
    7
    8
    //mode transfer
    IF NOT #udintORchar THEN
    #min := #In_min;
    #max := #In_max;
    ELSE
    #min := 1;
    #max := 72;
    END_IF;

3. UDINT随机数生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//udint random
IF #min >= 0 AND #max > #min THEN
#return_int := RD_LOC_T(#myDtl);
#random_static := (#myDtl.NANOSECOND * 7 + #myDtl.SECOND) MOD #max;
IF #random_static < #min THEN
#random_static := #min;
END_IF;
#Out_udint_random := #random_static;
#Out_status := #ERROR_CODE1;
ELSIF #min < 0 THEN
#Out_status := #ERROR_CODE2;
ELSIF #min >= #max THEN
#Out_status := #ERROR_CODE3;
END_IF;

4. 基于UDINT的结果,寻址到字符仓库中的对应字符

1
2
3
4
//char random
#CharRepertoire :=
'qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM-=[];_>/<!';
#Out_char_random := #CharRepertoire[#random_static];

5. 整体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//mode transfer
IF NOT #udintORchar THEN
#min := #In_min;
#max := #In_max;
ELSE
#min := 1;
#max := 72;
END_IF;

//udint random
IF #min >= 0 AND #max > #min THEN
#return_int := RD_LOC_T(#myDtl);
#random_static := (#myDtl.NANOSECOND * 7 + #myDtl.SECOND) MOD #max;
IF #random_static < #min THEN
#random_static := #min;
END_IF;
#Out_udint_random := #random_static;
#Out_status := #ERROR_CODE1;
ELSIF #min < 0 THEN
#Out_status := #ERROR_CODE2;
ELSIF #min >= #max THEN
#Out_status := #ERROR_CODE3;
END_IF;

//char random
#CharRepertoire :=
'qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM-=[];_>/<!';
#Out_char_random := #CharRepertoire[#random_static];


随机数生成器,支持Udint和Char两个格式
http://example.com/2024/07/21/随机数生成器,支持Udint和Char两个格式/
作者
xiao cuncun
发布于
2024年7月21日
许可协议