Dangerous Things
Custom gadgetry for the discerning hacker

The Store is now open! Check out the gadgetry »
Like what you're reading?
Share It.

Using an EMC AX150 or AX150i SAN without the APC UPS

I’ve got a couple EMC AX150i iSCSI SAN boxes I use for network storage. They are designed to function with write-caching turned on when they are in contact with the 1U APC UPS they ship with. When you buy one of these SAN units new, the UPS and special communications cable comes with it pretty much as standard parts. The problem is, if you buy one of these SANs on the used market like I did you pretty much have to scrounge your own UPS and cable, otherwise write-caching is turned off and you get truly horrible write performance. I don’t happen to use APC UPS gear in my racks for power protection, so I had to figure out a way to emulate an APC and tie that emulation in with the power protection hardware I did use.

Luckily I found someone nice enough to post both the communications cable pin-outs and serial conversation details that normally go between an AX150 SAN and the APC UPS it’s attached to. I used information this as the basis for my emulator, but just in case the original post goes away and the wayback machine fails us, I’m reposting it here (pdf).

Also! A reader (hi Jeff!) went ahead and created a “UPS emulator” with PIC microprocessor and circuit layout and source code and everything! Download the ZIP file here.

The Cables

Serial console cable

If you are looking for the pinout of the ax150i console cable; click here or just buy it on Amazon.

The UPS cable

The UPS cable is a little harder to find online, so you may need to recreate it using this pinout diagram:

The Software

Another reader named Jon posted a comment below with a link to a compiled version written in C#.

========================================== CODE ==========================================

You can find the APC SmartUPS commands off the web.

Communications capture

Normal Comms from/to AX-150

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>

!!! Weekly Batt Test Time !!!!!

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>
Y >>
SM<0D><0A>
W >> !! Tests battery, like pushing the test button on the front panel
OK<0D><0A>
R >>
BYE<0D><0A>
Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>
Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
X >> !! Self-test results
OK<0D><0A>
l >> !! Low transfer voltage
097<0D><0A>
R >>
BYE<0D><0A>

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>
Y >>
SM<0D><0A>
n >> !! Get Serial number
AS0632112344<00><0D><0A>
R >>
BYE<0D><0A>

!!! End of Test !!!

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>

Y >>
SM<0D><0A>
Q >>
08<0D><0A>
f >>
100.0<0D><0A>
R >>
BYE<0D><0A>

Delphi snapshot of main command-response logic:

if Result = pmerGood then
begin
tRx := Engine.RxString;

