Each AGO produces a number of 32 byte messages that are transmitted to the polar orbiting satellites every 200 seconds. The message is transmitted to the Service ARGOS Data Center and on to this AGO server each day. As messages are received they are marked by Service ARGOS with the transmitter number and time of reception. A typical message looks like:
00860 080730932J
1997-04-01
04:12:58.616 1 02 00
5B 04
0A 02 35 01
13 07 36 01
22 2F 4A 02
5E B1 B1 FF
C2 C7 C1 C4
C4 87 A4 AD
C3 BF A4 60
Where 00860 is the AGO Data program
number
08073 identifies the transmitter sending the data (in this case
AGO-2)
09 identifies the number of lines in this message
32 is the number of sensors (in our case one byte/sensor) in the
message
J is the satellite that received the message (in this case NOAA-J)
The next line is the date and time UTC the message
was received
1
the channel number transmitting - we operate one channel per AGO, in general
Following this are the 32 bytes of data.
The first byte m[0] indicated the message type. New messages types were introduced with the upgrade of the Data System in 1999. Each message type delivers a different set of data:
Message One Data: (for ARGOS messages prior to 1999 DCU upgrade)
dayno = m[1]; dayno <<=8; dayno
+= (int)m[2];
hour = m[3];
minute= m[4];
second= m[5];
hsecs = m[6];
time_quality=m[7];
disk_unit=m[9];
disk_block= (long)m[10];
disk_block= (disk_block<<8) + (long)m[11];
disk_block= (disk_block<<8) + (long)m[12];
fuel_status= m[24];
Ckt_status = m[13];
reset_counter = (unsigned)m[14];
h.Circuit_Current1 = (short)m[15] << 4;
h.Circuit_Current2 = (short)m[16] << 4;
h.Circuit_Current3 = (short)m[17] << 4;
h.Circuit_Current4 = (short)m[18] << 4;
h.Circuit_Current5 = (short)m[19] << 4;
h.Circuit_Current6 = (short)m[20] << 4;
h.Circuit_Current7 = (short)m[21] << 4;
h.Barometric_Pressure = (short)m[22] << 4;
h.Fuel_Pressure = (short)m[23] << 4;
h.Power_Bus_Voltage = (short)m[25] << 4;
h.TEG_Current = (short)m[26] << 4;
h.Shunt_Current = (short)m[27] << 4;
t = (short)m[28];
h.Exhaust_Temp = 3*t+200;
h.Coolant_Pressure = (short)m[29] << 4;
Message Two Data: (for ARGOS messages prior to 1999 DCU upgrade)
dayno = m[1]; dayno <<=8; dayno
+= (int)m[2];
hour = m[3];
minute= m[4];
second= m[5];
time_quality=m[6];
h.Ambient_Temp = ((short)m[7]<<8) + (short)m[8];
pressure = ((short)m[9]<<8) + (short)m[10];
h.Barometric_Pressure = pressure;
presst = (short)m[11];
if(presst & 0x80) presst = - (presst & 0x7F);
/* apply sign */
h.Wind_Speed = (short)m[12] << 4;
h.Wind_Direction = (short)m[14] << 4;
peak_wind = (short)m[13] << 4;
h.Room_Temp = ((short)m[15] << 8) + (short)m[16];
h.Batt_Voltage1 = (short)m[17] << 4;
h.Batt_Voltage2 = (short)m[18] << 4;
h.Burner_Temp1 = ubscale((short)m[19]);
h.Burner_Temp2 = ubscale((short)m[20]);
h.Burner_Temp3 = ubscale((short)m[21]);
h.Burner_Temp4 = ubscale((short)m[22]);
h.Burner_Temp5 = ubscale((short)m[23]);
h.Burner_Temp6 = ubscale((short)m[24]);
h.Burner_Voltage1 = (short)m[25] << 4;
h.Burner_Voltage2 = (short)m[26] << 4;
h.Burner_Voltage3 = (short)m[27] << 4;
h.Burner_Voltage4 = (short)m[28] << 4;
h.Burner_Voltage5 = (short)m[29] << 4;
h.Burner_Voltage6 = (short)m[30] << 4;
Message Seven Data: (post 1999)
WindSpeed = 50.0 * ((m[8] <<
8) | m[9]) / 65536.0;
WindDirection = 360.0 * ((m[10] <<
8) | m[11]) /65536.0;
Barometer = 600.000 * ((m[6] <<
8) | m[7]) / 65536.0 + 500.000;
OutsideTemp = 256.0 * ((m[4] <<
8) | m[5]) / 65536.0 - 128.0;
Message Eight Data: (post 1999)
Minutes = m[1];
Hours = (m[3] << 8) | m[2];
Source0Volt_float = 80.000 * ((m[7] <<
8) | m[6]) / 65536.0;
if(Source0Volt_float< 8.000) {}
else {
Pump0Curr_float = 4.000 * ((m[9] <<
8) | m[8]) / 65536.0;
Source0Curr_float = 8.000 * ((m[5] <<
8) | m[4]) / 65536.0;
}
Source1Volt_float = 80.000 * ((m[13] <<
8) | m[12]) / 65536.0;
if(Source1Volt_float< 8.000) {}
else {
Pump1Curr_float = 4.000 * ((m[15] <<
8) | m[14]) / 65536.0;
Source1Curr_float = 8.000 * ((m[11] <<
8) | m[10]) / 65536.0;
}
Source2Volt_float = 80.000 * ((m[19] <<
8) | m[18]) / 65536.0;
if(Source2Volt_float< 8.000) {}
else {
Pump2Curr_float = 4.000 * ((m[21] <<
8) | m[20]) / 65536.0;
Source2Curr_float = 8.000 * ((m[17] <<
8) | m[16]) / 65536.0;
}
Source3Volt_float = 80.000 * ((m[25] <<
8) | m[24]) / 65536.0;
if(Source3Volt_float< 8.000) {}
else {
Pump3Curr_float = 4.000 * ((m[27] <<
8) | m[26]) / 65536.0;
Source3Curr_float = 8.000 * ((m[23] <<
8) | m[22]) / 65536.0;
}
BatteryCharge = (m[29] << 8) | m[28];
Message Nine Data: (post 1999)
Minutes = m[1];
Hours = (m[3] << 8) | m[2]:
WindSpeed =50.0 * (((m[5] & 0x00F0) <<
8) | (m[4] << 4)) /65536.0;
WindDirection = 360.0 * ((m[6] << 8)
| ((m[5] & 0x00F0) << 4)) /65536.0;
Barometer = 60.000 * (((m[8] & 0x00F0)
<< 8) | (m[7] << 4)) / 65536.0 + 50.000;
ChassTemp = 256.0 * ((m[9] << 8) | ((m[8]
& 0x00F0) << 4)) /65536.0 - 128.0;
InsideTemp = 256.0 * (((m[11] & 0x00F0)
<< 8) | (m[10] << 4)) /65536.0 - 128.0;
OutsideTemp = 256.0 * ((m[12] << 8)
| ((m[11] & 0x00F0) << 4)) /65536.0 - 128.0;
SpareTemp = 256.0 * (((m[14] & 0x00F0)
<< 8) | (m[13] << 4)) /65536.0 - 128.0;
SpareSensor = 5.000 * ((m[15] << 8)
| ((m[14] & 0x00F0) << 4)) /65536.0;
BusVoltage = 32.000 * (((m[17] & 0x00F0)
<< 8) | (m[16] << 4)) /65536.0;
ShuntCurrent = 2.000 * ((m[18] << 8)
| ((m[17] & 0x00F0) << 4)) /65536.0;
BattSupCur = 2.000 * (((m[20] & 0x00F0)
<< 8) | (m[19] << 4)) /65536.0;
CharPlusShCur = 2.000 * ((m[21] << 8)
| ((m[20] & 0x000F) << 4)) /65536.0;
ExpCurrent[12] = 1.000 * ((m[23] <<
8) | ((m[22] & 0xF0)) /65536.0;
ExpStatus[12] = m[22] & 0x0F;
ExpStatusString[12] = ExpStatusString[Expstatus[12]];
ExpCurrent[13] = 1.000 * ((m[25] <<
8) | (m[24] & 0xF0)) / 65536.0;
ExpStatus[13] = m[24] & 0x0F;
ExpStatusString[13] = ExpStatusString[Expstatus[13]];
DCUCurrent = 1.000 * ((m[27] << 8) |
(m[26] & 0xF0)) / 65536.0;
DCUStatus = m[26] & 0x0F;
DCUStatusString =ExpStatusString[DCUStatus];
DAUCurrent = 1.000 * ((m[29] << 8) |
(m[28] & 0xF0)) /65536.0;
DAUStatus = m[28] & 0x0F;
DCUStatusString =ExpStatusString[DCUStatus];
Message A Data: (post 1999)
Minutes = m[1];
Hours = (m[3] << 8) | m[2];
for (n = 0; n< 12; ++n) {
ExpCurrent[n] = 1.000 * ((m[2 * n + 5]<< 8)
| (m[2 * n + 4] & 0xF0))
ExpStatus[n] m[2*n + 4] & 0x0F;
}
Message B Data: (post 1999)
Minutes = m[1];
Hours = (m[3]<< 8) | m[2];
for (n = 0; n< 3; ++n) {
StoType[n] = m[7*n + 4];
StoFreeBlocks[n] = ((unsigned long) m[7*n
+ 9]<< 24)
| ((unsigned long) m[7*n + 8]<<
16)
| ((unsigned long) m[7*n + 7]<<
8)
| (unsigned long) m[7*n +6];
StoPressErr = m[7*n + 10] & 0x40;
StoTempErr = m[7*n + 10] & 0x80;
DataRamSize = (m[26]<< 8) | m[25];
DataRamFree = (m[28]<< 8) | m[27];
DataRamBad = (m[30]<< 8) | m[29];
Message C Data: (post 1999)
Not assigned
Message D Data: (post 1999)
Not assigned
Message E Data: (post 1999)
Not assigned
Message F Data: (post 1999)
Not assigned