<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Goes Steel</title>
    <description>The latest articles on DEV Community by Goes Steel (@goessteel).</description>
    <link>https://dev.to/goessteel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4214788%2F74d8599e-f2f9-48f1-899e-f7157a4df229.jpg</url>
      <title>DEV Community: Goes Steel</title>
      <link>https://dev.to/goessteel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/goessteel"/>
    <language>en</language>
    <item>
      <title>How Many Sheets Are in a Transformer Core? A Small Python Estimator for CRGO Steel</title>
      <dc:creator>Goes Steel</dc:creator>
      <pubDate>Thu, 29 Oct 2026 09:31:12 +0000</pubDate>
      <link>https://dev.to/goessteel/how-many-sheets-are-in-a-transformer-core-a-small-python-estimator-for-crgo-steel-15fg</link>
      <guid>https://dev.to/goessteel/how-many-sheets-are-in-a-transformer-core-a-small-python-estimator-for-crgo-steel-15fg</guid>
      <description>&lt;p&gt;`I work on the supply side of grain-oriented electrical steel, the 0.23–0.30 mm silicon steel that transformer cores are stacked from. Almost every inquiry I get boils down to three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How many sheets go into this core?&lt;/li&gt;
&lt;li&gt;How much steel do I need to buy?&lt;/li&gt;
&lt;li&gt;Is the expensive grade worth it?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three can be answered with about 40 lines of Python and some numbers from the mill's datasheet. This post walks through a small estimator. It's a first-pass model, not a design tool, but it's close enough to settle most "is it worth it" arguments before anyone opens a FEM package.&lt;/p&gt;

&lt;h2&gt;
  
  
  The inputs
&lt;/h2&gt;

&lt;p&gt;A grade of grain-oriented (CRGO) steel is mostly described by three numbers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thickness&lt;/td&gt;
&lt;td&gt;0.27 mm&lt;/td&gt;
&lt;td&gt;Nominal sheet thickness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1.7/50&lt;/td&gt;
&lt;td&gt;1.20 W/kg&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Maximum&lt;/strong&gt; core loss at 1.7 T and 50 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stacking factor&lt;/td&gt;
&lt;td&gt;0.96&lt;/td&gt;
&lt;td&gt;Share of a measured stack height that is actually steel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The grade name usually encodes the first two. In the Chinese GB standard, &lt;code&gt;27Q120&lt;/code&gt; means 0.27 mm with at most 1.20 W/kg. &lt;code&gt;23QG085&lt;/code&gt; is a Hi-B (high permeability) grade at 0.23 mm with at most 0.85 W/kg.&lt;/p&gt;

&lt;p&gt;The stacking factor is the one people forget. Every sheet carries a thin insulation coating, and no stack is perfectly flat, so a 150 mm stack of 0.27 mm steel is not 150 mm of steel. Thinner sheets mean more coating layers per millimetre, so the factor drops a little as the gauge gets thinner.&lt;/p&gt;

&lt;p&gt;For the core itself, I'll use the simplest shape: a single-phase rectangular core with a limb width, a stack height, and a window.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
from dataclasses import dataclass&lt;/p&gt;

&lt;p&gt;DENSITY = 7650  # kg/m3, grain-oriented silicon steel&lt;/p&gt;

&lt;p&gt;@dataclass(frozen=True)&lt;br&gt;
class Grade:&lt;br&gt;
    name: str&lt;br&gt;
    thickness_mm: float&lt;br&gt;
    p17: float              # max core loss, W/kg at 1.7 T / 50 Hz&lt;br&gt;
    stacking_factor: float  # share of the stack height that is steel&lt;/p&gt;

&lt;p&gt;@dataclass(frozen=True)&lt;br&gt;
class Core:&lt;br&gt;
    limb_width_mm: float    # lamination width&lt;br&gt;
    stack_mm: float         # stack height, measured&lt;br&gt;
    window_w_mm: float&lt;br&gt;
    window_h_mm: float&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@property
def path_m(self):
    # mean magnetic path around a single-phase rectangular core
    w = self.limb_width_mm
    return (2 * (self.window_w_mm + w) + 2 * (self.window_h_mm + w)) / 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;def sheet_count(core, grade):&lt;br&gt;
    return round(core.stack_mm * grade.stacking_factor / grade.thickness_mm)&lt;/p&gt;

&lt;p&gt;def core_mass_kg(core, grade):&lt;br&gt;
    area_m2 = core.limb_width_mm * core.stack_mm * grade.stacking_factor / 1e6&lt;br&gt;
    return area_m2 * core.path_m * DENSITY&lt;/p&gt;

&lt;p&gt;def no_load_loss_w(core, grade, building_factor=1.2):&lt;br&gt;
    return core_mass_kg(core, grade) * grade.p17 * building_factor&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Three things in there deserve a comment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The mean path.&lt;/strong&gt; Flux runs around the window roughly through the middle of the steel, so the path length is the window perimeter plus one limb width on each side. That gives &lt;code&gt;2(a + w) + 2(h + w)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The net area.&lt;/strong&gt; Mass uses the limb width times the stack height &lt;em&gt;times the stacking factor&lt;/em&gt;. If you skip that factor, you overestimate the steel by about 4% and every number after that comes out too high.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The building factor.&lt;/strong&gt; The datasheet loss is measured on a single strip in a lab tester. An assembled core always does worse: flux crowds at the joints, cutting and handling add stress, and the corners carry flux partly against the grain. The ratio of real core loss to datasheet loss is the building factor. For modern step-lap cores it is often somewhere around 1.1 to 1.3. I default to 1.2, but if you have measured data from your own cores, use that instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it
&lt;/h2&gt;

&lt;p&gt;Take a core with a 150 mm limb width, a 150 mm stack, and a 200 × 500 mm window, then compare a conventional grade with a Hi-B grade:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
core = Core(limb_width_mm=150, stack_mm=150, window_w_mm=200, window_h_mm=500)&lt;br&gt;
grades = [&lt;br&gt;
    Grade("27Q120", 0.27, 1.20, 0.960),&lt;br&gt;
    Grade("23QG085", 0.23, 0.85, 0.955),&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;print(f"mean path: {core.path_m:.2f} m\n")&lt;br&gt;
print(f"{'grade':&amp;lt;8} {'sheets':&amp;gt;6} {'mass kg':&amp;gt;8} {'loss W':&amp;gt;7} {'kWh/yr':&amp;gt;7}")&lt;br&gt;
for g in grades:&lt;br&gt;
    loss = no_load_loss_w(core, g)&lt;br&gt;
    print(f"{g.name:&amp;lt;8} {sheet_count(core, g):&amp;gt;6} {core_mass_kg(core, g):&amp;gt;8.1f} "&lt;br&gt;
          f"{loss:&amp;gt;7.0f} {loss * 8760 / 1000:&amp;gt;7.0f}")&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`text&lt;br&gt;
