liangyangli
級(jí)別: 家園常客
|
S7200 PLC都沒(méi)有隨機(jī)函數(shù)指令,但有時(shí)工藝還是需要的,如何生成呢?求高手指教 |
---|---|
|
cvlsam
富士低壓,POD(觸摸屏),PLC專賣
級(jí)別: VIP會(huì)員
|
先描述一下何種工藝需要隨機(jī)數(shù),難道雙色球?然后我告訴你如何生成偽隨機(jī)數(shù)的方法。 Good Luck~ |
---|---|
|
月澤
時(shí)間嘛!就象乳溝,擠一擠總歸還是有的!
級(jí)別: 工控俠客
|
我感覺(jué) 樓主在搞什么賭博機(jī)啊 哈哈 |
|
---|---|---|
|
shfxfa
級(jí)別: 家園常客
|
產(chǎn)生隨機(jī)數(shù)的話應(yīng)該是搞賭博機(jī),而且這個(gè)隨機(jī)數(shù)是可控的,我以前有個(gè)同事用三菱的PLC加觸摸屏做過(guò),有大奔寶馬奧迪捷達(dá)啥的。 |
---|---|
|
zedy888
回收 西門子PLC,存儲(chǔ)卡,觸摸屏,變頻器
級(jí)別: 家園常客
|
恰好本人也對(duì)此有過(guò)研究,現(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ù)是怎么來(lái)的呢?這就是線性同余法中必須用的的”種子",也就是說(shuō),給定某個(gè)種子后,所產(chǎn)生的隨機(jī)數(shù)序列是固定的,在計(jì)算機(jī)編程中,一般使用系統(tǒng)時(shí)間來(lái)初始化種子,就是前面代碼中的 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 的指令表示出來(lái)就行了。 這兩個(gè)子程序是從 MicroWIN V4.0 中導(dǎo)出來(lái)的,可以將它們用文本編輯器保存為 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í)鐘的分秒來(lái)作為種子 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重新編輯 ] |
|
---|---|---|
|