衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PLC中隨機(jī)數(shù)產(chǎn)生的幾種方式

CHANBAEK ? 來源:頭條號(hào)朝拾憶 ? 作者:頭條號(hào)朝拾憶 ? 2023-03-23 13:50 ? 次閱讀

有時(shí)為了某些測(cè)試需求,需要仿真產(chǎn)生一些數(shù)據(jù)。 這時(shí),我們可以通過調(diào)取指令或自行編寫程序來生成這些隨機(jī)數(shù)據(jù)。

以下以博途為例,簡(jiǎn)要說明了隨機(jī)數(shù)產(chǎn)生的幾種方式:

一、讀取系統(tǒng)時(shí)間的納秒作為隨機(jī)數(shù)

以固定周期直接將系統(tǒng)時(shí)間中的納秒輸出到對(duì)應(yīng)變量。

系統(tǒng)時(shí)間中的納秒為UDINT類型,轉(zhuǎn)為INT后,丟棄了高字部分

監(jiān)視實(shí)時(shí)的系統(tǒng)時(shí)間,取其中的納秒(NANOSECOND,1秒=10^9納秒)

監(jiān)視一下生成的隨機(jī)數(shù)的范圍:-32258—32751(5分鐘)

后續(xù)可繼續(xù)對(duì)此數(shù)據(jù)處理,縮放到需要的區(qū)間。

二、由LGF庫(官方提供的通用函數(shù)庫)內(nèi)的隨機(jī)數(shù)程序生成

該指令原理也是采用納秒,不過處理過程更加細(xì)化、完善。

LGF庫

隨機(jī)數(shù)生成程序如下(只貼了其中關(guān)鍵的計(jì)算過程):

REGION Calculating random number
    // 將納秒轉(zhuǎn)換為雙字以便尋址單個(gè)字節(jié)
    #tempNanoSecondInDWord := UDINT_TO_DWORD(#tempTime.NANOSECOND);
    // 以片段訪問方式將納秒進(jìn)行字節(jié)交換
    #tempRandomValue.%B3 := #tempNanoSecondInDWord.%B0;
    #tempRandomValue.%B2 := #tempNanoSecondInDWord.%B1;
    #tempRandomValue.%B1 := #tempNanoSecondInDWord.%B2;
    #tempRandomValue.%B0 := #tempNanoSecondInDWord.%B3;
    // 隨機(jī)數(shù)標(biāo)準(zhǔn)化
    #tempNormReal := UDINT_TO_REAL(DWORD_TO_UDINT(#tempRandomValue)) / UDINT_TO_REAL(#MAX_UDINT);
    // 隨機(jī)數(shù)縮放
    #LGF_RandomRange_Real := ((#tempNormReal * (#maxValue - #minValue) + (#minValue)));
    #error := false;
    #status := #STATUS_FINISHED_NO_ERROR;
    #subfunctionStatus := #SUB_STATUS_NO_ERROR;
    // ENO mechanism is not used
    ENO := TRUE;
END_REGION

在主程序中調(diào)用,可設(shè)置上下限

三、線性同余法(LCG,Linear Congruential Method)

該方法的核心是以下遞歸公式:

RandNum =(A * RandNum + B)% M

A、B、M均為常數(shù),其中A是 乘數(shù) ,B是 增量 ,M是 模數(shù) ,RandNum是 初始值 ,A、C、M的取值是保證產(chǎn)生高質(zhì)量隨機(jī)數(shù)的關(guān)鍵。

可以看出,每次新產(chǎn)生的隨機(jī)數(shù)都跟上一次的數(shù)有關(guān)系。 隨機(jī)數(shù)序列中的初始值,我們通常叫做種子。 隨機(jī)數(shù)的產(chǎn)生需要設(shè)置種子,否則隨機(jī)數(shù)的結(jié)果每次運(yùn)行都將一樣。 通常,我們使用系統(tǒng)時(shí)間的納秒作為種子(某些將此作為缺省設(shè)置),這在一定程度上保證了種子的唯一性。

