在例程中主要展示了使用功能块vbioCtrlCM4810来进行数据的采集 在采集之前,首先需要保证将功能块的引脚绑定到对应模块的iomapping上,具体的绑定可以参考help当中的内容 在绑定之后则需要首先对功能块的相关引脚进行初始化赋值
CASE ParaInit:(*Init the Para*) |
之后则是对数据采集进行计时。因为数据是在模块中高频完成采集的,他的数据是首先缓存在模块上,之后通过功能块上载到PLC中,所以我们首先需要计时来确定我们需要采集的振动数据的时间区间。 计时的长短和模块的采样点数、采样频率都有关系,通过计算,我们可以得到下面采样频率和采样间隔的换算关系表
采样频率 |
采样间隔 |
---|---|
25781Hz |
0.03878ms |
12891Hz |
0.07757ms |
5156Hz |
0.1939ms |
2578Hz |
0.3879ms |
1289Hz |
0.7758ms |
516Hz |
1.938ms |
根据换算关系表,如果需要我们的程序能够兼容所有的采样频率,那么我们功能块所在的任务周期时间必须为这些采样间隔的公倍数,即0.776ms。
同时需要在程序中进行特殊的计数来满足以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 |
计算好时间后,相关的数据也已经缓存在模块当中,此时我们需要暂停模块的采集动作,并将已经缓存了的数据锁存起来以供后续的数据上载
以上,整个数据采集的过程就完成了