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

读取本地时间的纳秒时间,计算取余数得到随机数
1. 变量声明,定义

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

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

3. UDINT随机数生成

//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的结果,寻址到字符仓库中的对应字符

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

5. 整体代码如下

//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];

posted @ 2024-05-13 13:25  不愿透露姓名的小村村  阅读(11)  评论(0编辑  收藏  举报