之前我曾寫過一篇文章介紹西門子S7-200 SMART的模擬量指令庫《S7-200 SMART怎樣添加和使用模擬量指令庫?》。今天這篇文章,結合我近期測試國產模擬量輸出模塊的實際經驗,跟大家分享下該指令庫使用過程中要注意的幾個問題。本文主要包括如下幾個主題:
西門子plc STEP7中 模擬量指令S_RTR和S_RTI的區別
怎樣將實數轉換為無符號整數?
1、模擬量指令S_RTR和S_RTI的區別
指令S_RTR和S_RTI通常都是用來處理模擬量輸出。名稱中的"S"是"Scale"的縮寫,表示"量程";"R"是"Real"的縮寫,表示"實數";"T"是"To"的縮寫,表示轉換;"I"是"Integer"的縮寫,表示"整數"。因此,從名稱可以看出,S_RTR指令是把實數轉換成實數,S_RTI指令是把實數轉換成整數,通常情況下我使用的是S_RTI指令。
比如西門子 ET200 SP的模擬量輸出模塊AQ 2xI ST,它能輸出4~20mA的電壓信號,其對應的輸出整數的范圍為0~27648。對于這樣的模塊信號轉換,我們只需要輸入工程值和轉換值即可。舉個例子,某工程值速度信號的范圍為0.0~100.0 cm/min,其實際速度存放在VD100(actualSpeed)中,要求將實際速度轉換成相應的電流信號進行輸出,可以使用下面的代碼:
有些模擬量輸出模塊(比如我測試的這個國產模塊),它的輸出信號也是4~20mA,但是其對應的整數范圍是0~65535。這種情況下,如果我們還是用這個公式,將"OSH"改成65535,就會出問題,如下圖:
"S_RTI"指令中"OSH"和"OSL"都是"16位有符號整數",其取值范圍為-32768~+32767。65535超出了其取值范圍,因此會產生溢出錯誤,我們進入其內部代碼可以看的更清楚,如下圖所示:
這種情況下,我們應該使用"S_RTR"指令,它的量程范圍均為實數,如下圖所示:
不過"S_RTR"指令轉換的輸出值為實數,而我們需要寫入的模擬量輸出地址為無符號整數類型,比如QW130,怎么把實數轉換成無符號整數呢?
2、怎樣將實數轉換為無符號整數
首先,我們可以使用Round指令將實數轉換成近似的雙整數。接下來就是問題的關鍵:怎樣把雙整數轉換成無符號整數?
如果我們直接使用系統提供的指令"DI_I"會出現錯誤,因為這個雙整數超出了有符號整數的范圍。我找了半天,沒有發現能直接進行轉換的指令。于是自己寫了一個函數(子程序)來實現這個功能。
打開STEP 7 Micro-WIN/SMART,在程序塊中添加子程序,名稱為Conv_DI2W,在其變量表中聲明變量如下圖所示:
在主程序中調用子程序Conv_DI2W,為其參數賦值即可,如下圖所示:
好了,關于S7-200 SMART模擬量輸出指令使用時注意問題就先介紹到這里。如果你想學習S7-200 SMART PLC ,可以看看這本書《西門子S7-200 SMART PLC應用技術》