24 #define BRUKER_INIT_ERROR -2
25 #define BRUKER_READ_ERROR -1
27 #define BRUKER_MAX_READ 5
29 #define BRUKER_TIME_OUT 2000
33 #define BRUKER_MAX_READBACK_FAILURE 5
36 #define BRUKER_RECONNECTION_TIMEOUT 5
39 #define BRUKER_ETS_LOGOUT_SLEEP 10000
43 #define BRUKER_ERR_WATER 0x001
44 #define BRUKER_ERR_PHASE 0x002
46 #define BRUKER_ERR_TEMP 0x004
48 #define BRUKER_ERR_EXT1 0x008
50 #define BRUKER_ERR_DOOR 0x010
52 #define BRUKER_ERR_GND 0x020
54 #define BRUKER_ERR_EXT2 0x040
56 #define BRUKER_ERR_CURR 0x100
60 #define BRUKER_STATUS_REMOTE 0x010000
61 #define BRUKER_STATUS_EXTREF 0x040000
63 #define BRUKER_STATUS_CYCLE 0x080000
65 #define BRUKER_STATUS_POLNORM 0x200000
67 #define BRUKER_STATUS_DCPWRON 0x400000
73 #define BRUKER_MAX_ERROR 10
74 #define BRUKER_DELTA_TIME_ERROR 1800
79 #define BRUKER_IN_CHS 5
80 #define BRUKER_OUT_CHS 2
92 #define BRUKER_SETTINGS_STR "\
93 Detailed Messages = INT : 0\n\
94 ETS_IN_USE = INT : 1\n\
95 Input Names = STRING[5] :\n\
96 [32] Polarity, 1=pos, 2=neg, 3=switch\n\
98 [32] Demand Current (Readback)\n\
99 [32] Output Current\n\
100 [32] Output Voltage\n\
101 Output Names = STRING[2] :\n\
102 [32] Power On=1/Off=0\n\
103 [32] Demand Current\n\
109 INT (*bd)(INT cmd, ...);
142 char reply[128], *lp;
150 lp = strstr(reply,
"/");
153 strncpy(str, lp, size);
184 if ((strlen(str) == 0) || (strlen(str) == 1)) {
189 lp = strstr(str,
"E");
191 if (strstr(str,
"E01") || strstr(str,
"E03"))
193 cm_msg(MDEBUG,
"bruker_decode_status",
"bruker_decode_status: str=%s", str);
199 sscanf(str,
"%x", &status);
204 al_trigger_alarm(
"Bruker",
"NO WATER FLOW",
"Alarm",
"no water flow", AT_INTERNAL);
205 cm_msg(MERROR,
"bruker",
"ERROR - NO WATER FLOW");
214 al_trigger_alarm(
"Bruker",
"PHASE ERROR",
"Alarm",
"phase error", AT_INTERNAL);
215 cm_msg(MERROR,
"bruker",
"ERROR - PHASE ERROR");
224 al_trigger_alarm(
"Bruker",
"OVERHEATED",
"Alarm",
"overheated", AT_INTERNAL);
225 cm_msg(MERROR,
"bruker",
"ERROR - OVERHEATED");
234 al_trigger_alarm(
"Bruker",
"EXTERNAL 1 ERROR",
"Alarm",
"ext. 1", AT_INTERNAL);
235 cm_msg(MERROR,
"bruker",
"ERROR - EXTERNAL 1 ERROR");
244 al_trigger_alarm(
"Bruker",
"EXTERNAL 1 ERROR",
"Alarm",
"door open", AT_INTERNAL);
245 cm_msg(MERROR,
"bruker",
"ERROR - DOOR OPEN");
254 al_trigger_alarm(
"Bruker",
"GROUND FAULT or HV SPARKING",
"Alarm",
"ground fault", AT_INTERNAL);
255 cm_msg(MERROR,
"bruker",
"ERROR - GROUND FAULT");
264 al_trigger_alarm(
"Bruker",
"EXTERNAL 2 ERROR",
"Alarm",
"ext. 2", AT_INTERNAL);
265 cm_msg(MERROR,
"bruker",
"ERROR - EXTERNAL 2 ERROR");
274 al_trigger_alarm(
"Bruker",
"OVERCURRENT",
"Alarm",
"overcurrent", AT_INTERNAL);
275 cm_msg(MERROR,
"bruker",
"ERROR - OVERCURRENT");
285 al_trigger_alarm(
"Bruker",
"DC POWER OFF",
"Warning",
"DC Power Off", AT_INTERNAL);
286 cm_msg(MINFO,
"bruker",
"BRUKER - WARNING - DC POWER OFF");
287 cm_msg(MDEBUG,
"bruker_decode_status",
"debug> str='%s', strlen(str)=%d", str, (
int)strlen(str));
296 cm_msg(MINFO,
"bruker",
"BRUKER - WARNING - SWITCHED LOCAL->REMOTE");
302 cm_msg(MINFO,
"bruker",
"BRUKER - WARNING - SWITCHED REMOTE->LOCAL");
330 char cmd[64], str[64];
337 cm_get_experiment_database(&hDB, NULL);
341 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
342 cm_msg(MERROR,
"bruker_init",
"bruker_init: Error creating Bruker DD record in ODB, status=%d", status);
347 db_find_key(hDB, hKey,
"DD", &hkeydd);
368 if (status != SUCCESS) {
369 cm_msg(MERROR,
"bruker_init",
"Couldn't initialize the bus driver :-(");
378 cm_msg(MINFO,
"bruker_init",
"initialize bruker, takes a while ...");
380 strcpy(cmd,
"REM/\r");
383 cm_msg(MINFO,
"bruker_init",
"REM status = %d, received string = %s", status, str);
386 if (!strstr(str,
"1")) {
388 cm_msg(MINFO,
"bruker_init",
"bruker power supply not in remote mode.");
395 strcpy(cmd,
"RST=0\r");
400 strcpy(cmd,
"STA/\r");
403 cm_msg(MINFO,
"bruker_init",
"STA status = %d, received string = %s", status, str);
407 cm_msg(MINFO,
"bruker_init",
"STA: bruker does not respond. Check power and RS232 conection, further check Lantronix.");
418 strcpy(cmd,
"POL/\r");
421 cm_msg(MINFO,
"bruker_init",
"POL: bruker does not respond. Check power and RS232 conection, further check Lantronix.");
434 cm_msg(MINFO,
"bruker_init",
"POL: str='%s', polarity=%f", str, info->
bruker_polarity);
438 cm_msg(MINFO,
"bruker_init",
"bruker initialized");
493 char cmd[64], str[64];
503 cm_msg(MINFO,
"bruker_set",
504 "set values not possible at the moment, since the bus driver is not available!");
511 strcpy(cmd,
"DCP=0\r");
512 }
else if (value == 1.0) {
513 strcpy(cmd,
"DCP=1\r");
515 cm_msg(MINFO,
"bruker_set",
"bruker_set: Power On=1, Power Off=0, everything else will be ignored!");
528 cm_msg(MDEBUG,
"bruker_set",
"bruker_set: demand current = %f", value);
542 sprintf(cmd,
"POL=%d\r", pol_tag);
545 cm_msg(MINFO,
"bruker_set",
"bruker_set: polarity switching needed. cmd=%s", cmd);
551 sprintf(cmd,
"CUR=%f\r", value);
553 sprintf(cmd,
"CUR=%f\r", -value);
555 cm_msg(MINFO,
"bruker_set",
"bruker_set: cmd=%s", cmd);
611 char cmd[64], str[64];
614 DWORD nowtime, difftime;
635 cm_msg(MERROR,
"bruker_get",
"too many reconnection failures, bailing out :-(");
646 cm_msg(MINFO,
"bruker_get",
"Bruker: reconnection trial ...");
650 if (status != FE_SUCCESS) {
654 cm_msg(MINFO,
"bruker_get",
"Bruker: reconnection attempted failed");
664 cm_msg(MINFO,
"bruker_get",
"Bruker: successfully reconnected");
696 strcpy(cmd,
"POL/\r");
699 strcpy(cmd,
"STA/\r");
702 strcpy(cmd,
"CHN/\r");
705 strcpy(cmd,
"CUR/\r");
708 strcpy(cmd,
"VLT/\r");
718 cm_msg(MINFO,
"bruker_get",
"%s status = %d, received string = %s", cmd, status, str);
739 cm_msg(MINFO,
"bruker_get",
"Bruker: try to disconnect and reconnect the bus driver");
759 cm_msg(MINFO,
"bruker_get",
"bruker_get: channel=%d, str=%s", channel, str);
766 status = sscanf(str,
"%f", &fvalue);
778 else if (str[0] ==
'-')
782 status = sscanf(&str[1],
"%f", &fvalue);
811 cm_msg(MDEBUG,
"bruker_get",
"need to call bruker_set: demand=%f, measured=%f", info->
bruker_target_demand, *pvalue);
832 va_start(argptr, cmd);
837 hKey = va_arg(argptr, HNDLE);
838 info = va_arg(argptr,
void *);
839 channel = va_arg(argptr, INT);
840 flags = va_arg(argptr, DWORD);
841 bd = va_arg(argptr,
void *);
846 info = va_arg(argptr,
void *);
851 info = va_arg(argptr,
void *);
852 channel = va_arg(argptr, INT);
853 pvalue = va_arg(argptr,
float*);
858 info = va_arg(argptr,
void *);
859 channel = va_arg(argptr, INT);
860 name = va_arg(argptr,
char *);
884 va_start(argptr, cmd);
889 hKey = va_arg(argptr, HNDLE);
890 info = va_arg(argptr,
void *);
891 channel = va_arg(argptr, INT);
892 flags = va_arg(argptr, DWORD);
893 bd = va_arg(argptr,
void *);
898 info = va_arg(argptr,
void *);
899 channel = va_arg(argptr, INT);
900 name = va_arg(argptr,
char *);
905 info = va_arg(argptr,
void *);
906 channel = va_arg(argptr, INT);
907 value = (float) va_arg(argptr,
double);
DWORD last_reconnect
timer for bus driver reconnect error handling
float bruker_polarity
keeps the current polarity tag: 1=pos, 2=neg
#define BRUKER_ERR_PHASE
tag: on off the line phases might be missing (see Bruker "Description of B-EC 1", p...
INT bruker_in_init(HNDLE hKey, void **pinfo, INT channels, INT(*bd)(INT cmd,...))
INT bruker_out_init(HNDLE hKey, void **pinfo, INT channels, INT(*bd)(INT cmd,...))
HNDLE hkey
ODB key for bus driver info.
#define BRUKER_ETS_LOGOUT_SLEEP
sleep time (us) between the telnet commands of the ets_logout
DWORD lasterrtime
last error time stamp
INT bruker_pol_switching
flag showing that the polarity is switching
#define BRUKER_DELTA_TIME_ERROR
reset error counter after BRUKER_DELTA_TIME_ERROR seconds
DWORD check_setpoint_timer
timer needed to check the setpoint current
float bruker_target_demand
keeps the target demand current value: needed if polarity switching is needed
INT errcount
error counter in order not to flood the message queue
#define BRUKER_MAX_ERROR
maximum number of error messages
#define BRUKER_ERR_TEMP
tag: internal overheating protection for the bruker (see Bruker "Description of B-EC 1"...
#define BRUKER_ERR_CURR
tag: overcurrent protection
#define BRUKER_DEMAND_CURRENT
INT bruker_get_label_in(BRUKER_INFO *info, INT channel, char *name)
#define BRUKER_IN_CHS
number of input channels
INT bruker_send_rcv(BRUKER_INFO *info, char *cmd, char *str, int size)
#define BRUKER_MAX_READBACK_FAILURE
maximum number of readback failures before a reconnect will take place
#define BRUKER_OUTPUT_VOLTAGE
int bd_connected
flag showing if bus driver is connected
INT(* bd)(INT cmd,...)
bus driver entry function
#define BRUKER_POLARITY_READBACK
BRUKER_SETTINGS bruker_settings
stores the internal DD settings
char names_out[BRUKER_OUT_CHS][NAME_LENGTH]
Names of the output channels as found in the ODB.
INT readback_failure
counts the number of readback failures
int ets_logout(void *info, int wait, int detailed_msg)
INT detailed_msg
flag indicating if detailed status/error messages are wanted
This structure contains private variables for the device driver.
#define BRUKER_OUTPUT_CURRENT
INT bruker_in(INT cmd,...)
char names_in[BRUKER_IN_CHS][NAME_LENGTH]
Names of the input channels as found in the ODB.
#define BRUKER_SETTINGS_STR
Initializing string for the struct BRUKER_SETTINGS.
#define BRUKER_MAX_READ
maximal number for reading retries
INT bruker_get(BRUKER_INFO *info, INT channel, float *pvalue)
INT ets_in_use
flag indicating if the rs232 terminal server is in use
#define BRUKER_ERR_GND
tag: ground relay has tripped due to a ground voltage exeeding about 10 volt (see Bruker "Description...
#define BRUKER_STATUS_DCPWRON
tag: ??
void * bd_info
private info of bus driver
#define BRUKER_RECONNECTION_TIMEOUT
timeout in (sec) between logout terminal server an reconnection trial
#define BRUKER_ERR_WATER
tag: cooling water for the bruker is missing (see Bruker "Description of B-EC 1", p...
#define BRUKER_OUT_CHS
number of output channels
#define BRUKER_DEMAND_CURRENT_READBACK
int reconnection_failures
how often reconnection failed
INT bruker_set(BRUKER_INFO *info, INT channel, float value)
#define BRUKER_ERR_EXT1
tag: monitoring tag of the water guard of the magnet hooked up to the bruker
INT bruker_out(INT cmd,...)
#define BRUKER_TIME_OUT
timeout in (ms) for the communication between pc and bruker
#define BRUKER_ERR_EXT2
tag: unused
#define BRUKER_READ_ERROR
tag: read error
INT bruker_exit(BRUKER_INFO *info)
INT bruker_get_label_out(BRUKER_INFO *info, INT channel, char *name)
BOOL check_setpoint
flag needed to check the setpoint
INT bruker_decode_status(BRUKER_INFO *info, char *str)
int first_bd_error
flag showing if the bus driver error message is already given
INT bruker_remote
1=remote, 0=local
Stores all the parameters the device driver needs.
#define BRUKER_STATUS_REMOTE
tag: bruker on remote
#define BRUKER_INIT_ERROR
tag: initializing error
INT startup_error
initializer error tag, if set, bruker_get and bruker_set won't do anything
#define BRUKER_ERR_DOOR
tag: door at the back of the bruker is open