Hello,
I'm using CR1000 datalogger on the field with sampling frequency > 1Hz.
Actually i'm trying to minimize the following status tables fields ( Stations status):
- Measure Time = 16 mSec ( set by the number of meausuring channels used)
- Process Time = 110 mSec ( optimization of the CrBasic code)
- MaxProctime = 360 mSec ( maybe beacause i'm using CardOut intsruction and NL116).
I still have skipped scan and measurement even if the MaxProcTime is lower than the scan interval.
Is it the good way to approach to this issue?
I join the CrBasic code below.
Best Regards,
Firmin Fontaine
' CrBasic code for CR1000 logger autor = firmin.fontaine@irstea.fr ' Sations : ' loading date : '==================================================================================== 'VARIABLES & CONSTANTS '==================================================================================== '********** Station parameters *********** StationName(Test) Const concentration_bassin = 15 'Min Public Batt_volt Public rTime(9) Const Freq = 250 'Ms '*********** Rainfall *********** Public Pluie Public Pluie15 Alias Pluie15 = Cumul_Pluie_15min Public Pluie5a, Pluie5b, Pluie5c Dim PluieCum 'Rain gauge calibration Const CalibrePluvio = 0.254 'mm '********** Flow heigt *********** Public Hauteur_US Units Hauteur_US = mm Const PEH1 = 5500. Const MultH1 = PEH1/1600. Const OffsetH1 = -1345. '*********** Seismic signals *********** 'Geo 1 Public Geo_1_brute Public Geo_1_ampli Public Geo_1_corr 'Geo 2 Public Geo_2_brute Public Geo_2_ampli Public Geo_2_corr 'Geo 3 Public Geo_3_brute Public Geo_3_ampli Public Geo_3_corr 'Geo 4 Public Geo_4_brute Public Geo_4_ampli Public Geo_4_corr '*********** Event mode *********** Public Even As Boolean Public NbEven Public TestPort 'Circular memory settings Const RecBefore = (concentration_bassin + 5) * (60 * 2) ' (concentration_time + 5 min) * ( nbr record / min) Const RecAfter = (concentration_bassin -10)* (60 * 2) ' (concentration_time -10 min) * ( nbr record / min) '********** Image ********** Public Image Public NbImage As Long Public Photoseuil As Boolean '==================================================================================== ' TABLE DECLARATION '==================================================================================== DataTable (PluBatManival,True,-1) DataInterval(0,5,Min,0) CardOut (0, -1) Totalize (1,Pluie,FP2,0) Sample (1,Batt_volt,FP2) Sample (1,Hauteur_US,FP2) Maximum (1,Geo_1_corr(),IEEE4,False,False) Maximum (1,Geo_2_corr(),IEEE4,False,False) Maximum (1,Geo_3_corr(),IEEE4,False,False) Maximum (1,Geo_4_corr(),IEEE4,False,False) EndTable '______________________________________________________________________________________ DataTable (LaveManival,True,100000) DataEvent (RecBefore,Pluie15 >0,Pluie15 = 0,RecAfter) DataInterval(0,Freq,mSec,100) CardOut (0, -1) Sample (1,Hauteur_US,IEEE4) Sample (1,Geo_1_corr,IEEE4) Sample (1,Geo_2_corr,IEEE4) Sample (1,Geo_3_corr,IEEE4) Sample (1,Geo_4_corr,IEEE4) EndTable '=================================================================================== 'SUBROUTINES '==================================================================================== Sub Initialisation (APluieCum ,APluie15 , AEven, ANbEven, ANbImage,APhotoseuil,APluie5b, APluie5c) APluieCum = 0 APluie15 = 0 APluie5b = 0 APluie5c = 0 AEven = 0 ANbEven = 0 ANbImage = 0 APhotoseuil = False EndSub '______________________________________________________________________________________ Sub CumulPluie (APluieCum, APluie, APluie15, APluie5a, APluie5b, APluie5c) APluieCum = APluieCum + APluie APluie5a = APluieCum APluieCum = 0 APluie15 = APluie5a + APluie5b + APluie5c APluie5c = APluie5b APluie5b = APluie5a EndSub '______________________________________________________________________________________ Sub Evenement_image(ATestPort, AImage, APluie, AEven, ANbEven, APluie15, ArTime, ANbImage, APhotoseuil, APluieCum) If (APluieCum >= 0.8) Then AEven = 1 PortSet (6,1) EndIf If (APluie15 >= 3) APhotoseuil = True EndIf If TimeIntoInterval(0,4,Sec) AND (AEven = 1) AND (APhotoseuil = True) If (ArTime>=4) AND (ArTime<=20) PortSet(3,1) Delay (1,200,mSec) PortSet(3,0) AImage = 1 ANbImage = ANbImage + 1 EndIf EndIf If TimeIntoInterval(0,5,Min) AND AEven = 1 AND APluie15 < 1 Then PortSet (6,0) AEven = 0 APhotoseuil = False ANbEven = ANbEven +1 EndIf EndSub '______________________________________________________________________________________ Sub TimeLapse (AEven, AImage, ANbImage) If (AEven = 0) AND TimeIntoInterval(12,24,Hr) Then PortSet (6,1) EndIf If (AEven = 0) AND TimeIntoInterval(721,1440,Min) Then PortSet(3,1) Delay (1,100,mSec)'70ms semble ok PortSet(3,0) AImage = 1 ANbImage = ANbImage + 1 EndIf If (AEven = 0) AND TimeIntoInterval(722,1440,Min) Then PortSet (6,0) EndIf EndSub '===================================================================================== 'MAIN PROGRAM '==================================================================================== BeginProg 'Reset rain gauge pulse PulseCountReset 'Load initial settings Call Initialisation (PluieCum ,Pluie15 , Even, NbEven, NbImage, Photoseuil, Pluie5b, Pluie5c) '______________________________________________________________________________________ Scan (Freq,mSec,5000,0) Image = 0 '********** Measurements ********** 'flow heigt VoltDiff (Hauteur_US,1,mV2500,1,True,0,0,MultH1,OffsetH1) 'Rain gauge PulseCount(Pluie,1,1,2,0,CalibrePluvio,0) 'geo_1 VoltSe(Geo_1_brute,1,mV2500,5,True,0,0,1.0,0) VoltSe(Geo_1_ampli,1,mV2500,5,True,0,0,1.0,0) 'geo_2 VoltSe(Geo_2_brute,1,mV2500,5,True,0,0,1.0,0) VoltSe(Geo_2_ampli,1,mV2500,5,True,0,0,1.0,0) 'geo_3 VoltSe(Geo_3_brute,1,mV2500,5,True,0,0,1.0,0) VoltSe(Geo_3_ampli,1,mV2500,5,True,0,0,1.0,0) 'geo_4 VoltSe(Geo_4_brute,1,mV2500,5,True,0,0,1.0,0) VoltSe(Geo_4_ampli,1,mV2500,5,True,0,0,1.0,0) '********** Geophone correction ********* If Geo_1_ampli < 1800 Then Geo_1_corr = Geo_1_ampli ElseIf Geo_1_corr = Geo_1_brute * 200 EndIf If Geo_2_ampli < 1800 Then Geo_2_corr = Geo_2_ampli ElseIf Geo_2_corr = Geo_2_brute * 200 EndIf If Geo_3_ampli < 1800 Then Geo_3_corr = Geo_3_ampli ElseIf Geo_3_corr = Geo_3_brute * 200 EndIf If Geo_4_ampli < 1800 Then Geo_4_corr = Geo_4_ampli ElseIf Geo_4_corr = Geo_4_brute * 200 EndIf '********** Calling SubSequences ********** Call Evenement_image (TestPort, Image, Pluie, Even, NbEven, Pluie15, rTime(4), NbImage, Photoseuil, PluieCum) Call CumulPluie (PluieCum, Pluie, Pluie15,Pluie5a, Pluie5b, Pluie5c) '********** Calling DataTables ********** CallTable LaveManival NextScan '______________________________________________________________________________________ SlowSequence Scan (5,Min,3,0) '********** Calling SubSequence ********** Call TimeLapse (Even,Image, NbImage) '********** Calling Monitoring DataTable ********** CallTable PluBatManival '********** Checking Logger settings ********** Battery (Batt_volt) RealTime(rTime) PortGet(TestPort,6) NextScan EndProg '______________________________________________________________________________________
There are a couple of ways to avoid this but the simplest is to change your program to that is works in Pipelinemode and set the scan buffer parameter to 10 or so to allow the program to continue even if processing backs up for a couple of scans.
To make this happen you need to stop calling Portset conditionally (and also Portget in the slow sequence) which currently forces the logger to run in Sequential mode. You can change these to WriteIO and ReadIO (see the help system).
One thing to understand before you do this though the port switching may then run out of sequence with the measurement (especially if the processing gets queued). I am not sure if this is critical or not in this application.
Many thanks for your reply.
I changed the settings you suggested and for the moment it seems to work well.
I manage to rise the sampling freqency to 10Hz.
Best regards,
Firmin