数据采集

<< 点击显示目录 >>

主页  振动监测 > 实例展示与Demo > X20CM4810 >

数据采集



在例程中主要展示了使用功能块vbioCtrlCM4810来进行数据的采集 在采集之前,首先需要保证将功能块的引脚绑定到对应模块的iomapping上,具体的绑定可以参考help当中的内容 在绑定之后则需要首先对功能块的相关引脚进行初始化赋值

 

CASE ParaInit:(*Init the Para*)
    (*Clear Data*)
    brsmemset(ADR(gCMSDataTyp),SIZEOF(gCMSDataTyp));
    tindex              := 0;
    (*FB para clear*)
    brsmemset(ADR(BufferLoadTyp.FBTyp.VBioCtrlCM4810),SIZEOF(BufferLoadTyp.FBTyp.VBioCtrlCM4810));
    (*FB para init*)
    BufferLoadTyp.FBTyp.VBioCtrlCM4810.enable := FALSE;
    (* Buffermodule init *)
    BufferLoadTyp.FBTyp.VBioCtrlCM4810.paramBufferUpload.moduleBuffer := 0;
    (* BufferLen init *)
    BufferLoadTyp.FBTyp.VBioCtrlCM4810.paramBufferUpload.nrArrayElements := gMaxPoint;
    (* ModuleAddress init *)
    BufferLoadTyp.FBTyp.VBioCtrlCM4810.paramMain.pModulePath := ADR(MODULEPATH[0]);
    BufferLoadTyp.StatTyp.AllChanneUpload := FALSE;

 

之后则是对数据采集进行计时。因为数据是在模块中高频完成采集的,他的数据是首先缓存在模块上,之后通过功能块上载到PLC中,所以我们首先需要计时来确定我们需要采集的振动数据的时间区间。 计时的长短和模块的采样点数、采样频率都有关系,通过计算,我们可以得到下面采样频率和采样间隔的换算关系表

 

采样频率

采样间隔

25781Hz

0.03878ms

12891Hz

0.07757ms

5156Hz

0.1939ms

2578Hz

0.3879ms

1289Hz

0.7758ms

516Hz

1.938ms

 

根据换算关系表,如果需要我们的程序能够兼容所有的采样频率,那么我们功能块所在的任务周期时间必须为这些采样间隔的公倍数,即0.776ms。

clip0002

 

同时需要在程序中进行特殊的计数来满足以0.776ms的任务周期来计时1.938ms的采样间隔,以下展示了例程中如果要按照516Hz和5156Hz的采样率采集计数的方式

 

