![Ups Ups](/uploads/1/2/6/8/126878612/515931960.jpg)
Supreme Power specialize in supply UPS (Uninterruptible Power Supply)/ Computer Backup Battery in Singapore. Product Range include OPTI UPS, ELEN UPS, Marstech Battery and other computer backup battery. Supreme Power is the sole distributor for OPTI UPS in Singapore. RE: Masterguard 6KVA UPS Inverter BackFeed sibeen (Electrical) 14 Mar 15 13:44 Wouldn't asking the manufacturer of the equipment be a better option than asking the question of a general engineering forum? Product Documentation Quality Policy & Certifications Software/Firmware Updates Warranty. Uninterruptible Power Supplies (UPS). Roll, connect and play The UPS units are ready for action: just roll them in place and plug them in. Commissioning is simple: Just turn on the switch and your UPS is operational. The MASTERGUARD Series E is the mighty turbo in the single phase MASTERGUARD family of uninterruptible power supplies by Siemens. Series A from 700 to 3000 VA Secure Power Always Uninterruptible Power Supply. Secure Power Always Superior protection and availability ensured by high performance UPS The Range Applications Connectivity. Series A operates using online double MopUPS Professional software. Options medical laboratory instrumentation,.
PermalinkJoin GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign up Find file Copy path
Cannot retrieve contributors at this time
/* masterguard.c - support for Masterguard models |
Copyright (C) 2001 Michael Spanier <[email protected]> |
masterguard.c created on 15.8.2001 |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
*/ |
/******************************************************************** |
* |
* Please if you edit this code convert tabs to spaces and use |
* four characters indent. |
* If you don't know what this means use the vim editor. |
* |
* Have fun |
* Michael |
* |
********************************************************************/ |
#include'main.h' |
#include'serial.h' |
#defineDRIVER_NAME'MASTERGUARD UPS driver' |
#defineDRIVER_VERSION'0.24' |
/* driver description structure */ |
upsdrv_info_t upsdrv_info = { |
DRIVER_NAME, |
DRIVER_VERSION, |
'Michael Spanier <[email protected]>', |
DRV_STABLE, |
{ NULL } |
}; |
#defineUPSDELAY3 |
#defineMAXTRIES10 |
#defineUPS_PACE100/* 100 us between chars on write */ |
#defineQ11 |
#defineQ32 |
#defineDEBUG1 |
int type; |
char name[31]; |
char firmware[6]; |
/******************************************************************** |
* |
* Helper function to split a sting into words by splitting at the |
* SPACE character. |
* |
* Adds up to maxlen characters to the char word. |
* Returns NULL on reaching the end of the string. |
* |
********************************************************************/ |
staticchar *StringSplit( char *source, char *word, int maxlen ) |
{ |
int i; |
int len; |
int wc=0; |
word[0] = '0'; |
len = strlen( source ); |
for( i = 0; i < len; i++ ) |
{ |
if( source[i] '' ) |
{ |
word[wc] = '0'; |
return source + i + 1; |
} |
word[wc] = source[i]; |
wc++; |
} |
word[wc] = '0'; |
returnNULL; |
} |
/******************************************************************** |
* |
* Helper function to drop all whitespaces within a string. |
* |
* 'word' must be large enought to hold 'source', for the worst case |
* 'word' has to be exacly the size of 'source'. |
* |
********************************************************************/ |
staticvoidStringStrip( char *source, char *word ) |
{ |
int wc=0; |
int i; |
int len; |
word[0] = '0'; |
len = strlen( source ); |
for( i = 0; i < len; i++ ) |
{ |
if( source[i] '' ) |
continue; |
if( source[i] 'n' ) |
continue; |
if( source[i] 't' ) |
continue; |
word[wc] = source[i]; |
wc++; |
} |
word[wc] = '0'; |
} |
/******************************************************************** |
* |
* Function parses the status flags which occure in the Q1 and Q3 |
* command. Sets the INFO_STATUS value ( OL, OB, ... ) |
* |
********************************************************************/ |
staticvoidparseFlags( char *flags ) |
{ |
status_init(); |
if( flags[0] '1' ) |
status_set('OB'); |
else |
status_set('OL'); |
if( flags[1] '1' ) |
status_set('LB'); |
if( flags[2] '1' ) |
status_set('BOOST'); |
/* this has no mapping */ |
#if0 |
if( flags[3] '1' ) |
setinfo( INFO_ALRM_GENERAL, '1' ); |
#endif |
#if0 |
/* and these are... ? */ |
if( flags[5] '1' ) |
status_set('TIP'); |
if( flags[6] '1' ) |
status_set('SD'); |
#endif |
status_commit(); |
if( DEBUG ) |
printf( 'Status is %sn', dstate_getinfo('ups.status')); |
} |
/******************************************************************** |
* |
* Function parses the response of the query1 ( 'Q1' ) command. |
* Also sets various values (IPFreq ... ) |
* |
********************************************************************/ |
staticvoidquery1( char *buf ) |
{ |
#defineWORDMAXLEN255 |
char value[WORDMAXLEN]; |
char word[WORDMAXLEN]; |
char *newPOS; |
char *oldPOS; |
int count = 0; |
if( DEBUG ) |
printf( 'Q1 Buffer is : %sn' , buf + 1 ); |
oldPOS = buf + 1; |
newPOS = oldPOS; |
do |
{ |
newPOS = StringSplit( oldPOS, word, WORDMAXLEN ); |
StringStrip( word, value); |
oldPOS = newPOS; |
if( DEBUG ) |
{ |
printf( 'value=%sn', value ); |
fflush( stdout ); |
} |
switch( count ) |
{ |
case0: |
/* IP Voltage */ |
dstate_setinfo('input.voltage', '%s', value ); |
break; |
case1: |
/* IP Fault Voltage */ |
break; |
case2: |
/* OP Voltage */ |
dstate_setinfo('output.voltage', '%s', value); |
break; |
case3: |
/* OP Load*/ |
dstate_setinfo('ups.load', '%s', value ); |
break; |
case4: |
/* IP Frequency */ |
dstate_setinfo('input.frequency', '%s', value); |
break; |
case5: |
/* Battery Cell Voltage */ |
dstate_setinfo('battery.voltage', '%s', value); |
break; |
case6: |
/* UPS Temperature */ |
dstate_setinfo('ups.temperature', '%s', value ); |
break; |
case7: |
/* Flags */ |
parseFlags( value ); |
break; |
default: |
/* Should never be reached */ |
break; |
} |
count ++; |
oldPOS = newPOS; |
} |
while( newPOS != NULL ); |
} |
/******************************************************************** |
* |
* Function parses the response of the query3 ( 'Q3' ) command. |
* Also sets various values (IPFreq ... ) |
* |
********************************************************************/ |
staticvoidquery3( char *buf ) |
{ |
#defineWORDMAXLEN255 |
char value[WORDMAXLEN]; |
char word[WORDMAXLEN]; |
char *newPOS; |
char *oldPOS; |
int count = 0; |
if( DEBUG ) |
printf( 'Q3 Buffer is : %sn' , buf+1 ); |
oldPOS = buf + 1; |
newPOS = oldPOS; |
do |
{ |
newPOS = StringSplit( oldPOS, word, WORDMAXLEN ); |
StringStrip( word, value); |
oldPOS = newPOS; |
/* Shortcut */ |
if( newPOS NULL ) |
break; |
if( DEBUG ) |
{ |
printf( 'value=%sn', value ); |
fflush( stdout ); |
} |
switch( count ) |
{ |
case0: |
/* UPS ID */ |
break; |
case1: |
/* Input Voltage */ |
dstate_setinfo('input.voltage', '%s', value ); |
break; |
case2: |
/* Input Fault Voltage */ |
break; |
case3: |
/* Output Voltage */ |
dstate_setinfo('output.voltage', '%s', value); |
break; |
case4: |
/* Output Current */ |
dstate_setinfo('output.current', '%s', value ); |
break; |
case5: |
/* Input Frequency */ |
dstate_setinfo('input.frequency', '%s', value); |
break; |
case6: |
/* Battery Cell Voltage */ |
dstate_setinfo('battery.voltage', '%s', value); |
break; |
case7: |
/* Temperature */ |
dstate_setinfo('ups.temperature', '%s', value ); |
break; |
case8: |
/* Estimated Runtime */ |
dstate_setinfo('battery.runtime', '%s', value); |
break; |
case9: |
/* Charge Status */ |
dstate_setinfo('battery.charge', '%s', value); |
break; |
case10: |
/* Flags */ |
parseFlags( value ); |
break; |
case11: |
/* Flags2 */ |
break; |
default: |
/* This should never be reached */ |
/* printf( 'DEFAULTn' ); */ |
break; |
} |
count ++; |
oldPOS = newPOS; |
} |
while( newPOS != NULL ); |
} |
/******************************************************************** |
* |
* Function to parse the WhoAmI response of the UPS. Also sets the |
* values of the firmware version and the UPS identification. |
* |
********************************************************************/ |
staticvoidparseWH( char *buf ) |
{ |
strncpy( name, buf + 16, 30 ); |
name[30] = '0'; |
strncpy( firmware, buf + 4, 5 ); |
firmware[5] = '0'; |
if( DEBUG ) |
printf( 'Name = %s, Firmware Version = %sn', name, firmware ); |
} |
/******************************************************************** |
* |
* Function to parse the old and possible broken WhoAmI response |
* and set the values for the firmware Version and the identification |
* of the UPS. |
* |
********************************************************************/ |
staticvoidparseOldWH( char *buf ) |
{ |
strncpy( name, buf + 4, 12 ); |
name[12] = '0'; |
strncpy( firmware, buf, 4 ); |
firmware[4] = '0'; |
if( DEBUG ) |
printf( 'Name = %s, Firmware Version = %sn', name, firmware ); |
} |
/******************************************************************** |
* |
* Function to fake a WhoAmI response of a UPS that returns NAK. |
* |
********************************************************************/ |
staticvoidfakeWH(void) |
{ |
strcpy( name, 'GenericUPS' ); |
strcpy( firmware, 'unkn' ); |
if( DEBUG ) |
printf( 'Name = %s, Firmware Version = %sn', name, firmware ); |
} |
staticintups_ident( void ) |
{ |
char buf[255]; |
int ret; |
/* Check presence of Q1 */ |
ret = ser_send_pace(upsfd, UPS_PACE, '%s', 'Q1x0D' ); |
ret = ser_get_line(upsfd, buf, sizeof(buf), 'r', '', 3, 0); |
ret = strlen( buf ); |
if( ret != 46 ) |
{ |
/* No Q1 response found */ |
type = 0; |
return -1; |
} |
else |
{ |
if( DEBUG ) |
printf( 'Found Q1n' ); |
type = Q1; |
} |
/* Check presence of Q3 */ |
ret = ser_send_pace(upsfd, UPS_PACE, '%s', 'Q3x0D' ); |
ret = ser_get_line(upsfd, buf, sizeof(buf), 'r', '', 3, 0); |
ret = strlen( buf ); |
if( ret 70 ) |
{ |
if( DEBUG ) |
printf( 'Found Q3n' ); |
type = Q1 | Q3; |
} |
/* Check presence of WH ( Who am I ) */ |
ret = ser_send_pace(upsfd, UPS_PACE, '%s', 'WHx0D' ); |
ret = ser_get_line(upsfd, buf, sizeof(buf), 'r', '', 3, 0); |
ret = strlen( buf ); |
if( ret 112 ) |
{ |
if( DEBUG ) |
printf( 'WH foundn' ); |
parseWH( buf ); |
} |
elseif( ret 53 ) |
{ |
if( DEBUG ) |
printf( 'Old (broken) WH foundn' ); |
parseOldWH( buf ); |
} |
elseif( ret 3 && strcmp(buf, 'NAK') 0 ) |
{ |
if( DEBUG ) |
printf( 'WH was NAKedn' ); |
fakeWH( ); |
} |
elseif( ret > 0 ) |
{ |
if( DEBUG ) |
printf( 'WH says <%s> with length %in', buf, ret ); |
upslog_with_errno( LOG_INFO, |
'New WH String found. Please report to maintainern' ); |
} |
return1; |
} |
/******************************************************************** |
* |
* |
* |
* |
********************************************************************/ |
voidupsdrv_help( void ) |
{ |
} |
/******************************************************************** |
* |
* Function to initialize the fields of the ups driver. |
* |
********************************************************************/ |
voidupsdrv_initinfo(void) |
{ |
dstate_setinfo('ups.mfr', 'MASTERGUARD'); |
dstate_setinfo('ups.model', 'unknown'); |
/* |
dstate_addcmd('test.battery.stop'); |
dstate_addcmd('test.battery.start'); |
*/ |
if( strlen( name ) > 0 ) |
dstate_setinfo('ups.model', '%s', name); |
if( strlen( firmware ) > 0 ) |
dstate_setinfo('ups.firmware', '%s', firmware); |
} |
/******************************************************************** |
* |
* This is the main function. It gets called if the driver wants |
* to update the ups status and the information. |
* |
********************************************************************/ |
voidupsdrv_updateinfo(void) |
{ |
char buf[255]; |
int ret; |
int lenRSP=0; |
if( DEBUG ) |
printf( 'update infon' ); |
/* Q3 found ? */ |
if( type & Q3 ) |
{ |
ser_send_pace(upsfd, UPS_PACE, '%s', 'Q3x0D' ); |
lenRSP = 70; |
} |
/* Q1 found ? */ |
elseif( type & Q1 ) |
{ |
ser_send_pace(upsfd, UPS_PACE, '%s', 'Q1x0D' ); |
lenRSP = 46; |
} |
/* Should never be reached */ |
else |
{ |
fatalx(EXIT_FAILURE, 'Error, no Query mode defined. Please file bug against driver.'); |
} |
sleep( UPSDELAY ); |
buf[0] = '0'; |
ret = ser_get_line(upsfd, buf, sizeof(buf), 'r', '', 3, 0); |
ret = strlen( buf ); |
if( ret != lenRSP ) |
{ |
if( DEBUG ) |
printf( 'buf = %s len = %in', buf, ret ); |
upslog_with_errno( LOG_ERR, 'Error in UPS response ' ); |
dstate_datastale(); |
return; |
} |
/* Parse the response from the UPS */ |
if( type & Q3 ) |
{ |
query3( buf ); |
dstate_dataok(); |
return; |
} |
if( type & Q1 ) |
{ |
query1( buf ); |
dstate_dataok(); |
return; |
} |
} |
/******************************************************************** |
* |
* Called if the driver wants to shutdown the UPS. |
* ( also used by the '-k' command line switch ) |
* |
* This cuts the utility from the UPS after 20 seconds and restores |
* the utility one minute _after_ the utility to the UPS has restored |
* |
********************************************************************/ |
voidupsdrv_shutdown(void) |
{ |
/* ups will come up within a minute if utility is restored */ |
ser_send_pace(upsfd, UPS_PACE, '%s', 'S.2R0001x0D' ); |
} |
/******************************************************************** |
* |
* Populate the command line switches. |
* |
* CS: Cancel the shutdown process |
* |
********************************************************************/ |
voidupsdrv_makevartable(void) |
{ |
addvar( VAR_FLAG, 'CS', 'Cancel Shutdown' ); |
} |
/******************************************************************** |
* |
* This is the first function called by the UPS driver. |
* Detects the UPS and handles the command line args. |
* |
********************************************************************/ |
voidupsdrv_initups(void) |
{ |
int count = 0; |
int fail = 0; |
int good = 0; |
/* setup serial port */ |
upsfd = ser_open(device_path); |
ser_set_speed(upsfd, device_path, B2400); |
name[0] = '0'; |
firmware[0] = '0'; |
/* probe ups type */ |
do |
{ |
count++; |
if( ups_ident( ) != 1 ) |
fail++; |
/* at least two good identifications */ |
if( (count - fail) 2 ) |
{ |
good = 1; |
break; |
} |
} while( (count<MAXTRIES) | (good) ); |
if( ! good ) |
{ |
fatalx(EXIT_FAILURE, 'No MASTERGUARD UPS found' ); |
} |
upslogx(LOG_INFO, 'MASTERGUARD UPS foundn' ); |
/* Cancel Shutdown */ |
if( testvar('CS') ) |
{ |
ser_send_pace(upsfd, UPS_PACE, '%s', 'Cx0D' ); |
fatalx(EXIT_FAILURE, 'Shutdown cancelled'); |
} |
} |
/******************************************************************** |
* |
* VIM Preferences. |
* As you probably know vim is the best editor ever ;-) |
* http://www.vim.org |
* |
* vim:ts=4:sw=4:tw=78:et |
* |
********************************************************************/ |
voidupsdrv_cleanup(void) |
{ |
ser_close(upsfd, device_path); |
} |
Ups Software
Copy lines Copy permalink
United Parcel Service Software
![Apc ups software Apc ups software](/uploads/1/2/6/8/126878612/981633903.jpg)
Masterguard 6KVA UPS Inverter BackFeed
Ups Shipping Software
Masterguard 6KVA UPS Inverter BackFeed
Hi friends.
We have 1 UPS which has following details.
Make : Master guard (Emerson) Series 'E'
Rating: 6KVA
Single phase input/output 230VAC. 50 Hz
Today one alarm came 'INVERTER BACKFEED' on display of UPS and UPS gone to Bypass mode. We reset the fault and again make it online . It work for 6 hours and same alarm came 'INVERTER BACKFEED' and Ups gone to bypass mode. Reset the fault and UPS working normal again.
after reset follwing Measurements coming on UPS Display.
Input voltage : 237 V
Input Frequency : 49.9 Hz
Output Voltage : 230 V
Output Frequency : 49.9 Hz
Output Load : 33 percent
Output Current : 5 Amp
Output Watt : 1391 W
Output VA : 1468 VA
Batt Volt : 273 V
Batt Cap : 100 Percent
Backup : 39 min 47 sec
Positive DC bus : 361 V
Negative DC bus : 361 V
I tried to search at google regarding this fault but cannot find any information.
what is ' Inverter Backfeed' Alarm? and what is the remedy for this type of alarm.
Advance Thanks.
I am working in a petrochemical plant. And this UPS is used for control power (PLC, and other control equipments)
We have 1 UPS which has following details.
Make : Master guard (Emerson) Series 'E'
Rating: 6KVA
Single phase input/output 230VAC. 50 Hz
Today one alarm came 'INVERTER BACKFEED' on display of UPS and UPS gone to Bypass mode. We reset the fault and again make it online . It work for 6 hours and same alarm came 'INVERTER BACKFEED' and Ups gone to bypass mode. Reset the fault and UPS working normal again.
after reset follwing Measurements coming on UPS Display.
Input voltage : 237 V
Input Frequency : 49.9 Hz
Output Voltage : 230 V
Output Frequency : 49.9 Hz
Output Load : 33 percent
Output Current : 5 Amp
Output Watt : 1391 W
Output VA : 1468 VA
Batt Volt : 273 V
Batt Cap : 100 Percent
Backup : 39 min 47 sec
Positive DC bus : 361 V
Negative DC bus : 361 V
I tried to search at google regarding this fault but cannot find any information.
what is ' Inverter Backfeed' Alarm? and what is the remedy for this type of alarm.
Advance Thanks.
I am working in a petrochemical plant. And this UPS is used for control power (PLC, and other control equipments)