<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Technical notes — Zenquox</title>
    <link>https://zenquox.com/en/notes/</link>
    <description>Questions we meet in the field and how we solve them: serialization, predictive maintenance, data and regulation.</description>
    <language>en</language>
    <lastBuildDate>Fri, 09 Oct 2026 09:00:00 GMT</lastBuildDate>
    <atom:link href="https://zenquox.com/en/notes/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>MTBF, MTTR and availability: three numbers, three different questions</title>
      <link>https://zenquox.com/en/notes/mtbf-mttr-and-availability-three-numbers-three-questions/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/mtbf-mttr-and-availability-three-numbers-three-questions/</guid>
      <pubDate>Fri, 09 Oct 2026 09:00:00 GMT</pubDate>
      <description>MTBF says how often a machine fails, MTTR how quickly it comes back, availability what share of the time the line can produce. We calculate all three from one example, show which decision each one supports, and list the four most common mistakes.</description>
      <category>MTBF</category>
      <category>MTTR</category>
      <category>Availability</category>
      <category>Reliability</category>
      <content:encoded><![CDATA[<p>In a maintenance meeting, &quot;our MTBF is 500 hours&quot; says little on its own. The same machine can have an MTTR of 3 hours or of 30; availability is very different in the two cases. Three numbers answer three separate questions: how often does it fail, how quickly does it recover, how much time is left for production.</p>
<h2>1. Definitions</h2>
<ul><li>MTBF (mean time between failures) = total operating time / number of operating intervals. Repair time is not counted as operating time.</li><li>MTTR (mean time to repair) = total repair time / number of failures.</li><li>Availability = MTBF / (MTBF + MTTR). This is inherent availability, which counts only failures and repairs; planned maintenance and waiting for material are not included.</li></ul>
<h2>2. Example</h2>
<p>Assume a filling line ran 2,000 hours in a quarter, had 4 unplanned failures in that time, and the repairs took 12 hours in total.</p>
<ul><li>MTBF = 2,000 / 4 = 500 hours</li><li>MTTR = 12 / 4 = 3 hours</li><li>Availability = 500 / (500 + 3) = 99.40%</li></ul>
<p>The failure rate λ = 1 / MTBF = 0.002 failures per hour. Under a constant failure rate, the probability of getting through a 100-hour block of shifts without a failure is exp(−100/500) = 81.9%; the probability of 500 failure-free hours is exp(−1) = 36.8%. So MTBF does not mean &quot;one failure every 500 hours&quot;; the probability of surviving one MTBF without a failure is only 36.8%.</p>
<h2>3. Which number supports which decision?</h2>
<ul><li>A low MTBF points to design, operating conditions or part quality; preventive and predictive maintenance work on this.</li><li>A high MTTR points to organization: spare parts, diagnosis time, reaching a qualified technician. In the example, cutting MTTR from 3 hours to 1.5 raises availability from 99.40% to 99.70%. The same gain comes from halving the failures from 4 to 2 (MTBF 1,000 hours). Both give the same result, but one is an investment in the maintenance plan, the other in spares and diagnostics.</li><li>On a serial line availabilities multiply: three of the same machine in sequence give a line availability of 0.9940³ = 98.22%. Two machines in parallel with redundancy (one running is enough) give 1 − (1 − 0.9940)² = 99.996%. This assumes independent failures and a perfect switchover; in reality the switchover takes time.</li></ul>
<h2>4. Four common mistakes</h2>
<ul><li>Counting repair time as operating time. MTBF is inflated and availability looks better than it is.</li><li>Counting work orders instead of failures. One failure may have three work orders; MTBF drops to a third.</li><li>Deriving MTBF from a single quarter. The 500 hours calculated from 4 failures become 1,000 hours next quarter with 2 failures; follow the trend, not the number. For equipment with few failures, at least 10–12 months of records are needed.</li><li>Applying the constant-failure-rate assumption to wearing parts. For bearings, belts and seals the failure rate rises with time; there exp(−t/MTBF) is optimistic and a Weibull analysis is needed.</li></ul>
<h2>Try it with your own records</h2>
<p>The <a href="https://zenquox.com/en/tools/mtbf-mttr-availability-calculator/">MTBF / MTTR calculator</a> works from summary figures or from a failure log (start–end date-times); the data stays in your browser. To have your failure log interpreted, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Bearing life L10: what it says and what it does not, with load, speed and reliability</title>
      <link>https://zenquox.com/en/notes/bearing-life-l10-what-it-says-and-what-it-does-not/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/bearing-life-l10-what-it-says-and-what-it-does-not/</guid>
      <pubDate>Fri, 09 Oct 2026 09:00:00 GMT</pubDate>
      <description>From the catalogue dynamic load rating to the basic rating life, then to the reliability and operating-condition adjustment: we calculate a bearing's expected life step by step, show why a small increase in load shortens life so much, and list the questions L10 does not answer.</description>
      <category>Bearings</category>
      <category>ISO 281</category>
      <category>L10</category>
      <category>Predictive maintenance</category>
      <content:encoded><![CDATA[<p>Bearing life calculation invites one confusion above all: the &quot;life&quot; figure in the catalogue versus the real life in the field. L10 says that 90% of identical bearings will last at least that long; 10% fail earlier. It is not an average, it is a lower bound.</p>
<h2>1. Basic rating life</h2>
<ul><li>L10 = (C / P)^p million revolutions; p = 3 for ball bearings, p = 10/3 for roller bearings.</li><li>L10h = L10 × 10⁶ / (60 × n) hours; n in revolutions per minute.</li></ul>
<p>Example: dynamic load rating C = 25.5 kN (from the catalogue), equivalent dynamic load P = 3.1 kN, speed 1,450 rpm, ball bearing.</p>
<ul><li>C / P = 8.23</li><li>L10 = 8.23³ = 556.6 million revolutions</li><li>L10h = 556.6 × 10⁶ / (60 × 1,450) = 6,398 hours</li></ul>
<p>With the same C, P and speed, a roller bearing (p = 10/3) gives 12,914 hours; the difference in the exponent shows why roller bearings are preferred under heavy load.</p>
<h2>2. A small change in load changes life a lot</h2>
<p>Because the exponent is 3, a 25% increase in load cuts life by nearly half:</p>
<ul><li>load × 0.8 → P = 2.48 kN → L10h = 12,495 hours</li><li>load × 1.0 → P = 3.10 kN → L10h = 6,398 hours</li><li>load × 1.25 → P = 3.88 kN → L10h = 3,276 hours</li></ul>
<p>This is where the most common loss of life in the field comes from: belt tension, misalignment or unbalance raise the equivalent load, the catalogue life looks unchanged, but the real life halves. Vibration measurement does not see this load directly; it sees unbalance and misalignment, and the load is inferred from them.</p>
<h2>3. Reliability adjustment</h2>
<p>If you want 95% reliability instead of 90%, a1 = 0.64 (the value commonly given in ISO 281; verify against the standard or the catalogue before publishing):</p>
<ul><li>L5mh = 0.64 × 6,398 = 4,094 hours</li></ul>
<p>Asking 95% of the same bearings to survive pulls the planning life from 6,398 to 4,094 hours. On critical equipment, spares and maintenance intervals are planned on this figure, not on L10.</p>
<h2>4. The bearing needed for a target life</h2>
<p>If 40,000 hours are targeted on this machine (at 95% reliability), the required dynamic load rating is C = 54.5 kN, 2.14 times the current bearing. The target therefore calls for a larger bearing or a lower load; it cannot be closed by maintaining more often.</p>
<h2>Questions L10 does not answer</h2>
<ul><li>Lubrication, contamination and temperature: the a_ISO factor in ISO 281 (a23 in the tool) carries them; without a catalogue value it is taken as 1 and the result is optimistic.</li><li>Mounting errors and electrical erosion: these are not fatigue and sit outside the calculation; most early failures come from here.</li><li>Heavy loads with P/C &gt; 0.5: the model loses reliability in this region and the tool warns.</li><li>When one particular bearing will fail: L10 is the lower 10% of a distribution and gives no date for a single part. The closest thing to a date is the vibration trend.</li></ul>
<h2>Try it with your own bearing</h2>
<p>The <a href="https://zenquox.com/en/tools/bearing-life-l10-calculator/">bearing life L10 calculator</a> works from C, P (or Fr, Fa with X, Y), speed and reliability; it holds no bearing data, you enter it from your catalogue. To interpret it together with the vibration trend, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Pareto of downtime causes: 80/20 is not a law, it is a starting point</title>
      <link>https://zenquox.com/en/notes/pareto-of-downtime-causes-80-20-is-not-a-law/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/pareto-of-downtime-causes-80-20-is-not-a-law/</guid>
      <pubDate>Fri, 09 Oct 2026 09:00:00 GMT</pubDate>
      <description>We rank one month of downtime records by cause and work out the cumulative share. The example deliberately does not follow 80/20: five of eight causes make up 86.7% of the total. We show how to choose the threshold, how record quality distorts the result, and what comes after Pareto.</description>
      <category>Pareto</category>
      <category>Downtime analysis</category>
      <category>OEE</category>
      <category>Maintenance planning</category>
      <content:encoded><![CDATA[<p>A Pareto analysis turns the hundreds of lines in a downtime log into the question &quot;what do we tackle first&quot;. The part that is misunderstood is the expectation that the 80/20 ratio will appear in every data set. It may not; what matters is the ranking, not the ratio.</p>
<h2>1. Example log</h2>
<p>One month of unplanned downtime in minutes, summed by cause:</p>
<ul><li>Sensor failure: 420</li><li>Mould change: 310</li><li>Waiting for material: 260</li><li>Conveyor jam: 190</li><li>Label printer: 120</li><li>No operator: 90</li><li>Power cut: 60</li><li>Other: 50</li></ul>
<p>Total 1,500 minutes, that is 25 hours.</p>
<h2>2. Share and cumulative share</h2>
<ul><li>Sensor failure 28.0% → cumulative 28.0%</li><li>Mould change 20.7% → 48.7%</li><li>Waiting for material 17.3% → 66.0%</li><li>Conveyor jam 12.7% → 78.7%</li><li>Label printer 8.0% → 86.7%</li><li>No operator 6.0% → 92.7%</li><li>Power cut 4.0% → 96.7%</li><li>Other 3.3% → 100%</li></ul>
<p>The first point to reach the 80% threshold is the fifth cause: the &quot;vital few&quot; are 5 causes, 62.5% of the 8 causes, 86.7% of the total. Not 80/20 but roughly 86/63. This does not mean the data is wrong; it means downtime is spread fairly evenly across causes. On such a line, fixing a single cause reduces the total by at most 28.0%.</p>
<h2>3. How to choose the threshold</h2>
<ul><li>80% is the usual starting point, but the real constraint is how many causes you can work on. If you have capacity for three improvements this month, the first three causes (66.0%) are your list; the threshold comes afterwards.</li><li>If there is no large gap between the first two causes (28.0% and 20.7% in the example), tackling both together is often quicker than finishing one and moving to the next, because the root cause may be shared (in the example, the sensor failure and the conveyor jam may be at the same station).</li><li>Ranking by duration and ranking by frequency give different lists. A single 60-minute power cut and twelve 5-minute label-printer stops per shift add up to the same total but call for different fixes. The tool takes duration; for frequency, run the same log with counts.</li></ul>
<h2>4. Record quality distorts the result</h2>
<ul><li>If &quot;Other&quot; comes out as the largest slice, no Pareto is done; the cause list is fixed first. &quot;Other&quot; should not exceed 10%.</li><li>Three spellings of the same cause (&quot;sensor&quot;, &quot;Sensor failure&quot;, &quot;sensor failure&quot;) become three lines and sink in the ranking. The tool merges case and whitespace; it cannot merge spelling differences. The cause list must be fixed and coded.</li><li>Is the mould change unplanned or planned? If planned, it does not belong in this list; in OEE it is a planned stop. If the two are mixed in one log, both the Pareto and the OEE come out wrong.</li></ul>
<h2>After Pareto</h2>
<p>Pareto says what is large, not why it is large. For the first cause, a root-cause analysis (5 whys or a fishbone); for the second, usually a measurement (is the sensor failure really the sensor, the cable, or the PLC input?). For the money side of downtime there is the <a href="https://zenquox.com/en/tools/downtime-cost-calculator/">unplanned downtime cost</a> tool, for its effect on OEE the <a href="https://zenquox.com/en/tools/oee-calculator/">OEE calculator</a>.</p>
<h2>Try it with your own log</h2>
<p>The <a href="https://zenquox.com/en/tools/downtime-pareto-analysis/">unplanned downtime Pareto analysis</a> processes &quot;cause;duration&quot; lines in your browser and lets you change the threshold; no data goes to any server. To set up the structure of your downtime log, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>The true cost of unplanned downtime: how to calculate lost hours, repair and the payback of predictive maintenance</title>
      <link>https://zenquox.com/en/notes/true-cost-of-unplanned-downtime-how-to-calculate/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/true-cost-of-unplanned-downtime-how-to-calculate/</guid>
      <pubDate>Thu, 08 Oct 2026 09:00:00 GMT</pubDate>
      <description>The cost of one stoppage is more than the repair invoice. We walk through lost production hours, repair and a realistic estimate of what early warning saves in one worked example, and show which assumption moves the result most.</description>
      <category>Predictive maintenance</category>
      <category>Downtime cost</category>
      <category>Payback</category>
      <category>Maintenance planning</category>
      <content:encoded><![CDATA[<p>The item that shows up in the maintenance budget is usually parts and labor. But when a line stops, the real cost is the value of the product that could not be made while it was down. That is why two plants can have the same repair invoice while one stoppage is far more expensive. Splitting the calculation into three parts moves the conversation from &quot;what does maintenance spend&quot; to &quot;what does downtime cost us&quot;.</p>
<h2>1. Cost per failure</h2>
<p>The formula is simple:</p>
<ul><li>cost per failure = downtime hours × loss per hour + repair</li></ul>
<p>An example line: 8 hours of downtime on average, a production loss of 50,000 TRY per hour, and 150,000 TRY of repair per failure.</p>
<ul><li>Loss: 8 × 50,000 = 400,000 TRY</li><li>Repair: 150,000 TRY</li><li>Total per failure: 550,000 TRY</li></ul>
<p>Repair is less than a quarter of the total (150,000 / 550,000 ≈ 27%). The rest is invisible loss.</p>
<h2>2. Annual cost</h2>
<p>Assume 6 unplanned stoppages a year:</p>
<ul><li>annual cost = 6 × 550,000 = 3,300,000 TRY</li><li>annual downtime = 6 × 8 = 48 hours</li></ul>
<p>These two numbers are the most useful pair for making a maintenance meeting concrete: how much money, how many hours.</p>
<h2>3. How much does early warning save?</h2>
<p>Not every failure can be prevented. Vibration, temperature or current data shows some failures days ahead; others come suddenly. The calculation needs two honest assumptions:</p>
<ul><li>avoidable share: the percentage of failures that early warning can catch (25% in the example)</li><li>planned-intervention ratio: what a caught failure costs as a planned stop, as a percentage of the unplanned cost (30% in the example)</li></ul>
<p>The formula:</p>
<ul><li>savings = number of stoppages × avoidable share × cost per failure × (1 − planned-intervention ratio)</li></ul>
<p>In the example: 6 × 0.25 × 550,000 × 0.70 = 577,500 TRY per year. Annual downtime also falls from 48 hours to 36, a reduction of 12 hours (48 × 0.25).</p>
<h2>4. Payback on the investment</h2>
<p>If the system costs 1,200,000 TRY, payback is 1,200,000 / 577,500 × 12 ≈ 24.9 months, roughly two years. How much does changing the avoidable share move the result?</p>
<ul><li>10% → annual savings 231,000 TRY</li><li>20% → 462,000 TRY</li><li>30% → 693,000 TRY</li><li>40% → 924,000 TRY</li></ul>
<p>Savings are directly proportional to the avoidable share, so that is the assumption most worth debating. Classifying your past failure records by asking &quot;did this failure show a warning sign beforehand&quot; turns the number from a guess into a measurement.</p>
<h2>Four common mistakes</h2>
<ul><li>Counting the repair invoice as the downtime cost and leaving out the lost hours.</li><li>Not stating whether the hourly loss is based on gross revenue or contribution margin. Raw material and energy that are not consumed during a stop reduce the loss; say which one you used.</li><li>Assuming an avoidable share close to 100%. Realistic starting values are low and rise as data accumulates.</li><li>Deciding on a single scenario. Looking at four values, like the sensitivity table above, ties the decision to a range rather than to one assumption.</li></ul>
<h2>Try it with your own numbers</h2>
<p>The <a href="https://zenquox.com/en/tools/downtime-cost-calculator/">unplanned downtime cost tool</a> runs in your browser; the values you enter are not sent to any server. The defaults in the example are only examples, so enter your own line's numbers. For a predictive maintenance pilot, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Six common mistakes on medical device UDI labels</title>
      <link>https://zenquox.com/en/notes/medical-device-udi-label-errors/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/medical-device-udi-label-errors/</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>Packaging levels, changes that require a new UDI-DI, confusing Basic UDI-DI with UDI-DI, missing production identifiers, labels that don't match the barcode and unmeasured print quality: the most common UDI mistakes for medical devices.</description>
      <category>UDI</category>
      <category>EUDAMED</category>
      <category>MDR</category>
      <category>GS1</category>
      <category>Medical devices</category>
      <content:encoded><![CDATA[<p>A unique device identifier (UDI) for medical devices has two parts. The device identifier (UDI-DI) identifies the model and its packaging and does not change; the production identifier (UDI-PI) carries the information that changes with every production run, such as the lot, serial number, manufacturing date or expiry date. In the GS1 system the UDI-DI is a GTIN (01); the UDI-PI uses (10) lot, (21) serial number, (11) production date and (17) expiry date.</p>
<p>In the EU this structure is set out in the MDR (2017/745); the US FDA's UDI rule follows the same logic. The mistakes below are the ones we see most often at the label design and master data stage.</p>
<p>This article summarizes a software team's perspective; it is not regulatory advice. For binding requirements, refer to the applicable regulation and your notified body.</p>
<h2>1. The same UDI-DI on every packaging level</h2>
<p>The single device, the inner box and the case are different packaging levels, and each carries its own UDI-DI. Printing the same GTIN on the single device and on a box of ten leaves it unclear how many devices one scan represents. Shipping containers used for logistics are exempt; they use an SSCC.</p>
<p>What helps: keep the device and each packaging level as separate master data records, each with its quantity and the GTIN of the level below.</p>
<h2>2. No new UDI-DI after a change</h2>
<p>The MDR requires a new UDI-DI whenever a change could lead to misidentification of the device. The list includes the name or trade name, the model or version, single-use labelling, sterile packaging, the need for sterilization before use, the quantity in a package, and critical warnings such as containing latex or DEHP. Raising the pack quantity from 10 to 12 and keeping the same GTIN is a common mistake.</p>
<p>What helps: add &quot;does this affect the UDI-DI?&quot; as a mandatory step in the product change process.</p>
<h2>3. Confusing Basic UDI-DI with UDI-DI</h2>
<p>The Basic UDI-DI identifies a group of devices with the same intended purpose, risk class and essential design. It appears in EUDAMED, in the declaration of conformity and in certificates, but not on the label; the label carries the UDI-DI. Master data that keeps both in the same field produces inconsistencies between registration and label.</p>
<h2>4. A production identifier that doesn't match how the device is controlled</h2>
<p>The UDI-PI reflects how the manufacturer controls the device: (10) for lot-controlled devices, (21) for serialized ones, and (17) whenever there is an expiry date. An expiry date printed on the label but missing from the barcode, or only a lot encoded for a serialized device, leaves the UDI incomplete.</p>
<h2>5. Human-readable text that differs from the barcode</h2>
<p>The UDI appears on the label both in machine-readable form (the barcode) and in human-readable form (HRI). When the two are fed from separate template fields, one gets updated and the other is forgotten. The HRI should be generated from the barcode content; in GS1 the fields are written with identifiers in parentheses: (01)…(17)…(10)….</p>
<h2>6. Print quality that is never measured</h2>
<p>Small devices have little label space, and the symbol gets shrunk. A barcode that scans is not enough; quality grades are measured with ISO/IEC 15415 for 2D symbols and ISO/IEC 15416 for linear barcodes. Periodic measurement with a verifier reduces the risk of unreadable labels in the field.</p>
<h2>Quick check</h2>
<p>You can split the barcode content of a label into its fields with the <a href="https://zenquox.com/en/tools/gs1-barcode-decoder/">GS1 barcode decoder</a> and check that the device identifier and a production identifier are present. GTIN check digits can be verified in bulk with the <a href="https://zenquox.com/en/tools/gs1-check-digit-calculator/">check digit calculator</a>. If you want to look at labelling and UDI database integration together, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Six ways the case–pallet relationship breaks in aggregation</title>
      <link>https://zenquox.com/en/notes/aggregation-case-pallet-errors/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/aggregation-case-pallet-errors/</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>Rejected packs, partial cases, sampling, manual handling, double assignment and pallet breakdown: the most common situations in which aggregation records drift from physical content, and how to prevent them on the line.</description>
      <category>Aggregation</category>
      <category>SSCC</category>
      <category>Serialization</category>
      <category>İTS</category>
      <content:encoded><![CDATA[<p>Aggregation is the parent–child record that links saleable units to a case and cases to a pallet. Set up correctly, scanning one pallet label means knowing the serial number of every pack on it; warehouse and shipping operations run without scanning packs one by one. When the record drifts from the physical content, the problem usually surfaces after shipment, as missing or extra product at the receiving end.</p>
<p>The situations below are where the relationship breaks most often. What they have in common is a physical event on the line that never reaches the software.</p>
<h2>1. A rejected pack stays in the record</h2>
<p>The camera rejects a pack and it is ejected; but if the pack had already been assigned to a case, or the reject never reached the aggregation station, it stays in the record. The reverse also happens: a pack put back on the line by hand after a reject is never assigned to any case.</p>
<p>What helps: record the reject decision and the physical ejection as one event, and let the aggregation station accept only serial numbers that passed verification.</p>
<h2>2. Partial cases</h2>
<p>At the end of a batch the last case is not full. If the partial case is not closed explicitly in the software, the system may try to add the next batch's packs to the same case, and batches get mixed.</p>
<p>What helps: closing the batch must close the partial case; the case record holds the actual quantity, and the label shows it.</p>
<h2>3. Sampling</h2>
<p>Samples taken from the line or from a case for quality control physically leave the hierarchy. If they stay in the record, the receiver expects products that are not in the case.</p>
<p>What helps: take samples at a station by scanning; the pack status changes to &quot;sample&quot; and the pack drops out of the hierarchy.</p>
<h2>4. Manual handling</h2>
<p>Operators moving packs by hand after a jam, a damaged pack or a line stop is the most common source of drift. Every movement made outside the system invalidates the record.</p>
<p>What helps: set up a rework station where opening a case, removing and adding packs is done by scanning, and every action is written to the audit trail with user and time.</p>
<h2>5. The same pack in two cases</h2>
<p>On fast lines, a pack read twice, or an old relationship not removed during rework, links one serial number to two parents.</p>
<p>What helps: the software enforces &quot;every child has exactly one parent&quot; at database level; a second assignment is rejected with a warning.</p>
<h2>6. Pallet breakdown and re-palletizing</h2>
<p>When a pallet is split in the warehouse and its cases are moved to other pallets, a pallet record that is not updated makes the shipping notice show the old content.</p>
<p>What helps: breaking down and building pallets is done by scanning too; a new pallet gets a new SSCC, and an old SSCC is never reused.</p>
<h2>Print the label last</h2>
<p>If the case label is printed before the content is final, a gap opens between label and content. In a good flow the case is filled, its content is verified, and only then is the label printed and scanned to match it with the record. You can verify SSCC check digits with the <a href="https://zenquox.com/en/tools/gs1-check-digit-calculator/">check digit calculator</a> and review overall line readiness with the <a href="https://zenquox.com/en/tools/serialization-readiness-checklist/">serialization readiness checklist</a>. If you want to review the aggregation flow on your current line together, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Gaps and bad records in SCADA data: what to do before modelling</title>
      <link>https://zenquox.com/en/notes/scada-data-gaps-and-bad-records/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/scada-data-gaps-and-bad-records/</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>Timestamps, gaps, frozen sensors, physically impossible values, curtailment and maintenance periods, sensor replacement: what to check in SCADA data before building a predictive maintenance or power forecasting model.</description>
      <category>SCADA</category>
      <category>Data quality</category>
      <category>Predictive maintenance</category>
      <category>Wind</category>
      <content:encoded><![CDATA[<p>In predictive maintenance and power forecasting projects, most of the time goes into the data, not the model. SCADA systems are built for operations, not for analysis: records are usually stored as 10-minute averages, communication outages leave gaps, and sensor replacements and recalibrations leave no trace in the data. A model trained before these problems are dealt with learns data errors, not faults.</p>
<p>The checks below are the ones we run at the start of every project on wind farm and rotating equipment data.</p>
<h2>1. Timestamps</h2>
<p>The first question is which time zone a timestamp belongs to, and whether it marks the start or the end of the averaging interval. In data recorded in local time, one hour appears twice or not at all when daylight saving time changes. Data from different systems (SCADA, alarm logs, maintenance work orders) should all be converted to UTC before they are joined.</p>
<h2>2. Gaps</h2>
<p>A communication outage deletes data; some systems fill the gap with zeros or with the last value. A power record filled with zeros tells the model &quot;the turbine produced nothing&quot;. A gap should stay a gap, and coverage should be reported per channel.</p>
<h2>3. Frozen values</h2>
<p>A faulty or disconnected sensor can repeat the same value for hours. Values that do not change at all over a given period should be flagged. This matters most for temperature and vibration channels: a frozen temperature hides real heating.</p>
<h2>4. Physically impossible values</h2>
<p>A negative wind speed, a direction above 360 degrees, output far above rated power, or a bearing temperature below ambient are data errors. Define physical lower and upper limits for every channel and flag the records that exceed them.</p>
<h2>5. Curtailment, maintenance and fault periods</h2>
<p>A normal behaviour model should learn from periods when the machine runs healthy and unconstrained. If grid curtailment, planned maintenance, icing and fault stops stay in the training data, the model treats them as &quot;normal&quot; and misses a real deviation. These periods should be derived from status codes and alarm logs and flagged.</p>
<h2>6. Sensor replacement and level shifts</h2>
<p>When a sensor is replaced or recalibrated, the measured level can shift suddenly, and the model mistakes it for degradation. Sudden level changes that maintenance records do not explain deserve a separate look.</p>
<h2>Flag instead of delete</h2>
<p>Rather than deleting bad records, adding a flag that says why each record is questionable has two benefits: clean windows can be selected for training, and loss calculations can state plainly which part of the data could not be assessed. We describe our power forecasting and loss study on an open wind farm dataset in our <a href="https://zenquox.com/en/projects/wind-power-forecasting/case-study/">case study</a>, and how to proceed without labelled failure data in <a href="https://zenquox.com/en/notes/predictive-maintenance-without-labeled-failure-data/">this note</a>. You can run most of these checks on your own CSV file, without uploading it, with our <a href="https://zenquox.com/en/tools/scada-data-quality-check/">SCADA data quality check</a>. For a first assessment with your own data, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>How to read and validate a GS1 code: from raw data to field-by-field checks</title>
      <link>https://zenquox.com/en/notes/how-to-read-and-validate-a-gs1-code/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/how-to-read-and-validate-a-gs1-code/</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>The raw text a scanner returns, the invisible separator, field lengths, calculating the GTIN check digit by hand and checking the date: a step-by-step guide to validating a GS1 code.</description>
      <category>GS1</category>
      <category>DataMatrix</category>
      <category>2D code</category>
      <category>Validation</category>
      <content:encoded><![CDATA[<p>Showing a code to a scanner and seeing the &quot;read&quot; light is not validation. The scanner only says it decoded the symbol; it does not say whether the data inside follows the GS1 rules. The steps below show the order for checking a code in your hands, starting from the raw text.</p>
<h2>1. What does the scanner return?</h2>
<p>Most scanners type the decoded content as plain text, like a keyboard. Two things matter in that text. First, some scanners prepend a symbology identifier to the content: ]d2 for GS1 DataMatrix, ]C1 for GS1-128. This prefix is not data and must be removed before parsing. Second, the FNC1 character that separates fields (ASCII 29, &quot;GS&quot;) is invisible on screen; some scanners do not transmit it at all, others replace it with another character. Do not build parsing software without knowing how the scanner is configured here.</p>
<h2>2. Split the raw text into fields</h2>
<p>An example content: 0109504000059118 17271231 10LOT42 [GS] 21A1B2C3 (written with spaces for readability; in reality it is contiguous). Parsing works by reading the application identifier (AI) at the start of each field:</p>
<ul><li>(01) GTIN: fixed 14 digits</li><li>(17) expiration date: fixed 6 digits, YYMMDD</li><li>(10) batch: variable length, up to 20 characters</li><li>(21) serial number: variable length, up to 20 characters</li></ul>
<p>Fixed-length fields need no separator after them; a variable-length field ends with a separator unless it comes last. In the example the batch (10) is not last, so a GS follows it; the serial number (21) is last.</p>
<h2>3. Calculate the GTIN check digit by hand</h2>
<p>The last digit (8) of the 14-digit GTIN 09504000059118 is the check digit. The calculation: multiply the first 13 digits, from right to left, alternately by 3 and 1 (the rightmost by 3), add them up, and the number that brings the total up to the next multiple of ten is the check digit. In the example the sum is 72, the next multiple of ten is 80, the difference is 8: the code is correct. With a 7 the symbol would still scan, but the GTIN would be invalid.</p>
<h2>4. Check the date and the separators</h2>
<ul><li>The month under (17) must be 01-12. Day 00 means &quot;last day of the month&quot;; does your system handle that explicitly?</li><li>271231 in the example is 31 December 2027. The same digits written out of a DD.MM.YY habit would give a valid but wrong date.</li><li>If there is no separator after a variable field, the date and batch get mixed into the serial number. A field longer than 20 characters, or an unexpected &quot;17&quot; sequence inside the serial number, is the symptom.</li></ul>
<h2>5. Keep readability and correctness apart</h2>
<p>The print quality of the symbol (contrast, module size, quiet zone) is one problem; the correctness of the data is another. They are tested separately. Print quality needs a verifier device; for the data, the steps above are enough and can be automated in software for every pack.</p>
<h2>Try it with the tool</h2>
<p>Paste the content into our <a href="https://zenquox.com/en/tools/gs1-barcode-decoder/">GS1 barcode decoder</a>: it splits the fields and validates the check digit and the date. For the check digit alone there is the <a href="https://zenquox.com/en/tools/gs1-check-digit-calculator/">check digit calculator</a>, and for field definitions the <a href="https://zenquox.com/en/tools/gs1-application-identifiers/">application identifier dictionary</a>. The most common errors on the line have their own note: <a href="https://zenquox.com/en/notes/common-pharma-serialization-code-errors/">Five common errors in pharma serialization codes</a>. To set up validation on your line, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>How to calculate OEE, and the six most common mistakes</title>
      <link>https://zenquox.com/en/notes/how-to-calculate-oee-common-mistakes/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/how-to-calculate-oee-common-mistakes/</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>The product of availability, performance and quality; a step-by-step example on a 450-minute shift and six common mistakes that distort the OEE figure.</description>
      <category>OEE</category>
      <category>Efficiency</category>
      <category>Manufacturing</category>
      <category>Losses</category>
      <content:encoded><![CDATA[<p>OEE (overall equipment effectiveness) says in one number how much of the planned time a machine turns into good product. The value of that number depends entirely on how it is calculated: two teams can get two different OEE figures from the same line. Let us look at the calculation first, then the mistakes.</p>
<h2>Three factors</h2>
<p>OEE = availability × performance × quality.</p>
<ul><li>Availability = run time / planned production time</li><li>Performance = (ideal cycle time × total pieces) / run time</li><li>Quality = good pieces / total pieces</li></ul>
<h2>Example</h2>
<p>The shift is 480 minutes with a 30-minute planned break, so planned production time is 450 minutes. Unplanned stops total 45 minutes; run time is 405 minutes. The part has an ideal cycle time of 0.5 minutes (30 seconds); 700 pieces came out, 21 of them scrap, 679 good.</p>
<ul><li>Availability: 405 / 450 = 90.0%</li><li>Performance: 0.5 × 700 / 405 = 86.4%</li><li>Quality: 679 / 700 = 97.0%</li><li>OEE: 0.900 × 0.864 × 0.970 = 75.4%</li></ul>
<p>The largest loss shows up in performance (about 13.6%): the machine runs slowly or with short stops while it is &quot;running&quot;. Someone who looks only at stop records misses that.</p>
<h2>Six common mistakes</h2>
<ul><li>**Counting planned breaks as losses.** Availability is calculated against planned production time. A calculation that puts calendar time (24 hours) in the denominator is a different measure (TEEP); do not mix the two.</li><li>**Using a target cycle time instead of the ideal one.** The ideal cycle time is the design or proven best speed. If you enter today's average speed as &quot;ideal&quot;, performance always comes out near 100% and the loss disappears.</li><li>**Counting reworked parts as good.** A part that is not right the first time is a quality loss, even if it is salvaged later.</li><li>**Not recording short stops.** Stops under a minute are usually forgotten in hand-kept records; the loss is pushed into performance, the wrong place. Decide the stop threshold up front.</li><li>**Averaging OEE values.** Adding the OEE of three machines and dividing by three ignores run times. Sum the times and counts first, then calculate the ratios.</li><li>**Burying performance above 100%.** If performance goes above 100, the ideal cycle time is defined wrongly; find the cause instead of clipping the result.</li></ul>
<h2>After the number</h2>
<p>OEE is a starting point, not a diagnosis. Go deeper in the factor where the loss is: a Pareto of causes for stops, the cycle time distribution for performance, scrap causes for quality. Reading a loss waterfall tells you more than a single OEE for a line.</p>
<p>Enter your own shift figures into the <a href="https://zenquox.com/en/tools/oee-calculator/">OEE calculator</a> to see the breakdown above in your browser; to rank stop causes there is the <a href="https://zenquox.com/en/tools/downtime-pareto-analysis/">unplanned downtime Pareto analysis</a>, and for the money side the <a href="https://zenquox.com/en/tools/downtime-cost-calculator/">unplanned downtime cost</a> tool. To set up OEE measurement on your line, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>SPC and Cpk: when a control chart raises an alarm and when a process is capable</title>
      <link>https://zenquox.com/en/notes/spc-and-cpk-when-a-control-chart-alarms/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/spc-and-cpk-when-a-control-chart-alarms/</guid>
      <pubDate>Tue, 06 Oct 2026 09:00:00 GMT</pubDate>
      <description>Calculating I-MR control limits, the logic of the Nelson rules, the difference between control limits and specification limits, and why Cpk can be low in a ten-point example even while the process is in control.</description>
      <category>SPC</category>
      <category>Cpk</category>
      <category>Control chart</category>
      <category>Quality</category>
      <content:encoded><![CDATA[<p>Statistical process control (SPC) answers two separate questions, and they are often confused: is the process stable (the control chart), and does the process meet the specification (capability, Cp/Cpk)? A stable process may not meet the specification; a process that meets it for now may be unstable.</p>
<h2>Where do the control limits come from?</h2>
<p>In an I-MR chart for individual measurements, the limits are calculated from the process's own data. The absolute difference between two consecutive measurements is the moving range (MR); call its mean MR-bar. The centre line is the mean, and the limits are the mean ± 2.66 × MR-bar (2.66 = 3 / 1.128). The standard deviation estimate is MR-bar / 1.128.</p>
<p>Example: ten measurements: 10.02 · 10.05 · 9.98 · 10.03 · 10.01 · 10.04 · 9.99 · 10.02 · 10.06 · 10.00. The mean is 10.020; MR-bar = 0.0422 (total difference 0.38 divided by 9). The limits are 10.020 ± 2.66 × 0.0422: upper 10.132, lower 9.908. The sigma estimate is 0.0422 / 1.128 = 0.0374. (Ten points are only to show the method; a real limit calculation needs at least 20-25 stable measurements.)</p>
<h2>When does it alarm?</h2>
<p>Rule 1: one point falls outside the 3-sigma limit. In a normal distribution, even while the process is stable, the probability of a point exceeding this limit is about 0.27%; so on average one false alarm is expected every 370 measurements. To catch small shifts the Nelson rules also look at patterns:</p>
<ul><li>9 points in a row on the same side of the centre: the mean has shifted.</li><li>6 points in a row steadily rising or falling: there is a trend, often wear.</li><li>14 points in a row alternating up and down: two sources may be mixed.</li><li>2 of 3 points on the same side beyond 2 sigma: an early sign of a shift.</li></ul>
<p>As the number of rules grows, detection speeds up but false alarms also increase; you need not apply all of them to every process.</p>
<h2>A control limit is not a specification limit</h2>
<p>Control limits say what the process does, specification limits what the customer wants. In the same example let the lower specification limit be 9.90 and the upper 10.10. Cp = (10.10 − 9.90) / (6 × 0.0374) = 0.89; Cpk = min(10.10 − 10.02; 10.02 − 9.90) / (3 × 0.0374) = 0.08 / 0.1123 = 0.71. Even though all ten measurements are within specification, the process is not capable, because its mean is close to the upper limit and its spread is wide; with the normal-distribution assumption the estimated defect rate is about 1.7%. Cp reflects the spread, and Cpk reflects the spread together with how far the mean sits off centre.</p>
<h2>Common mistakes</h2>
<ul><li>**Drawing the specification limit on the control chart.** It reflects what is wanted, not the natural behaviour of the process; control limits must be calculated separately.</li><li>**Calculating Cpk on an unstable process.** Bring it under control first; otherwise Cpk has no meaning.</li><li>**Not keeping the data in time order.** The moving range depends on order; shuffled data distorts the limits.</li><li>**Recalculating limits at every alarm.** Limits come from a stable period; if there is a shift, the cause is investigated, the limit is not moved.</li><li>**Copying a Cpk target blindly.** The accepted level varies with the customer, the sector and the contract.</li><li>**Assuming a normal distribution.** For one-sided or skewed data the ppm estimate can mislead.</li></ul>
<h2>Try it with the tools</h2>
<p>Paste your own measurements into the <a href="https://zenquox.com/en/tools/control-chart-spc/">control chart (SPC)</a> tool: you get the I and MR charts, the limits and the Nelson rules that were violated. For Cp, Cpk, Pp, Ppk and a ppm estimate against your specification limits there is the <a href="https://zenquox.com/en/tools/cp-cpk-capability-calculator/">Cp / Cpk capability calculator</a>. To set up quality monitoring in your process, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Five common errors in pharma serialization codes and how to catch them on the line</title>
      <link>https://zenquox.com/en/notes/common-pharma-serialization-code-errors/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/common-pharma-serialization-code-errors/</guid>
      <pubDate>Mon, 05 Oct 2026 09:00:00 GMT</pubDate>
      <description>Missing separators, wrong check digits, date format mix-ups, duplicate serial numbers and disallowed characters: the most frequent errors in pharma DataMatrix codes and how to prevent each one on the line.</description>
      <category>GS1</category>
      <category>Serialization</category>
      <category>DataMatrix</category>
      <category>Pharma</category>
      <content:encoded><![CDATA[<p>The code on a medicine pack is more than a barcode: it carries the product identity, serial number, expiration date and batch in a single symbol. If any of these four fields is wrong, the pack causes trouble in shipping, at the pharmacy or in the regulatory report — whether that is Türkiye's ITS or the EU's FMD system. The errors below are the ones we see most often in the field; all of them can be caught at the start of the line by reading every printed code and parsing it field by field.</p>
<h2>1. A missing separator after the serial number</h2>
<p>In a GS1 code the GTIN (01) and the expiration date (17) have a fixed length, while the serial number (21) and the batch (10) are variable-length. Unless a variable field comes last, it must be followed by a separator (FNC1, ASCII 29). Without it, the scanner reads the date and batch that follow as part of the serial number. The code is printed and read — but read wrongly.</p>
<p>Prevention: fix the field order in the printer template; the verification camera should parse the printed content field by field instead of only checking &quot;read / not read&quot;.</p>
<h2>2. A GTIN with a wrong check digit</h2>
<p>The last digit of a GTIN is a check digit computed from the others. A GTIN typed into master data by hand, or converted incorrectly from 13 to 14 digits, is printed wrongly on every pack on the line. Because the error starts in the data, not in the symbol, the camera reports &quot;read&quot; while the code is invalid.</p>
<p>Prevention: software should validate the check digit when the GTIN is entered into master data and when a work order is opened.</p>
<h2>3. Date format confusion</h2>
<p>The expiration date uses YYMMDD: year, month, day. A date entered out of DD.MM.YY habit can turn into a valid but wrong date in the symbol. Day &quot;00&quot; means the last day of the month, which causes inconsistencies between systems that do not handle it explicitly.</p>
<p>Prevention: take the date automatically from the work order instead of having operators type it; read the printed date back and compare it with the work order.</p>
<h2>4. Duplicate serial numbers</h2>
<p>The same serial number printed on two packs usually happens when a line is restarted or two lines share the same number pool. A duplicate code causes problems in reporting and breaks the traceability of the product in the field.</p>
<p>Prevention: serial numbers should come from a central, collision-free generator; printed and rejected numbers should be recorded permanently and never reused.</p>
<h2>5. Characters outside the character set</h2>
<p>GS1 alphanumeric fields use a limited character set: accented letters and spaces are not part of it. An accented letter or a space in a batch number violates the GS1 rules; depending on the scanner and system, the code is rejected or misread.</p>
<p>Prevention: define the batch and serial number format as a rule in master data and check it when the work order is opened.</p>
<h2>Quick check</h2>
<p>You can check the content of a code taken from the line in your browser with our <a href="https://zenquox.com/en/tools/gs1-barcode-decoder/">GS1 barcode decoder</a>: it splits the fields, validates the check digit and the date, and checks that the four serialization fields are present. The lasting fix is to run these checks on the line itself, for every pack.</p>]]></content:encoded>
    </item>
    <item>
      <title>Starting predictive maintenance without labeled failure data</title>
      <link>https://zenquox.com/en/notes/predictive-maintenance-without-labeled-failure-data/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/predictive-maintenance-without-labeled-failure-data/</guid>
      <pubDate>Mon, 05 Oct 2026 09:00:00 GMT</pubDate>
      <description>Predictive maintenance does not need a dataset of labeled past failures. Learning normal behavior, linking alarms to a physical fault class and collecting labels along the way is a sound start.</description>
      <category>Predictive maintenance</category>
      <category>Anomaly detection</category>
      <category>SCADA</category>
      <content:encoded><![CDATA[<p>Most predictive maintenance projects stall on the same sentence: &quot;We have no labeled failure data.&quot; Machine learning brings to mind a large dataset in which every past failure is marked. Yet in most plants failures are rare, their records are scattered and every machine runs a little differently. The good news: you do not need failure labels to get started.</p>
<h2>Learn what normal looks like first</h2>
<p>The first step is to model the machine's normal behavior, not its failures. Four to eight weeks of vibration, temperature, current and SCADA/PLC records show how a machine behaves under different loads and conditions. Unsupervised methods such as Isolation Forest or autoencoders learn this &quot;normal envelope&quot;; as new measurements move away from it, the health score drops.</p>
<p>The most time-consuming part is not the model but the data: separating downtime, repairing sensor dropouts and telling apart the operating modes of the same machine (idle, part load, full load).</p>
<h2>Make alarms meaningful</h2>
<p>A health score on its own tells the maintenance team little. The signal and frequency in which a deviation starts point to a physical fault class: bearing, gear, alignment, imbalance or electrical. This classification turns &quot;machine 7 is abnormal&quot; into &quot;machine 7, possible bearing damage&quot; and sends the right team with the right part.</p>
<h2>Collect labels along the way</h2>
<p>Every alarm should be closed with a technician's finding: was there really a problem, and what was it? Once these findings are written back to the model, the system produces its own labeled data within a few months. Labels become an output of the process, not a precondition.</p>
<h2>Show the uncertainty</h2>
<p>A remaining-life or output forecast given as a single number creates either too much confidence or too little. Methods such as conformal prediction intervals put next to each forecast the range in which the actual value falls with a stated probability. The maintenance planner then sees the &quot;earliest&quot; and &quot;latest&quot; scenarios together.</p>
<h2>Start small, measure</h2>
<p>A single line or a group of similar machines is enough for a first pilot. Two things need measuring: how well alarms match technician findings, and how unplanned downtime changes. We have shared how we tested our approach on an open wind farm dataset, including forecast error and interval coverage, on our <a href="https://zenquox.com/en/projects/wind-power-forecasting/case-study/">case study page</a>.</p>
<p>To get a rough idea of what a pilot could be worth, the <a href="https://zenquox.com/en/tools/downtime-cost-calculator/">downtime cost calculator</a> estimates your annual downtime cost and potential savings, and the <a href="https://zenquox.com/en/tools/scada-data-quality-check/">SCADA data quality check</a> shows whether your data is ready for modelling.</p>]]></content:encoded>
    </item>
    <item>
      <title>Audit trails for 21 CFR Part 11: what to record and how</title>
      <link>https://zenquox.com/en/notes/21-cfr-part-11-audit-trail/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/21-cfr-part-11-audit-trail/</guid>
      <pubDate>Mon, 05 Oct 2026 09:00:00 GMT</pubDate>
      <description>On the software side, FDA's 21 CFR Part 11 requirements for electronic records and signatures show up most in the audit trail. What to record, immutability, retention and a short checklist for electronic signatures.</description>
      <category>21 CFR Part 11</category>
      <category>GMP</category>
      <category>Audit trail</category>
      <category>Validation</category>
      <content:encoded><![CDATA[<p>The U.S. Food and Drug Administration's 21 CFR Part 11 covers electronic records and electronic signatures subject to FDA requirements. Manufacturers and contract laboratories supplying the U.S. market meet these requirements in customer audits too. On the software side, their most visible part is the audit trail.</p>
<p>This article summarizes a software team's perspective; it is not legal or regulatory advice. Whether a system complies is assessed within the organization's own validation process.</p>
<h2>What should the audit trail record?</h2>
<p>Section 11.10(e) of Part 11 requires secure, computer-generated, time-stamped audit trails that independently record the date and time of operator entries and actions that create, modify or delete electronic records. In practice, each event stores:</p>
<ul><li>who: a unique user identity</li><li>when: server time, with the time zone stated</li><li>what: create, modify or delete</li><li>which record and which field</li><li>the old value and the new value</li><li>the reason for the change (expected in GMP processes, e.g. by EU GMP Annex 11)</li></ul>
<h2>Earlier information must not be obscured</h2>
<p>The same section requires that record changes do not obscure previously recorded information. In design this becomes two decisions: records are never physically deleted but flagged as deleted (soft delete), and changes are not overwritten but added as new versions. The audit trail itself must be immutable: no application user, administrators included, should be able to edit an audit entry.</p>
<h2>Retention and access</h2>
<p>The audit trail must be retained at least as long as the electronic record it covers and be available for review and copying during an inspection. That means tying audit records to the same backup and archive policy as the primary data and providing a readable export (PDF or CSV).</p>
<h2>Access control and electronic signatures</h2>
<p>An audit trail loses its meaning in a system with weak authentication. Part 11 requires limiting system access to authorized individuals (11.10(d)), showing the signer's name, the date and time and the meaning of the signature (such as &quot;approved&quot; or &quot;reviewed&quot;) in electronic signatures (11.50), and linking signatures to their records (11.70). Each electronic signature must belong to one individual only (11.100), which is why shared accounts are not acceptable.</p>
<h2>A checklist for the software side</h2>
<ul><li>A unique account per user, role-based permissions</li><li>Audit entries generated server-side and not editable from within the application</li><li>Old and new value, a reason field</li><li>Soft delete and record versioning</li><li>Name, date-time and meaning in electronic signatures</li><li>Audit trail backed up with the records and exportable</li><li>Traceable requirement–test mapping for validation documents</li></ul>
<p>We build this structure into the design of our serialization and laboratory software from the start. If you would like to review the audit trail of an existing system together, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Early failure warning from vibration data: the ISO 20816 logic and a general approach</title>
      <link>https://zenquox.com/en/notes/early-failure-warning-from-vibration-data/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/early-failure-warning-from-vibration-data/</guid>
      <pubDate>Mon, 05 Oct 2026 09:00:00 GMT</pubDate>
      <description>What the vibration severity zones tell you, why you should look at your own baseline and trend rather than a single limit, the acceleration-velocity conversion and common mistakes when setting alarms.</description>
      <category>Vibration</category>
      <category>ISO 20816</category>
      <category>Predictive maintenance</category>
      <category>Alarms</category>
      <content:encoded><![CDATA[<p>On a rotating machine, vibration is one of the earliest visible signs of failure: imbalance, misalignment, looseness and bearing damage all change it. The question is how to tell when the change reaches a level that &quot;asks for maintenance&quot;. This note explains the logic of the approach without giving numbers; the values that apply to your machine are in the standard itself and in the manufacturer's documents.</p>
<h2>What do the standards do?</h2>
<p>The ISO 10816 series has been replaced by the ISO 20816 series. For rotating machines, it divides the broadband vibration severity measured on structures (mostly velocity, RMS) into four zones according to machine type, power and foundation stiffness: A is the level of a newly commissioned machine, B is suitable for long-term operation, C is limited-duration operation, D is risk of damage. The zone limits change with the machine group, so there is no single &quot;safe mm/s&quot; figure. Read the table from the standard; do not guess.</p>
<h2>The standard is not enough: baseline and trend</h2>
<p>The zone assessment looks at the absolute level. For early warning, relative change is often more valuable: the level measured on the same machine, at the same point, under the same operating condition while it is healthy is the baseline. A clear rise against the baseline shows that something has changed even while the machine is still in zone B. Set alarm thresholds using both yardsticks: the standard zone (absolute limit) and a multiple of the baseline or a slope (relative limit). Choose the multiples for your machine and experience; an &quot;example&quot; multiplier is not a standard.</p>
<h2>Units: acceleration, velocity, displacement</h2>
<p>The same vibration is expressed in three units, and they convert into each other by frequency. For a sine, peak velocity = peak acceleration / (2πf). Example: for a peak acceleration of 0.5 g (0.5 × 9.81 = 4.905 m/s²) at 100 Hz, peak velocity is 4.905 / 628.3 = 7.81 mm/s, and RMS velocity, dividing that by √2, is 5.52 mm/s. Because a real signal is not single-frequency, this conversion is valid only for one component; for broadband, velocity comes from measuring velocity directly or integrating the signal.</p>
<h2>Common mistakes when setting alarms</h2>
<ul><li>**Changing the measurement point and direction.** Mounting the sensor somewhere else changes the level. Mark the points and keep the same direction and mounting method.</li><li>**Ignoring the operating condition.** When load and speed change, vibration changes; compare data under similar conditions.</li><li>**Alarming on a single measurement.** A momentary spike (impact, measurement error) produces a false alarm. Require it to persist over several consecutive measurements.</li><li>**Looking only at the overall level.** Bearing damage barely moves the overall level in its early stage; you need a high-frequency band or spectrum detail. For spectra, pay attention to the measurement settings (sampling, window, resolution).</li><li>**Not defining the action after an alarm.** What does the &quot;alarm&quot; trigger? Inspection, lubrication, re-measurement, a planned stop: write the action down in advance for each threshold.</li></ul>
<h2>Try it with the tools</h2>
<p>You can place a velocity value you measured into a zone for your machine group in the <a href="https://zenquox.com/en/tools/vibration-severity-iso-20816/">vibration severity evaluator</a> and compare it with your baseline; the limits in the tool are for illustration, and what binds you is the standard and the manufacturer's document. For unit conversion there is the <a href="https://zenquox.com/en/tools/vibration-unit-converter/">vibration unit converter</a>, for spectrum settings the <a href="https://zenquox.com/en/tools/vibration-fft-setup-calculator/">FFT measurement setup</a>. How to proceed without labelled failure data is in <a href="https://zenquox.com/en/notes/predictive-maintenance-without-labeled-failure-data/">this note</a>. For setting up vibration monitoring, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Choosing thresholds for SCADA data quality checks: gaps, frozen values, out-of-range</title>
      <link>https://zenquox.com/en/notes/choosing-thresholds-for-scada-data-quality/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/choosing-thresholds-for-scada-data-quality/</guid>
      <pubDate>Sun, 04 Oct 2026 09:00:00 GMT</pubDate>
      <description>Calculating expected record count and coverage from the logging interval, the window length for frozen values, setting physical ranges and how to read the result of a check.</description>
      <category>SCADA</category>
      <category>Data quality</category>
      <category>Sensor</category>
      <category>Threshold</category>
      <content:encoded><![CDATA[<p>Finding errors in SCADA data is easy; deciding what counts as an error is the hard part. Set the threshold too tight and normal behaviour is flagged as an error; too loose and bad data enters the model. The note <a href="https://zenquox.com/en/notes/scada-data-gaps-and-bad-records/">Gaps and bad records in SCADA data</a> describes the error types; this note focuses on how to choose the thresholds.</p>
<h2>1. Know the logging interval first</h2>
<p>The only input to a coverage calculation is the expected record count, and that comes from the logging interval. With 10-minute averages you expect 144 records a day, 4,320 over 30 days. If the file has 4,104 rows, coverage is 4,104 / 4,320 = 95.0%, so 216 records (about 36 hours) are missing. Assuming the wrong interval ruins coverage from the start: read hourly data as 10-minute data and it looks 100% &quot;missing&quot;.</p>
<h2>2. Gaps: how long becomes a problem?</h2>
<p>A single missing record is unimportant in most analyses; a long outage matters. Think of the threshold as a multiple of the logging interval: for example, in 10-minute data a spacing larger than 1.5 times the interval between two consecutive records can count as a gap, but a longer threshold (say, several hours) can be chosen for a &quot;problem gap&quot;. Set the threshold by use: a short one for instant alarms, a longer gap is acceptable for daily energy calculations. Never fill a gap with zero or with the last value.</p>
<h2>3. Frozen values: window length</h2>
<p>A frozen value is the value staying exactly the same over N consecutive records. Choose N by the nature of the signal. On a continuously varying channel such as wind speed or vibration, 6 identical values in 10-minute data (1 hour) is suspicious. On the other hand, the power of a stopped machine or a fixed setpoint may legitimately be constant: there a frozen value is a state, not an error. So set the threshold per channel and assess stopped periods separately.</p>
<h2>4. Out of range: physical limits</h2>
<p>Derive the limit from physics, not from the data itself. Examples: direction 0-360 degrees, relative humidity 0-100, speed cannot be negative. For fields like temperature, keep the limit wide and catch only impossible values (a bearing temperature below ambient, for instance, is outside this and is a machine-specific rule). Values that are physically possible but unusual are not errors but statistical outliers; they are examined in a separate step.</p>
<h2>5. How to read the result</h2>
<ul><li>Look at coverage per channel and the share of problem records, not at the error count.</li><li>If gaps, freezing and out-of-range values appear together on one channel, a sensor or communication problem is likely; compare with the maintenance records.</li><li>Flag, do not delete: a flag stating why a record is questionable lets you pick training windows and report losses honestly.</li></ul>
<h2>Try it with the tool</h2>
<p>Give your own CSV file to the <a href="https://zenquox.com/en/tools/scada-data-quality-check/">SCADA data quality check</a>: the file is not uploaded to a server, it is processed in your browser. For timestamp problems the <a href="https://zenquox.com/en/tools/timestamp-time-zone-converter/">timestamp converter</a> helps. For a first assessment with your own data, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sample size in A/B testing and five common misconceptions</title>
      <link>https://zenquox.com/en/notes/ab-test-sample-size-and-common-misconceptions/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/ab-test-sample-size-and-common-misconceptions/</guid>
      <pubDate>Sun, 04 Oct 2026 09:00:00 GMT</pubDate>
      <description>The sample needed per group from power, significance level and minimum detectable difference, the 5% to 6% example, and misconceptions such as stopping early and multiple comparisons; a short note on survey samples.</description>
      <category>A/B testing</category>
      <category>Sample size</category>
      <category>Statistics</category>
      <category>Survey</category>
      <content:encoded><![CDATA[<p>An A/B test compares two versions using randomly split users. Tests often fail for the wrong reason: they are run for much shorter than needed, or started with too small a sample to see a small difference. Calculating the sample size at the start largely prevents both problems.</p>
<h2>What does the sample size depend on?</h2>
<p>Four quantities determine one another:</p>
<ul><li>**The current rate** (for example a 5% conversion rate).</li><li>**The smallest difference you want to catch** (for example from 5% to 6%).</li><li>**The significance level** (usually 5%, two-sided): the risk of wrongly saying &quot;there is a difference&quot; when there is none.</li><li>**The power** (usually 80%): the probability of catching a difference when it really exists.</li></ul>
<p>Tightening any one of them enlarges the sample. With the two-proportion z-test approach, examples:</p>
<ul><li>5% → 6% (a 20% relative lift): about 8,158 users per group, about 16,300 in total for two groups</li><li>5% → 7%: about 2,213 per group</li><li>5% → 5.5% (a 10% relative lift): about 31,234 per group</li></ul>
<p>When the difference is halved, the sample grows about fourfold: the sample is inversely proportional to the square of the difference. That is why measuring small improvements is expensive.</p>
<h2>Five common misconceptions</h2>
<ul><li>**Stopping the test when it turns significant.** Looking at the result continuously and stopping at the first significant p-value raises the false-positive rate. Write down the sample size and duration beforehand and do not decide before reaching them (or use sequential testing methods).</li><li>**Trying many metrics or segments.** Out of twenty metrics, one is expected to come out significant by chance. Fix the primary metric in advance and treat the others as exploration.</li><li>**Skipping the full weekly cycle.** Weekday and weekend behaviour differ. Run the test for at least one, preferably two full weeks.</li><li>**Confusing significance with effect size.** In a very large sample even a trivial difference turns significant; look at the confidence interval and the business value.</li><li>**Not noticing a broken split.** If the share of users between groups deviates from plan (for example 52-48 instead of 50-50), there may be an assignment error; the result should not be interpreted without this check.</li></ul>
<h2>Survey samples: a short note</h2>
<p>In surveys the same logic works with different quantities: margin of error, confidence level and population. For 95% confidence and a ±5% margin of error, in the worst case (proportion 50%) the sample needed for an infinite population is 384.15, which rounds up to 385. If the population is 2,000 people, the finite population correction brings it down to 323. With a 30% response rate you must invite 323 / 0.30 ≈ 1,077 people. Whether respondents represent the whole population (response bias) is a separate problem; sample size does not solve it.</p>
<h2>Try it with the tools</h2>
<p>You can calculate the needed sample and the significance of a result in the <a href="https://zenquox.com/en/tools/ab-test-sample-size-and-significance/">A/B test sample size and significance</a> tool: the two-proportion z-test, p-value, confidence interval and relative lift come out in your browser. For surveys there is the <a href="https://zenquox.com/en/tools/survey-sample-size-calculator/">survey sample size</a> tool, and for differences in means the <a href="https://zenquox.com/en/tools/t-test-calculator/">t-test calculator</a>. To review your experiment design together, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Common cron expression mistakes and time zone traps</title>
      <link>https://zenquox.com/en/notes/common-cron-mistakes-and-time-zone-traps/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/common-cron-mistakes-and-time-zone-traps/</guid>
      <pubDate>Sat, 03 Oct 2026 09:00:00 GMT</pubDate>
      <description>Day-of-month and day-of-week combining with OR, step values resetting at the top of the hour, the 31st-day trap, UTC versus local time and jobs that are skipped or run twice at daylight saving changes.</description>
      <category>Cron</category>
      <category>Scheduling</category>
      <category>Time zone</category>
      <category>Integration</category>
      <content:encoded><![CDATA[<p>Scheduled jobs (nightly sync, report, backup) are the quiet backbone of most integrations. Because a cron expression is short, its mistakes are easy to miss: the expression is valid, the job runs, but not when you expect. The traps below are the ones we meet most often with the standard five-field expression (minute, hour, day of month, month, day of week).</p>
<h2>1. Day of month and day of week combine with OR</h2>
<p>Reading &quot;0 9 1 * 1&quot; as &quot;09:00 if the 1st is a Monday&quot; is a common misreading. When both fields are restricted, classic (Vixie) cron combines them with OR: the job runs on the 1st and also every Monday. If one of them is a star, the logic goes back to AND. For a condition like &quot;the first Monday of the month&quot; the expression alone is not enough; the job has to check today's date itself.</p>
<h2>2. A step value resets at the top of the hour</h2>
<p>&quot;*/7 * * * *&quot; looks like every seven minutes; in reality the minutes are 0, 7, 14, ... 56, and then 0 again at the top of the hour. So the gap after 56 is 4 minutes. Steps that do not divide 60 (7, 8, 25...) run unevenly. If you truly need an even interval, pick a step that divides 60 (5, 10, 15, 20, 30) or build the scheduler on a &quot;since last run&quot; basis.</p>
<h2>3. Months without a 31st</h2>
<p>&quot;0 0 31 * *&quot; does not run every month, only in the seven months that have 31 days. For &quot;month end&quot;, a safe day such as the 28th is usually chosen, or the job runs every day and checks whether tomorrow is the 1st. In February the 30th and 31st never exist, and the 29th only in leap years.</p>
<h2>4. Time zone: what does the server say?</h2>
<p>The time zone of a cron expression is the time zone of the environment the job runs in, which in most cloud environments is UTC. UTC 06:00 is 09:00 in Türkiye (UTC+3, no daylight saving). For &quot;every morning at 09:00&quot; on a UTC server the expression must be &quot;0 6 * * *&quot;. When the environment changes (from a local machine to the cloud) the time zone changes too and the job shifts by three hours. So note next to the expression which time zone it was written in.</p>
<h2>5. Daylight saving changes</h2>
<p>In a time zone with daylight saving, one hour does not exist at the spring change: in Germany, for example, on the last Sunday of March local time jumps from 02:00 to 03:00, and &quot;30 2 * * *&quot; may not run that day. In autumn one hour happens twice and the same job may run twice. Behaviour depends on the scheduler. Countermeasure: schedule critical jobs in UTC, or write the job so that running it again does no harm (idempotent).</p>
<h2>6. Other systems' syntax</h2>
<p>Quartz and similar tools use six or seven fields with a seconds field, and special characters such as &quot;?&quot;, &quot;L&quot; and &quot;W&quot;. Pasted into standard cron, such an expression is invalid or means something else. For day of week, both 0 and 7 mean Sunday; names (MON, JAN) may not be supported everywhere.</p>
<h2>See it before you run it</h2>
<p>Type the expression into the <a href="https://zenquox.com/en/tools/cron-expression-explainer/">cron expression explainer</a>: it explains it in plain language, shows the next 10 run times for the time zone you choose and warns about traps like the OR rule. To convert timestamps there is the <a href="https://zenquox.com/en/tools/timestamp-time-zone-converter/">timestamp converter</a>, and for retry behaviour the <a href="https://zenquox.com/en/tools/api-retry-backoff-simulator/">API retry simulator</a>. To review your integration schedule, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Using JWT correctly: common security mistakes</title>
      <link>https://zenquox.com/en/notes/using-jwt-correctly-common-security-mistakes/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/using-jwt-correctly-common-security-mistakes/</guid>
      <pubDate>Fri, 02 Oct 2026 09:00:00 GMT</pubDate>
      <description>A JWT is signed, not encrypted; verifying the signature on every request, the alg and expiry fields, where to store it and the revocation problem: eight mistakes to avoid when designing an API.</description>
      <category>JWT</category>
      <category>Security</category>
      <category>API</category>
      <category>Authentication</category>
      <content:encoded><![CDATA[<p>JWT (JSON Web Token) is a common way to carry identity and authorisation information between APIs. It looks simple: three parts separated by dots. Most mistakes come from that apparent simplicity. The list below gathers the points every team that issues and verifies tokens should review; for detailed recommendations see RFC 8725, which covers JWT security best practices.</p>
<h2>1. A JWT is not encrypted</h2>
<p>The header and payload of a signed JWT are only base64url-encoded; anyone can read them. Do not put passwords, identity numbers or confidential business data in the payload. If confidentiality is needed, use the encrypted form (JWE), or carry only a reference number in the token and keep the data on the server.</p>
<h2>2. Decoding is not verifying</h2>
<p>Decoding the payload and reading &quot;user: ayse, role: admin&quot; does not show that the token is genuine. Trust arises only after the signature is verified with the key. Server code that only decodes and trusts the fields lets anyone write their own token.</p>
<h2>3. &quot;alg&quot;: &quot;none&quot; and algorithm confusion</h2>
<p>The alg field in the header comes from the token itself; an attacker can change it. The verifier must take the algorithm to accept from its own configuration, not from the header. &quot;none&quot; must never be accepted, and a token signed with a public key (RS) must not be &quot;verified&quot; with HS by using that same key as a secret.</p>
<h2>4. Not checking expiry and audience fields</h2>
<ul><li>If the exp (expiry) field is not checked, the token stays valid forever.</li><li>If iss (issuer) and aud (audience) are not checked, a token issued for another service also passes on your API.</li><li>nbf (not before) and clock skew: a few minutes of tolerance between servers is enough, not hours.</li></ul>
<h2>5. A long-lived access token</h2>
<p>An access token should be short-lived (minutes), with a separate refresh token to extend the session. A stolen long-lived token can be used with full authority until the theft is noticed.</p>
<h2>6. Where it is stored</h2>
<p>A token in localStorage in the browser falls into the hands of any script that leaks into the page (XSS). In a cookie with the HttpOnly and Secure flags and a suitable SameSite setting, it cannot be read by scripts; but if you use cookies you must also think about CSRF. No option is sufficient alone.</p>
<h2>7. Not being able to revoke</h2>
<p>A JWT is a self-contained token; to cancel it before expiry the server needs an extra mechanism (a deny list, a session version, a short lifetime). The token of a user who logs out or loses authorisation stays valid until it expires; accept that in the design or close it.</p>
<h2>8. A weak HMAC key</h2>
<p>With shared-key algorithms such as HS256, a guessable or short key can be cracked by offline trial. The key should be randomly generated, long enough and stored apart from the code.</p>
<h2>How to use the tool</h2>
<p>You can open a token in your browser with the <a href="https://zenquox.com/en/tools/jwt-decoder/">JWT decoder</a> to see the header, payload, time fields and weak settings; the token is not sent anywhere. The tool decodes, it does not verify: real verification must be done on your server with the key. To try signature logic there is the <a href="https://zenquox.com/en/tools/webhook-hmac-signature-verifier/">webhook HMAC signature verifier</a>, and for keys the <a href="https://zenquox.com/en/tools/password-strength-and-entropy-calculator/">password strength and entropy calculator</a>. To review your API security, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>UPS sizing: VA versus W, power factor and how to calculate runtime</title>
      <link>https://zenquox.com/en/notes/ups-sizing-va-vs-w-power-factor-and-runtime/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/ups-sizing-va-vs-w-power-factor-and-runtime/</guid>
      <pubDate>Fri, 02 Oct 2026 09:00:00 GMT</pubDate>
      <description>Converting VA to W, the rated power margin, runtime from battery energy and the capacity needed for a target time: a step-by-step UPS calculation on a 300 W load.</description>
      <category>UPS</category>
      <category>Backup power</category>
      <category>Battery</category>
      <category>Infrastructure</category>
      <content:encoded><![CDATA[<p>When choosing a UPS there are two separate questions: can it carry the load (power), and for how long (energy)? They are calculated separately, and most wrong sizing comes from mixing the two up.</p>
<h2>1. VA and W are not the same</h2>
<p>UPS units are quoted in two values, VA (apparent power) and W (real power). The power factor lies between them: W = VA × power factor. For example, a UPS rated 1000 VA with a power factor of 0.9 carries at most 900 W. The power factor varies from model to model; look at the real power rating in the catalogue. On the load side it is the same: if a server's power is stated in W you need not convert it to VA, but the UPS's W limit must be larger than the load total.</p>
<h2>2. Add up the load properly</h2>
<p>Adding the nameplate (maximum) power of the devices gives an exaggerated result; measuring the real consumption or reading it with a power meter is more accurate. Still, account for start-up loads (disks spinning up, cooling fans) and devices to be added later. Leaving a margin instead of running the UPS at its full rated power is a common internal yardstick; set the margin according to your own policy.</p>
<h2>3. Runtime: energy divided by power</h2>
<p>The simple approach goes through the steps below. Example: load 300 W; two 12 V, 9 Ah batteries in series (24 V, 9 Ah).</p>
<ul><li>Nominal energy: 24 V × 9 Ah = 216 Wh</li><li>With 90% inverter efficiency, power drawn from the battery: 300 / 0.9 = 333.3 W</li><li>Battery current: 333.3 / 24 = 13.9 A</li><li>The whole battery cannot be used: with 80% usable depth and an 80% ageing or temperature correction, usable capacity is 9 × 0.8 × 0.8 = 5.76 Ah</li><li>Time: 5.76 / 13.9 = 0.415 hours, about 24.9 minutes</li></ul>
<p>Shorter than you expected? That is normal: only about half of the nominal 216 Wh is actually usable.</p>
<h2>4. Working backwards from a target time</h2>
<p>You can turn this around. If 30 minutes is wanted for the same load, the usable capacity needed is 13.9 A × 0.5 h = 6.94 Ah, and in nominal terms 6.94 / 0.64 = 10.85 Ah; so a battery string of about 11 Ah or more is needed. The next standard size up must be chosen.</p>
<h2>5. Limits of the calculation</h2>
<ul><li>**The load is not constant.** Runtime lengthens non-linearly as the load falls; at high current the battery delivers less capacity (the Peukert effect). The constant-power assumption is approximate.</li><li>**Batteries age.** A battery a few years old has less capacity than at the start; a hot environment shortens its life too.</li><li>**The manufacturer's curve is what counts.** The calculation is for a preliminary decision; for the exact time use the manufacturer's load-runtime table.</li><li>**End voltage.** The UPS shuts down when it drops below a certain voltage; this &quot;depth&quot; must be consistent with the DoD you entered in the calculation.</li></ul>
<h2>Use the tool</h2>
<p>Enter your own load, battery and target time into the <a href="https://zenquox.com/en/tools/ups-runtime-calculator/">UPS backup runtime calculator</a>: it calculates runtime from VA or W, power factor, inverter efficiency, an ageing margin and an optional Peukert exponent, shows sensitivity when the load changes, and in reverse mode gives the capacity needed. For the cooling load of the whole server room there is the <a href="https://zenquox.com/en/tools/server-room-power-cooling-calculator/">server room power and cooling calculation</a>. To review your backup power design, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>CIDR and subnet planning: summarisation, alignment and overlap</title>
      <link>https://zenquox.com/en/notes/cidr-and-subnet-planning-summarisation-and-overlap/</link>
      <guid isPermaLink="true">https://zenquox.com/en/notes/cidr-and-subnet-planning-summarisation-and-overlap/</guid>
      <pubDate>Thu, 01 Oct 2026 09:00:00 GMT</pubDate>
      <description>Address count from the prefix length, when two networks can be summarised into one block, overlap checking and common mistakes in the address plan when building a VPN or cloud network.</description>
      <category>CIDR</category>
      <category>Subnet</category>
      <category>IP planning</category>
      <category>Network</category>
      <content:encoded><![CDATA[<p>The address plan is one of the most expensive decisions to change once the network is built. A block that looks ample on day one runs out when you add a second branch, a VPN or a cloud network. The basics below (for IPv4) are enough to build the plan soundly from the start.</p>
<h2>Address count from the prefix</h2>
<p>A /n prefix says that the first n of the 32 bits identify the network. The block holds 2^(32-n) addresses:</p>
<ul><li>/24: 256 addresses (usually 254 usable for clients)</li><li>/23: 512 addresses</li><li>/22: 1,024 addresses</li></ul>
<p>In classic networks the first address is the network address and the last is the broadcast address, so the usable count is two fewer (2 of the 4 addresses in a /30; /31 is a special exception for point-to-point links). Cloud providers reserve addresses of their own as well; the number varies by provider, so plan according to its documentation.</p>
<h2>Alignment: a block starts at a multiple of its own size</h2>
<p>A /24 block starts at an address that is a multiple of 256, a /23 at a multiple of 512. That is why 10.0.0.0/24 and 10.0.1.0/24 merge into 10.0.0.0/23: third byte 0 and 1 exactly fill a 512-address block. By contrast 10.0.1.0/24 and 10.0.2.0/24 look adjacent, but because 10.0.1.0 does not start at an even third byte they do not fit into a single /23; if you try to summarise them as one block you include addresses in between and around them. Four consecutive /24s (10.0.0.0 to 10.0.3.0) can be summarised as 10.0.0.0/22.</p>
<h2>Why summarisation matters</h2>
<p>Keeping a single line in the routing table instead of dozens of branch networks shrinks the table and hides faults. But if the summary block also covers addresses that are not yours, traffic can go to the wrong place. Summarisation is safe only for blocks that are truly contiguous and aligned; plan by splitting into large, aligned blocks from the start (a /24 per branch, a /20 per region, for example).</p>
<h2>Overlap checking</h2>
<p>Two blocks overlap if the address range of one intersects the other; they also overlap if one block lies inside the other. Example: 10.20.0.0/16 and 10.20.8.0/21 overlap, because the /21 covers addresses with third byte 8-15, which are inside the /16. Overlap appears most often when:</p>
<ul><li>The company network and a home or guest network use the same default block, so routes get mixed up over the VPN.</li><li>Two companies merge and both use 10.0.0.0/16.</li><li>A cloud virtual network and the local network were built in the same block and are to be connected.</li></ul>
<h2>A planning pattern</h2>
<ul><li>Place the largest requirement first, then work down to the small ones (VLSM).</li><li>Leave growth room in every block: twice today's need is a common yardstick.</li><li>Avoid common blocks such as the default 192.168.0.0/24 and 10.0.0.0/24 so as not to overlap with networks that may connect in future (partners, cloud).</li><li>Write the usage in a table: block, purpose, owner, date.</li></ul>
<h2>Try it with the tools</h2>
<p>For an address and prefix, see the network, broadcast, first-last address and host count with the <a href="https://zenquox.com/en/tools/ip-subnet-cidr-calculator/">IP subnet and CIDR calculator</a>. To summarise several blocks into one or to check overlap, use <a href="https://zenquox.com/en/tools/cidr-summarization-aggregation/">CIDR summarisation and merging</a>; for IPv6 there is the <a href="https://zenquox.com/en/tools/ipv6-subnet-calculator/">IPv6 subnet calculator</a>. To review your network and cloud address plan together, <a href="https://zenquox.com/en/#contact">get in touch</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