CASE Buffering:(*Wait Fresh data*)

   CASE frequenceValue:        //根据不同的采样频率计算每个采样周期已经采集了多少个数

   516:        

       tElpTime :=  tElpTime + tcyt ;

       //Task CYT = 776us (fixed)

       //each CYT get 4 sample data in 10 sample data on 516 sample frequency

       IF gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BufferSizeValueIndex = 0 THEN//8192 Points

           IF tindex = 8188 THEN

               /// The remain data need fill  Sample frequency 516 remain 3 data

               FOR  tInterval := 0 TO 3 DO

                   gCMSDataTyp.BaseFrequency[8188+tInterval] :=  UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;

               END_FOR                

               tindex := 0;

               tElpTime := 0;//Clear Duration time

           

               tCytCount := 0;//Clear Cyt count

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := TRUE;

               BufferLoadTyp.InternalTyp.Step := Lock;//GOTO Bufering        

 

           ELSIF  tindex < 8188 THEN

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := FALSE;

               tCytCount := tCytCount + 1;

               IF tCytCount MOD 10 = 0 THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

           

               ELSIF tCytCount MOD 10 = 3  THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

 

               ELSIF tCytCount MOD 10 = 5  THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

 

               ELSIF tCytCount MOD 10 = 8  THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

               END_IF

           END_IF

       

       ELSIF gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BufferSizeValueIndex = 1 THEN//65535 Points

           IF tindex = 65532 THEN

               /// The remain data need fill  Sample frequency 516 remain 3 data

               FOR  tInterval := 0 TO 3 DO

                   gCMSDataTyp.BaseFrequency[65532+tInterval] :=  UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;

               END_FOR                

               tindex := 0;

               tElpTime := 0;//Clear Duration time

           

               tCytCount := 0;//Clear Cyt count

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := TRUE;

               BufferLoadTyp.InternalTyp.Step := Lock;//GOTO Bufering        

 

           ELSIF  tindex < 65532 THEN

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := FALSE;

           

               tCytCount := tCytCount + 1;

               IF tCytCount MOD 10 = 0 THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

           

               ELSIF tCytCount MOD 10 = 3  THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

 

               ELSIF tCytCount MOD 10 = 5  THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

 

               ELSIF tCytCount MOD 10 = 8  THEN

                   gCMSDataTyp.BaseFrequency[tindex] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

                   tindex := tindex +1;

 

               END_IF

           END_IF

       END_IF

 

   5156:

       //Get the BaseFreq buffering    

       //Task CYT = 776us (fixed)

       //each CYT get 4 sample value on 5156 sample frequency remain 0 data

       IF gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BufferSizeValueIndex = 0 THEN//8192 Points

           IF  tindex < 8192 THEN

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := FALSE;

               FOR tInterval := 0 TO POINTINTERVAL5156 -1  DO

                   gCMSDataTyp.BaseFrequency[tindex + tInterval] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

               END_FOR

               tindex := tindex + POINTINTERVAL5156;        //POINTINTERVAL5156 = 0.776/0.1939=4

           ELSIF  tindex = 8192 THEN                        

               /// The remain data need fill  Sample frequency 5156 remain 0 data

               FOR  tInterval := 0 TO 0 DO

                   gCMSDataTyp.BaseFrequency[8192+tInterval] :=  UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;

               END_FOR                

               tindex := 0;

               tElpTime := 0;//Clear Duration time

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := TRUE;

               BufferLoadTyp.InternalTyp.Step := Lock;//GOTO Bufering        

           END_IF

           

       ELSIF gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BufferSizeValueIndex = 1 THEN//65536 Points

           IF  tindex < 65536 THEN

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := FALSE;

               FOR tInterval := 0 TO POINTINTERVAL5156 -1  DO

                   gCMSDataTyp.BaseFrequency[tindex + tInterval] := UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;                

               END_FOR

               tindex := tindex + POINTINTERVAL5156;        //POINTINTERVAL5156 = 0.776/0.1939=4

           ELSIF  tindex = 65536 THEN                        

           

               /// The remain data need fill  Sample frequency 5156 remain 0 data

               FOR  tInterval := 0 TO 0 DO

                   gCMSDataTyp.BaseFrequency[65535+tInterval] :=  UINT_TO_REAL(gMainCtrlTyp.BufferLoadTyp.BufferLoadPara_MainTyp.BaseVelocityRPM) / 60.000;

               END_FOR                

               tindex := 0;

               tElpTime := 0;//Clear Duration time

               gMainCtrlTyp.BufferLoadTyp.OtherDateBufferingOK := TRUE;

               BufferLoadTyp.InternalTyp.Step := Lock;//GOTO Bufering        

           END_IF

       END_IF

 

以下就是通过功能块锁存采集数据的例程代码

 

CASW Lock:(*Lock the Buffer*)

         

    BufferLoadTyp.FBTyp.VBioCtrlCM4810.enable := TRUE;                

    BufferLoadTyp.FBTyp.VBioCtrlCM4810.requestBufferLock := TRUE;

                

    (*Wait the buffer Lock*)

    IF BufferLoadTyp.FBTyp.VBioCtrlCM4810.status = 0 THEN

        IF BufferLoadTyp.FBTyp.VBioCtrlCM4810.bufferLockValid = TRUE THEN

            BufferLoadTyp.InternalTyp.Step := PreUpLoad;

        END_IF

    ELSIF BufferLoadTyp.FBTyp.VBioCtrlCM4810.status = 65534 THEN

        BufferLoadTyp.InternalTyp.Step := Lock;

    ELSE

        BufferLoadTyp.StatTyp.ErrorCode := BufferLoadTyp.FBTyp.VBioCtrlCM4810.status;

        BufferLoadTyp.InternalTyp.Step := ErrorHandling;

    END_IF

 
计算好时间后,相关的数据也已经缓存在模块当中,此时我们需要暂停模块的采集动作,并将已经缓存了的数据锁存起来以供后续的数据上载
以上,整个数据采集的过程就完成了