liangyangli
級(jí)別: 家園?
精華主題: 0
發(fā)帖數(shù)量: 18 個(gè)
工控威望: 560 點(diǎn)
下載積分: 848 分
在線時(shí)間: 183(小時(shí))
注冊(cè)時(shí)間: 2009-11-25
最后登錄: 2014-09-03
查看liangyangli的 主題 / 回貼
樓主  發(fā)表于: 2013-04-05 01:04
  S7200  PLC都沒有隨機(jī)函數(shù)指令,但有時(shí)工藝還是需要的,如何生成呢?求高手指教

zedy888
回收 西門子PLC,存儲(chǔ)卡,觸摸屏,變頻器
級(jí)別: 家園常客
精華主題: 0
發(fā)帖數(shù)量: 1254 個(gè)
工控威望: 709 點(diǎn)
下載積分: 750 分
在線時(shí)間: 1200(小時(shí))
注冊(cè)時(shí)間: 2010-09-23
最后登錄: 2024-10-22
查看zedy888的 主題 / 回貼
1樓  發(fā)表于: 2013-04-06 17:41
恰好本人也對(duì)此有過研究,現(xiàn)貼出供大家研究,可以用狀態(tài)圖監(jiān)控效果。
偽隨機(jī)數(shù)的產(chǎn)生,現(xiàn)在用得較多的是“線性同余法"  公式 = R(n+1) = [R(n) * a + b]  mod  c  為使隨機(jī)數(shù)分布盡量均勻,a、b 均為質(zhì)數(shù), c 一般取值域內(nèi)的最大值(mod 是求余數(shù))  從這個(gè)式了可以看出,每次產(chǎn)生的隨機(jī)數(shù)都跟上一次產(chǎn)生的數(shù)有關(guān)系,那么,第一個(gè)數(shù)是怎么來的呢?這就是線性同余法中必須用的的”種子",也就是說,給定某個(gè)種子后,所產(chǎn)生的隨機(jī)數(shù)序列是固定的,在計(jì)算機(jī)編程中,一般使用系統(tǒng)時(shí)間來初始化種子,就是前面代碼中的 srand((unsigned)time(NULL)); 這一句了。因?yàn)槊看芜\(yùn)行程序的時(shí)間肯定不一樣,所以產(chǎn)生散列肯定也不一樣,從而達(dá)到“隨機(jī)”的目的。  a,b,c 的取值我用的是 a=3373, b=1, c=32768 下面的兩個(gè)子程序是我在我的項(xiàng)目(S7-200 226)中產(chǎn)生隨機(jī)的系統(tǒng)編號(hào)用的,因?yàn)槲业木幪?hào)中只有4位數(shù)采用了隨機(jī)數(shù),所以下面的程序中用的是整型,最大范圍為32767。如果需要更寬范圍的隨機(jī)數(shù),可以采用雙字類型,并適當(dāng)修改程序,代碼很簡(jiǎn)單,就是將上面那個(gè)表達(dá)式用 S7-200 的指令表示出來就行了。  這兩個(gè)子程序是從 MicroWIN V4.0 中導(dǎo)出來的,可以將它們用文本編輯器保存為 AWL 文件后直接導(dǎo)入 MicroWIN。  使用時(shí)在第一個(gè)掃描周期調(diào)用  Srand 初始種子,需要隨機(jī)數(shù)的地方調(diào)用 Random Random 有了個(gè)最大范圍參數(shù),可以限制生成的隨機(jī)數(shù)的最大范圍,比如我只需要4位隨機(jī)數(shù),所以一般這樣調(diào)用   CALL  Random, 10000, vw0,生成的數(shù)就在 0-9999 范圍內(nèi)  下面是代碼: SUBROUTINE_BLOCK Srand:SBR17 TITLE=初始化隨機(jī)數(shù)種子 //  // 直接使用系統(tǒng)時(shí)鐘的分秒來作為種子 VAR_OUTPUT seed:WORD; END_VAR BEGIN Network 1  LD     SM0.0  TODR   VB1990  Network 2  LD     SM0.0 BTI    VB1994, AC1 SLW    AC1, 8  BTI    VB1995, AC3 +I     AC3, AC1  MOVW   AC1, LW0  END_SUBROUTINE_BLOCK  SUBROUTINE_BLOCK Random:SBR16 TITLE=隨機(jī)數(shù)發(fā)生器 //  // 線性同余法獲取偽隨機(jī)數(shù),范圍:0~32767 //  // seed = (seed * 3373 + 1) % 32768; //  VAR_INPUT wMax:WORD; // 最大范圍 END_VAR VAR_OUTPUT wOut:WORD; END_VAR BEGIN Network 1  // wSeed * 3373 + 1  => AC1 LD     SM0.0  ITD    VW1940, AC1 *D     3373, AC1 INCD   AC1  Network 2  // AC1 mod 32768 => wSeed LD     SM0.0  MOVD   AC1, AC3 /D     +32768, AC3 *D     32768, AC3 -D     AC3, AC1  DTI    AC1, VW1940  Network 3  // wSeed / 32768 * wMax => wOut LD     SM0.0 DTR    AC1, AC1 /R     32768.0, AC1  ITD    LW0, AC3 DTR    AC3, AC3 *R     AC3, AC1  ROUND  AC1, AC1 DTI    AC1, LW2  END_SUBROUTINE_BLOCK
[ 此帖被zedy888在2013-04-06 17:50重新編輯 ]
長期回收西門子 PLC  變頻器,觸摸屏,成套伺服等,電微:I8I2I923860注明二手電氣