liangyangli
級別: 家園常客
|
S7200 PLC都沒有隨機函數指令,但有時工藝還是需要的,如何生成呢?求高手指教 |
---|---|
|
cvlsam
富士低壓,POD(觸摸屏),PLC專賣
級別: VIP會員
|
先描述一下何種工藝需要隨機數,難道雙色球?然后我告訴你如何生成偽隨機數的方法。 Good Luck~ |
---|---|
|
月澤
時間嘛!就象乳溝,擠一擠總歸還是有的!
級別: 工控俠客
|
我感覺 樓主在搞什么賭博機啊 哈哈 |
|
---|---|---|
|
shfxfa
級別: 家園常客
|
產生隨機數的話應該是搞賭博機,而且這個隨機數是可控的,我以前有個同事用三菱的PLC加觸摸屏做過,有大奔寶馬奧迪捷達啥的。 |
---|---|
|
zedy888
回收 西門子PLC,存儲卡,觸摸屏,變頻器
級別: 家園常客
|
恰好本人也對此有過研究,現貼出供大家研究,可以用狀態圖監控效果。 偽隨機數的產生,現在用得較多的是“線性同余法" 公式 = R(n+1) = [R(n) * a + b] mod c 為使隨機數分布盡量均勻,a、b 均為質數, c 一般取值域內的最大值(mod 是求余數) 從這個式了可以看出,每次產生的隨機數都跟上一次產生的數有關系,那么,第一個數是怎么來的呢?這就是線性同余法中必須用的的”種子",也就是說,給定某個種子后,所產生的隨機數序列是固定的,在計算機編程中,一般使用系統時間來初始化種子,就是前面代碼中的 srand((unsigned)time(NULL)); 這一句了。因為每次運行程序的時間肯定不一樣,所以產生散列肯定也不一樣,從而達到“隨機”的目的。 a,b,c 的取值我用的是 a=3373, b=1, c=32768 下面的兩個子程序是我在我的項目(S7-200 226)中產生隨機的系統編號用的,因為我的編號中只有4位數采用了隨機數,所以下面的程序中用的是整型,最大范圍為32767。如果需要更寬范圍的隨機數,可以采用雙字類型,并適當修改程序,代碼很簡單,就是將上面那個表達式用 S7-200 的指令表示出來就行了。 這兩個子程序是從 MicroWIN V4.0 中導出來的,可以將它們用文本編輯器保存為 AWL 文件后直接導入 MicroWIN。 使用時在第一個掃描周期調用 Srand 初始種子,需要隨機數的地方調用 Random Random 有了個最大范圍參數,可以限制生成的隨機數的最大范圍,比如我只需要4位隨機數,所以一般這樣調用 CALL Random, 10000, vw0,生成的數就在 0-9999 范圍內 下面是代碼: SUBROUTINE_BLOCK Srand:SBR17 TITLE=初始化隨機數種子 // // 直接使用系統時鐘的分秒來作為種子 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=隨機數發生器 // // 線性同余法獲取偽隨機數,范圍: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重新編輯 ] |
|
---|---|---|
|