ycllzl1314
級別: 探索解密
|
遇到點問題,請師傅們幫忙看看。 有D1 D2 D3 `````D10 一共10個寄存器數(shù)據(jù),有常數(shù)K, 10個寄存器數(shù)據(jù)順序排放,每次N個相加,要求(D1+D2+DN )最大并且小于 K,求N 如果用PLC寫上面的程序,該怎么寫,一點思路都沒有,PLC用松下的 |
---|---|
|
ycllzl1314
級別: 探索解密
|
每次從D1開始 N個數(shù)相加,結(jié)果與K比較,符合條件取最大,這是一個思路,查了下,西門子PLC可以做到, 不知道松下能不能做到 |
---|---|
|
xingzb2
級別: 論壇先鋒
|
用10個d代表是10個相加結(jié)果,n位相加結(jié)果小于K,且n+1>k,輸出結(jié)果就行了 (LD m8000 ,add d1 d2 d32。。。。。。。。。) 意思是 d1+d2=d32 。。。 。。。 d32+d3=d33 。。。 d33+d4=d34 。。。 。。。。 D39+D10=d40 條件ld m8000 -- (<D102 Kn)---(>d103 Kn)。。。。 意思是d102小于常數(shù)K,而D103大于常數(shù)K時,把2傳送到d100當(dāng)中 輸出mov k2 d100 最后讀出d100的數(shù)據(jù)就行了xxx |
---|---|
|
lvpretend
級別: 論壇先鋒
|
沒看懂: 10個寄存器數(shù)據(jù)順序排放,每次N個相加,要求(D1+D2+DN )最大并且小于 K,求N。 既然每次有N個數(shù)相加,為什么有要求(D1+D2+DN)三個數(shù)了。 你是不是說的N個數(shù)相加,小于K,最大的組合,要求全部組合還是一個就行(因為可能出現(xiàn)多個結(jié)果相同)? 這是個排列組合呀!計算量有點大。 首先,10個數(shù)N1,N2,N3,N4,N5,N6,N7,N8,N9,N10。 再定義10個緩沖區(qū)A1,,,,,,,,A10,10個緩沖區(qū)相加,A1+A2+,,,,,,,+A10 N1,,,,,N10可以對應(yīng)分別移入A1,,,,A10,具體移動幾個數(shù),看情況。不移入的,填寫0. 如何確定哪些要移入呢? 設(shè)一個可以位操作的16位數(shù)D(其實只需使用低10位),對這個數(shù)每次加1,直到10位完成,2^10=1024,也就是要做1024次。 每次計算結(jié)果判斷大于K,丟棄。小于K,結(jié)果存放到一個中間暫存變量中(定義MAX),且把這個D也存入一個數(shù)據(jù)隊列中。 D由1開始計算,1的16位二進制編碼為0000 0000 0000 0001 先把A1,,,A10清0 那么按位尋址D-M1位1,則把N1移入A1,其它為0則不移動 A1,,,,A10累加,結(jié)果與K比較,大于K,不管,小于K,存入。 下一個循環(huán), A1,,,A10清零 D+1=2,二進制編碼為0000 0000 0000 0010 把N2,移入A2,再累加,,,,, 現(xiàn)在你懂了吧,也就是把1024種組合全部計算完,就可以找出全部符合你要求的數(shù)。 當(dāng)然這個算法不夠簡練,是最笨的方法,但編程會方便些。其它算法會復(fù)雜些,計算速度也要快些,但編程不方便。 這個用時間中斷來寫,比如1mS中斷一次,這樣在1S多點就能求出結(jié)果。 |
---|---|
|