COMMUNICATING WITH THE HP 59309A HP-IB DIGITAL CLOCK |
The Hewlett-Packard 59309A digital clock, introduced in 1974, is able to
communicate via an HP-IB (Hewlett-Packard Interface Bus), a precursor to
the GPIB (General Purpose Interface Bus), defined by the IEEE-488 standard.
These days HP-IB is mostly relegated to test instruments, so HP-IB interfaces for modern computers are not exactly common. I recently purchased an inexpensive (about $40 US) HP-IB (GPIB) to USB interface from LQ Electronics called the UG Simple. The product consists of a single cable with a USB connector at one end and a GPIB connector at the other end, along with an optical disk containing driver software. The LQ driver provides two functions:
This code compiles in Microsoft's free Visual Studio Community 2019 and produces a Windows console application that demonstrates reading and writing commands from and to the clock using the LQ Electronics UG Simple interface.
// LQ_59309.cpp // Read and set a Hewlett-Packard HP 59309A clock via LQ UGSimple interface // Last revised 27 April 2019 // #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <windows.h> #include <winuser.h> #define HPIB_ADDRESS 1 int day_counts[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //Define loading function pointers typedef int (*gwrite1)(int address, char* scpi); typedef char* (*gread1)(int address); //point the function pointer to specific function gwrite1 Gwrite; gread1 Gread; void fatal_exit(const char* s) { printf("Fatal: %s\n", s); exit(-1); } void Loaddll(void) { HINSTANCE hInst = NULL; hInst = LoadLibrary(TEXT("C:\\Program Files (x86)\\LQElectronics\\UGSimple\\UGSimpleAPI\\LQUGSimple_c.dll")); if (hInst == NULL) { fatal_exit( "Error loading UG DLL" ); } Gwrite = (gwrite1)GetProcAddress(hInst, "Gwrite"); Gread = (gread1)GetProcAddress(hInst, "Gread"); } int main() { time_t now; struct tm tm; int clock_address; char command[128]; int result; int i; char *answer = new char[500]; int month_number; Loaddll(); now = time(0); localtime_s(&tm, &now); printf("Now: %4d-%02d-%02d %02d:%02d:%02d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); clock_address = HPIB_ADDRESS; // Request the current clock values command[0] = 'C'; command[1] = '?'; command[2] = 0x00; result = Gwrite(clock_address, command); if (result < 0) exit(-2); answer = Gread(clock_address); if (answer) { printf("Answer (%d): ", (int)strlen(answer)); for (i = 0; i < (int)strlen(answer); i++) if ((answer[i] >= ' ') && (answer[i] <= 128)) printf("%c", answer[i]); else printf("\\%02X", answer[i]); printf("\n"); } else { printf("No answer.\n"); } // Set the time by stopping the clock (P), resetting the clock (R), // then moving ahead the proper number of seconds (S), minutes (M), // hours (H) and days (D), // then start the clock (T) command[0] = 'P'; command[1] = 'R'; command[2] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Stop Clock"); // Adjust seconds for (i = 0; i < tm.tm_sec; i++) command[i] = 'S'; command[i] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Set Seconds"); // Adjust minutes for (i = 0; i < tm.tm_min; i++) command[i] = 'M'; command[i] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Set Minutes"); // Set hours for (i = 0; i < tm.tm_hour; i++) command[i] = 'H'; command[i] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Set Hours"); // Set Days for (i = 0; i < tm.tm_mday - 1; i++) command[i] = 'D'; command[i] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Set Days"); // Set months by moving Day counter forward for each month for (month_number = 0; month_number < tm.tm_mon; month_number++) { for (i = 0; i < day_counts[month_number]; i++) command[i] = 'D'; command[i] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Set Months"); } // Start the clock command[0] = 'T'; command[1] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Start Clock"); // Clear the bus command[0] = '?'; command[1] = 0x00; result = Gwrite(clock_address, command); if (result < 0) fatal_exit("Clear Addressed"); exit(0); } |
Click here for the Wanted page.
Click here for the Main page.
Last updated April 27, 2019