西門子S7-1200PLC模塊河南代理商
西門子S7-300/400的有符號數(shù)右移指令
移位指令將累加器1的低字或累加器1的全部內(nèi)容左移或右移若干位(見表3-16)。
有符號數(shù)(整數(shù)或雙整數(shù))右移后空出來的位填以符號位對應(yīng)的二進(jìn)制數(shù),正數(shù)的符號位為0,負(fù)數(shù)的符號位為1。移位指令將狀態(tài)字的CC0清零,后移出的位被裝入狀態(tài)位CC1。
表3-16 移位指令
圖3-99中的整數(shù)右移指令SHR_I將MW40中的16位有符號整數(shù)右移4位。-8000右移4位相當(dāng)于除以24,移位后的數(shù)為-500。從圖3-100中的變量表可以看出,右移后空出來的位用符號位1填充。移位位數(shù)N為十六進(jìn)制的字,N如果大于16,原有的數(shù)據(jù)被全部移出去了,MW42的各位均為符號位。
圖3-99 有符號整數(shù)右移指令
圖3-100 變量表
圖3-99的右邊是移位指令對應(yīng)的語句表程序,被移位的數(shù)在累加器1中,移位位數(shù)在累加器2中,移位位數(shù)的允許值為0~255,移位位數(shù)(常數(shù))也可以在移位指令中。如果移位位數(shù)等于0,移位指令被當(dāng)作NOP(空操作)指令來處理。
求反碼與求補(bǔ)碼指令如表3-15和圖3-97所示。整數(shù)求反碼(取反)指令INVI將累加器1低字的16位整數(shù)逐位取反,即各位二進(jìn)制數(shù)由0變?yōu)?/span>1,由1變?yōu)?/span>0(見圖3-98),運(yùn)算結(jié)果在累加器1的低字。雙整數(shù)求反碼指令INVD將累加器1中的雙整數(shù)逐位取反,結(jié)果在累加器1。
表3-15 求反碼與求補(bǔ)碼指令
語句表指令 | 梯形圖指令 | 描 述 |
INVI | INV_I | 求累加器1低字的16位整數(shù)的反碼 |
INVD | INV_DI | 求累加器1中雙整數(shù)的反碼 |
NEGI | NEG_I | 求累加器1低字的16位整數(shù)的補(bǔ)碼 |
NEGD | NEG_DI | 求累加器1中雙整數(shù)的補(bǔ)碼 |
NEGR | NEG_R | 將累加器1中的浮點數(shù)的符號位取反 |
圖3-97 求反碼指令
圖3-98 變量表
整數(shù)求補(bǔ)碼指令NEGI將累加器1低字的整數(shù)逐位取反后再加1,運(yùn)算結(jié)果仍在累加器1的低字。雙整數(shù)求補(bǔ)碼指令NEGD將累加器1的雙整數(shù)逐位取反后再加1,運(yùn)算結(jié)果仍在累加器1。求補(bǔ)碼相當(dāng)于求一個數(shù)的相反數(shù),即將該數(shù)乘以-1。
浮點數(shù)取反指令NEGR將累加器1的浮點數(shù)的符號位(第31位)取反,運(yùn)算結(jié)果仍在累加器1。下面的例子求雙整數(shù)MD20的補(bǔ)碼,然后傳送到MD30:
L MD 20 //將32位雙整數(shù)裝入累加器1
NEGD //求補(bǔ)碼
T MD 30 //運(yùn)算結(jié)果傳送到MD30
TR指令將累加器1中的32位雙整數(shù)轉(zhuǎn)換為32位IEEE浮點數(shù)(實數(shù)),結(jié)果仍在累加器1。因為32位雙整數(shù)的精度比浮點數(shù)的高,指令將轉(zhuǎn)換結(jié)果四舍五入。
有4條將浮點數(shù)轉(zhuǎn)換為雙整數(shù)的指令(見表3-13),它們將累加器1中的浮點數(shù)轉(zhuǎn)換為雙整數(shù)。因為轉(zhuǎn)換規(guī)則不同,得到的結(jié)果也不相同,表3-14給出了不同的取整格式的例子。4條指令中用得多的是RND,RND+和RND-很少使用。
表3-14 不同的取整格式舉例
因為浮點數(shù)的數(shù)值范圍遠(yuǎn)遠(yuǎn)大于32位整數(shù),有的浮點數(shù)不能成功地轉(zhuǎn)換為32位整數(shù)。如果被轉(zhuǎn)換的浮點數(shù)超出了32位整數(shù)的表示范圍,得不到有效的結(jié)果,狀態(tài)字中的OV和OS位被置1。例2-1中的壓力P(kPa)計算公式為
P=(10000×N)/27648=0.36169×N (3-1)
來自AI模塊的PIW320的原始數(shù)據(jù)Ⅳ為16位整數(shù),首先用I_DI指令將整數(shù)轉(zhuǎn)換為雙整數(shù)(見圖3-95),然后用DI_R指令轉(zhuǎn)換為實數(shù)(Real),再用實數(shù)乘法指令MUL_R完成式(3-1)的運(yùn)算。后用四舍五入的ROUND指令,將運(yùn)算結(jié)果轉(zhuǎn)換為以kPa為單位的整數(shù)。圖中的程序在隨書光盤的例程“指令應(yīng)用”中。
圖3-95 使用浮點數(shù)運(yùn)算指令的壓力計算程序
用仿真軟件調(diào)試程序時,可將0和27 648分別輸入PIW320,觀察MD16中的計算結(jié)果是否是0和10000 kPa。將0~27648之間的任意數(shù)值輸入PIW320,觀察計算結(jié)果是否與計算器計算的相同。
【實例】 將101 in(英寸,浮點數(shù))轉(zhuǎn)換為以cm(厘米)為單位的整數(shù),保存到MW0。
L 101.0 //將浮點數(shù)101.0裝入累加器1
L 2. 54 //將浮點數(shù)2.54裝入累加器1,累加器1的內(nèi)容裝入累加器2
*R //101.0乘以2.54,得256. 54 cm
RND //四舍五入轉(zhuǎn)換為整數(shù)257
T MW 0
16位格式的BCD碼的第0N11位二進(jìn)制數(shù)用來表示3位BCD碼(見圖3-19),每位的數(shù)值范圍為2#0000~2#1001,對應(yīng)于十進(jìn)制數(shù)0~9。第15位二進(jìn)制數(shù)用來表示BCD碼的符號,正數(shù)為0,負(fù)數(shù)為1,第12~14位二進(jìn)制數(shù)未用,一般取與符號位相同的數(shù)。
圖3-94給出了BCD碼與整數(shù)相互轉(zhuǎn)換的例子。用變量表給MW2輸入16 #8123(高位二進(jìn)制數(shù)為1)或16#f123(高4位二進(jìn)制數(shù)均為1),轉(zhuǎn)換的結(jié)果均為十進(jìn)制數(shù)-123。
圖3-94 BCD碼與整數(shù)的轉(zhuǎn)換
如果輸入的BCD碼的某位為無效數(shù)據(jù)(2#1010~2#1111,對應(yīng)的十進(jìn)制數(shù)為10~15),將得不到正確的轉(zhuǎn)換結(jié)果,會出現(xiàn)“BCDF”錯誤。如果沒有下載編程錯誤組織塊OB121,CPU將進(jìn)入STOP狀態(tài),“BCD轉(zhuǎn)換錯誤”信息被寫入診斷緩沖區(qū)。
32位格式的BCD碼的第0~27位二進(jìn)制數(shù)用來表示7位BCD碼。第31位二進(jìn)制數(shù)是BCD碼的符號位,正數(shù)為0、負(fù)數(shù)為1。第28~30位二進(jìn)制數(shù)未用,一般取與符號位相同的數(shù)。
ITB指令將累加器1低字的16位整數(shù)轉(zhuǎn)換為3位BCD碼,結(jié)果仍在累加器1的低字,累加器1的高字不變。DTB指令將累加器1的32位雙整數(shù)轉(zhuǎn)換為7位BCD碼,結(jié)果仍在累加器1。圖3-94中的I_BCD指令將- 456轉(zhuǎn)換為BCD碼W#16#f456,二進(jìn)制數(shù)的高4位均為1,表示該數(shù)是負(fù)數(shù)。圖的右邊是對應(yīng)的語句表程序。
16位整數(shù)的表示范圍為-32 768~+32 767,而3位BCD碼的表示范圍為- 999~+999。如果被轉(zhuǎn)換的整數(shù)超出BCD碼的允許范圍,得不到有效的轉(zhuǎn)換結(jié)果,同時狀態(tài)字的溢出位OV和溢出保持位OS將被置1。在程序中,可以根據(jù)OV位判斷轉(zhuǎn)換結(jié)果是否有效,以免造成進(jìn)一步的運(yùn)算錯誤。
西門子S7-1200PLC模塊河南代理商