伪随机数-codesys的ST实现两种方法-CODESYS资源下载区-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 983|回复: 0

伪随机数-codesys的ST实现两种方法

[复制链接]
  • TA的每日心情
    开心
    2017-11-20 22:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2024-11-5 21:34:24 | 显示全部楼层 |阅读模式
    ST实现伪随机数的两种方法
    使用codesys的FUN函数块实现

    方法一:LCG算法,Seed= (Seed *259 + 147) MOD 27200
    (**********************************************变量区一**********************************************)
    VAR_IN_OUT
            Seed:dINT;
            Range_MinValue:REAL;
            Range_MaxValue:REAL;
    end_var
    var_output
            RandReal:REAL;
    END_VAR
    VAR
            SCALE_X:REAL;
            RandInt:dINT;
    END_VAR

    (*********************************************程序区一**********************************************)
    //算出的seed
            RandInt := (Seed *259 + 147) MOD 27200;
            Seed := RandInt;
    //把数据压缩到在0至1.0之间        
            RandReal := DINT_TO_REAL(RandInt)/ 27200.0;
    //设置区间后,输出区间值缩放:OUT = [VALUE * (MAX – MIN)] + MIN
    IF          Range_MinValue < Range_MaxValue  THEN
            SCALE_X :=RandReal*(Range_MaxValue-Range_Minvalue)+Range_Minvalue;
            RandReal := SCALE_X;
    END_IF


    方法二:使用系统时间纳秒
    (**********************************************变量区二**********************************************)
    FUNCTION NS_Random_R : real
    VAR_INPUT
            Range_MinValue:REAL;
            Range_MaxValue:REAL;
    end_var

    VAR CONSTANT
            udiMinUdint:UDINT:=0;//无符号双整数的最小值
            udiMaxUdint:UDINT:=16#ffffffff;//无符号双整数的最大值4294967295
    END_VAR

    VAR
            uliGetRtcNs: ULINT;        //获取系统时间纳秒变量,Alias SYSTIME: ULINT
            //udiGetRtcNsStatus: UDINT;//获取纳秒时间结果*)
            
    (*数据转换变量*)
            uliConvertValue0: UDINT;
            uliConvertValue1: UDINT;
            uliConvertValue2: UDINT;
            uliConvertValue3: UDINT;
            uliConvertValue4: UDINT;
            uliConvertValue:UDINT;
            
            rNORM_X:REAL;
            SCALE_X:REAL;

    END_VAR

    (**********************************************程序区二**********************************************)
    (*//读取PLC的系统时间纳秒读数,
    //然后取系统时间纳秒后四字节,并交换字节顺序:1234转为4321
    //再标准化之后压缩到0.0到1.0之间,
    //最后线性转化到设定范围内
    //未设置缩放范围,输出结果是在0到1.0之间*)

    (*读系统时间纳秒,纳秒是64位无符号长整型数*)
            //udiGetRtcNsStatus:=SysTimeGetNs(uliGetRtcNs);
            SysTimeGetNs(uliGetRtcNs);
    (*读出来的纳秒是8个字节无符号长整型数,取后四个字节,并交换字节顺序:1234转为4321*)
            uliConvertValue0:=ULINT_TO_UDINT(uliGetRtcNs);//把8字节无符号长整数转换成4字节无符号整数
            uliConvertValue1 := ROL(uliConvertValue0,24);//交换第1字节和第3字节
            uliConvertValue2 := ROL(uliConvertValue0,8);//交换第0字节和第2字节
            uliConvertValue3 := uliConvertValue1 AND 16#FF00FF00;
            uliConvertValue4 := uliConvertValue2 AND 16#00FF00FF;
            uliConvertValue := uliConvertValue3 OR uliConvertValue4;
            
    (*把变量的值映射到0.0~1.0之间,对其进行标准化*)
    //标准化公式:OUT = (VALUE – MIN) / (MAX – MIN)
            rNORM_X := UDINT_TO_REAL(uliConvertValue-udiMinUdint) /UDINT_TO_REAL(udiMaxUdint-udiMinUdint);
            NS_Random_R := rNORM_X;

    (*把标准化结果缩放到指定的取值范围(最小值和最大值之间)*)
    //先判断是否使用缩放区间
    //缩放公式:OUT = [VALUE * (MAX – MIN)] + MIN
    IF         Range_MinValue < Range_MaxValue  THEN
            SCALE_X :=rNORM_X*(Range_MaxValue-Range_Minvalue)+Range_Minvalue;
            NS_Random_R := SCALE_X;
    END_IF

    (**********************************************效果**********************************************)
    114539c7idzd7bsidsbddd.png

    114544nn2pzjph5i2p4pkj.png
    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-11-15 13:44 , Processed in 0.183652 second(s), 50 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表