I have datalogger which is hooked up directly to an instrument that reads every minute as well as two multiplexers which read daily. I would like to be able to read the mux'es at will without duplicating a bunch of code.
I am attempting to read the individual multiplexers at will with a "read_mux#_now" boolean toggle in addition to regular scan intervals. My attempts so far have led me to creating individual subroutines for each mux and then calling them up for the standard scan or when the "read_mux#_now" toggle is true.
When I placed the multiplexer portion of the code into subroutines I get a compile error: "SubScan used outside of Scan .. NextScan". I am new at this, I do know why the error is being thrown up, but I do not know what I should be doing instead of this. For reference my code is below:
'Declared variables, units and tables removed for brevity '///////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '//////////////////////////////DECLARE SUBROUTINES\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '///////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Sub Read_Mux-1 PortSet(U5,1) 'TURN MUX 1 ON Delay(0,150,mSec) Count=1 'This is where I have the compile error SubScan(0,uSec,15) PulsePort(U7,10000) 'SWITCH TO NEXT PORT ON MUX VibratingWire(VW(1),1,U1,1200,2800,1,0.01,"",60,1.4051E-3,2.369E-4,1.019E-7) Freq(Count)=VW(1) Amp(Count)=VW(2) SNRat(Count)=VW(3) NFreq(Count)=VW(4) DRat(Count)=VW(5) DL1_Therm(Count)=VW(6) DL1_Digits(Count)=Freq(Count)^2/1000 'CALCULATE DIGITS Disp(Count)=(DL1_Digits(Count)-DL1_Digits0(Count))*G_Factor(Count) 'CALCULATE DISPLAY VALUES Count=Count+1 NextSubScan FieldCal(4,DL1_Digits(),15,0,DL1_Digits0(),ZMode,0,CIndex,CAvg) 'Zeroing calibration for Jointmeter calculations 'DL1_Digits()' PortSet(U5,0) 'Turn AM16/32 Multiplexer Off Delay(0,150,mSec) EndSub Sub Read_Mux-2 PortSet(U6,1) 'TURN MUX 2 ON Delay(0,150,mSec) Count_2=1 SubScan(0,uSec,8) PulsePort(U7,10000) 'SWITCH TO NEXT PORT ON MUX VibratingWire(VW_2(1),1,U1,1000,4000,1,0.01,"",60,1.4051E-3,2.369E-4,1.019E-7) Freq_2(Count_2)=VW_2(1) Amp_2(Count_2)=VW_2(2) SNRat_2(Count_2)=VW_2(3) NFreq_2(Count_2)=VW_2(4) DRat_2(Count_2)=VW_2(5) DL1_Therm_2(Count_2)=VW_2(6) DL1_Digits_2(Count_2)=Freq_2(Count_2)^2/1000 'DIGITS CALCULATION Lvl(Count_2)=(DL1_Digits_2(Count_2)-DL1_Digits0_2(Count_2))*G_Factor_2(Count_2) 'PRESSURE PSI CALCULATION ELEV(Count_2)=(Lvl(Count_2)*2.3067)+SELEV(Count_2) 'WATER ELEVATION CALC Count_2=Count_2+1 NextSubScan FieldCal(4,DL1_Digits_2(),8,0,DL1_Digits0_2(),ZMode_2,0,CIndex_2,CAvg_2) 'Zeroing calibration for Piezometer calculations 'DL1_Digits_2()' PortSet(U6,0) 'Turn AM16/32 Multiplexer Off Delay(0,150,mSec) EndSub Sub Initialize_JMCAL CIndex=1 : CAvg=1 For Count = 1 To 15 DL1_Digits0(Count)=F0DL1_Digits(Count) ': DL1_Therm_20(Count)=F0Temp(Count) Next EndSub Sub Initialize_VWPCAL CIndex_2=1 : CAvg_2=1 For Count_2 = 1 To 8 DL1_Digits0_2(Count_2)=F0DL1_Digits_2(Count_2) Next EndSub '///////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '//////////////////////////////////MAIN PROGRAM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '///////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BeginProg Scan(1,Min,1,0) 'SETTING SCAN TIME FOR PROGRAM '///READING FLOWMETER 2122 PER MAIN SCAN RATE\\\ VibratingWire(VW_3(),1,U9,100,6500,1,0.01,"",_60Hz,1.4051E-3,2.369E-4,1.019E-7) Freq_3=VW_3(1) Amp_3=VW_3(2) SNRat_3=VW_3(3) NFreq_3=VW_3(4) DRat_3=VW_3(5) DL1_Therm_3=VW_3(6) DL1_Digits_3=Freq_3^2/1000 If IfTime (0,1440,min) Then Call Initialize_JMCAL Call Initialize_VWPCAL FCLoaded=LoadFieldCal(True) '///MAIN SCAN\\\ Battery(Battv) PanelTemp(PTemp_C,60) '///READ MUX 1 - JOINTMETERS\\\ Call Read_Mux-1 '///READ MUX 2 - PIEZOMETERS\\\ Call Read_Mux-2 Endif If Read_JM_Now = true Then Call Initialize_JMCAL 'INITIALIZE CALIBRATION FACTORS FCLoaded=LoadFieldCal(True) Call Read_Mux-1 EndIf If Read_VWP_Now = true Then Call Initialize_VWPCAL 'INITIALIZE CALIBRATION FACTORS FCLoaded=LoadFieldCal(True) Call Read_Mux-2'READ PIEZOMETERS EndIf Read_JM_Now=False Read_VWP_Now=False '///Call Tables\\\ CallTable Datalogger1 CallTable Datalogger1Info CallTable Display CallTable CalHist CallTable Fl2122 NextScan EndProg
I am open to suggestions of better methods. I am uncertain that this will work as written outside of the one compile error. Thank you for your time in reading this.
This is solved, I ended up substituting the subscan / nextsubscan for a do/loop statement. This solved the problem. It should be noted that this forces the datalogger into sequential mode, which may or may not be important to you.