I have a YSI EXO2 sonde running on a CR1000 data logger. My program is below. The sonde will provide data for an hour or so then stop. Then I go out unplug power to it and plug back in. Sometimes it starts sending data again sometimes it doesn't and I have to recycle power again to get it to eventually start again. The sonde is brand new.
I setup the deployment of the sonde using YSI software and USB cable then plug it into the data logger through their modbus signal output adapter for SDI-12 output. Voltage stays well above the 9 volt cutoff of the sensor. I have another station with the EXO2 in almost the exact same configuration and it appears to be doing fine. I'm wondering if anyone else has experienced this issue with this sonde and campbell loggers?
Public PTemp, batt_volt
Public EXO(21)
Public Phy(1)
Public Chl(1)
Public DOM(1)
Public InString As String * 1000, NBytesReturned
Public Wind(8)
Public Licor(1)
Alias EXO(1)=WTemp
Alias EXO(2)=Cond
Alias EXO(3)=spCond
Alias EXO(4)=Sal
Alias EXO(5)=pHmv
Alias EXO(6)=pH
Alias EXO(7)=ORP
Alias EXO(8)=Depth
Alias EXO(9)=Battv
Alias EXO(10)=Date
Alias EXO(11)=Time
Alias EXO(12)=ODOSat
Alias EXO(13)=TDSmgL
Alias EXO(14)=TurbNTU
Alias EXO(15)=TSSmgL
Alias EXO(16)=ODOmgL
Alias EXO(17)=WiperCurr
Alias EXO(18)=WiperPos
Alias EXO(19)=CablePWR
Alias EXO(20)=PressPsia
Alias EXO(21)=PressPsig
DataTable (GBE,1,-1) 'Set table size to # of records, or -1 to autoallocate.
DataInterval (0,5,min,10)
Minimum (1,batt_volt,FP2,False,False)
Sample (1,PTemp,FP2)
Sample (1,EXO(1),FP2)
Sample (1,EXO(2),FP2)
Sample (1,EXO(3),FP2)
Sample (1,EXO(4),FP2)
Sample (1,EXO(5),FP2)
Sample (1,EXO(6),FP2)
Sample (1,EXO(7),FP2)
Sample (1,EXO(8),FP2)
Sample (1,EXO(9),FP2)
Sample (1,EXO(10),FP2)
Sample (1,EXO(11),FP2)
Sample (1,EXO(12),FP2)
Sample (1,EXO(13),FP2)
Sample (1,EXO(14),FP2)
Sample (1,EXO(15),FP2)
Sample (1,EXO(16),FP2)
Sample (1,EXO(17),FP2)
Sample (1,EXO(18),FP2)
Sample (1,EXO(19),FP2)
Sample (1,EXO(20),FP2)
Sample (1,EXO(21),FP2)
Sample (1,Phy(),FP2)
Sample (1,Chl(),FP2)
Sample (1,DOM(),FP2)
Sample (1,Wind(1),FP2)
Sample (1,Wind(2),FP2)
Sample (1,Wind(3),FP2)
Sample (1,Wind(4),FP2)
Sample (1,Wind(5),FP2)
Sample (1,Wind(6),FP2)
Sample (1,Wind(7),FP2)
Sample (1,Wind(8),FP2)
Sample(1,Licor(1),FP2)
EndTable
BeginProg
SerialOpen(Com4,9600,3,0,300)
Scan (5,min,0,0)
PanelTemp (PTemp,250)
Battery (batt_volt)
VoltSe(Phy(),1,0,1,0,100,250,1,0)
VoltSe(Chl(),1,0,3,0,100,250,1,0)
VoltSe(DOM(),1,0,2,0,100,250,1,0)
SDI12Recorder(EXO(),1,0,"C!",1,0)
SerialInRecord (Com4,InString,0,39,&H0D0A,NBytesReturned,01)
SplitStr(Wind(),InString," ",8,5)
VoltDiff(Licor(1),1,3,3,1,0,250,266.04,0)
CallTable GBE
NextScan
EndProg
It wouldn't answer what the root of the problem is, but you could wire the sonde and interface to SW12. Then the datalogger could be programmed to power cycle it to save you a trip.
TrexMiller, I am having trouble even getting my EXO2s to respond to my cr1000, I even used your code above. I am using exo2s vented and using the EXO DCP Adapter and the sdi-12 output. Are you using the DCP or the Modbus adapter? I was under the impression I would need the DCP, now I am thinking otherwise.
Just want to respond to this since I've pretty much figured out many of my problems getting the EXO2 sonde from YSI Xylem to work with a CR1000. It's been almost a year of work on and off to figure this out. The root of the problem comes down to the fact that you can easily and unkowingly put this sonde into a state of internal logging only such that it will not respond to the CR1000 or other datalogger. See below for how to avoid this.
1. The new KorEXO program (2.1.0.8 as of this writing) has a tab for SDI12 setup (the previous versions I used did not). Connect the sonde directly to the PC using the USB cable from YSI and run the KorEXO program. In the setup template add all parameters you want (or that you have sensors for) to the DCP Adapter output section tab in KorEXO. Save the template and apply to sonde but do not tell it to start internal logging when asked. There might be a way to make the sonde start internal logging and still respond to SDI12 commands from the CR1000 but I have not figured it out. In additoin, do not click the big deploy button after applying the deploy template (I know, it's not intuitive at all), just exit the program, disconnect sonde and plug into your CR1000.
2. The sonde connects to the CR1000 digital ports through the DCP adapter. For SDI12 communication run some hookup wire (~24 gauge) from the SDI12 DCP adapter to one of the C1-C4 ports on the CR1000 (I used C1 for the program below). Run another wire from data ground and power ground on the adapter to any ground port on the CR1000. Run another wire from the power 9 - 16 VDC on the adapter to one of the 12 volt power ports of the CR1000 or even better to the SW12 volt port on the CR1000 (see below). See the EXO2 manual wiring instructions for the SDI12 DCP adapter for more info.
3. When the EXO2 is plugged into the adapter the adapter needs to have its power recycled (according to techs I spoke to at YSI and my own experience). You have to do this by unplugging the power on the adapter or waving the YSI- supplied magnet thingy at the adapter. Just as easy to unplug it. This is somewhat problematic if you are like me and the sonde connections to the adapter go through wet pluggable connectors into an electronics well that is sealed up in a dry well. Its not advisable to go in and out of a sealed dry well, especially if you are in the field. This is why we connect power from the adapter to the SW12 port on the CR1000 since this allows switching power on and off. You want to be able to do this remotely, which you can if you setup the program correctly. Thanks to Mark Wallace at CS for the help on this!
4. Other obvious but easily fogotten things...
a) As with all SDI12 sensors be sure the address indicated in the SDI12record argument is the same address of the sensor. For the EXO2, its address can be set in the deployment DCP adapter output section in the KorEXO program, or presumably (like other SDI12 sensors) it can be set remotely using terminal emulator in LoggerNet with the command a!.
b) The magnet thingy that comes with the EXO2 was pretty much unimportant for me as it just cycles power at the adapter, not the sonde.
c) Need to be sure order of output chosen in the DCP adapter section in KorEXO program should match order of the alias designations in the CRBasic program, or table order setting if you don't use an alias.
Below is the final CRBasic program I used that has worked with the EXO2 sonde (as well as other sensors) and CR1000 data logger.
'GBW2018 Buoy Script, Todd R. Miller, University of Wisconsin - Milwaukee, Feb. 24, 2018.
'CR1000 program For EXO2 sonde, RM Young marine wind sensor 5106 with 32500 digital compass,''
'Licor 190R, and Turner C7 fluorometers.
'EXO powered by SW12 switched power that is always on unless power needs to be recycled by setting
'the PowerCycleSondeNow variable to -1. Power goes off for 60s then back on.
Public PTemp, batt_volt
Public EXO(15) '15 variables measured by EXO2 sonde
Public Phy(1)
Public Chl(1)
Public DOM(1)
Public InString As String * 100, NBytesReturned 'string variale for wind sensor from compass
Public Wind(8) 'wind sensor string has 8 parts
Public WS
Public WD
Public Heading 'compass heading
Public RawWD 'uncorrected wind direction
Public Licor(1)
Public PowerCycleSondeNow As Boolean, Timer1_Seconds, Timer1_Threshold_Seconds=60, SW12_State=1
Alias EXO(1)=WTemp
Alias EXO(2)=spCond
Alias EXO(3)=Sal
Alias EXO(4)=pH
Alias EXO(5)=ORP
Alias EXO(6)=SondeBatt
Alias EXO(7)=Date
Alias EXO(8)=Time
Alias EXO(9)=DOSat
Alias EXO(10)=TDS
Alias EXO(11)=Turbidity
Alias EXO(12)=TSS
Alias EXO(13)=DOmgL
Alias EXO(14)=WiperCurrent
Alias EXO(15)=SondeCableV
Units WTemp=Degrees C
Units spCond=uS/cm
Units Sal=psu
Units pH=pH
Units ORP=ORP
Units SondeBatt=Volts
Units DOSat=%
Units TDS=mg/L
Units Turbidity=NTU
Units TSS=mg/L
Units DOmgL=mg/L
Units WiperCurrent=mAmps
Units SondeCableV=Volts
Units WS=m/s
Units WD=Degrees
DataTable (GBW,1,-1)
DataInterval (0,30,Sec,10)'average 6 readings every 30 seconds
Average (1,batt_volt,FP2,0)
Average (1,PTemp,FP2,0)
Average (1,EXO(1),FP2,0)
Average (1,EXO(2),FP2,0)
Average (1,EXO(3),FP2,0)
Average (1,EXO(4),FP2,0)
Average (1,EXO(5),FP2,0)
Average (1,EXO(6),FP2,0)
Average (1,EXO(7),FP2,0)
Average (1,EXO(8),FP2,0)
Average (1,EXO(9),FP2,0)
Average (1,EXO(10),FP2,0)
Average (1,EXO(11),FP2,0)
Average (1,EXO(12),FP2,0)
Average (1,EXO(13),FP2,0)
Average (1,EXO(14),FP2,0)
Average (1,EXO(15),FP2,0)
Average (1,Phy(),FP2,0)
Average (1,Chl(),FP2,0)
Average (1,DOM(),FP2,0)
Average (1,WS,FP2,0)
Average (1,WD,FP2,0)
Average (1,Heading,FP2,0)
Average (1,RawWD,FP2,0)
Average (1,Licor(1),FP2,0)
EndTable
BeginProg
SerialOpen(Com2,9600,3,0,3000) 'Open serial com for digital compass
Scan (10,Sec,0,0)
PanelTemp (PTemp,250)
Battery (batt_volt)
VoltSe(Phy(),1,0,1,0,100,250,1,0) 'single end voltage reading of fluorometer on SE1
VoltSe(Chl(),1,0,2,0,100,250,1,0) 'single end voltage reading of fluorometer on SE2
VoltSe(DOM(),1,0,3,0,100,250,1,0) 'single end voltage reading of fluorometer on SE3
SDI12Recorder(EXO(),1,1,"C!",1,0) 'EXO2 on digital port 1
SerialInRecord (Com2,InString,0,39,&H0D0A,NBytesReturned,01) 'serial read digital compass with no begin word, 39 bytes, and end at carraige return
SplitStr(Wind(),InString," ",8,5) 'split the digital compass instring into 8 segments based on space as the separator
WS=Wind(1)*0.04903 'convert pulse count wind speed to m/s and store in WS
WD=Wind(2)/10 'convert raw wind direction to degrees and store in WD
If WD > 360 Then WD = WD - 360
If WD < 0 Then WD = WD + 360
If WD>=360 Then WD=0
Heading=Wind(7)/10 'buoy heading
RawWD=Wind(8)/10 'uncorrected wind direction
VoltDiff(Licor(1),1,3,4,1,0,250,266.04,0)
Timer1_Seconds=Timer(1,Sec,4)'Read Timer#1.
If PowerCycleSondeNow Then 'Starting edge of power cycle event.
Timer(1,Sec,2)'Reset and start Timer#1.
SW12_State=0
PowerCycleSondeNow=False
EndIf
If Timer1_Seconds>0 And Timer1_Seconds>Timer1_Threshold_Seconds Then 'Ending edge of power cycle event.
Timer(1,Sec,3)'Stop and reset Timer#1.
SW12_State=1
EndIf
SW12(SW12_State)
CallTable GBW
NextScan
EndProg
Hi TrexMiller.
I am about to install one of these sensors on a project. I'm going to use the EXO Modbus Signal Output Adapter as I have to run the cable about 300 ft. from the sonde to a CR6 Logger. I'm curious as to why you used the Modbus module for the SDI instead of the EXO DCP Signal Output Adapter.
Thanks,
Dave