I'm trying to use a CR800 to control an ISCO sampler to collect one sample per hour.
I've been trying to merge two CR Basic programs to accomplish this goal. I currently use one to control an ISCO sampler for flow paced sampling (see code below). The other program I found on this forum (https://www.campbellsci.com/forum?forum=1&l=thread&tid=1641) is designed to control a sampler based on one sample per hour. Maybe there is an easy way to repurpose the program I currently use to change the enable level and begin time based sampling.
Here is the program that I'm using now for flow paced sampling. Any ideas for adjusting this to accomplish hourly sample collection are much appreciated.
'CR800 Series Datalogger '*********************** 'NOTE: 1.2NE Pakbus Address is 7 '*********************** 'Brian Jastram - MWMO - 10-29-19, 12/10/2021 '*********************** PreserveVariables 'Declare Variables and Units Const RainPerTip = 0.01 Const ISCO6712port = Com1 Public CSI_Batt Public ISCO_Batt Public LoggerTemp Public ISCO_Data(50) As String * 20 Public ISCO_Instring As String * 1000 Public ISCO_Bottle(3) As String * 3 Public ISCO_Bottle1 As Long 'Integer version of ISCO_Bottle(1) string Public ISCO_BottleTime(3) As String * 20 Public ISCO_TodaysRain As Long Public ISCO_Checksum As Long Public ISCO_Description As String * 20 Public ISCO_Flow Public ISCO_ID As String *20 Public ISCO_Level Public ISCO_Model As String * 10 Public ISCO_YesterdaysRain Public ISCO_Rain Public ISCO_RainTips As Long Public LastRainTips As Long Public ISCO_EnableState As Boolean Public ISCO_Time As String * 20 Public ISCO_Velocity Public ISCO_Volume Public Last_ISCO_Volume Public ISCO_Volume_LastSample Public VolumeBetweenSamples_ft3 Public VolumeBetweenSamples Public ISCO_Level_Threshold_ft Public ISCO_Level_Threshold Public ISCO_Volume_Reset As Boolean Public ISCO_Sampling_Enabled As Boolean Public SampleOnEnable As Boolean Public ISCO_VelSigStrength Public ISCO_VelSpecStrength Public NextEmptyBottleNum As Long Public NextEmptyBottleStr As String * 2 Public SampleVolume As String * 3 Public SampleRequest As Boolean Public SamplesTaken As Long Dim I As Long Public ChargingISCOBattery As Boolean Public Nighttime As Boolean Public YSIAttached As Boolean Public ISCOCommFailure As Boolean 'following added for conductivity Public ConductivityAttached As Boolean Public Rcable, Rp, CellConstant, TempCoef Public Rs, Ct Public TempDeg_C Public C25mScm_1 Units Ct=mS/cm Units C25mScm_1=mS/cm Units TempDeg_C=Deg C Dim OneOvrRs 'variables for 2150 AV probe and Modbus Const AV2150port = ComRS232 Dim ISCOregister(138) As Long Public AV2150Attached As Boolean Public ModuleName As String * 38 Public ModelNumber As String * 8 Public AV2150TakeReadingFlag As Long Public AV2150Temp Public AV2150Volts Units AV2150Temp = Deg C Units AV2150Volts = Volts 'the following ???StatTime(7) arrays are a combination of the Status (???StatTime(1)) and the 6 integer time (???StatTime(2-7)) Public LevelStatTime(7) As Long Public VelocityStatTime(7) As Long Public FlowStatTime(7) As Long Public VolumeStatTime(7) As Long Public AV2150TempStatTime(7) As Long Public AV2150VoltsStatTime(7) As Long Public ModbusResultModel As Long Public ModbusResultTakeReadingWrite As Long Public ModbusResultTakeReadingRead As Long Public ModbusResultLevel As Long Public ModbusResultLevelStatTime As Long Public ModbusResultVelocity As Long Public ModbusResultVelocityStatTime As Long Public ModbusResultFlow As Long Public ModbusResultFlowStatTime As Long Public ModbusResultVolume As Long Public ModbusResultVolumeStatTime As Long Public ModbusResultTemp As Long Public ModbusResultTempStatTime As Long Public ModbusResultVolts As Long Public ModbusResultVoltsStatTime As Long Public AV2150CommFailure As Boolean Units ISCO_Bottle()=Bottle# Units ISCO_BottleTime()=Date&Time Units ISCO_TodaysRain=Tips Units ISCO_Flow=M^3/S Units ISCO_Level=Meters Units ISCO_YesterdaysRain=Tips Units ISCO_Rain=Inches Units ISCO_RainTips=Tips Units ISCO_Time=Date&Time Units ISCO_Velocity=M/S Units ISCO_Volume=M^3 Units Last_ISCO_Volume=M^3 Units ISCO_Volume_LastSample=M^3 Units VolumeBetweenSamples_ft3=ft^3 Units VolumeBetweenSamples=M^3 Units ISCO_Level_Threshold_ft=ft Units ISCO_Level_Threshold=M Units ISCO_VelSigStrength=% Units ISCO_VelSpecStrength=% Units ISCO_Batt=Volts Units CSI_Batt=Volts Units LoggerTemp=Deg C 'Define Data Tables DataTable(ISCOData,True,-1) DataInterval(0,5,Min,10) Sample(1,CSI_Batt,FP2) Sample(1,ISCO_Batt,FP2) Sample(1,ISCO_Bottle(),String) Totalize(1,ISCO_Rain,FP2,False) Average(1,ISCO_Level,FP2,ISCO_Level=NaN) Average(1,ISCO_Velocity,FP2,ISCO_Velocity=NaN) Totalize(1,SamplesTaken,UINT2,False)'added to be able to count samples during DataInterval in systems with AV2150 Average(1,LoggerTemp,FP2,LoggerTemp=NaN) Sample(1,ISCO_Level_Threshold_ft,FP2) Sample(1,VolumeBetweenSamples_ft3,IEEE4) Totalize(1,AV2150CommFailure,FP2,False) EndTable DataTable (Conductivity,True,-1) 'conductivity measurements DataInterval(0,5,Min,10) Average (1,Ct,FP2,False) Average (1,TempDeg_C,FP2,False) Average (1,C25mScm_1,FP2,False) EndTable DataTable(BatteryData,True,-1) DataInterval(0,6,Hr,10) Minimum(1,CSI_Batt,FP2,False,False) Minimum(1,ISCO_Batt,FP2,False,False) Totalize(1,ChargingISCOBattery,FP2,False) EndTable 'Define Subroutines Sub OpenISCOComm ISCOCommFailure=False SerialOpen(ISCO6712port,9600,0,0,10000) SerialOut(ISCO6712port,CHR(13)+CHR(10),"",0,100) 'see if 6712 is awake SerialIn(ISCO_Instring,ISCO6712port,10,">",200) 'if response is a prompt, 6712 is awake. If not... If ISCO_Instring="" Then 'wakeup 6712 by sending ?'s 1 sec apart For I = 1 To 10 SerialOut(ISCO6712port,"?","",1,100) 'send ?'s 1 sec apart SerialIn(ISCO_Instring,ISCO6712port,10,-1,200) 'look for any response If ISCO_Instring<>"" Then ExitFor 'ISCO is awake If I = 10 Then ISCOCommFailure=True 'ISCO never responded to ?'s Next I SerialOut(ISCO6712port,CHR(13)+CHR(10),"",0,100) 'send SerialIn(ISCO_Instring,ISCO6712port,50,">",200) '6712 responds with prompt EndIf EndSub Sub SendISCOCommand(Command As String * 20, TerminationChar As Long) SerialOut(ISCO6712port,Command+CHR(13)+CHR(10),"",1,100) SerialIn(ISCO_Instring,ISCO6712port,50,TerminationChar,500) ISCO_Instring=Right(ISCO_Instring,Len(ISCO_Instring)-1) 'strip LineFeed character from beginning of string EndSub Sub CloseISCOComm SerialClose(ISCO6712port) EndSub Sub ProcessISCOData Dim Bottle As Long SplitStr (ISCO_Data(),ISCO_Instring,",",50,5) Bottle=1 For I = 1 To 49 Step 2 If Left(ISCO_Data(I),1)="B" Then ISCO_Bottle(Bottle)=Mid(ISCO_Data(I),2,2) ISCO_BottleTime(Bottle)=ISCO_Data(I+1) Bottle=Bottle+1 EndIf ISCO_Bottle1=ISCO_Bottle(1) 'Integer version of ISCO_Bottle(1) string If ISCO_Data(I)="CR" Then ISCO_TodaysRain=ISCO_Data(I+1) If ISCO_Data(I)="CS" Then ISCO_Checksum=ISCO_Data(I+1) If ISCO_Data(I)="DE" Then ISCO_Description=ISCO_Data(I+1) If ISCO_Data(I)="FL" Then ISCO_Flow=ISCO_Data(I+1) If ISCO_Data(I)="ID" Then ISCO_ID=ISCO_Data(I+1) If ISCO_Data(I)="LE" Then ISCO_Level=ISCO_Data(I+1) If ISCO_Data(I)="MO" Then ISCO_Model=ISCO_Data(I+1) If ISCO_Data(I)="PR" Then ISCO_YesterdaysRain=ISCO_Data(I+1) If ISCO_Data(I)="RA" Then ISCO_RainTips=ISCO_Data(I+1) If ISCO_Data(I)="SS" Then ISCO_EnableState=ISCO_Data(I+1) If ISCO_Data(I)="TI" Then ISCO_Time=ISCO_Data(I+1) If ISCO_Data(I)="VE" Then ISCO_Velocity=ISCO_Data(I+1) If ISCO_Data(I)="VO" Then ISCO_Volume=ISCO_Data(I+1) If ISCO_Data(I)="VSI" Then ISCO_VelSigStrength=ISCO_Data(I+1) If ISCO_Data(I)="VSP" Then ISCO_VelSpecStrength=ISCO_Data(I+1) Next I If ISCO_RainTips 0 Then AV2150CommFailure = True 'AV2150 never responded ExitSub '2150 didn't respond Else AV2150CommFailure = False 'AV2150 responded EndIf ' AV2150TakeReadingFlag = 1 'Set the flag to take a set of readings on demand AV2150TakeReadingFlag = 2 'Set the flag to cause an automatic, 15 second update of readings ModbusMaster (ModbusResultTakeReadingWrite,AV2150port,9600,2,6,AV2150TakeReadingFlag,25,1,20,40,10) 'Write Take Reading Flag to register 25 ModbusMaster (ModbusResultTakeReadingRead,AV2150port,9600,2,3,AV2150TakeReadingFlag,25,1,20,40,11) 'Read take reading flag from register 25 ModbusMaster (ModbusResultLevel,AV2150port,9600,2,3,ISCO_Level,40,1,20,40,12) 'Level ModbusMaster (ModbusResultLevelStatTime,AV2150port,9600,2,3,LevelStatTime(),42,7,20,40,11) 'Level Status & Time ModbusMaster (ModbusResultVelocity,AV2150port,9600,2,3,ISCO_Velocity,55,1,20,40,12) 'Velocity ModbusMaster (ModbusResultVelocityStatTime,AV2150port,9600,2,3,VelocityStatTime(),57,7,20,40,11) 'Velocity Status & Time ModbusMaster (ModbusResultFlow,AV2150port,9600,2,3,ISCO_Flow,70,1,20,40,12) 'Flow ModbusMaster (ModbusResultFlowStatTime,AV2150port,9600,2,3,FlowStatTime(),72,7,20,40,11) 'Flow Status & Time ModbusMaster (ModbusResultVolume,AV2150port,9600,2,3,ISCO_Volume,100,1,20,40,12) 'Volume ModbusMaster (ModbusResultVolumeStatTime,AV2150port,9600,2,3,VolumeStatTime(),102,7,20,40,11) 'Volume Status & Time ModbusMaster (ModbusResultVolts,AV2150port,9600,2,3,AV2150Volts,130,1,20,40,12) 'Voltage ModbusMaster (ModbusResultVoltsStatTime,AV2150port,9600,2,3,AV2150VoltsStatTime(),132,7,20,40,11) 'Voltage Status & Time ModbusMaster (ModbusResultTemp,AV2150port,9600,2,3,AV2150Temp,145,1,20,40,12) 'Temperature ModbusMaster (ModbusResultTempStatTime,AV2150port,9600,2,3,AV2150TempStatTime(),147,7,20,40,11) 'Temperature Status & Time EndSub Sub SetBatteryCharging 'Note: Setting SW12 high sends solar output to ISCO battery If ChargingISCOBattery=False Then VoltSe(ISCO_Batt,1,mV5000,1,False,0,_60Hz,.003712,0) '1:3.2 divider (10k, 22k resistors), output in volts SW12(1) 'Direct charging to ISCO Battery ChargingISCOBattery=True Delay (0,30,Sec) Battery(CSI_Batt) Else Battery(CSI_Batt) SW12(0) 'Direct charging to CSI Battery ChargingISCOBattery=False Delay (0,30,Sec) VoltSe(ISCO_Batt,1,mV5000,1,False,0,_60Hz,.003712,0) '1:3.2 divider (10k, 22k resistors), output in volts EndIf If CSI_Batt<12.2 OR ISCO_Batt>12.4 OR Nighttime Then SW12(0) 'Direct charging to CSI Battery ChargingISCOBattery=False Else SW12(1) 'Direct charging to ISCO Battery ChargingISCOBattery=True EndIf EndSub Sub MeasureConductivity BrFull(Rs, 1, mV2500, 3, VX1, 1, 2500, True, True, 0, 250, -0.001, 1) Rs = 1*Rs/(1.0-Rs) Select Case Rs Case Is < 1.8 BrHalf(Rs, 1, mV2500, 6, VX1, 1, 2500, True, 0, 250, 1, 0) Rs = (Rs/(1-Rs)) Case Is < 9.25 BrFull(Rs, 1, mV2500, 3, VX1, 1, 2500, True, True, 0, 250, -0.001, 1) Rs = Rs/(1-Rs) Case Is < 280 BrFull(Rs, 1, mV250, 3, VX1, 1, 2500, True, True, 0, 250, -0.001, 1) Rs = Rs/(1-Rs) EndSelect Rp = -Rcable * (0.000032) - 0.005 Rs = Rs + Rp OneOvrRs = 1 / Rs Ct = OneOvrRs * CellConstant If (Ct < 0.474) Then Ct = (Ct * 0.95031) - 0.00378 Else Ct = -0.02889 + 0.98614 * Ct + 0.02846 * Ct^2 EndIf Therm107 (TempDeg_C,1,3,Vx2,0,_60Hz,1,0) C25mScm_1 = (Ct * 100)/(((TempDeg_C-25) * TempCoef) + 100) EndSub 'Main Program BeginProg AV2150Attached = False YSIAttached = False ConductivityAttached = False SampleVolume = "950"'ml SampleOnEnable = True 'VolumeBetweenSamples_MGal = 0.08'Million Gallons = 300m^3 'note 283.2m^3 = 10000 ft^3 VolumeBetweenSamples_ft3 = 20000'ft^3 = 560m^3 ISCO_Level_Threshold_ft = 0.5'ft 'will reset to this when program starts 'Conductivity: Evaluate and edit each of these 3 user specific values Rcable=40 'edit this value to the actual footage of cable on your sensor CellConstant=1.417 'edit this value with the Cell Constant (Kc) printed on the label of each sensor TempCoef=2 'see section 9 of the manual for an explanation of how to more precisely determine the value of this coefficient Scan(1,Min,1,0) ISCO_Level = NaN ISCO_Velocity = NaN SamplesTaken = 0 GetISCOData If AV2150Attached Then Get2150Data VolumeBetweenSamples = VolumeBetweenSamples_ft3 * 0.0283168 'convert to M^3 ISCO_Level_Threshold = ISCO_Level_Threshold_ft * .3048 'convert to M If NOT (ISCO_Volume_LastSample > 0 OR ISCO_Volume = NaN) Then ISCO_Volume_LastSample = ISCO_Volume 'trap for ISCO_Volume_LastSample = 0 or NaN If ISCO_Volume < Last_ISCO_Volume - 300 Then 'if volume drops by more than 300m^3 (~10,000ft^3) in 5 minutes, means volume accumulator was reset ISCO_Volume_LastSample = ISCO_Volume_LastSample-Last_ISCO_Volume 'this makes ISCO_Volume_LastSample a negative number ISCO_Volume_Reset = True EndIf If ISCO_Level >= ISCO_Level_Threshold Then 'Sampling is enabled If ISCO_Volume - ISCO_Volume_LastSample >= VolumeBetweenSamples Then 'More than VolumeBetweenSamples has passed since last sample If NOT ISCO_Sampling_Enabled Then 'ISCO_Level just exceeded Threshold and more than VolumeBetweenSamples has passed If SampleOnEnable Then TakeSample Else 'ISCO_Level had previously exceeded Threshold and more than VolumeBetweenSamples has passed TakeSample EndIf ISCO_Volume_LastSample = ISCO_Volume 'reset logger volume accumulator EndIf ISCO_Sampling_Enabled = True 'ISCO_Level >= ISCO_Level_Threshold Else ISCO_Sampling_Enabled = False 'ISCO_Level < ISCO_Level_Threshold EndIf If ISCO_Volume > 0 Then Last_ISCO_Volume = ISCO_Volume 'Trap for ISCO_Volume=NaN which will cause ISCO_Volume_Reset to fail If ConductivityAttached Then MeasureConductivity CallTable(Conductivity) EndIf If SampleRequest Then TakeSample PanelTemp (LoggerTemp,_60Hz) CallTable(ISCOData) NextScan SlowSequence Scan (1,Hr,0,0) If TimeIntoInterval(7,24,hr) Then Nighttime=False If TimeIntoInterval(19,24,hr) Then Nighttime=True 'Uncomment the next line for solar powered sites SetBatteryCharging 'Uncomment the next 2 lines for 110VAC powered sites 'VoltSe(ISCO_Batt,1,mV5000,1,False,0,_60Hz,.003712,0) 'Measure ISCO battery voltage thru 1:3.7 divider (10k, 27k resistors) 'Battery(CSI_Batt) CallTable(BatteryData) NextScan EndProg
This is an example program I wrote that can do flow paced or time paced. Constants are used to set the mode. It has been six years since I wrote it, so you will need to read the comments in the program to know how to use it.
'Example program for different types of sampler control 'date: June 17, 2016 'program author: Jacob Davis, CSI ConstTable (Configuration) 'ISCO Serial Const ISCO_Comport = Com1 EndConstTable PreserveVariables 'This is the simplest way to ensure continued operation after power interruption Dim rTime(9) As Long Alias rTime(8) = rDayOfWeek Alias rTime(4) = rHourOfDay Alias rTime(5) = rMinute Dim tempInt As Long Public ResetSamplingSchedule As Boolean = False 'Manually set this to reset bottle numbers etc. Usually set after changing bottles in sampler. Public EnableSamplerControl As Boolean = False 'Manually set this to true when all parameters are set and you are ready for the datalogger to take over. '#######Enabling Event######### Dim ScheduleEnabled As Boolean = False 'Delayed Start Public DelayStart As Boolean = False 'True to use delay start, false to not delay Public StartDayOfWeek As Long = 1 '1 is Sunday. These correspond to day of week from realtime Public StartHHMM As Long = 1200 'Enter as 24 hour time 'Threshold Trigger Public WaterLevel 'A different parameter could be used to trigger off of, but requires changing code within the body of the program Public StartThreshold = 1.0 Dim ThresholdGood As Boolean 'Disabling Condition Public StopThreshold = 0.5 '#######Pacing Control######### Public TakeSampleAtStartOfInterval As Boolean 'Collect a sample at the beginning of the first interval? Dim firstSampleTaken As Boolean 'Keeps track of if first sample was taken Public NumberOfInstalledBottles As Long '1 if composite Public BottlesPerEvent As Long 'Number of bottles to use per event Dim remainingBottlesThisEvent As Long Public VolumePerSample As Long 'Volume to put in each bottle Public MaxSamples As Long = 24 'Total number of samples to collect before disabling sampler Dim samplesTaken As Long Dim TakeASample As Boolean 'True when you should start taking a sample this scan Const TimePaced = True Const FlowPaced = False Public PacingMode As Boolean = True 'TODO, add easy to understand way for changing the pacing mode. 'Time Paced Public MinutesBetweenSamples As Long Public IntervalOffset As Long 'Minutes into the interval to use as an offset 'Flow Paced Public WaterFlow Public FlowBetweenSampleEvents Dim accumulatedFlow '#######Sampler Control######## Public CurrentBottleNumber As Long 'CSI Smart, ISCO 10164-L cable, or ISCO serial 'ISCO serial Public ISCO_WaterLevel, ISCO_Flow Public LastBottle As Long, LastVolume As Long Public ISCO_SampleCode As Long, ISCO_SampleStatus As String * 20 Public ISCO_StatusCode As Long, ISCO_Status As String * 20 'Declare Public Variables 'Example: Public PTemp, batt_volt 'Declare Other Variables 'Example: 'Dim Counter 'Define Data Tables. DataTable (Test,1,-1) 'Set table size to # of records, or -1 to autoallocate. DataInterval (0,15,Min,10) Minimum (1,batt_volt,FP2,False,False) Sample (1,PTemp,FP2) EndTable Sub ISCO_GetStatus(_Comport As Long,_BottleCode As Long, _SampleVolume As Long, _LastSampleStatus As Long, _CurrentStatus As Long) 'Will poll the sampler for the current status Dim serialResponse As String * 256 Dim lBytesBack As Long Dim lString(18) As String Dim lk As Long ' send out repeated ? until you get the > prompt lBytesBack = SerialOut (_Comport,"?",">",20,10) 'TODO, don't have feedback for failed request. All values currently left as is if failed. If lBytesBack Then 'Received the prompt SerialOut (_Comport,CHR(13),">",1,100) SerialFlush(_Comport) ' command STS,2 SerialOut (_Comport,"STS,2" & CHR(13),"",1,100) 'Command is echoed back. Wait for the echo SerialIn (serialResponse,_Comport,200,13,256) SplitStr (lString(),serialResponse,",",18,5) For lk = 1 To 17 If InStr (1,lstring(lk),"STS",2) Then _CurrentStatus = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"BTL",2) Then _BottleCode = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"SVO",2) Then _SampleVolume = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"SOR",2) Then _LastSampleStatus = lstring(lk + 1) EndIf Next lk Else 'Failed to get prompt EndIf EndSub Sub ISCO_GetData(_Comport As Long,_BottleCode As Long, _SampleVolume As Long, _LastSampleStatus As Long, _CurrentStatus As Long, _WaterLevel As Float, _Flow As Float) 'Will poll the sampler for the current status and sensor data Dim serialResponse As String * 256 Dim lBytesBack As Long Dim lString(56) As String Dim lk As Long ' send out repeated ? until you get the > prompt lBytesBack = SerialOut (_Comport,"?",">",20,10) 'TODO, don't have feedback for failed request. All values currently left as is if failed. If lBytesBack Then 'Received the prompt SerialOut (_Comport,CHR(13),">",1,100) SerialFlush(_Comport) ' command STS,2 SerialOut (_Comport,"DATA" & CHR(13),"",1,100) 'Command is echoed back. Wait for the echo SerialIn (serialResponse,_Comport,200,13,256) SplitStr (lString(),serialResponse,",",56,5) For lk = 1 To 55 If InStr (1,lstring(lk),"STS",2) Then _CurrentStatus = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"BTL",2) Then _BottleCode = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"SVO",2) Then _SampleVolume = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"SOR",2) Then _LastSampleStatus = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"FL",2) Then _Flow = lstring(lk + 1) EndIf If InStr (1,lstring(lk),"LE",2) Then _WaterLevel = lstring(lk + 1) EndIf Next lk Else 'Failed to get prompt EndIf EndSub Sub ISCO_TakeSample(_Comport As Long, _BottleNumber As Long, _Volume As Long) 'Will trigger a sample on the specified bottle number and volume Dim lBytesBack As Long Dim _outCommand As String ' send out repeated ? until you get the > prompt lBytesBack = SerialOut (_Comport,"?",">",20,10) If lBytesBack Then SerialOut (_Comport,CHR(13),">",1,100) SerialFlush(_Comport) ' command BTL,2,SVO,200 _outCommand = "BTL," & FormatLong (_BottleNumber,"%u") & ",SVO," & FormatLong(_Volume,"%u") & CHR(13) SerialOut (_Comport,_outCommand,"",0,0) 'This sub doesn't wait for a response. Request the status later to see if the sample was successful. EndIf EndSub Function ISCO_ConvertStatusCode(SamplerStatusCode As Long) As String * 20 Select Case SamplerStatusCode Case 1 Return "Waiting for Sample" Case 4 Return "Power Failed" Case 5 Return "Pump Jammed" Case 6 Return "Distributor Jammed" Case 9 Return "Sampler Off" Case 12 Return "Sample in Progress" Case 20 Return "Invalid Command" Case 21 Return "Checksum Mismatch" Case 22 Return "Invalid Bottle" Case 23 Return "Volume Out of Range" Case Else Return "Invalid Code" EndSelect EndFunction Function ISCO_ConvertSampleCode(SampleStatusCode As Long) As String * 20 Select Case SampleStatusCode Case 0 Return "Sample OK" Case 1 Return "No Liquid Found" Case 2 Return "Liquid Lost" Case 3 Return "User Stopped" Case 4 Return "Power Failed" Case 5 Return "Pump Jammed" Case 6 Return "Distributor Jammed" Case 8 Return "Pump Latch Open" Case 11 Return "No Distributor" Case 12 Return "Sample in Progress" Case Else Return "Invalid Code" EndSelect EndFunction 'Main Program BeginProg 'ISCO Serial SerialOpen (ISCO_Comport,9600,3,0,256) 'Configure the comport 'Sending the request status message will turn on the sampler. Call ISCO_GetStatus(ISCO_Comport, LastBottle,LastVolume, ISCO_SampleCode,ISCO_StatusCode) 'Will poll the sampler for the current status Scan (1,Min,0,0) PanelTemp (PTemp,250) Battery (batt_volt) 'Enter other measurement instructions 'Read Status from Sampler Call ISCO_GetStatus(ISCO_Comport, LastBottle,LastVolume, ISCO_SampleCode,ISCO_StatusCode) 'Will poll the sampler for the current status 'ISCO Serial Call ISCO_GetData(ISCO_Comport, LastBottle,LastVolume, ISCO_SampleCode,ISCO_StatusCode,ISCO_WaterLevel,ISCO_Flow) 'Will poll the sampler for the current status WaterLevel = ISCO_WaterLevel WaterFlow = ISCO_Flow ISCO_SampleStatus = ISCO_ConvertSampleCode(ISCO_SampleCode) ISCO_Status = ISCO_ConvertStatusCode(ISCO_StatusCode) 'Manual reset of sampling control If ResetSamplingSchedule Then ResetSamplingSchedule = False EnableSamplerControl = False CurrentBottleNumber = 0 TakeASample = False ScheduleEnabled = False ThresholdGood = False samplesTaken = 0 firstSampleTaken = False accumulatedFlow = 0 remainingBottlesThisEvent = 0 EndIf 'ResetSamplingSchedule '#######Enabling Event######### 'Delayed Start RealTime(rTime) tempInt = rHourOfDay * 100 + rMinute 'HHMM If DelayStart Then If EnableSamplerControl Then If (tempInt > StartHHMM) AND (StartDayOfWeek = rDayOfWeek) Then ScheduleEnabled = true EndIf Else ScheduleEnabled = false EndIf 'EnableSamplerControl Else If EnableSamplerControl Then ScheduleEnabled = true Else ScheduleEnabled = false EndIf 'EnableSamplerControl EndIf ' DelayStart 'Threshold Trigger If WaterLevel > StartThreshold Then ThresholdGood = true 'Disabling Condition If WaterLevel < StopThreshold Then ThresholdGood = false '#######Pacing Control######### 'Time Paced or Flow Paced If ScheduleEnabled AND ThresholdGood Then If TakeSampleAtStartOfInterval AND firstSampleTaken = false Then 'Sample trigger for first sample after enabled firstSampleTaken = true TakeASample = true EndIf 'Time paced If PacingMode = TimePaced Then 'Time Paced If TimeIntoInterval (IntervalOffset,MinutesBetweenSamples,Min) Then TakeASample = True Else 'Flow Paced '!!!!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!!!!!! 'The time units on the flow and the scan time must be compensated for 'If the scan is 1 minute, and the flow is gpm, you get lucky and end up with gallons accumulatedFlow += WaterFlow If accumulatedFlow > FlowBetweenSampleEvents Then accumulatedFlow -= FlowBetweenSampleEvents TakeASample = true EndIf EndIf 'Pacing Mode Else TakeASample = false EndIf 'ScheduleEnabled and ThresholdGood '#######Sampler Control######## 'CSI Smart, ISCO 10164-L cable, or ISCO serial 'ISCO Serial If TakeASample Then TakeASample = false samplesTaken += 1 If NumberOfInstalledBottles = 1 Then 'Composite CurrentBottleNumber = 1 Else 'Discrete If remainingBottlesThisEvent <= 0 Then '0 , so first sample this event remainingBottlesThisEvent = BottlesPerEvent EndIf 'remainingBottlesThisEvent CurrentBottleNumber += 1 remainingBottlesThisEvent -= 1 'Decrement for this sample If remainingBottlesThisEvent Then TakeASample = True 'Marks to take another sample next scan when there are remaining bottles EndIf If samplesTaken >= MaxSamples Then 'Sampler will disable itself when it has filled all the bottles EnableSamplerControl = False EndIf 'Trigger the sampler Call ISCO_TakeSample(ISCO_Comport, CurrentBottleNumber,VolumePerSample) EndIf 'Call Output Tables 'Example: CallTable Test NextScan EndProg
Ok!
Thank you Jacob. I'll dig into this and let you know how it goes.
Sorry for bumping old thread. Any update?