由于計(jì)算過程最后是對(duì)M取余數(shù),余數(shù)的范圍就是0—(M-1),這決定了產(chǎn)生的隨機(jī)數(shù)是有周期性的。 M的大小決定了最大周期的長短,一般取值域的最大值,而A和B也會(huì)影響周期。 A、B、M的選取多種多樣,只要保證產(chǎn)生的隨機(jī)數(shù)有較好的均勻性和隨機(jī)性即可。

FC塊,變量定義為雙整型。 模數(shù)M可以取值域最大值2^32

種子seed可以采用系統(tǒng)時(shí)間或自行設(shè)置

隨機(jī)數(shù)曲線

線性同余法的初始值一旦確定,輸出的序列將固定。 而當(dāng)獲取某些隨機(jī)數(shù)序列后,其初始值以及A、B、M也會(huì)被反向計(jì)算出來。

對(duì)于其缺點(diǎn),可以考慮以下改進(jìn)方式,每產(chǎn)生n個(gè)數(shù),將當(dāng)前時(shí)鐘值MOD M得到的余數(shù)作為新的種子。

四、平方取中法

平方取中法由馮·諾依曼提出,它的原理是:首先取一個(gè)2s位的整數(shù)(種子),平方,得4s位整數(shù),然后取此4s位中間的2s位作為下次運(yùn)算的種子。 重復(fù)該過程,即可得到一個(gè)隨機(jī)數(shù)序列。 (序列中每個(gè)數(shù)縮放至0.0—1.0范圍內(nèi))

例如:取種子365,平方得133225,高位補(bǔ)0,取中間1332,平方得1774224,高位補(bǔ)0,取7742,以此類推.........

#RandInt := SQR(#Seed);
#Seed := (#RandInt MOD 1000000 - #RandInt MOD 100) / 100;
#RandReal := DINT_TO_REAL(#Seed) / 9999.0;

隨機(jī)數(shù)測(cè)試結(jié)果

在實(shí)踐中,這種方法其實(shí)并不好用。 很難說明取什么種子才能保證足夠長的周期。 以種子123為例,在40多個(gè)周期后,種子末位便退化產(chǎn)生了00,之后的隨機(jī)數(shù)成了固定的幾個(gè)數(shù)值,周期極短。 該算法也有改進(jìn)空間。

梅森旋轉(zhuǎn)算法_Mersenne Twister

梅森旋轉(zhuǎn)算法可以產(chǎn)生高質(zhì)量的偽隨機(jī)數(shù),且效率高效,彌補(bǔ)了以上偽隨機(jī)數(shù)生成器的不足和缺陷。 它在C++Python編程語言中均有應(yīng)用。

理解該算法前需要先了解許多前置名詞,線性反饋移位寄存器、級(jí)、反饋函數(shù)、抽頭序列、本原多項(xiàng)式...... 實(shí)在有興趣的可以搜索一下。 我,放棄了。

說到隨機(jī)數(shù),不禁想到了因果律:果由因生、有依空立 、事待理成。

