Automatic Geophysical Observatories
AGO Service ARGOS Status Messages

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