Monday, October 20, 2014

How to destroy a fake FOTEK SSR

In the process of developing a kiln controller on the cheap, I had opted to purchase a cheap Chinese solid state relay from ebay. I've used cheap relays for other projects, and they had worked well. I purchased a grey FOTEK branded unit, as it had nice robust barrier terminals, unlike many of the other cheap options.

Bewaaaaare
After finding out that the absolute minimum input voltage was closer to 5.0-5.3 volts than the stated 3 volts, the doubts began to surface -- but what could go wrong?  The use case was marginal, but not unreasonable.  The system operates at 208V; the relay is rated for 380V.  The operating current is less than 48A, with a cold current less than 53A.  The relay is rated for 60A.  That's less than a conservative 75% derating, but why stick to arbitrary derating factors when an upper boundary on the cold current is known?

All started well in the first cycle test.  The unit ramped up to a test setpoint and we observed the overshoot.  Either the time constant in the feedback path was three times what I'd estimated, or the relay thyristors were still partially conducting... POP.  What was that? Soon the PV fell below the setpoint and the relay driver came on once more... POP.

A bit embarrassed and reluctant to spend a (relatively) lot of money for a Crydom or Gavazzi, I headed back to the internet for options.  Somewhere along the way, a chisel and bandsaw attacked the failed SSR and a few interesting details dripped onto the pavement around its body.

Fused leads and torn trace; melted solder blown through vias

Exploded via and opto, stray solder flash and char
The PCB traces carrying the main current path are 1mil thick, 150 mil wide.  To some degree, the solder from hand-assembly does serve to increase sectional area, but I can't imagine anything more than 25A wouldn't start melting things. The side of the relay case had been blistered from the heat, and liquid solder had been forced between the PCB and the potting, spraying out through cracks and likely shorting the output at least momentarily.

Part of one of the triacs
The output stage is composed of discrete thyristor packages screwed to the backplate.  I could tell this much from the screws visible externally.  I haven't gutted many SSR's, but I imagine a more reliable approach for high-current units would be direct-bonded chips.  Still, my first guess when seeing two screws was to think it was two antiparallel SCR's.  Nope.  It's two CTA24-800 clones (triacs) in parallel without any means of enforcing current sharing (other than a common heat sink).  I should point out that even in the ideal scenario, that only amounts to 25Ax2=50A worth of current capacity, not 60A.  Curiously, the FOTEK product pdf for SSR50DA has transient current capacity curves strikingly similar to twice that of a mounted CTA24-800.  I'm curious to know if they also use paralleled discrete output triacs or if that's just a consequence of a coincidentally similar thermal impedance.

The remnant internals of the triacs can be inspected and tested to clearly indicate that they are the insulated-tab variant.  Considering a junction-case thermal resistance of 1.7 K/W (from STmicro BTA24) and an interface thermal resistance of about 0.20-0.25 K/W for the TO220 insulated tab packages, the overall junction-case thermal resistance for the SSR could be as much as 0.975 K/W -- let's just say 1 K/W.  This is significantly higher than the thermal resistances listed for other SSR's in the 50A class -- by as much as a factor of two.  With an input of 1.2 W/A at 40°C, one needs a 0.3 K/W heat sink to keep the junction temperature safely below 125°C at the limiting current of 50A.  When it's the thermal resistances internal to the assembly that are so significant, it may be difficult to notice an excessive operational condition; the heat sink temps would remain relatively low. Overheating would indeed contribute to the likelihood of a stuck relay.

My casual guess at what happened was that one of the triacs remained on after the input went low, a condition made more likely if one had been hogging current.  This resulted in the failure of the stuck triac.  When the input signal reappeared, the remaining device destroyed itself, blowing out the optocoupler in the process.

Note position of R5 and suggested alternate location
Interpreting the schematic from the board is trivial, though a few curiosities appear.  The series input circuit ensures that the device will not trigger at 3v input.  At the rated 5mA threshold current for the MOC3063, the input voltage would indeed need to be higher than 5v.  The FOTEK device pdf shows a parallel input structure and specifies a minimum ON transition voltage of 2.4v.

I found the location of R5 to be curious.  Its manner of connection to the snubber network seems a bit odd.  The resistor actually looks as if it were improperly installed through a via in this node, as the pad spacing is too small for the device to properly fit.  There is a stub trace with an unpopulated PTH nearby which connects to the AC2 node.  The spacing is more appropriate in this location, so this may be an alternate or a defect.  It may also be that the PCB is used for multiple layouts.

