西門子S7-200 PLC由“冒泡法”排序算法的逆向思考
在一些C語言資料上看到,“冒泡法”排序一般是從最后一個(gè)數(shù)據(jù)開始,向地址小的方向相鄰兩個(gè)數(shù)據(jù)比較,并按照從小到大或者從大到小排序的一種算法。在數(shù)據(jù)比較、移動(dòng)的過程中,數(shù)據(jù)的運(yùn)動(dòng),看起來好像水中的氣泡向上運(yùn)動(dòng)。故而稱之為“冒泡法”排序。
“冒泡法”排序,在知道數(shù)據(jù)的起始地址、數(shù)據(jù)個(gè)數(shù)、數(shù)據(jù)類型后,需要算出最后一個(gè)數(shù)據(jù)的地址,并從最后的一個(gè)地址開始運(yùn)算排序。我在想,為什么不能從數(shù)據(jù)的起始地址開始排序呢,如果采用這種“下沉法”排序,還能省去計(jì)算數(shù)據(jù)的結(jié)束地址,程序應(yīng)該會(huì)更簡潔。于是自己就試著寫了一下“下沉法”排序的PLC程序代碼,并測試通過。
排序環(huán)境:224CPU,從VB1000開始連續(xù)20個(gè)整數(shù),從小到大排序?!跋鲁练ā迸判蛩惴▍⒖即a如下:
//******************給外循環(huán)體、內(nèi)循環(huán)體的循環(huán)次數(shù)賦初值***********************
LD SM0.0 //開始執(zhí)行從小到大的排序程序
MOVW 19, LW2 //給外循環(huán)次數(shù)(數(shù)據(jù)個(gè)數(shù)-1)賦初值
MOVW 19, LW6 //給內(nèi)循環(huán)次數(shù)(數(shù)據(jù)個(gè)數(shù)-1)賦初值
//*******************建立外循環(huán)體并定義排序的其實(shí)地址*****************************
FOR LW0, +1, LW2 //FOR外循環(huán)體循執(zhí)行LW2次
MOVD &VB1000, AC1 //將V區(qū)的起始地址賦給AC1,定義排序的起始地址
//**************建立內(nèi)循環(huán)體并開始進(jìn)行相鄰的兩個(gè)數(shù)據(jù)比較、移動(dòng)****************
FOR LW4, +1, LW6 //FOR內(nèi)循環(huán)體循執(zhí)行LW6次
MOVD AC1, AC2 //把當(dāng)前AC1里面的地址存儲(chǔ)到AC2里面
+D +2, AC2 //AC2當(dāng)前地址+2,存入AC2
LDW< *AC2, *AC1 //如果AC2指向的地址里面的內(nèi)容小于AC1指向的地址里面的內(nèi)容
MOVW *AC1, LW8 //那么將當(dāng)前兩個(gè)地址里面的內(nèi)容互換
MOVW *AC2, LW10 //如果AC2指向的地址里面的內(nèi)容不小于AC1指向的地址里面的內(nèi)容
MOVW LW8, *AC2 //那么當(dāng)前兩個(gè)地址里面的內(nèi)容保持不變
MOVW LW10, *AC1 //如果把小于比較指令改成大于比較指令,那么數(shù)據(jù)就是從大到小排序
LD SM0.0
+D +2, AC1 //AC1當(dāng)前地址+2,存入AC1
NEXT //跳轉(zhuǎn)到FOR內(nèi)循環(huán),如果內(nèi)循環(huán)執(zhí)行結(jié)束,程序往下執(zhí)行
//*******************內(nèi)循環(huán)執(zhí)行結(jié)束,進(jìn)入外循環(huán)執(zhí)行*****************************
DECW LW6 //內(nèi)循環(huán)體執(zhí)行結(jié)束,將內(nèi)循環(huán)體的循環(huán)次數(shù)減1
NEXT //跳轉(zhuǎn)到FOR外循環(huán),如果外循環(huán)執(zhí)行結(jié)束,程序往下執(zhí)行
上面代碼基本采用臨時(shí)變量作運(yùn)算的,其實(shí)還可以將其封裝成一個(gè)子程序,實(shí)現(xiàn)多次調(diào)用。
“冒泡法”排序,在知道數(shù)據(jù)的起始地址、數(shù)據(jù)個(gè)數(shù)、數(shù)據(jù)類型后,需要算出最后一個(gè)數(shù)據(jù)的地址,并從最后的一個(gè)地址開始運(yùn)算排序。我在想,為什么不能從數(shù)據(jù)的起始地址開始排序呢,如果采用這種“下沉法”排序,還能省去計(jì)算數(shù)據(jù)的結(jié)束地址,程序應(yīng)該會(huì)更簡潔。于是自己就試著寫了一下“下沉法”排序的PLC程序代碼,并測試通過。
排序環(huán)境:224CPU,從VB1000開始連續(xù)20個(gè)整數(shù),從小到大排序?!跋鲁练ā迸判蛩惴▍⒖即a如下:
//******************給外循環(huán)體、內(nèi)循環(huán)體的循環(huán)次數(shù)賦初值***********************
LD SM0.0 //開始執(zhí)行從小到大的排序程序
MOVW 19, LW2 //給外循環(huán)次數(shù)(數(shù)據(jù)個(gè)數(shù)-1)賦初值
MOVW 19, LW6 //給內(nèi)循環(huán)次數(shù)(數(shù)據(jù)個(gè)數(shù)-1)賦初值
//*******************建立外循環(huán)體并定義排序的其實(shí)地址*****************************
FOR LW0, +1, LW2 //FOR外循環(huán)體循執(zhí)行LW2次
MOVD &VB1000, AC1 //將V區(qū)的起始地址賦給AC1,定義排序的起始地址
//**************建立內(nèi)循環(huán)體并開始進(jìn)行相鄰的兩個(gè)數(shù)據(jù)比較、移動(dòng)****************
FOR LW4, +1, LW6 //FOR內(nèi)循環(huán)體循執(zhí)行LW6次
MOVD AC1, AC2 //把當(dāng)前AC1里面的地址存儲(chǔ)到AC2里面
+D +2, AC2 //AC2當(dāng)前地址+2,存入AC2
LDW< *AC2, *AC1 //如果AC2指向的地址里面的內(nèi)容小于AC1指向的地址里面的內(nèi)容
MOVW *AC1, LW8 //那么將當(dāng)前兩個(gè)地址里面的內(nèi)容互換
MOVW *AC2, LW10 //如果AC2指向的地址里面的內(nèi)容不小于AC1指向的地址里面的內(nèi)容
MOVW LW8, *AC2 //那么當(dāng)前兩個(gè)地址里面的內(nèi)容保持不變
MOVW LW10, *AC1 //如果把小于比較指令改成大于比較指令,那么數(shù)據(jù)就是從大到小排序
LD SM0.0
+D +2, AC1 //AC1當(dāng)前地址+2,存入AC1
NEXT //跳轉(zhuǎn)到FOR內(nèi)循環(huán),如果內(nèi)循環(huán)執(zhí)行結(jié)束,程序往下執(zhí)行
//*******************內(nèi)循環(huán)執(zhí)行結(jié)束,進(jìn)入外循環(huán)執(zhí)行*****************************
DECW LW6 //內(nèi)循環(huán)體執(zhí)行結(jié)束,將內(nèi)循環(huán)體的循環(huán)次數(shù)減1
NEXT //跳轉(zhuǎn)到FOR外循環(huán),如果外循環(huán)執(zhí)行結(jié)束,程序往下執(zhí)行
上面代碼基本采用臨時(shí)變量作運(yùn)算的,其實(shí)還可以將其封裝成一個(gè)子程序,實(shí)現(xiàn)多次調(diào)用。
本文標(biāo)簽:西門子S7-200 PLC由“冒泡法”排序算法的逆向思考
* 由于無法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報(bào)酬未能及時(shí)支付,在此深表歉意,請(qǐng)《西門子S7-200 PLC由“冒泡法”排序算法的逆向思考》相關(guān)權(quán)利人與機(jī)電之家網(wǎng)取得聯(lián)系。
關(guān)于“西門子S7-200 PLC由“冒泡法”排序算法的逆向思考”的更多資訊










