話說一個細心的客戶詢問我“為什么西門子s7-200編程軟件里面除了有div_i指令,還要有div指令,它們不都是實現整數相除的功能嗎?”。說的有道理,差異在哪兒呢?先來看看兩個指令的功能說明:
1. div指令是將兩個16位的整數相除,得出一個32位的結果,其中包括一個16位的余數(高位)和一個16位的商(低位)。
2. div_i指令是將兩個16位的整數相除,產生一個16位的商,不保留余數。
哦,看來區別是在結果上面,一起來做個實驗看看吧:

其中,vw0是被除數,vw2是除數,vd4的低十六位(即vw6 = 16#000d)是整數相除得到的商(vw6十進制值是13);高十六位(即vw4 = 16#00dc)是整數相除得到的余數(vw4十進制值是220)。

其中,vw0是被除數,vw2是除數,vw10是整數相除得到的商,余數沒有保留。
由此,這兩個功能塊的區別就顯而易見了,然后本以為問題到此結束,剛要與客戶說再見,但客戶接著又拋出了一個問題“s7-300中哪個指令塊可以實現s7-200中div指令塊的功能啊?”,這個,這個。。。。我得查查。然后,搜遍step7中整數運算的指令塊,沒有見到與div指令完全相同功能的指令塊,但卻發現了mod_di功能塊是可以單獨取余數的。那么,接著實驗:

其中,md0為被除數,md4為除數,md8為雙整數相除得到的余數 ,不保留商。

其中,md0為被除數,md4為除數,md12為雙整數相除得到的商,不保留余數。
看來客戶想要實現一個指令塊既得商,又得余數的功能不得不分步實施啦。雖然說在step7的編程中不存在div同樣功能的指令塊,但它的實現更為靈活——將余數與商分開,根據客戶的需要單獨取之。另外,在s7-200中實現整數取余有一定的局限性,就是div指令塊只能實現16位的整數相除取余,而step 7中的mod_di則可以使用32位的雙整數直接取余。
通過實驗是不是更清楚明了呢?相信您已經牢牢記住了,那么我要給客戶回電話去啦。。。