It's also worth noting that the trace spacing reduces the input-output isolation distance to roughly 20 mil.  I haven't checked, but even under thin coating of epoxy, I doubt that meets the 2.5kV isolation spec.

So what are the actual capabilities of this thing?  If one is able to trust that the components (triacs, optocoupler) meet their individual specifications, I would still feel reluctant to trust this relay above about 20A at 240V.  I don't trust the configuration to share current reliably between triacs, so I'd derate it to the capacity of a single component.  Even still, one needs to consider the added thermal resistance caused by the packaging as mentioned before.  The signal voltage range would be limited to an inconvenient 5.5v to 12v, as restricted by the series input structure.  The extra indicator LED increases the minimum voltage to reach a reliable trigger current, and it also restricts the maximum allowable current.  While the optocoupler can accept up to 60mA forward current, the indicator won't likely be reliable at 300% of its absolute maximum current.  For people wanting to drive it directly from a microcontroller IO pin, this would probably cause problems as it did for me.  At 5v, the relay may trigger unreliably because the opto would be operating near or below its specified trigger current.  Operating at voltages slightly above 12v would probably be okay, but 32v is asking for trouble in my opinion.

In the end, the device design is a functioning SSR, but it is not capable of performing to the specified capacity.  I'm curious to know how the 100A or 600V units are constructed.  As I mentioned, I've used cheap chinese SSR's before; perhaps for a 25A relay, all this gimmickry doesn't impact the performance as much.  Without knowing the details of construction or being able to trust the specifications, there is no reliable method to use these devices within their actual range of functionality.  There are other stories online of fake FOTEK SSR's sticking on or melting.  Hopefully I can contribute a little bit of information to explain the failure beyond "it was cheap". 

Kill internet trolls with fire

Well maybe it's not actual fire, but it certainly gives me a warm feeling inside.

Do you frequent any sites where the user comment section is overrun with trolls, plants, and paid shills? Are you sick of their comments reminding you that they remain capable of breathing? Use YARIP to eliminate all their comments from view. Just use Firefox's element inspector (use the right-click menu) to take a peek at the local structure and put together an appropriate XPATH to use in YARIP.

For example, delete entire posts based on a partial name match on reason.com:
//li[child::p/strong[contains(., 'Viagra')]]
Or delete just the post content based on a full name match on zerohedge.com:
//div[child::div/b/a[@href="/users/bangalore-equity-trader"]]/div[@class='comment-content']
Adapt to suit your browsing habits.

Always expand YouTube video descriptions

I never understood the point of creating website content and then persistently hiding it from users. Do stores put their merchandise on top of tall greased poles to improve sales?  With Google continually finding ways to obfuscate interfaces for no clear reason, I'm reluctantly conditioned to lose hope in the suspicion that the defining characteristic of the modern web is waste without reason -- but masturbatory social media should have made that conclusion obvious long ago.  It's a world of greased poles either way. 

Today's drop in the sea, the pinprick distracting from a thousand knife wounds, is the YouTube video watch page.  Why hide the video description? Fix that fucking shit with YARIP.  The following ugly attribute deletion expands the description, and the second XPATH removes the more/less buttons.
//div[@id='action-panel-details']/attribute::class
//div[@id='action-panel-details']/button
As an alternative and more appropriate approach, instead of using the first line to delete the class attribute for 'action-panel-details', YARIP can be configured to perform an attribute substitution.  From the YARIP's page manager, under the attribute tab, the class attribute for the 'action-panel-details' element can be simply set to
'action-panel-content yt-card yt-card-has-padding yt-uix-expander'
As a bonus, try this in YARIP to get rid of a fraction of the unrelated garbage in the sidebar. 
//li[child::a/span[text()="Recommended for you"]]
I'd like to find a way to fix the comment sorting, but I haven't had much luck so far.  It's not exactly as if I know what I'm doing.

Alternatively, the expansion itself can be accomplished using a userscript.   I use Scriptish, but Greasemonkey may also work. 
// ==UserScript==
// @name          YouTube Show Description
// @description   show the full description for fucks sake
// @namespace     http://www.stopbreakingyoutubeyouassholes.com
// @include       https://www.youtube.com/watch?*
// ==/UserScript==

document.getElementById('action-panel-details').className = 'action-panel-content yt-card yt-card-has-padding yt-uix-expander';