controling APC Smart-UPS
I need to control outs on APC Smart-ups, and recieve information by axcent3 when bettery is low. Could you give me some examples of code which contols a smart ups.
Sorry fot my bad english, and thanks for advice
Sorry fot my bad english, and thanks for advice
0
Comments
One approach to working it out would be to install the APC software and sniff the strings.
Now i need, to check where the bettery is low.
A standard com-cable will not work. Check Dave's docs.
Signal Computer UPS DB9F DB9M RxD 2 -------------------- 2 TxD Send TxD 3 -------------------- 1 RxD Receive GND 5 -------------------- 9 GroundI had to write this module for a project, does not do a hell of alot, but it will give you an idea how I had to go about it.
MODULE_NAME='APC Smart-UPS,Rev 0' (Dev vdvUPS, Dev dvUPS) (*{{PS_SOURCE_INFO(PROGRAM STATS) *) (***********************************************************) (* FILE CREATED ON: 08/06/2003 AT: 18:02:03 *) (***********************************************************) (* FILE_LAST_MODIFIED_ON: 08/19/2003 AT: 20:06:56 *) (***********************************************************) (* ORPHAN_FILE_PLATFORM: 1 *) (***********************************************************) (*!!FILE REVISION: Rev 0 *) (* REVISION DATE: 08/19/2003 *) (* *) (* COMMENTS: *) (* *) (***********************************************************) (*!!FILE REVISION: Rev 0 *) (* REVISION DATE: 08/06/2003 *) (* *) (* COMMENTS: *) (* *) (***********************************************************) (*}}PS_SOURCE_INFO *) (***********************************************************) (***********************************************************) (* System Type : Netlinx *) (***********************************************************) (* REV HISTORY: *) (***********************************************************) (***********************************************************) (* DEVICE NUMBER DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_DEVICE (***********************************************************) (* CONSTANT DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_CONSTANT // TimeLines TL_POLL = 2; // Status Mode RUNTIME_CALIBRATE = 100; SMART_TRIM = 101; SMART_BOOST = 102; LINE_POWER = 103; BATTERY_POWER = 104; OVERLOAD = 105; BATTERY_LOW = 106; REPLACE_BATTERY = 107; // Battery Mode CHARGING = 110; FULL = 111; // Parse Mode EMPTY = 0; STATUS_MODE = 1; BATTERY_MODE = 2; (***********************************************************) (* DATA TYPE DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_TYPE (***********************************************************) (* VARIABLE DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_VARIABLE Volatile Char cUPSBuffer[1000]; Volatile Integer nParseMode = EMPTY; Volatile Long lPollTimes[] = {5000,5000}; (***********************************************************) (* LATCHING DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_LATCHING (***********************************************************) (* MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_MUTUALLY_EXCLUSIVE (***********************************************************) (* SUBROUTINE/FUNCTION DEFINITIONS GO BELOW *) (***********************************************************) Define_Function StatusMode(Integer nStatus) { [vdvUPS,RUNTIME_CALIBRATE] = (nStatus Band $01) [vdvUPS,SMART_TRIM] = (nStatus Band $02) [vdvUPS,SMART_BOOST] = (nStatus Band $04) [vdvUPS,LINE_POWER] = (nStatus Band $08) [vdvUPS,BATTERY_POWER] = (nStatus Band $10) [vdvUPS,OVERLOAD] = (nStatus Band $20) [vdvUPS,BATTERY_LOW] = (nStatus Band $40) [vdvUPS,REPLACE_BATTERY] = (nStatus Band $80) } Define_Function BatteryMode(Integer nStatus) { [vdvUPS,CHARGING] = (nStatus < 100) [vdvUPS,FULL] = (nStatus == 100) } Define_Function ParseUPS(Char cBuffer[]) { Local_vAR Char cMsg[100] lOCAL_Var Integer nStatus; cMsg = Remove_String(cBuffer,"13,10",1); If (Length_String(cMsg)) { Set_Length_String(cMsg,Length_String(cMsg)-2); Select { Active (Find_String(cMsg,'SM',1)): { } Active (Find_String(cMsg,'BYE',1)): { } Active (1): { SWITCH (nParseMode) { CASE STATUS_MODE: { nStatus = Type_Cast(HexToI(cMsg)); StatusMode(nStatus) nParseMode = EMPTY; } CASE BATTERY_MODE: { BatteryMode(Atoi(cMsg)) nParseMode = EMPTY; } } } } } } (***********************************************************) (* STARTUP CODE GOES BELOW *) (***********************************************************) DEFINE_START Create_Buffer dvUPS,cUPSBuffer Timeline_Create(TL_POLL,lPollTimes,2,TIMELINE_RELATIVE,TIMELINE_REPEAT); (* System Information Strings ******************************) (* Use this section if there is a TP in the System! *) (* SEND_COMMAND TP,"'!F',250,'1'" SEND_COMMAND TP,"'TEXT250-',__NAME__" SEND_COMMAND TP,"'!F',251,'1'" SEND_COMMAND TP,"'TEXT251-',__FILE__,', ',S_DATE,', ',S_TIME" SEND_COMMAND TP,"'!F',252,'1'" SEND_COMMAND TP,"'TEXT252-',__VERSION__" SEND_COMMAND TP,"'!F',253,'1'" (* Must fill this (Master Ver) *) SEND_COMMAND TP,'TEXT253-' SEND_COMMAND TP,"'!F',254,'1'" (* Must fill this (Panel File) *) SEND_COMMAND TP,'TEXT254-' SEND_COMMAND TP,"'!F',255,'1'" (* Must fill this (Dealer Info) *) SEND_COMMAND TP,'TEXT255-' *) (***********************************************************) (* THE EVENTS GOES BELOW *) (***********************************************************) DEFINE_EVENT Channel_Event[vdvUPS,0] { On: { } Off: { } } Data_Event[dvUPS] { Online: { Send_Command dvUPS,'SET BAUD 2400,N,8,1'; Send_Command dvUPS,'HSOFF'; Send_Command dvUPS,'CHARDM-255'; } String: { If (Find_String(Data.Text,"10",1)) ParseUPS(cUPSBuffer); } } Timeline_Event[TL_POLL] { Switch (Timeline.Sequence) { Case 1: { Send_String dvUPS,'YQR' nParseMode = STATUS_MODE; } Case 2: { Send_String dvUPS,'YfR' nParseMode = BATTERY_MODE; } } } (***********************************************************) (* THE ACTUAL PROGRAM GOES BELOW *) (***********************************************************) DEFINE_PROGRAM (***********************************************************) (* END OF PROGRAM *) (* DO NOT PUT ANY CODE BELOW THIS COMMENT *) (***********************************************************)