24 #define DANFYSIK_INIT_ERROR -2
25 #define DANFYSIK_READ_ERROR -1
27 #define DANFYSIK_TIME_OUT 2000
29 #define DANFYSIK_RECONNECTION_TIMEOUT 10
33 #define DANFYSIK_IN_CH 5
34 #define DANFYSIK_OUT_CH 4
38 #define DANFYSIK_ETS_LOGOUT_SLEEP 10000
42 #define DANFYSIK_MAX_READBACK_FAILURE 5
43 #define DANFYSIK_MAX_EMPTY_READBACK_ERR 10
45 #define DELTA_TIME_ERROR 3600
49 #define DANFYSIK_STATUS_OFF 0x800000
50 #define DANFYSIK_STATUS_LOCAL 0x400000
51 #define DANFYSIK_INTERLOCK_EXT_4 0x200000
52 #define DANFYSIK_SPARE_1 0x100000
53 #define DANFYSIK_SPARE_2 0x080000
54 #define DANFYSIK_SPARE_3 0x040000
55 #define DANFYSIK_PERCENTAGE 0x020000
56 #define DANFYSIK_INTERLOCK_EXT_1 0x010000
57 #define DANFYSIK_STATUS_STANDBY 0x008000
58 #define DANFYSIK_INTERLOCK_SUM 0x004000
59 #define DANFYSIK_INTERLOCK_DC_OVER_CURRENT 0x002000
60 #define DANFYSIK_INTERLOCK_OVER_VOLTAGE_PROTECTION 0x001000
61 #define DANFYSIK_STATUS_ON 0x000800
62 #define DANFYSIK_INTERLOCK_EXT_2 0x000400
63 #define DANFYSIK_INTERLOCK_MAINS_FAILURE 0x000200
64 #define DANFYSIK_STATUS_CURRENT_LIMIT 0x000100
65 #define DANFYSIK_INTERLOCK_EARTH_LEAKAGE_FAILURE 0x000080
66 #define DANFYSIK_INTERLOCK_CONVERTER_OVER_VOLTAGE 0x000040
67 #define DANFYSIK_INTERLOCK_MPS_OVERTEMPERATURE 0x000020
68 #define DANFYSIK_SPARE_4 0x000010
69 #define DANFYSIK_SPARE_5 0x000008
70 #define DANFYSIK_INTERLOCK_EXT_3 0x000004
71 #define DANFYSIK_STATUS_MPS_NOT_READY 0x000002
72 #define DANFYSIK_INTERLOCK_MPS_FAN_FAULT 0x000001
86 #define DANFYSIK_SETTINGS_STR "\
87 Detailed Messages = INT : 0\n\
88 ETS_IN_USE = INT : 1\n\
89 Input Names = STRING[5] : \n\
90 [32] Remote (read back)\n\
91 [32] Current Set Value (A) (readback)\n\
92 [32] Output Voltage (V)\n\
93 [32] Output Current (A)\n\
95 Output Names = STRING[4] : \n\
97 [32] State (0 off, 1 on, 2 reset)\n\
98 [32] Set Current (A)\n\
99 [32] Current Limit (A)\n\
100 Max. Current = FLOAT : 20.f\n\
101 Max. Voltage = FLOAT : 75.f\n\
102 Next Read Attempt (ms) = DWORD : 75\n\
110 INT (*bd)(INT cmd, ...);
145 for (i=0; i<strlen(str_in); i++)
146 if ((str_in[i]>=32) && (str_in[i]<=126))
149 strcpy(str_clean, str_in+i);
172 if (strlen(str) != 6)
174 }
else if (channel == 1) {
175 if (strlen(str) != 8)
177 }
else if ((channel > 1) && (channel < 4)) {
178 if (((str[0] !=
'+') && (str[0] !=
'-')) || strlen(str) != 8)
181 if (strlen(str) != 8)
192 strcpy(err_msg,
"Communication/Command Error");
195 cm_msg(MERROR,
"danfysik_error_read", err_msg);
212 if (strlen(str)==0) {
217 sscanf(str,
"%x", &status);
220 if ((str[0] ==
'-') || (str[0] ==
'+')) {
232 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Status changed to Off.");
237 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Status changed to Local.");
242 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Ext Interlock 4 fired.");
247 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Shows Percentage instead of A/V.");
252 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Ext Interlock 1 (Magnet Thermo Switch) fired.");
257 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Status changed to Standby Mode.");
262 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: DC Over Current Interlock fired.");
266 if (!(info->
danfysik_status & DANFYSIK_INTERLOCK_OVER_VOLTAGE_PROTECTION))
267 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Over Voltage Protection Interlock fired.");
272 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Status changed to On.");
277 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Ext Interlock 2 fired.");
282 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Mains Failure Interlock fired.");
287 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: At Current Limit.");
291 if (!(info->
danfysik_status & DANFYSIK_INTERLOCK_EARTH_LEAKAGE_FAILURE))
292 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Earth Leakage Failure Interlock fired.");
296 if (!(info->
danfysik_status & DANFYSIK_INTERLOCK_CONVERTER_OVER_VOLTAGE))
297 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Converter Over Voltage Interlock fired.");
302 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: MPS Overtemperature Interlock fired.");
307 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Ext Interlock 3 fired.");
312 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: Status changed to MPS not ready.");
317 cm_msg(MINFO,
"danfysik_decode_status",
"Danfysik Power Supply: MPS Fan Fault Interlock fired.");
340 char str[256], str2[256], str3[256], str_clean[256];
347 cm_get_experiment_database(&hDB, NULL);
351 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
352 cm_msg(MERROR,
"danfysik_init",
"danfysik_init: Error creating Danfysik DD record in ODB, status=%d", status);
357 db_find_key(hDB, hKey,
"DD", &hkeydd);
383 if (status != SUCCESS) {
391 cm_msg(MINFO,
"danfysik_init",
"initialize danfysik.");
401 cm_msg(MINFO,
"danfysik_init",
"danfysik sw version:\r %s %s %s", str, str2, str3);
408 if (strstr(str_clean,
"LOC")) {
410 cm_msg(MINFO,
"danfysik_init",
"danfysik power supply not in remote mode.");
412 }
else if (strstr(str_clean,
"REM")) {
417 cm_msg(MINFO,
"danfysik_init",
"danfysik read problem: %s", str_clean);
424 cm_msg(MINFO,
"danfysik_init",
"danfysik set to %s", str_clean);
429 memset(str, 0,
sizeof(str));
436 cm_msg(MINFO,
"danfysik_init",
"danfysik startup status to %s", str);
492 char str[128], str_clean[128];
503 cm_msg(MINFO,
"danfysik_set",
504 "set values not possible at the moment, since the bus driver is not available!");
512 strcpy(str,
"LOC\r");
515 }
else if (value == 1) {
517 strcpy(str,
"REM\r");
527 switch ((
int)value) {
544 cm_msg(MERROR,
"danfysik_set",
"Set current value %f > soft current limit %f! Will set soft current limit.",
548 ivalue = (INT)(value*1.0e3);
551 sprintf(str,
"DA 0,+0%d\r", ivalue);
553 sprintf(str,
"DA 0,-0%d\r", abs(ivalue));
556 status = BD_GETS(str,
sizeof(str),
"\r", 200);
558 if (strstr(str_clean,
"?")) {
560 cm_msg(MERROR,
"danfysik_set",
"set current: Wrong command mode (local/remote)!");
619 char str[128], cmd[128], str_clean[128];
622 DWORD now, nowtime, difftime;
625 now = ss_millitime();
651 cm_msg(MERROR,
"danfysik_get",
"too many reconnection failures, bailing out :-(");
661 cm_msg(MINFO,
"danfysik_get",
"Danfysik: reconnection trial ...");
663 if (status != FE_SUCCESS) {
667 cm_msg(MINFO,
"danfysik_get",
"Danfysik: reconnection attempted failed");
675 cm_msg(MINFO,
"danfysik_get",
"Danfysik: successfully reconnected");
685 db_find_key(info->
hDB, 0,
"/Equipment/Danfysik/Variables/Output", &hkey);
688 if (status != DB_SUCCESS) {
689 cm_msg(MERROR,
"danfysik_init",
"danfysik_init: Error reading Danfysik soft current limit, status=%d", status);
697 strcpy(cmd,
"CMD\r");
703 strcpy(cmd,
"AD 2\r");
706 strcpy(cmd,
"AD 8\r");
709 strcpy(cmd,
"S1H\r");
716 memset(str, 0,
sizeof(str));
724 cm_msg(MERROR,
"danfysik_get",
"danfysik_get: cannot get any readback anymore! Check device!");
736 cm_msg(MINFO,
"danfysik_get",
"Danfysik: try to disconnect and reconnect the bus driver");
749 if (strstr(str_clean,
"LOC"))
751 else if (strstr(str_clean,
"REM"))
758 sscanf(str_clean,
"%d", &value);
764 if (strstr(str_clean,
"+"))
765 *pvalue = (float)value/1.0e3;
767 *pvalue = -1.0*(float)value/1.0e3;
770 sscanf(str_clean,
"%d", &value);
771 *pvalue = (float)value/1.0e2;
774 sscanf(str_clean,
"%d", &value);
775 *pvalue = (float)value/1.0e3;
778 sscanf(str_clean,
"%d", &value);
779 *pvalue = (float)value;
790 memset(str, 0,
sizeof(str));
814 va_start(argptr, cmd);
819 hKey = va_arg(argptr, HNDLE);
820 info = va_arg(argptr,
void *);
821 channel = va_arg(argptr, INT);
822 flags = va_arg(argptr, DWORD);
823 bd = va_arg(argptr,
void *);
828 info = va_arg(argptr,
void *);
833 info = va_arg(argptr,
void *);
834 channel = va_arg(argptr, INT);
835 pvalue = va_arg(argptr,
float*);
840 info = va_arg(argptr,
void *);
841 channel = va_arg(argptr, INT);
842 name = va_arg(argptr,
char *);
865 va_start(argptr, cmd);
870 hKey = va_arg(argptr, HNDLE);
871 info = va_arg(argptr,
void *);
872 channel = va_arg(argptr, INT);
873 flags = va_arg(argptr, DWORD);
874 bd = va_arg(argptr,
void *);
879 info = va_arg(argptr,
void *);
880 channel = va_arg(argptr, INT);
881 name = va_arg(argptr,
char *);
886 info = va_arg(argptr,
void *);
887 channel = va_arg(argptr, INT);
888 value = (float) va_arg(argptr,
double);
INT danfysik_remote
1=remote, 0=local
#define DANFYSIK_INTERLOCK_EXT_4
DANFYSIK_SETTINGS danfysik_settings
stores the internal DD settings
#define DANFYSIK_ETS_LOGOUT_SLEEP
sleep time (us) between the telnet commands of the ets_logout
HNDLE hkey
ODB key for device driver info.
HNDLE hDB
main handle to the ODB
#define DANFYSIK_INTERLOCK_DC_OVER_CURRENT
INT danfysik_exit(DANFYSIK_INFO *info)
INT num_channels
number of channels for this device
#define DANFYSIK_OUT_CH
number of output channels
INT danfysik_status
keeps the old danfysik status
INT danfysik_set(DANFYSIK_INFO *info, INT channel, float value)
int reconnection_failures
how often reconnection failed
INT danfysik_out_get_label(DANFYSIK_INFO *info, INT channel, char *name)
#define DANFYSIK_STATUS_ON
DWORD next_read
timeout in (ms) before trying to attempt to read new data from the danfysik pwr supply ...
#define DANFYSIK_STATUS_LOCAL
void danfysik_strip_rubbish(char *str_in, char *str_clean)
#define DANFYSIK_STATUS_CURRENT_LIMIT
#define DANFYSIK_MAX_EMPTY_READBACK_ERR
maximum number of empty readback errors
#define DANFYSIK_INTERLOCK_EARTH_LEAKAGE_FAILURE
INT readback_failure
counts the number of readback failures
int ets_logout(void *info, int wait, int detailed_msg)
#define DANFYSIK_STATUS_OFF
Stores all the parameters the device driver needs.
DWORD time_to_read
timer which allows to slow down the reading a bit (get routine)
INT empty_readback_error
counts the number of empty readbacks
#define DANFYSIK_RECONNECTION_TIMEOUT
timeout in (sec) for before trying to reconnect again (after a communication breakdown) ...
INT ets_in_use
flag indicating if the rs232 terminal server is in use
INT detailed_msg
flag indicating if detailed status/error messages are wanted
INT danfysik_in(INT cmd,...)
INT danfysik_out_init(HNDLE hKey, void **pinfo, INT channels, INT(*bd)(INT cmd,...))
#define DANFYSIK_INTERLOCK_MAINS_FAILURE
DWORD last_reconnect
timer for bus driver reconnect error handling
#define DELTA_TIME_ERROR
reset error counter after DELTA_TIME_ERROR seconds
float last_valid_value[DANFYSIK_IN_CH]
stores the last valid value
#define DANFYSIK_INTERLOCK_EXT_3
INT danfysik_error_read(int channel, char *str)
INT danfysik_get(DANFYSIK_INFO *info, INT channel, float *pvalue)
float soft_current_limit
keeps the soft current limit, i.e. the current set value needs to be < than the soft current limit ...
#define DANFYSIK_INTERLOCK_CONVERTER_OVER_VOLTAGE
char out_names[DANFYSIK_OUT_CH][NAME_LENGTH]
Names of the DD output channels.
void * bd_info
private info of bus driver
INT danfysik_in_get_label(DANFYSIK_INFO *info, INT channel, char *name)
#define DANFYSIK_STATUS_STANDBY
float max_voltage
Max. voltage of the danfysik power supply.
INT startup_error
initializer error tag, if set, danfysik_get and danfysik_set won't do anything
int first_bd_error
flag showing if the bus driver error message is already given
INT(* bd)(INT cmd,...)
bus driver entry function
#define DANFYSIK_PERCENTAGE
#define DANFYSIK_INTERLOCK_MPS_FAN_FAULT
int bd_connected
flag showing if bus driver is connected
char in_names[DANFYSIK_IN_CH][NAME_LENGTH]
Names of the DD input channels.
#define DANFYSIK_MAX_READBACK_FAILURE
maximum number of readback failures before a reconnect will take place
DWORD lasterrtime
last error time stamp
#define DANFYSIK_INTERLOCK_MPS_OVERTEMPERATURE
INT danfysik_in_init(HNDLE hKey, void **pinfo, INT channels, INT(*bd)(INT cmd,...))
#define DANFYSIK_INTERLOCK_EXT_2
float max_current
Max. current of the danfysik power supply.
#define DANFYSIK_READ_ERROR
tag: read error
#define DANFYSIK_IN_CH
number of input channels
#define DANFYSIK_SETTINGS_STR
Initializing string for the struct DANFYSIK_SETTINGS.
INT errcount
error counter in order not to flood the message queue
#define DANFYSIK_INTERLOCK_EXT_1
#define DANFYSIK_STATUS_MPS_NOT_READY
#define DANFYSIK_INTERLOCK_OVER_VOLTAGE_PROTECTION
#define DANFYSIK_INIT_ERROR
tag: initializing error
#define DANFYSIK_TIME_OUT
timeout in (ms) for the communication between pc and danfysik
void danfysik_decode_status(DANFYSIK_INFO *info, char *str)
INT danfysik_out(INT cmd,...)