西門子的模擬量輸入功能塊(Function Block, FB)用于PLC(可編程邏輯控制器)程序中處理來自傳感器或其他模擬信號源的數(shù)據(jù),。這種功能塊主要封裝了將模擬信號轉(zhuǎn)換為工程單位值所需的所有操作,包括但不限于線性化,、濾波,、比例縮放和錯誤處理等。
一,、應(yīng)用場合 工業(yè)自動化: 在制造業(yè)和其他需要精密控制和監(jiān)控的環(huán)境中,,模擬量輸入FB可以用來讀取溫度,、壓力、流量,、位置等各種物理參數(shù),,并將這些數(shù)據(jù)轉(zhuǎn)換成控制系統(tǒng)能夠理解的信息。 過程控制: 在化工,、石油天然氣等行業(yè),,對于連續(xù)生產(chǎn)過程中各種變量的監(jiān)測非常重要。模擬量輸入FB可以幫助工程師準(zhǔn)確地獲取這些關(guān)鍵參數(shù)的狀態(tài),。 能源管理: 電力,、水力等能源設(shè)施使用模擬量輸入FB來測量消耗或生產(chǎn)的能量水平,以優(yōu)化資源利用效率,。
二,、意義 簡化編程: 使用預(yù)定義的功能塊可以減少編程工作量,因?yàn)楹芏鄰?fù)雜的計(jì)算已經(jīng)被內(nèi)置到FB中去了,。 提高準(zhǔn)確性: 內(nèi)置算法通常經(jīng)過優(yōu)化,,可以提供更精確的數(shù)據(jù)轉(zhuǎn)換,從而確保系統(tǒng)運(yùn)行更加穩(wěn)定可靠,。 增強(qiáng)靈活性: 用戶可以通過配置不同的參數(shù)輕松調(diào)整FB的行為,,使之適應(yīng)特定的應(yīng)用需求。 促進(jìn)標(biāo)準(zhǔn)化: 使用標(biāo)準(zhǔn)的功能塊有助于在整個項(xiàng)目或者企業(yè)內(nèi)部建立一致的做法,,便于維護(hù)和支持,。 易于調(diào)試和維護(hù): 功能塊封裝了所有必要的邏輯,使得問題排查更為直接,;而且一旦更新了FB版本,,所有調(diào)用該FB的地方都可以受益于改進(jìn)后的特性。 總之,,西門子模擬量輸入FB在實(shí)現(xiàn)高效,、精準(zhǔn)的過程監(jiān)控與控制方面扮演著重要角色,是現(xiàn)代工業(yè)自動化不可或缺的一部分,。(1)、
(2),、 #tempLowerBound := LOWER_BOUND(ARR := #channels, DIM := 1);#tempUpperBound := UPPER_BOUND(ARR := #channels, DIM := 1);#tempNumberOfElements := #tempUpperBound - #tempLowerBound + 1;IF #通道數(shù)量 > #tempNumberOfElements THEN #status := #ARRAY_SIZE_SMALL;IF #通道數(shù)量 > #MAX_CHANNEL_INDEX + 1 THEN #status := #COUNT_OVRANGE;FOR #tempLoopCount := 0 TO #通道數(shù)量 - 1 DO #tempCunrrnentIndex := #tempLowerBound + #tempLoopCount; IF #channels[#tempCunrrnentIndex].enable THEN #channels[#tempCunrrnentIndex].retVal := 0; #statErrorChanels[#tempLoopCount] := FALSE; //通過間接尋址peek獲取對應(yīng)通道數(shù)值 #tempbyteOffset := #address + 2 * #tempLoopCount; #tempAIValueWord := PEEK_WORD(area := 16#81, byteOffset := #tempbyteOffset); #tempAIValueInt := WORD_TO_INT(#tempAIValueWord); ////retVal=16#8001 模式錯誤 MeasuringMode IF (#channels[#tempCunrrnentIndex].measuringMode <> #NON_TEMP AND #channels[#tempCunrrnentIndex].measuringMode <> #STD_TEMP AND #channels[#tempCunrrnentIndex].measuringMode <> #CLIMATE_TEMP) THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_MEASURING_MODE; //retVal=16#8002 高限值小于等于低限值 IF #channels[#tempCunrrnentIndex].hiLIM <= #channels[#tempCunrrnentIndex].loLIM THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_LIM; CASE #channels[#tempCunrrnentIndex].measuringMode OF IF #channels[#tempCunrrnentIndex].bipolar THEN //雙極性處理 IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW; ELSIF #tempAIValueInt > 27648 OR #tempAIValueInt < -27648 THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_OVER_RANG; #tempAIValueReal := INT_TO_REAL(#tempAIValueInt); #tempOutput := (#tempAIValueReal + 27648.0) / 55296.0 * (#channels[#tempCunrrnentIndex].hiLIM - #channels[#tempCunrrnentIndex].loLIM) + #channels[#tempCunrrnentIndex].loLIM; IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW; ELSIF #tempAIValueInt > 27648 OR #tempAIValueInt < 0 THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_OVER_RANG; #tempAIValueReal := INT_TO_REAL(#tempAIValueInt); #tempOutput := #tempAIValueReal / 27648.0 * (#channels[#tempCunrrnentIndex].hiLIM - #channels[#tempCunrrnentIndex].loLIM) + #channels[#tempCunrrnentIndex].loLIM; IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW; #tempOutput := #tempAIValueReal / 10.0; IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW; #tempOutput := #tempAIValueReal / 100.0; IF #channels[#tempCunrrnentIndex].filterOn THEN IF #channels[#tempCunrrnentIndex].filterReset THEN #statFloatingAverageInsts[0].reset := TRUE; #statFloatingAverageInsts[#tempLoopCount].reset:= TRUE; #statFloatingAverageInsts[#tempLoopCount].reset := FALSE; #statFloatingAverageInsts[#tempLoopCount](value := #tempOutput, 濾波強(qiáng)度 := #channels[#tempCunrrnentIndex].windowSize, '濾波后模擬量輸出' => #channels[#tempCunrrnentIndex].outputValue); #channels[#tempCunrrnentIndex].outputValue := #tempOutput; IF #channels[#tempCunrrnentIndex].outputValue > #channels[#tempCunrrnentIndex].hiLevel THEN #channels[#tempCunrrnentIndex].hiAlarm := TRUE; #channels[#tempCunrrnentIndex].hiAlarm := FALSE; IF #channels[#tempCunrrnentIndex].outputValue < #channels[#tempCunrrnentIndex].loLevel THEN #channels[#tempCunrrnentIndex].loAlarm := TRUE; #channels[#tempCunrrnentIndex].loAlarm := FALSE; IF (#channels[#tempCunrrnentIndex].filterOn AND #statFloatingAverageInsts[#tempLoopCount].error) OR (#channels[#tempCunrrnentIndex].retVal <> 0) THEN #statErrorChanels[#tempLoopCount] := TRUE; #channels[#tempCunrrnentIndex].outputValue := 0.0; #statErrorChanels[#tempLoopCount] := FALSE;
|