if cbHex.Checked then
Msg(Engine.SeeBytes(tRx)+ ‘ >> ‘ + #$0D + #$0A)
else
Msg(Engine.SeeChars(tRx)+ ‘ >> ‘ + #$0D + #$0A);

PendingCmd := ”;
Engine.CharDelay := 0;

CmdData := ‘NA’ + #$0D + #$0A;
if length(tRx) > 0 then
case ord(tRx[1]) of
$01 : CmdData := ‘Smart-UPS 750 RM’ + #$0D + #$0A;
$1A : CmdData := ‘#uD43127130133136uA43108110112114uI43253257261265uM432252292’ + ‘33237lD43106103100097lA43092090088086lI43208204200196lM43182178174170e47200153045607590oD13120oA13100oI33230240220oM13208s431HMLq4820205081114172023p483090180270360450540630000k4310TNr483000060120180240300360420E443336168ON OFF’ + #$0D + #$0A;
ord(‘A’) : CmdData := ‘OK’ + #$0D + #$0A;
ord(‘B’) : CmdData := ‘27.40’ + #$0D + #$0A;
ord(‘C’) : CmdData := ‘016.2’ + #$0D + #$0A;
ord(‘D’) : begin CmdData := ‘!!!$’; Engine.CharDelay := 600; end;
ord(‘E’) : CmdData := ‘336’ + #$0D + #$0A;
ord(‘F’) : CmdData := ‘60.00’ + #$0D + #$0A;
ord(‘G’) : CmdData := ‘S’ + #$0D + #$0A;
ord(‘I’) : CmdData := ‘FF’ + #$0D + #$0A;
ord(‘J’) : CmdData := ‘0F,00’ + #$0D + #$0A;
ord(‘K’) : CmdData := ‘OK’ + #$0D + #$0A;
ord(‘L’) : CmdData := ‘126.7’ + #$0D + #$0A;
ord(‘M’) : CmdData := ‘128.1’ + #$0D + #$0A;
ord(‘N’) : CmdData := ‘125.2’ + #$0D + #$0A;
ord(‘O’) : CmdData := ‘113.0’ + #$0D + #$0A;
ord(‘P’) : CmdData := ‘000.0’ + #$0D + #$0A;
ord(‘Q’) : CmdData := ’08’ + #$0D + #$0A;
ord(‘R’) : CmdData := ‘BYE’ + #$0D + #$0A;
ord(‘S’) : CmdData := ‘OK’ + #$0D + #$0A;
ord(‘U’) : begin CmdData := ‘!!!$’; Engine.CharDelay := 600; end;
ord(‘V’) : CmdData := ‘FWD’ + #$0D + #$0A;
ord(‘W’) : CmdData := ‘OK’ + #$0D + #$0A;
ord(‘X’) : CmdData := ‘OK’ + #$0D + #$0A;
ord(‘Y’) : CmdData := ‘SM’ + #$0D + #$0A;
ord(‘a’) : CmdData := ‘3.!$%+?=#|.’ + #$01 + #$0E + #$1A + ”’)+-89>@ABCDEFGKLMNOPQRSUVWXYZabcefgjklmnopqrsuxyz~’ + #$0D + #$0A;
ord(‘b’) : CmdData := ‘615.3.D’ + #$0D + #$0A;
ord(‘c’) : CmdData := ‘UPS_IDEN’ + #$0D + #$0A;
ord(‘e’) : CmdData := ’00’ + #$0D + #$0A;
ord(‘g’) : CmdData := ‘024’ + #$0D + #$0A;
ord(‘f’) : CmdData := ‘100.0’ + #$0D + #$0A;
ord(‘i’) : CmdData := ‘FWD’ + #$0D + #$0A;
ord(‘j’) : CmdData := ‘0375:’ + #$0D + #$0A;
ord(‘k’) : CmdData := ‘0’ + #$0D + #$0A;
ord(‘l’) : CmdData := ‘097’ + #$0D + #$0A;
ord(‘m’) : CmdData := ’08/03/06′ + #$0D + #$0A;
ord(‘n’) : CmdData := ‘AS0632112344’ + #$00 + #$0D + #$0A;
ord(‘o’) : CmdData := ‘120’ + #$0D + #$0A;
ord(‘p’) : CmdData := ‘090’ + #$0D + #$0A;
ord(‘q’) : CmdData := ’02’ + #$0D + #$0A;
ord(‘r’) : CmdData := ‘000’ + #$0D + #$0A;
ord(‘s’) : CmdData := ‘H’ + #$0D + #$0A;
ord(‘u’) : CmdData := ‘127’ + #$0D + #$0A;
ord(‘x’) : CmdData := ’01/01/10′ + #$0D + #$0A;
ord(‘y’) : CmdData := ‘(C) APCC’ + #$0D + #$0A;
ord(‘z’) : CmdData := ‘CLEAR’ + #$0D + #$0A;
ord(‘9’) : CmdData := ‘FF’ + #$0D + #$0A;
end;

if CmdData <> ” then
begin
if cbHex.Checked then
Msg(Engine.SeeBytes(CmdData)+ #$0D + #$0A)
else
Msg(Engine.SeeChars(CmdData)+ #$0D + #$0A);

Engine.SendMsg := CmdData;
end;

36 Responses to “Using an EMC AX150 or AX150i SAN without the APC UPS”

  1. Borik says:

    Hi there…

    I have AX150i with singe Processing Unit, and it seems that i don’t have port of UPS,
    any advice you can give me how to turn on Write Cache?

    Thank you

  2. Amal says:

    Post a picture of the back of your unit. It should have a UPS port even if it is a single processor unit.

  3. Brian says:

    Hi!

    Will the pinout you have diagramed here work with the APC UPS that came with the AX150i? We’re in a similar situation, but have both the SAN and UPS, but not the cable. None of the cables we’ve tried seems to work, and Dell, EMC, and APC are telling us the cable is unavailable. Any help would be greatly appreciated!

  4. Amal says:

    Hi Brian,

    The diagram above shows the DB9F plug emulating the UPS end of things, so it should work. However, if it does not, use the following swaps using a DB9M (male) end;

    PIN 3 (Green-White) – PIN 9 on DB9M
    PIN 4 (Blue) – PIN 1 on DB9M
    PIN 5 (Blue-White) – PIN 2 on DB9M

    Hope that helps! Once you’ve found the correct pin-out, if you have time, please report back so we all can benefit 🙂

  5. Lee says:

    I have the UPS but no cables, do you have any information on making the cable to connect to the AX150 and APC device. I tried the pin outs and was unsuccessful.

  6. Amal says:

    Have you also tried the alternate pinout described in the comment stream just about yours?

  7. Lee says:

    I lack the knowledge of the cabling of the DB9 side.
    I have the RJ45 end with the 568B wiring that would go into the AX150.
    I currently have on the other end a connector for each wire that I can plug directly into the APC.
    With that, could you describe the color of the cable that would go into back end of the APC.
    For example, green/white would go into the Female APC number say pin 9 ? etc..
    That way can match it correctly to the connector that I bought to correctly pin it out.

    Thank you.

  8. Kason says:

    Can you send me the exr file(don’t know dephi). I’d like to urgent apply this to my network

  9. Amal says:

    Don’t have it. Never needed to compile it because I had a UPS, but I wanted to keep the info just in case I ever needed it.

  10. Kason says:

    ok thanks

  11. Jon says:

    For anyone that is still looking for a program to Emulate the APC SmartUPS for the AX150. Here is a link to one that is done in C#. You will need .Net installed on you system to run this (4.0 it may work with 3.5). I have it running on my system right now and it has allowed for Write Caching to be enabled without the UPS. The program is based on Serial Comm program found here (http://www.dreamincode.net/forums/topic/35775-serial-port-communication-in-c%23/)

    The program i am using can be found @ http://slaterhouse.com/AX150_APC.zip

    I will be making some changes to it as the program right now has alot more to it then needed, but for right now it does work. (do not use the HEX option as it has not been finished.)

    If you would like the source for this let me know.

    jon dot slaterhouse at gmail dot com

  12. Ian says:

    This is great stuff! however – I’m a bit confused about which cable diagram to go to – the first one appears to have pins 1&8 shorted, 6&7 shorted (RJ-45), and only pins 2, 3 & 5 connected on the DB9; but the other digram shows a completely different connection? I was going to attempt to use the current UPS Cable with a gender changer instead, but not sure if this will work?

    Thanks

  13. Amal says:

    Hi Ian,

    At one time I found my cable, tested it, and took a picture of my findings… but I can’t find that photo now. So, as I recall, the second drawing with pins 5 & 9 on the DB9 connector shorted together to pin 7 on the RJ45 connector.

  14. […] Using an EMC AX150 or AX150i SAN without the APC UPS – Amal … […]

  15. MrTruffle says:

    Can anyone with this cable confirm the pinout? I haven’t had success with either of the pinouts displayed above. I have an actual APC750, so I am not emulating the UPS. The pinout above that only uses 3 wires doesn’t not get interpreted by the ax150i as being a valid APC750, and the pinout that uses all the wires causes the APC to immediately power off.

    Any help is appreciated,
    T

  16. Amal says:

    I was able to confirm the pinout after finding my original EMC cable.

  17. MrTruffle says:

    The original pinout you posted or the revised one from another user? Would you be interested in selling the EMC->UPS cable?

    Thanks,
    T

  18. Amal says:

    Oh yeah, the revised version. I just completely re-wrote the post so it makes more sense.

    Also, I no longer have the cable but when I tested it I took a photo of the cable and the result, and based on the number on the cable I found one on Amazon for you; http://www.amazon.com/gp/product/B008BMV1J8/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B008BMV1J8&linkCode=as2&tag=amalnet-20

  19. MrTruffle says:

    Thanks so much for the follow up. I believe I’ve found out why the pinout is not working for communications between my AX150i and APC UPS. The cable you identified in the ebay listing is the console cable for the EMC unit, not the communications cable to the UPS. The pinout I need is for the UPS Power Sense Cable, Dell P/N F9100 (http://support.dell.com/support/topics/global.aspx/support/kcs/document?c=us&cs=19&l=en&s=dhs&docid=DSN_1D4708A4F574853CE0401E0A551770C5&isLegacy=true). Thanks again for your efforts, I really do appreciate it.

  20. Amal says:

    Hey Truffle, thanks for clearing that up! I’ve once again revised the post 🙂

  21. MrTruffle says:

    about to give up and got it working with the 9-1-2 pin configuration for the UPS cable. That note should be bumped up into the primary article.

    Thanks for everything,
    T

  22. MrTruffle says:

    Pardon my delay in responding, I’ve been on holiday.

    The pinout that ended up working for me is the one identified in the following comment: http://amal.net/?p=3154&cpage=1#comment-9069

    RJ45 pin 3 to DB9 pin 9
    RJ45 pin 4 to DB9 pin 1
    RJ45 pin 5 to DB9 pin 2

    As an aside, I ended up using a 6 conductor cable with RJ12 ends rather than RJ45 ends so my actual pinout is:

    RJ12 pin 2 to DB9 pin 9
    RJ12 pin 3 to DB9 pin 1
    RJ12 pin 4 to DB9 pin 2

    For anyone else seeking to make this cable, I recommend using a serial RS232 adapter to RJ45 adapter and make a straight-through cable (this is similar to a crossover cable, but they are not the same). The adapter will make is easy to swap around pins during testing, just make sure you don’t push the leads all the way into the “junction” part of the adapter because they are difficult to get out (I ended up pushing them out the other side with a safety pin using more force than I’m comfortable with when working on electronics). I used an adapter from Microcenter part number 19020L. Serendipitously, I found this blog posting on making the cable useful from another home project I was working on: http://wls.wwco.com/ledsigns/alpha/cable.html

    T

  23. netmgr says:

    The initial pinout DB-9F:5,3,2 & AX150_APC.zip hack is confirmed to work also with AX100 older storage model.

    Write on cache is again alive!

    Thank you very much.

  24. Gildas says:

    Hello

    I got an AX150, but without UPS, so I try to use the AX150_APC.exe with a homemade cable into a server, but the only things that i got is lot of “xx” into the program’s console.
    is it normal ?
    how to use the AX150_APC.exe to simulate to be an UPS ?
    PS : I try RJ45:3-4-5 into DB9:5-3-2 and RJ45:3-4-5 into DB9:9-1-2 with the same results

  25. Chris says:

    I have made the cable, am running the AX150_APC.zip file and am seeing xx in the window.

    What do I do next to get the emulator to emulate the APC and enable write cache?

  26. Chris says:

    Got it working. In my case I am using a DB9F and was switching between the two given pin outs.

    The 5 3 2 pinout is correct in my case. I had to read through the original post to learn that the comm program needed to be set to 2400Baud in order to work properly. Once I did this I started seeing the expected output in the window and the AX150 detected the UPS emulator.

    Thanks for the program and the pinouts!

  27. Gildas says:

    My cable was working fine too,
    I just didn’t fix the correct transfert rate : must be in 2400 bauds
    and now everything work fine!

    Thanx

  28. friedmas says:

    I know this is an old thread, but I have been struggling with this for over 2 weeks. I just acquired an AX150 with the APC UPS 750 but no cable. I have tried all different combinations to get this to work. I finally found a friend who just happened to have one and I asked to borrow the cable. It turns out that the following pinout is what I found:

    DB9M RJ45
    9 3
    2 4
    1 5

    No other pins are needed, just these 3. The previous comment stated 9-1-2, but that did not work. I hope this helps everyone else out there.

    Chris

  29. JC says:

    i know this is an old thread, but after finding this website and this application that has to run on a “dedicated host” for the AX100/150 to enable the write cache, i found that it did not fit my needs. with VMware, it is very hard to impossible to set up a guest OS with dedicated serial port access that can withstand migrations or a host being down. so i started working on a simple device using a microchip 18f4455 and a MAX232A (left over from a different project) to setup a stand alone dedicated device.

    so far it has been working for a several days, once i make sure that it is stable without lockups or code loops, i will post the code and schematics.

    look back in a week or two.

    j

  30. JM says:

    JC or OP I’m really really curious about this hardware device you made (could it even be a an n arduino or msp430 Launchpad? Like you JC, a VM is less than ideal in my situation Also, thank you very much for this post.

  31. jc says:

    it could be any mirco-controller, i just happened to use the pic microchip because that is what i use for most of my projects. i forgot to get back to this, the unit has been running none stop since May with no lockups or missed query sessions from the array to cause write caching to be disabled. let me dig up the project again, clean it up some and post the circuit and code.

  32. JM says:

    Thank you kindly JC. Looking forward to seeing your info. From that I’ll “Rosetta Stone” it to Arduino and breadboard it. I’m not good with the PIC, but if I can get it working with the Arduino I’ll program up a chip and use he MAX chip like u did for the serial link. I’ve been looking for a fun project like this, and I thank you kindly.
    –Jeff

  33. JM says:

    I’m back to working on this again. Barring anybody having cooked up a device like JC (see his device above) has anybody else successfully gotten any of this to work in the modern area? The c# app must not be 64bit compliant (or it just hates Win7) because it refuses to see anything other than COM1. Does anybody have a working version of this app? Also, I’ve got a PIC and Arduino and would love to collaborate with someone on coming up with a solution to this that works in 2014. There’s a ton of these devices out there, and heck I’ve got 12 of them myself. This blog post is the only site when searching for “AX150 bypass UPS” and it would be cool to come up with a new solution that works and pays it forward a bit.
    Thanks in advance.

  34. Jc says:

    Jm, i sent amel the source code, compiled hex file and a circuit schematic to him to upload, he indicated he would get them up on the site as soon as he got back from his travels

    J

  35. JM says:

    Thank you JC. I appreciate it.

  36. Jon says:

    Hey guys.

    Im the one who wrote the emulation software for the ups a couple of years ago.

    I have been contacted quite a bit over the last few years about it. So i wanted to post the settings since this is usually the issue.

    Port: Com1 – Com9 (there were issues with it detecting or using any ports above 9, but I used this program with a usb2serial converter on a higher port then com1 and it did function correctly)

    Baud Rate: 2400 (This is the default baud rate of the AX-150, it can be changed in the AX-150 system but 2400 seems to work best)

    Parity: None (this must be set to None)

    Stop Bits: One (must be set to One)

    Data Bits: 8 (must be set to 8)

    Mode: Text (must be text as hex does not work)

    If these settings do not work for you try using a program like Putty to connect to the com port and make sure you are able to open that com port and receive data from the AX-150, as it is always sending data on its com port. If you dont get anything either the cable is not working, the com port cant be opened (putty should tell you if it cant open it), or possibly the baud rate has been changed from default in the AX-150 system.

    I no longer use my AX-150 and have not done any development of the emulator since i posted the software. I am currently looking for the source code (its on one of my backup hard drives somewhere) and once i have found it I will include it in the zip file for download. as well as a separate download. So if someone else wants to clean it up and make it better they can. I will make another post once i find the source code and post it.

    As stated I no longer use the AX-150, but i do still have it sitting in my rack. If someone would like it send me a reasonable offer. It is a fiber channel version with both A and B controllers. I dont remember how much space there is, but they are 500GB drives and it is either 3 or 4 TB raw space. I also have the BroCade SilkWorm 200E that it came with that has 8 of the 16 ports licensed.

    again my email is jon dot slaterhouse at gmail dot com

Leave a Reply

Get Adobe Flash player