mean path: 2.00 m&lt;/p&gt;

&lt;p&gt;grade    sheets  mass kg  loss W  kWh/yr&lt;br&gt;
27Q120      533    330.5     476    4169&lt;br&gt;
23QG085     623    328.8     335    2938&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the result
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sheet count.&lt;/strong&gt; Moving from 0.27 mm to 0.23 mm adds 90 sheets to the same stack. That means 17% more pieces to cut, handle, and stack, and the extra labour shows up in the quote. Thinner steel is not free even when its price per ton is similar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mass.&lt;/strong&gt; It barely changes: 330.5 kg against 328.8 kg. The only difference is the slightly lower stacking factor of the thinner gauge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loss.&lt;/strong&gt; This is the column that matters. The Hi-B core loses about 141 W less.&lt;/p&gt;

&lt;p&gt;Then comes the line that usually ends the argument. A distribution transformer stays energised around the clock, loaded or not, so its no-load loss runs 8,760 hours a year. Those 141 W add up to roughly &lt;strong&gt;1,230 kWh per year&lt;/strong&gt;, for every unit, for a service life usually measured in decades. Multiply that by your electricity price and by the number of units in a project, and you have a number a buyer can compare directly with the price difference of the steel.&lt;/p&gt;

&lt;p&gt;That's why utilities often specify a loss evaluation formula (a cost per watt of no-load loss) in their tenders instead of simply picking the cheapest steel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this model is wrong
&lt;/h2&gt;

&lt;p&gt;It is useful because it is simple, so here is what it leaves out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It uses the guaranteed maximum loss.&lt;/strong&gt; P1.7/50 on a grade is a ceiling. Real coils usually test lower, and the actual value is on the mill test certificate. For a real comparison, use certificate values from the coils you would actually receive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It assumes the core runs at 1.7 T.&lt;/strong&gt; Designers pick the operating flux density, and loss rises steeply with it. If your design runs at 1.5 T or 1.8 T, take the loss at that point from the grade's B–P curve, not the 1.7 T figure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It assumes 50 Hz.&lt;/strong&gt; At 60 Hz the same core loses more per kilogram. Datasheets usually list a separate P1.7/60 value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It ignores corner geometry.&lt;/strong&gt; Mitred corners and step-lap overlaps change the mass by a few percent. Close enough for a comparison, not for a bill of materials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's single-phase.&lt;/strong&gt; A three-phase three-limb core has three limbs and two yokes, so the path calculation changes. The rest of the code stays the same.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always apply the stacking factor before computing mass or flux area.&lt;/li&gt;
&lt;li&gt;Treat the datasheet loss as a lab number and multiply it by a building factor for real cores.&lt;/li&gt;
&lt;li&gt;Compare grades on loss per year, not price per ton. The steel is paid for once; the no-load loss is paid for every hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built tools for other "the datasheet number isn't the real number" problems (motor efficiency classes, battery capacity ratings, cable derating), I'd like to hear how you modelled the correction factors in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I work at GOES Steel, a supplier of grain-oriented and non-oriented electrical steel in Wuxi, China. The grades above are ones we handle every day. The code is free to use.&lt;/em&gt;&lt;br&gt;
`&lt;/p&gt;

</description>
      <category>python</category>
      <category>engineering</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