所謂的“隨機(jī)”,大概不過是事物發(fā)展中的個(gè)體因?yàn)?a target="_blank">信息偏差,產(chǎn)生的局限認(rèn)知。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • plc
    plc
    +關(guān)注

    關(guān)注

    5016

    文章

    13388

    瀏覽量

    465422
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7145

    瀏覽量

    89583
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4124

    瀏覽量

    133998
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3796

    瀏覽量

    81418
  • 隨機(jī)數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    12048
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    matlab中產(chǎn)生隨機(jī)數(shù)的十七種方式

    ) 的該分布的隨機(jī)數(shù)。例如: (1) R = random('Normal',0,1,2,4): 生成期望為 0,標(biāo)準(zhǔn)差為 1 的(2 行 4 列)2× 4 個(gè)正態(tài)隨機(jī)數(shù) (2) R
    發(fā)表于 01-16 11:05

    keil 產(chǎn)生 隨機(jī)數(shù)

    最近需要用 keil 軟件產(chǎn)生一個(gè)0-10的隨機(jī)數(shù),請(qǐng)各位大神指點(diǎn)下,有原代碼參考的話就更好了
    發(fā)表于 03-12 20:53

    怎么產(chǎn)生更大范圍的隨機(jī)數(shù)

    labview提供了產(chǎn)生0-1的隨機(jī)數(shù)函數(shù),怎么產(chǎn)生更大的范圍的隨機(jī)數(shù)
    發(fā)表于 10-26 21:17

    STM32的ADC產(chǎn)生隨機(jī)數(shù)

    本帖最后由 sunhongdd26 于 2015-7-14 09:58 編輯 因?yàn)樵谧鲆粯訓(xùn)|西需要產(chǎn)生隨機(jī)數(shù),范圍在[0,15],在網(wǎng)上找到一種方法,就是利用ADC懸空引腳產(chǎn)生隨機(jī)數(shù)
    發(fā)表于 02-28 11:58

    隨機(jī)數(shù)產(chǎn)生小程序求助

    剛開始學(xué)習(xí)Labview,想做一個(gè)小程序:打開布爾開關(guān),自動(dòng)產(chǎn)生0-10范圍內(nèi)的隨機(jī)數(shù),輸出數(shù)值控件一直刷新隨機(jī)數(shù),開關(guān)關(guān)閉后,隨機(jī)數(shù)停止刷新,輸出控件顯示最后一個(gè)
    發(fā)表于 04-18 23:50

    單片機(jī)C語言如何產(chǎn)生隨機(jī)數(shù)

    單片機(jī)C語言如何產(chǎn)生隨機(jī)數(shù) 隨機(jī)數(shù)在單片機(jī)的應(yīng)用也是很多的,當(dāng)然產(chǎn)生隨機(jī)數(shù)的方法有很多,當(dāng)中有
    發(fā)表于 05-14 15:14

    產(chǎn)生隨機(jī)數(shù)的方法有哪些

    隨機(jī)數(shù)在單片機(jī)的應(yīng)用也是很多的,當(dāng)然產(chǎn)生隨機(jī)數(shù)的方法有很多,當(dāng)中有一個(gè)就是利用單片機(jī)定時(shí)器,取出未知的定時(shí)器THX和TLX的值,再加以運(yùn)算得到一個(gè)規(guī)定范圍內(nèi)的
    發(fā)表于 07-15 09:08

    AT32的隨機(jī)數(shù)產(chǎn)生

    AT32的隨機(jī)數(shù)產(chǎn)生為設(shè)計(jì)者使用AT32芯片時(shí),產(chǎn)生符合應(yīng)用需求的隨機(jī)數(shù),提供設(shè)計(jì)建議。
    發(fā)表于 10-26 06:04

    產(chǎn)生隨機(jī)數(shù)

    一個(gè)自己寫的產(chǎn)生隨機(jī)數(shù)的工程
    發(fā)表于 12-01 15:45 ?13次下載

    單片機(jī)產(chǎn)生隨機(jī)數(shù)的方法

    隨機(jī)數(shù)在單片機(jī)的應(yīng)用也是很多的,當(dāng)然產(chǎn)生隨機(jī)數(shù)的方法有很多,當(dāng)中有一個(gè)就是利用單片機(jī)定時(shí)器,取出未知的定時(shí)器THX和TLX的值,再加以運(yùn)算得到一個(gè)規(guī)定范圍內(nèi)的
    發(fā)表于 02-23 10:37 ?2.2w次閱讀

    單片機(jī)產(chǎn)生隨機(jī)數(shù)的兩種方法

    隨機(jī)數(shù)在單片機(jī)的應(yīng)用也是很多的,當(dāng)然產(chǎn)生隨機(jī)數(shù)的方法有很多,當(dāng)中有一個(gè)就是利用單片機(jī)定時(shí)器,取出未知的定時(shí)器THX和TLX的值,再加以運(yùn)算得到一個(gè)規(guī)定范圍內(nèi)的
    發(fā)表于 03-01 11:04 ?2337次閱讀

    單片機(jī)C語言如何產(chǎn)生隨機(jī)數(shù)

    C語言中有三個(gè)通用的隨機(jī)數(shù)發(fā)生器,分別為 rand函數(shù)、random函數(shù)、randomize 函數(shù),但是rand函數(shù)產(chǎn)生的并不是真意正義上的隨機(jī)數(shù),是一個(gè)偽隨機(jī)數(shù),是根據(jù)一個(gè)
    的頭像 發(fā)表于 11-26 14:25 ?7606次閱讀

    STM8單片機(jī)產(chǎn)生隨機(jī)數(shù)

    最近需要用到單片機(jī)隨機(jī)數(shù),但是用rand()產(chǎn)生隨機(jī)數(shù),發(fā)現(xiàn)每次單片機(jī)上電時(shí)產(chǎn)生隨機(jī)數(shù)都是一樣的,沒有實(shí)現(xiàn)真正的
    發(fā)表于 11-23 17:21 ?13次下載
    STM8單片機(jī)<b class='flag-5'>產(chǎn)生</b><b class='flag-5'>隨機(jī)數(shù)</b>

    單片機(jī)C語言如何產(chǎn)生隨機(jī)數(shù)

    隨機(jī)數(shù)在單片機(jī)的應(yīng)用也是很多的,當(dāng)然產(chǎn)生隨機(jī)數(shù)的方法有很多,當(dāng)中有一個(gè)就是利用單片機(jī)定時(shí)器,取出未知的定時(shí)器THX和TLX的值,再加以運(yùn)算得到一個(gè)規(guī)定范圍內(nèi)的
    發(fā)表于 02-08 17:12 ?11次下載
    單片機(jī)C語言如何<b class='flag-5'>產(chǎn)生</b><b class='flag-5'>隨機(jī)數(shù)</b>

    PLC輸出0~100之間的隨機(jī)數(shù)編寫

    由于西門子PLC不提供隨機(jī)數(shù)相關(guān)函數(shù),在需要用到隨機(jī)數(shù)的情況下,只能自己手動(dòng)去寫,下面來教大家寫一個(gè)簡(jiǎn)單的0~100之間的隨機(jī)數(shù)
    發(fā)表于 10-11 12:22 ?4153次閱讀
    <b class='flag-5'>PLC</b>輸出0~100之間的<b class='flag-5'>隨機(jī)數(shù)</b>編寫
    太阳城的故事| 安阳百家乐赌博| 百家乐官网休闲游戏| 百家乐游戏唯一官网网站| 什么是百家乐官网平注法| 大发888娱乐场大发888娱乐场下载| 游戏百家乐押发| 百家乐官网3宜3忌| 威尼斯人娱乐城会员注册| 真人百家乐官网是真的吗| KK娱乐城| 百家乐路单怎样| 怎样打百家乐官网的玩法技巧和规则 | 百家乐官网游戏如何玩| 大发888棋牌官网| 真人百家乐是啥游戏| 新时代娱乐城开户| 香港百家乐玩| 娱乐百家乐官网下载| 百家乐官网注码管理| 大发888站| 百家乐赌博是否违法| 百家乐官网发牌牌规| 博网百家乐官网现金网| 大发888casino组件下载| 百家乐mediacorp| 百家乐官网电子路单谁| 大渡口区| 360棋牌游戏| 环球百家乐官网的玩法技巧和规则 | CEO百家乐娱乐城| 百家乐娱乐城网站| 百家乐官网路子分| 百家乐官网的技术与心态| 金都娱乐场| 水果机价格| 赌博百家乐技巧| 博彩百家乐官网组选六六组 | 百家乐投注网出租| 百家乐棋牌正式版| 做生意门朝向什么方向|