久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

西門子模擬量輸入FB塊封裝

 德陽北方數(shù)控 2024-12-20
西門子的模擬量輸入功能塊(Function Block, FB)用于PLC(可編程邏輯控制器)程序中處理來自傳感器或其他模擬信號源的數(shù)據(jù),。這種功能塊主要封裝了將模擬信號轉(zhuǎn)換為工程單位值所需的所有操作,包括但不限于線性化,、濾波,、比例縮放和錯誤處理等。

一,、應(yīng)用場合

  1. 工業(yè)自動化: 在制造業(yè)和其他需要精密控制和監(jiān)控的環(huán)境中,,模擬量輸入FB可以用來讀取溫度,、壓力、流量,、位置等各種物理參數(shù),,并將這些數(shù)據(jù)轉(zhuǎn)換成控制系統(tǒng)能夠理解的信息。

  2. 過程控制: 在化工,、石油天然氣等行業(yè),,對于連續(xù)生產(chǎn)過程中各種變量的監(jiān)測非常重要。模擬量輸入FB可以幫助工程師準(zhǔn)確地獲取這些關(guān)鍵參數(shù)的狀態(tài),。

  3. 能源管理: 電力,、水力等能源設(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è)自動化不可或缺的一部分,。
三,、FB塊封裝

(1)、

圖片

圖片

圖片

圖片

圖片

圖片

(2),、

圖片

圖片

圖片

//錯誤初始化
#error := FALSE;
#status := #NO_ERROR;
//輸入?yún)?shù)檢查
#tempLowerBound := LOWER_BOUND(ARR := #channels, DIM := 1);
#tempUpperBound := UPPER_BOUND(ARR := #channels, DIM := 1);
#tempNumberOfElements := #tempUpperBound - #tempLowerBound + 1;
IF #通道數(shù)量 > #tempNumberOfElements THEN
    #error := TRUE;
    #status := #ARRAY_SIZE_SMALL;
    RETURN;
END_IF;
IF #通道數(shù)量 > #MAX_CHANNEL_INDEX + 1 THEN
    #error := TRUE;
    #status := #COUNT_OVRANGE;
    RETURN;
END_IF;

FOR #tempLoopCount := 0 TO #通道數(shù)量 - 1 DO
    //計(jì)算第一個通道的起始索引值
    #tempCunrrnentIndex := #tempLowerBound + #tempLoopCount;
    IF #channels[#tempCunrrnentIndex].enable THEN
        //通道值處理
        ////通道錯誤返回值狀態(tài)復(fù)位
        #channels[#tempCunrrnentIndex].retVal := 0;
        #statErrorChanels[#tempLoopCount] := FALSE;
        //通過間接尋址peek獲取對應(yīng)通道數(shù)值
        #tempbyteOffset := #address + 2 * #tempLoopCount;
        #tempAIValueWord := PEEK_WORD(area := 16#81,
                                      dbNumber := 0,
                                      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;
            CONTINUE;
        END_IF;
        //retVal=16#8002 高限值小于等于低限值
        IF #channels[#tempCunrrnentIndex].hiLIM <= #channels[#tempCunrrnentIndex].loLIM THEN
            #channels[#tempCunrrnentIndex].retVal := #ERROR_LIM;
            CONTINUE;
        END_IF;
        //非溫度模擬量處理
        CASE #channels[#tempCunrrnentIndex].measuringMode OF
            #NON_TEMP:
                IF #channels[#tempCunrrnentIndex].bipolar THEN  //雙極性處理
                    IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN
                        #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW;
                        CONTINUE;
                    ELSIF #tempAIValueInt > 27648 OR #tempAIValueInt < -27648 THEN
                        #channels[#tempCunrrnentIndex].retVal := #ERROR_OVER_RANG;
                        CONTINUE;
                    ELSE
                        #tempAIValueReal := INT_TO_REAL(#tempAIValueInt);
                        #tempOutput := (#tempAIValueReal + 27648.0) / 55296.0 *
                        (#channels[#tempCunrrnentIndex].hiLIM - #channels[#tempCunrrnentIndex].loLIM)
                        + #channels[#tempCunrrnentIndex].loLIM;
                    END_IF;
                ELSE
                    //單極性處理
                    IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN
                        #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW;
                        CONTINUE;
                    ELSIF #tempAIValueInt > 27648 OR #tempAIValueInt < 0 THEN
                        #channels[#tempCunrrnentIndex].retVal := #ERROR_OVER_RANG;
                        CONTINUE;
                    ELSE
                        #tempAIValueReal := INT_TO_REAL(#tempAIValueInt);
                        #tempOutput := #tempAIValueReal / 27648.0 *
                        (#channels[#tempCunrrnentIndex].hiLIM - #channels[#tempCunrrnentIndex].loLIM)
                        + #channels[#tempCunrrnentIndex].loLIM;
                    END_IF;
                END_IF;
                //標(biāo)準(zhǔn)型溫度測量
            #STD_TEMP:
                IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN
                    #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW;
                    CONTINUE;
                ELSE
                    #tempOutput := #tempAIValueReal / 10.0;
                END_IF;
                //氣候型溫度測量
            #CLIMATE_TEMP:
                IF #tempAIValueInt = 32767 OR #tempAIValueInt = -32768 THEN
                    #channels[#tempCunrrnentIndex].retVal := #ERROR_OVERFLOW;
                    CONTINUE;
                ELSE
                    #tempOutput := #tempAIValueReal / 100.0;
                END_IF;
        END_CASE;
        //濾波處理
        IF #channels[#tempCunrrnentIndex].filterOn THEN
            IF #channels[#tempCunrrnentIndex].filterReset THEN
                #statFloatingAverageInsts[0].reset := TRUE;
                #statFloatingAverageInsts[#tempLoopCount].reset:= TRUE;
            ELSE
                #statFloatingAverageInsts[#tempLoopCount].reset := FALSE;
            END_IF;
            #statFloatingAverageInsts[#tempLoopCount](value := #tempOutput,
                                                      濾波強(qiáng)度 := #channels[#tempCunrrnentIndex].windowSize,
                                                      '濾波后模擬量輸出' => #channels[#tempCunrrnentIndex].outputValue);
           
            
        ELSE
            #channels[#tempCunrrnentIndex].outputValue := #tempOutput;
        END_IF;
        
        //報(bào)警處理
        IF #channels[#tempCunrrnentIndex].outputValue > #channels[#tempCunrrnentIndex].hiLevel THEN
            #channels[#tempCunrrnentIndex].hiAlarm := TRUE;
        ELSE
            #channels[#tempCunrrnentIndex].hiAlarm := FALSE;
        END_IF;
        IF #channels[#tempCunrrnentIndex].outputValue < #channels[#tempCunrrnentIndex].loLevel THEN
            #channels[#tempCunrrnentIndex].loAlarm := TRUE;
        ELSE
            #channels[#tempCunrrnentIndex].loAlarm := FALSE;
        END_IF;
        
        //生成通道錯誤狀態(tài)
        IF (#channels[#tempCunrrnentIndex].filterOn
            AND #statFloatingAverageInsts[#tempLoopCount].error)
            OR (#channels[#tempCunrrnentIndex].retVal <> 0) THEN
            #statErrorChanels[#tempLoopCount] := TRUE;
        END_IF;
    ELSE
        //如果通道不使能
        #channels[#tempCunrrnentIndex].outputValue := 0.0;
        #statErrorChanels[#tempLoopCount] := FALSE;
    END_IF;
END_FOR;

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約