[{"data":1,"prerenderedAt":1710},["ShallowReactive",2],{"blog-\u002Fblog\u002F2025\u002F07\u002Fquality-control-automation-spc-charts":3},{"id":4,"title":5,"body":6,"description":12,"extension":1700,"meta":1701,"navigation":832,"path":1706,"seo":1707,"stem":1708,"__hash__":1709},"blog\u002Fblog\u002F2025\u002F07\u002Fquality-control-automation-spc-charts.md","Statistical Process Control (SPC): Benefits and Implementation Guide",{"type":7,"value":8,"toc":1682},"minimark",[9,13,16,19,22,27,30,37,43,49,54,57,63,66,69,73,76,87,92,95,99,102,134,138,141,172,175,179,186,210,213,322,326,333,351,497,500,504,507,564,575,579,582,607,613,619,623,631,635,638,643,654,657,662,700,709,712,721,726,730,733,759,762,778,1464,1467,1476,1480,1483,1499,1510,1518,1521,1525,1528,1531,1551,1554,1557,1563,1566,1569,1573,1576,1579,1608,1621,1624,1632,1636,1678],[10,11,12],"p",{},"Leading manufacturers are quietly saving thousands, sometimes millions, of dollars annually with a quality control method that's been proven since the 1920s. The difference today? Modern tools make it simple to implement.",[10,14,15],{},"Consider this real example: A manufacturer shared on Practical Machinist forum that they process 400,000 parts per year with a 4% scrap rate. That's 16,000 parts discarded annually. At even a conservative $10 per part, this represents $160,000 in direct losses from a single production line. They accepted this as normal because industry reports confirm 4-5% scrap rates are standard.",[10,17,18],{},"What separates industry leaders from the rest? They refuse to accept \"normal\" waste. Using Statistical Process Control (SPC), they detect problems as they occur, not after producing defective parts. When a process begins drifting, they receive immediate alerts and correct it before generating scrap.",[10,20,21],{},"This guide shows you exactly how to build a real-time SPC system using FlowFuse. You'll create a live dashboard that tracks measurements and alerts operators the moment something goes wrong. No statistics degree needed, just practical steps you can implement today.",[23,24,26],"h2",{"id":25},"why-traditional-quality-control-falls-short","Why Traditional Quality Control Falls Short",[10,28,29],{},"Most manufacturers still rely on end-of-line inspection. Make parts, check parts, scrap the bad ones. This reactive approach creates three expensive problems:",[10,31,32,36],{},[33,34,35],"strong",{},"Problem 1: You're always too late","\nWhen inspection finds a defect, you've already invested in material, machine time, labor, and energy. That investment is now scrap. Worse, how many parts did you make between when the problem started and when you caught it?",[10,38,39,42],{},[33,40,41],{},"Problem 2: The borderline parts you miss","\nNot all defects are obvious. Parts that barely pass inspection today might fail in the field tomorrow. These marginal parts slip through because traditional inspection only catches clear failures, not process degradation.",[10,44,45,48],{},[33,46,47],{},"Problem 3: No insight into root causes","\nFinding bad parts tells you nothing about why they're bad. Was it temperature drift? Tool wear? Material variation? Without process data, you're guessing at solutions.",[10,50,51],{},[33,52,53],{},"The Proactive Alternative: Statistical Process Control",[10,55,56],{},"SPC flips the entire approach. Instead of checking parts after production, it monitors your process during production. The NIST Engineering Statistics Handbook explains it simply:",[58,59,60],"blockquote",{},[10,61,62],{},"\"The underlying concept of statistical process control is based on a comparison of what is happening today with what happened previously.\"",[10,64,65],{},"When your process starts to drift from its normal behavior, SPC alerts you immediately. You fix the issue before making defective parts, not after.",[10,67,68],{},"Walter Shewhart developed this method at Bell Labs in the 1920s, proving its effectiveness across industries. Today, FlowFuse makes it accessible to any manufacturer, regardless of size or technical expertise.",[23,70,72],{"id":71},"building-your-first-spc-system-with-flowfuse","Building Your First SPC System with FlowFuse",[10,74,75],{},"Let's build a real example. This guide shows you how to create a SPC control chart for individual measurements - perfect for monitoring critical dimensions in real-time.",[10,77,78,79,86],{},"First, open your FlowFuse Node-RED instance. If you don't have one yet, you can ",[80,81,85],"a",{"href":82,"rel":83},"https:\u002F\u002Fapp.flowfuse.com\u002Faccount\u002Fcreate",[84],"nofollow","sign up for a free account"," and have an instance running in minutes.",[88,89,91],"h3",{"id":90},"what-we're-building","What We're Building",[10,93,94],{},"A real-time SPC control chart that monitors individual measurements and automatically calculates control limits. Perfect for scenarios where you measure one part at a time - like bearing dimensions on a CNC line. When measurements drift outside the calculated limits, you'll know instantly.",[88,96,98],{"id":97},"step-1:-get-your-tools-ready","Step 1: Get Your Tools Ready",[10,100,101],{},"First, we need two nodes for SPC monitoring.",[103,104,105,109,112,131],"ol",{},[106,107,108],"li",{},"Open FlowFuse's palette manager (hamburger menu → Manage palette)",[106,110,111],{},"Go to the Install tab",[106,113,114,115],{},"Search for and install these nodes:",[116,117,118,125],"ul",{},[106,119,120,124],{},[121,122,123],"code",{},"node-red-contrib-simple-spc"," - This is your statistics engine",[106,126,127,130],{},[121,128,129],{},"@flowfuse\u002Fnode-red-dashboard"," - For that slick real-time chart",[106,132,133],{},"Click Install for each node and wait for completion",[88,135,137],{"id":136},"step-2:-simulate-your-machine-data","Step 2: Simulate Your Machine Data",[10,139,140],{},"In production, you'd connect to your PLC. For now, let's simulate a bearing measurement around 10mm nominal.",[103,142,143,150],{},[106,144,145,146,149],{},"Drag an ",[33,147,148],{},"inject"," node onto your canvas. This is your \"sensor.\"",[106,151,152,153],{},"Double-click it and set:",[116,154,155,166],{},[106,156,157,158,161,162,165],{},"Repeat: ",[121,159,160],{},"interval"," → ",[121,163,164],{},"2 seconds"," (mimics real sensor timing)",[106,167,168,169],{},"Payload: switch to JSONata mode and enter: ",[121,170,171],{},"$random() * 0.2 + 10",[10,173,174],{},"This generates readings like 10.05, 9.98, 10.11 - realistic variation around 10mm.",[88,176,178],{"id":177},"step-3:-add-the-statistical-brain","Step 3: Add the Statistical Brain",[10,180,181,182,185],{},"Find the ",[33,183,184],{},"spc"," node in your palette (it'll be under \"function\" category after install).",[103,187,188,191],{},[106,189,190],{},"Drag it over and wire your inject node to it.",[106,192,193,194],{},"Double-click to configure:",[116,195,196,203],{},[106,197,198,199,202],{},"Control Limit Multiplier: ",[121,200,201],{},"3"," (for 3-sigma limits)",[106,204,205,206,209],{},"Timer: ",[121,207,208],{},"10"," (seconds before alerting out-of-control)",[10,211,212],{},"Once configured, the node outputs an object like this:",[214,215,220],"pre",{"className":216,"code":217,"language":218,"meta":219,"style":219},"language-javascript shiki shiki-themes github-light github-dark","{\n    value: 10.020214950604476,      \u002F\u002F Current measurement\n    avg: 10.089877376434453,         \u002F\u002F Running average\n    ucl: 10.344067494423967,         \u002F\u002F Upper control limit\n    lcl: 9.835687258444938,          \u002F\u002F Lower control limit\n    outOfControl: false              \u002F\u002F Alert status\n}\n","javascript","",[121,221,222,231,252,269,285,302,316],{"__ignoreMap":219},[223,224,227],"span",{"class":225,"line":226},"line",1,[223,228,230],{"class":229},"sVt8B","{\n",[223,232,234,238,241,245,248],{"class":225,"line":233},2,[223,235,237],{"class":236},"sScJk","    value",[223,239,240],{"class":229},": ",[223,242,244],{"class":243},"sj4cs","10.020214950604476",[223,246,247],{"class":229},",      ",[223,249,251],{"class":250},"sJ8bj","\u002F\u002F Current measurement\n",[223,253,255,258,260,263,266],{"class":225,"line":254},3,[223,256,257],{"class":236},"    avg",[223,259,240],{"class":229},[223,261,262],{"class":243},"10.089877376434453",[223,264,265],{"class":229},",         ",[223,267,268],{"class":250},"\u002F\u002F Running average\n",[223,270,272,275,277,280,282],{"class":225,"line":271},4,[223,273,274],{"class":236},"    ucl",[223,276,240],{"class":229},[223,278,279],{"class":243},"10.344067494423967",[223,281,265],{"class":229},[223,283,284],{"class":250},"\u002F\u002F Upper control limit\n",[223,286,288,291,293,296,299],{"class":225,"line":287},5,[223,289,290],{"class":236},"    lcl",[223,292,240],{"class":229},[223,294,295],{"class":243},"9.835687258444938",[223,297,298],{"class":229},",          ",[223,300,301],{"class":250},"\u002F\u002F Lower control limit\n",[223,303,305,308,310,313],{"class":225,"line":304},6,[223,306,307],{"class":236},"    outOfControl",[223,309,240],{"class":229},[223,311,312],{"class":243},"false",[223,314,315],{"class":250},"              \u002F\u002F Alert status\n",[223,317,319],{"class":225,"line":318},7,[223,320,321],{"class":229},"}\n",[88,323,325],{"id":324},"step-4:-make-the-data-chart-ready","Step 4: Make the Data Chart-Ready",[10,327,328,329,332],{},"Charts need data in a specific format. Add a ",[33,330,331],{},"change"," node between SPC and your chart.",[103,334,335,341,344],{},[106,336,337,338,340],{},"Drag a ",[33,339,331],{}," node onto the canvas",[106,342,343],{},"Wire it between the SPC node and where your chart will go",[106,345,346,347,350],{},"Double-click to configure and set one rule: ",[121,348,349],{},"Set msg.payload"," to this JSONata expression:",[214,352,356],{"className":353,"code":354,"language":355,"meta":219,"style":219},"language-json shiki shiki-themes github-light github-dark","[\n    {\"series\": \"Measurement\", \"x\": $millis(), \"y\": payload.value},\n    {\"series\": \"UCL\", \"x\": $millis(), \"y\": payload.ucl},\n    {\"series\": \"LCL\", \"x\": $millis(), \"y\": payload.lcl},\n    {\"series\": \"Average\", \"x\": $millis(), \"y\": payload.avg}\n]\n","json",[121,357,358,363,402,432,462,492],{"__ignoreMap":219},[223,359,360],{"class":225,"line":226},[223,361,362],{"class":229},"[\n",[223,364,365,368,371,373,377,380,383,385,389,391,394,396,399],{"class":225,"line":233},[223,366,367],{"class":229},"    {",[223,369,370],{"class":243},"\"series\"",[223,372,240],{"class":229},[223,374,376],{"class":375},"sZZnC","\"Measurement\"",[223,378,379],{"class":229},", ",[223,381,382],{"class":243},"\"x\"",[223,384,240],{"class":229},[223,386,388],{"class":387},"s7hpK","$millis()",[223,390,379],{"class":229},[223,392,393],{"class":243},"\"y\"",[223,395,240],{"class":229},[223,397,398],{"class":387},"payload.value",[223,400,401],{"class":229},"},\n",[223,403,404,406,408,410,413,415,417,419,421,423,425,427,430],{"class":225,"line":254},[223,405,367],{"class":229},[223,407,370],{"class":243},[223,409,240],{"class":229},[223,411,412],{"class":375},"\"UCL\"",[223,414,379],{"class":229},[223,416,382],{"class":243},[223,418,240],{"class":229},[223,420,388],{"class":387},[223,422,379],{"class":229},[223,424,393],{"class":243},[223,426,240],{"class":229},[223,428,429],{"class":387},"payload.ucl",[223,431,401],{"class":229},[223,433,434,436,438,440,443,445,447,449,451,453,455,457,460],{"class":225,"line":271},[223,435,367],{"class":229},[223,437,370],{"class":243},[223,439,240],{"class":229},[223,441,442],{"class":375},"\"LCL\"",[223,444,379],{"class":229},[223,446,382],{"class":243},[223,448,240],{"class":229},[223,450,388],{"class":387},[223,452,379],{"class":229},[223,454,393],{"class":243},[223,456,240],{"class":229},[223,458,459],{"class":387},"payload.lcl",[223,461,401],{"class":229},[223,463,464,466,468,470,473,475,477,479,481,483,485,487,490],{"class":225,"line":287},[223,465,367],{"class":229},[223,467,370],{"class":243},[223,469,240],{"class":229},[223,471,472],{"class":375},"\"Average\"",[223,474,379],{"class":229},[223,476,382],{"class":243},[223,478,240],{"class":229},[223,480,388],{"class":387},[223,482,379],{"class":229},[223,484,393],{"class":243},[223,486,240],{"class":229},[223,488,489],{"class":387},"payload.avg",[223,491,321],{"class":229},[223,493,494],{"class":225,"line":304},[223,495,496],{"class":229},"]\n",[10,498,499],{},"This creates four lines on your chart, your actual measurements plus the three control lines.",[88,501,503],{"id":502},"step-5:-build-your-control-room-dashboard","Step 5: Build Your Control Room Dashboard",[10,505,506],{},"Now we'll create the dashboard that displays your SPC control chart. This is what operators will watch to spot problems in real-time.",[103,508,509,558,561],{},[106,510,337,511,514,515],{},[33,512,513],{},"chart"," widget from the dashboard section and set:",[116,516,517,523,530,537,543,549,555],{},[106,518,519,520],{},"Type: ",[121,521,522],{},"Line Chart",[106,524,525,526,529],{},"X-axis: ",[121,527,528],{},"HH:mm:ss"," (shows time)",[106,531,532,533,536],{},"Series: Set to ",[121,534,535],{},"series"," (as key)",[106,538,539,540,536],{},"X: Set to ",[121,541,542],{},"x",[106,544,545,546,536],{},"Y: Set to ",[121,547,548],{},"y",[106,550,551,552],{},"Legend: ",[121,553,554],{},"Show",[106,556,557],{},"Label: \"SPC Chart: Bearing Diameter (mm)\"",[106,559,560],{},"Connect the change node to it.",[106,562,563],{},"Deploy the flow.",[10,565,566,571],{},[567,568],"img",{"alt":569,"dataZoomable":219,"src":570},"Node-RED flow showing SPC monitoring setup with inject node, SPC calculations, data formatting, and dashboard chart configuration","\u002Fblog\u002F2025\u002F07\u002Fimages\u002Fspc.png",[572,573,574],"em",{},"Complete SPC monitoring flow with real-time chart display",[88,576,578],{"id":577},"step-6:-add-the-alert-system","Step 6: Add the Alert System",[10,580,581],{},"A chart is nice, but you need immediate alerts. Here's the clever bit:",[103,583,584,591,597,600],{},[106,585,586,587,590],{},"Add a ",[33,588,589],{},"switch"," node connected to your SPC output",[106,592,593,594],{},"Set it to check ",[121,595,596],{},"msg.payload.outOfControl",[106,598,599],{},"Create two outputs: true and false",[106,601,602,603,606],{},"Now add a ",[33,604,605],{},"text"," nodes from dashboard. Wire it to your switch outputs.",[10,608,609,610],{},"For the \"true\" path, set the text to something attention-grabbing using change node:\n",[121,611,612],{},"⚠️ PROCESS OUT OF CONTROL - CHECK MACHINE!",[10,614,615,616],{},"For the \"false\" path:\n",[121,617,618],{},"✓ Process Stable",[103,620,621],{"start":287},[106,622,563],{},[10,624,625,629],{},[567,626],{"alt":627,"dataZoomable":219,"src":628},"Node-RED alert system with switch node: Process stable","\u002Fblog\u002F2025\u002F07\u002Fimages\u002Fspc-visual-alert.png",[572,630,627],{},[88,632,634],{"id":633},"step-7:-test-your-spc-system","Step 7: Test Your SPC System",[10,636,637],{},"Open your dashboard (switch to the Dashboard 2.0 tab → click Open Dashboard button on the top-right of the right sidebar).",[10,639,640],{},[33,641,642],{},"What you'll see initially:",[116,644,645,648,651],{},[106,646,647],{},"First 20 measurements: Chart builds up baseline data",[106,649,650],{},"After 20 points: Control limits appear automatically",[106,652,653],{},"Blue line bouncing between red lines: Process is stable",[10,655,656],{},"Let the system run for a minute to establish your baseline. The control limits aren't arbitrary - they're calculated from your actual process data.",[10,658,659],{},[33,660,661],{},"Now test it with a simulated process shift:",[103,663,664,667,674,677],{},[106,665,666],{},"Double-click the Inject node",[106,668,669,670,673],{},"Change the formula to ",[121,671,672],{},"$random() * 0.2 + 10.5"," (this shifts the mean up by 0.5mm)",[106,675,676],{},"Click Done to close the node",[106,678,679,680],{},"Deploy only the modified nodes:",[116,681,682,689,695],{},[106,683,684,685,688],{},"Click the down arrow next to the ",[33,686,687],{},"Deploy"," button",[106,690,691,692],{},"Select ",[33,693,694],{},"Modified Nodes",[106,696,697,698,688],{},"Click the ",[33,699,687],{},[10,701,702,706],{},[567,703],{"alt":704,"dataZoomable":219,"src":705},"Node-RED deploy menu showing Modified Nodes option for selective deployment","\u002Fblog\u002F2025\u002F07\u002Fimages\u002Fmodifed-nodes-deploy.png",[572,707,708],{},"Deploy menu with Modified Nodes option for updating only changed nodes",[10,710,711],{},"Once done You will see the chart detect the change within seconds.",[10,713,714,718],{},[567,715],{"alt":716,"dataZoomable":219,"src":717},"SPC chart showing process shift with measurements exceeding upper control limit and alert triggered","\u002Fblog\u002F2025\u002F07\u002Fimages\u002Fspc-visual-alert2.png",[572,719,720],{},"SPC chart detecting process shift - measurements above UCL trigger immediate alert",[722,723],"render-flow",{":height":724,"flow":725},"300","W3siaWQiOiIxMjRmNTMxMzY1YjgyZTFjIiwidHlwZSI6Imdyb3VwIiwieiI6IjA3MTUyNGE4ZmQ0ODIxMTYiLCJzdHlsZSI6eyJzdHJva2UiOiIjYjJiM2JkIiwic3Ryb2tlLW9wYWNpdHkiOiIxIiwiZmlsbCI6IiNmMmYzZmIiLCJmaWxsLW9wYWNpdHkiOiIwLjUiLCJsYWJlbCI6dHJ1ZSwibGFiZWwtcG9zaXRpb24iOiJudyIsImNvbG9yIjoiIzMyMzMzYiJ9LCJub2RlcyI6WyI0MDgyZjg5NjA1NzkzNjY2IiwiMmVjODM1MWYwMWY5NTdhNCIsImM5MGQ2N2M1N2QxYWYzYmQiLCI1M2VmODQ5YTQxYWVlMmIzIiwiZDc4ZmYzZGJlOTdhNWJlOSIsIjk4ZTc2NjE2YzI4ZWQ5Y2EiLCI1ZmQzNDE1ZWY0YzM2YjZlIiwiOTc2MzYzMjYwNmMyYTE2NSJdLCJ4IjoyMTQsInkiOjE1OSwidyI6ODcyLCJoIjoxNjJ9LHsiaWQiOiI0MDgyZjg5NjA1NzkzNjY2IiwidHlwZSI6ImluamVjdCIsInoiOiIwNzE1MjRhOGZkNDgyMTE2IiwiZyI6IjEyNGY1MzEzNjViODJlMWMiLCJuYW1lIjoiIiwicHJvcHMiOlt7InAiOiJwYXlsb2FkIn1dLCJyZXBlYXQiOiIyIiwiY3JvbnRhYiI6IiIsIm9uY2UiOmZhbHNlLCJvbmNlRGVsYXkiOjAuMSwidG9waWMiOiIiLCJwYXlsb2FkIjoiJHJhbmRvbSgpICogMC4yICsgMTAuNSIsInBheWxvYWRUeXBlIjoianNvbmF0YSIsIngiOjMxMCwieSI6MjQwLCJ3aXJlcyI6W1siMmVjODM1MWYwMWY5NTdhNCJdXX0seyJpZCI6IjJlYzgzNTFmMDFmOTU3YTQiLCJ0eXBlIjoic3BjIiwieiI6IjA3MTUyNGE4ZmQ0ODIxMTYiLCJnIjoiMTI0ZjUzMTM2NWI4MmUxYyIsIm5hbWUiOiIiLCJsaW1pdE11bHRpcGxpZXIiOiIzIiwidGltZXIiOiIxMCIsIngiOjQzMCwieSI6MjQwLCJ3aXJlcyI6W1siYzkwZDY3YzU3ZDFhZjNiZCIsImQ3OGZmM2RiZTk3YTViZTkiXV19LHsiaWQiOiJjOTBkNjdjNTdkMWFmM2JkIiwidHlwZSI6ImNoYW5nZSIsInoiOiIwNzE1MjRhOGZkNDgyMTE2IiwiZyI6IjEyNGY1MzEzNjViODJlMWMiLCJuYW1lIjoiIiwicnVsZXMiOlt7InQiOiJzZXQiLCJwIjoicGF5bG9hZCIsInB0IjoibXNnIiwidG8iOiJbICAgICB7XCJzZXJpZXNcIjogXCJNZWFzdXJlbWVudFwiLCBcInhcIjogJG1pbGxpcygpLCBcInlcIjogcGF5bG9hZC52YWx1ZX0sICAgICB7XCJzZXJpZXNcIjogXCJVQ0xcIiwgXCJ4XCI6ICRtaWxsaXMoKSwgXCJ5XCI6IHBheWxvYWQudWNsfSwgICAgIHtcInNlcmllc1wiOiBcIkxDTFwiLCBcInhcIjogJG1pbGxpcygpLCBcInlcIjogcGF5bG9hZC5sY2x9LCAgICAge1wic2VyaWVzXCI6IFwiQXZlcmFnZVwiLCBcInhcIjogJG1pbGxpcygpLCBcInlcIjogcGF5bG9hZC5hdmd9IF0iLCJ0b3QiOiJqc29uYXRhIn1dLCJhY3Rpb24iOiIiLCJwcm9wZXJ0eSI6IiIsImZyb20iOiIiLCJ0byI6IiIsInJlZyI6ZmFsc2UsIngiOjYwMCwieSI6MjAwLCJ3aXJlcyI6W1siNTNlZjg0OWE0MWFlZTJiMyJdXX0seyJpZCI6IjUzZWY4NDlhNDFhZWUyYjMiLCJ0eXBlIjoidWktY2hhcnQiLCJ6IjoiMDcxNTI0YThmZDQ4MjExNiIsImciOiIxMjRmNTMxMzY1YjgyZTFjIiwiZ3JvdXAiOiIzYWYyMWNmMmNlYTYzOGM4IiwibmFtZSI6IiIsImxhYmVsIjoiSS1NUiBDaGFydDogQmVhcmluZyBEaWFtZXRlciAobW0pIiwib3JkZXIiOjEsImNoYXJ0VHlwZSI6ImxpbmUiLCJjYXRlZ29yeSI6InNlcmllcyIsImNhdGVnb3J5VHlwZSI6InByb3BlcnR5IiwieEF4aXNMYWJlbCI6IiIsInhBeGlzUHJvcGVydHkiOiJ4IiwieEF4aXNQcm9wZXJ0eVR5cGUiOiJwcm9wZXJ0eSIsInhBeGlzVHlwZSI6InRpbWUiLCJ4QXhpc0Zvcm1hdCI6IiIsInhBeGlzRm9ybWF0VHlwZSI6ImF1dG8iLCJ4bWluIjoiIiwieG1heCI6IiIsInlBeGlzTGFiZWwiOiIiLCJ5QXhpc1Byb3BlcnR5IjoieSIsInlBeGlzUHJvcGVydHlUeXBlIjoicHJvcGVydHkiLCJ5bWluIjoiIiwieW1heCI6IiIsImJpbnMiOjEwLCJhY3Rpb24iOiJhcHBlbmQiLCJzdGFja1NlcmllcyI6ZmFsc2UsInBvaW50U2hhcGUiOiJjaXJjbGUiLCJwb2ludFJhZGl1cyI6NCwic2hvd0xlZ2VuZCI6dHJ1ZSwicmVtb3ZlT2xkZXIiOjEsInJlbW92ZU9sZGVyVW5pdCI6IjM2MDAiLCJyZW1vdmVPbGRlclBvaW50cyI6IiIsImNvbG9ycyI6WyIjMDA5NWZmIiwiI2ZmMDAwMCIsIiNmZjdmMGUiLCIjMmNhMDJjIiwiI2EzNDdlMSIsIiNkNjI3MjgiLCIjZmY5ODk2IiwiIzk0NjdiZCIsIiNjNWIwZDUiXSwidGV4dENvbG9yIjpbIiM2NjY2NjYiXSwidGV4dENvbG9yRGVmYXVsdCI6dHJ1ZSwiZ3JpZENvbG9yIjpbIiNlNWU1ZTUiXSwiZ3JpZENvbG9yRGVmYXVsdCI6dHJ1ZSwid2lkdGgiOiIxMiIsImhlaWdodCI6IjciLCJjbGFzc05hbWUiOiIiLCJpbnRlcnBvbGF0aW9uIjoibGluZWFyIiwieCI6ODQwLCJ5IjoyMDAsIndpcmVzIjpbW11dfSx7ImlkIjoiZDc4ZmYzZGJlOTdhNWJlOSIsInR5cGUiOiJzd2l0Y2giLCJ6IjoiMDcxNTI0YThmZDQ4MjExNiIsImciOiIxMjRmNTMxMzY1YjgyZTFjIiwibmFtZSI6IiIsInByb3BlcnR5IjoicGF5bG9hZC5vdXRPZkNvbnRyb2wiLCJwcm9wZXJ0eVR5cGUiOiJtc2ciLCJydWxlcyI6W3sidCI6InRydWUifSx7InQiOiJmYWxzZSJ9XSwiY2hlY2thbGwiOiJ0cnVlIiwicmVwYWlyIjpmYWxzZSwib3V0cHV0cyI6MiwieCI6NTcwLCJ5IjoyNjAsIndpcmVzIjpbWyI5OGU3NjYxNmMyOGVkOWNhIl0sWyI1ZmQzNDE1ZWY0YzM2YjZlIl1dfSx7ImlkIjoiOThlNzY2MTZjMjhlZDljYSIsInR5cGUiOiJjaGFuZ2UiLCJ6IjoiMDcxNTI0YThmZDQ4MjExNiIsImciOiIxMjRmNTMxMzY1YjgyZTFjIiwibmFtZSI6IiIsInJ1bGVzIjpbeyJ0Ijoic2V0IiwicCI6InBheWxvYWQiLCJwdCI6Im1zZyIsInRvIjoi4pqg77iPIFBST0NFU1MgT1VUIE9GIENPTlRST0wgLSBDSEVDSyBNQUNISU5FISIsInRvdCI6InN0ciJ9XSwiYWN0aW9uIjoiIiwicHJvcGVydHkiOiIiLCJmcm9tIjoiIiwidG8iOiIiLCJyZWciOmZhbHNlLCJ4Ijo3ODAsInkiOjI0MCwid2lyZXMiOltbIjk3NjM2MzI2MDZjMmExNjUiXV19LHsiaWQiOiI1ZmQzNDE1ZWY0YzM2YjZlIiwidHlwZSI6ImNoYW5nZSIsInoiOiIwNzE1MjRhOGZkNDgyMTE2IiwiZyI6IjEyNGY1MzEzNjViODJlMWMiLCJuYW1lIjoiIiwicnVsZXMiOlt7InQiOiJzZXQiLCJwIjoicGF5bG9hZCIsInB0IjoibXNnIiwidG8iOiLinJMgUHJvY2VzcyBTdGFibGUiLCJ0b3QiOiJzdHIifV0sImFjdGlvbiI6IiIsInByb3BlcnR5IjoiIiwiZnJvbSI6IiIsInRvIjoiIiwicmVnIjpmYWxzZSwieCI6NzgwLCJ5IjoyODAsIndpcmVzIjpbWyI5NzYzNjMyNjA2YzJhMTY1Il1dfSx7ImlkIjoiOTc2MzYzMjYwNmMyYTE2NSIsInR5cGUiOiJ1aS10ZXh0IiwieiI6IjA3MTUyNGE4ZmQ0ODIxMTYiLCJnIjoiMTI0ZjUzMTM2NWI4MmUxYyIsImdyb3VwIjoiM2FmMjFjZjJjZWE2MzhjOCIsIm9yZGVyIjoyLCJ3aWR0aCI6MCwiaGVpZ2h0IjowLCJuYW1lIjoiVmlzdWFsIEFsZXJ0IiwibGFiZWwiOiIiLCJmb3JtYXQiOiJ7e21zZy5wYXlsb2FkfX0iLCJsYXlvdXQiOiJjb2wtY2VudGVyIiwic3R5bGUiOnRydWUsImZvbnQiOiJBcmlhbCxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIsImZvbnRTaXplIjoiMjQiLCJjb2xvciI6IiM3MTcxNzEiLCJ3cmFwVGV4dCI6ZmFsc2UsImNsYXNzTmFtZSI6IiIsIngiOjk5MCwieSI6MjYwLCJ3aXJlcyI6W119LHsiaWQiOiIzYWYyMWNmMmNlYTYzOGM4IiwidHlwZSI6InVpLWdyb3VwIiwibmFtZSI6Ikdyb3VwIDEiLCJwYWdlIjoiNzM1MTAyZjIyOWYxYTQ1YiIsIndpZHRoIjoiMTIiLCJoZWlnaHQiOiI3Iiwib3JkZXIiOjEsInNob3dUaXRsZSI6ZmFsc2UsImNsYXNzTmFtZSI6IiIsInZpc2libGUiOiJ0cnVlIiwiZGlzYWJsZWQiOiJmYWxzZSIsImdyb3VwVHlwZSI6ImRlZmF1bHQifSx7ImlkIjoiNzM1MTAyZjIyOWYxYTQ1YiIsInR5cGUiOiJ1aS1wYWdlIiwibmFtZSI6IlNQQyIsInVpIjoiM2MyZTdjNmY0MzgzNDllNCIsInBhdGgiOiIvcGFnZTEiLCJpY29uIjoiaG9tZSIsImxheW91dCI6ImdyaWQiLCJ0aGVtZSI6ImRhZmY4NGI2ZjdmZTFmOTciLCJicmVha3BvaW50cyI6W3sibmFtZSI6IkRlZmF1bHQiLCJweCI6IjAiLCJjb2xzIjoiMyJ9LHsibmFtZSI6IlRhYmxldCIsInB4IjoiNTc2IiwiY29scyI6IjYifSx7Im5hbWUiOiJTbWFsbCBEZXNrdG9wIiwicHgiOiI3NjgiLCJjb2xzIjoiOSJ9LHsibmFtZSI6IkRlc2t0b3AiLCJweCI6IjEwMjQiLCJjb2xzIjoiMTIifV0sIm9yZGVyIjoxLCJjbGFzc05hbWUiOiIiLCJ2aXNpYmxlIjoidHJ1ZSIsImRpc2FibGVkIjoiZmFsc2UifSx7ImlkIjoiM2MyZTdjNmY0MzgzNDllNCIsInR5cGUiOiJ1aS1iYXNlIiwibmFtZSI6Ik15IERhc2hib2FyZCIsInBhdGgiOiIvZGFzaGJvYXJkIiwiYXBwSWNvbiI6IiIsImluY2x1ZGVDbGllbnREYXRhIjp0cnVlLCJhY2NlcHRzQ2xpZW50Q29uZmlnIjpbInVpLW5vdGlmaWNhdGlvbiIsInVpLWNvbnRyb2wiXSwic2hvd1BhdGhJblNpZGViYXIiOmZhbHNlLCJoZWFkZXJDb250ZW50IjoicGFnZSIsIm5hdmlnYXRpb25TdHlsZSI6ImRlZmF1bHQiLCJ0aXRsZUJhclN0eWxlIjoiZGVmYXVsdCIsInNob3dSZWNvbm5lY3ROb3RpZmljYXRpb24iOnRydWUsIm5vdGlmaWNhdGlvbkRpc3BsYXlUaW1lIjoxLCJzaG93RGlzY29ubmVjdE5vdGlmaWNhdGlvbiI6dHJ1ZSwiYWxsb3dJbnN0YWxsIjp0cnVlfSx7ImlkIjoiZGFmZjg0YjZmN2ZlMWY5NyIsInR5cGUiOiJ1aS10aGVtZSIsIm5hbWUiOiJEZWZhdWx0IFRoZW1lIiwiY29sb3JzIjp7InN1cmZhY2UiOiIjZmZmZmZmIiwicHJpbWFyeSI6IiMwMDk0Q0UiLCJiZ1BhZ2UiOiIjZWVlZWVlIiwiZ3JvdXBCZyI6IiNmZmZmZmYiLCJncm91cE91dGxpbmUiOiIjY2NjY2NjIn0sInNpemVzIjp7ImRlbnNpdHkiOiJkZWZhdWx0IiwicGFnZVBhZGRpbmciOiIxMnB4IiwiZ3JvdXBHYXAiOiIxMnB4IiwiZ3JvdXBCb3JkZXJSYWRpdXMiOiI0cHgiLCJ3aWRnZXRHYXAiOiIxMnB4In19XQ==",[23,727,729],{"id":728},"spc-chart-rules-that-actually-matter","SPC Chart Rules That Actually Matter",[10,731,732],{},"Control limits catch obvious problems. But subtle issues need pattern recognition. Here are the four rules that catch 95% of real problems:",[116,734,735,741,747,753],{},[106,736,737,740],{},[33,738,739],{},"Rule 1: Any point outside limits","\nThis one is fairly obvious:  If a measurement point falls outside of the established upper or lower limits, something is wrong.",[106,742,743,746],{},[33,744,745],{},"Rule 2: Seven points on one side","\nSeven consecutive points above or below the center line means your process has shifted. Maybe a new material lot, maybe tool wear.",[106,748,749,752],{},[33,750,751],{},"Rule 3: Seven points trending","\nSeven points in a row going up or down. Classic sign of tool wear or temperature drift.",[106,754,755,758],{},[33,756,757],{},"Rule 4: Repeating and Cyclical Patterns","\nThis rule is for recurring behaviors that the other rules miss. Cycles that repeat over time, like a regular pattern that appears at the start of every shift change or every Monday. Speak with your operators, they will likely know what these mean.",[10,760,761],{},"Here's how to implement these rules in FlowFuse:",[103,763,764,770,776],{},[106,765,337,766,769],{},[33,767,768],{},"Function"," node onto the workspace and add the following JavaScript code to it.",[106,771,772,773,775],{},"Replace switch node with this ",[33,774,768],{}," node.",[106,777,563],{},[214,779,781],{"className":216,"code":780,"language":218,"meta":219,"style":219},"const buffer = context.get('measurements') || [];\nconst current = msg.payload;\n\n\u002F\u002F Rule 1: Out-of-control point (handled by SPC node)\nif (msg.payload.outOfControl) {\n    msg.payload = \"⚠️ PROCESS OUT OF CONTROL – CHECK MACHINE!\";\n    return msg;\n}\n\n\u002F\u002F Store the current measurement\nbuffer.push({\n    value: current.value,\n    avg: current.avg,\n    timestamp: new Date()\n});\n\n\u002F\u002F Keep only the last 20 measurements\nif (buffer.length > 20) {\n    buffer.shift();\n}\ncontext.set('measurements', buffer);\n\n\u002F\u002F Initialize alert message\nlet alertMessage = \"✓ Process Stable\";\n\n\u002F\u002F Check rules if we have enough data\nif (buffer.length >= 7) {\n    const recent = buffer.slice(-7);\n    const values = recent.map(r => r.value);\n\n    \u002F\u002F Rule 2: Seven points on one side of the center line\n    const allAbove = values.every(v => v > current.avg);\n    const allBelow = values.every(v => v \u003C current.avg);\n    if (allAbove || allBelow) {\n        alertMessage = \"⚠️ Process shift detected – 7 points on one side of center\";\n    }\n\n    \u002F\u002F Rule 3: Seven points trending up or down\n    let trending = true;\n    const increasing = values[1] > values[0];\n    for (let i = 2; i \u003C values.length; i++) {\n        if ((increasing && values[i] \u003C= values[i - 1]) ||\n            (!increasing && values[i] >= values[i - 1])) {\n            trending = false;\n            break;\n        }\n    }\n    if (trending) {\n        alertMessage = increasing\n            ? \"⚠️ Increasing trend – check for tool wear\"\n            : \"⚠️ Decreasing trend – check material quality\";\n    }\n}\n\nmsg.payload = alertMessage;\nreturn msg;\n",[121,782,783,816,828,834,839,847,861,869,874,879,885,897,903,909,924,930,935,941,961,973,978,994,999,1005,1021,1026,1032,1049,1077,1105,1110,1116,1148,1175,1189,1202,1208,1213,1219,1235,1264,1300,1332,1360,1373,1381,1387,1392,1400,1410,1419,1430,1435,1440,1445,1456],{"__ignoreMap":219},[223,784,785,789,792,795,798,801,804,807,810,813],{"class":225,"line":226},[223,786,788],{"class":787},"szBVR","const",[223,790,791],{"class":243}," buffer",[223,793,794],{"class":787}," =",[223,796,797],{"class":229}," context.",[223,799,800],{"class":236},"get",[223,802,803],{"class":229},"(",[223,805,806],{"class":375},"'measurements'",[223,808,809],{"class":229},") ",[223,811,812],{"class":787},"||",[223,814,815],{"class":229}," [];\n",[223,817,818,820,823,825],{"class":225,"line":233},[223,819,788],{"class":787},[223,821,822],{"class":243}," current",[223,824,794],{"class":787},[223,826,827],{"class":229}," msg.payload;\n",[223,829,830],{"class":225,"line":254},[223,831,833],{"emptyLinePlaceholder":832},true,"\n",[223,835,836],{"class":225,"line":271},[223,837,838],{"class":250},"\u002F\u002F Rule 1: Out-of-control point (handled by SPC node)\n",[223,840,841,844],{"class":225,"line":287},[223,842,843],{"class":787},"if",[223,845,846],{"class":229}," (msg.payload.outOfControl) {\n",[223,848,849,852,855,858],{"class":225,"line":304},[223,850,851],{"class":229},"    msg.payload ",[223,853,854],{"class":787},"=",[223,856,857],{"class":375}," \"⚠️ PROCESS OUT OF CONTROL – CHECK MACHINE!\"",[223,859,860],{"class":229},";\n",[223,862,863,866],{"class":225,"line":318},[223,864,865],{"class":787},"    return",[223,867,868],{"class":229}," msg;\n",[223,870,872],{"class":225,"line":871},8,[223,873,321],{"class":229},[223,875,877],{"class":225,"line":876},9,[223,878,833],{"emptyLinePlaceholder":832},[223,880,882],{"class":225,"line":881},10,[223,883,884],{"class":250},"\u002F\u002F Store the current measurement\n",[223,886,888,891,894],{"class":225,"line":887},11,[223,889,890],{"class":229},"buffer.",[223,892,893],{"class":236},"push",[223,895,896],{"class":229},"({\n",[223,898,900],{"class":225,"line":899},12,[223,901,902],{"class":229},"    value: current.value,\n",[223,904,906],{"class":225,"line":905},13,[223,907,908],{"class":229},"    avg: current.avg,\n",[223,910,912,915,918,921],{"class":225,"line":911},14,[223,913,914],{"class":229},"    timestamp: ",[223,916,917],{"class":787},"new",[223,919,920],{"class":236}," Date",[223,922,923],{"class":229},"()\n",[223,925,927],{"class":225,"line":926},15,[223,928,929],{"class":229},"});\n",[223,931,933],{"class":225,"line":932},16,[223,934,833],{"emptyLinePlaceholder":832},[223,936,938],{"class":225,"line":937},17,[223,939,940],{"class":250},"\u002F\u002F Keep only the last 20 measurements\n",[223,942,944,946,949,952,955,958],{"class":225,"line":943},18,[223,945,843],{"class":787},[223,947,948],{"class":229}," (buffer.",[223,950,951],{"class":243},"length",[223,953,954],{"class":787}," >",[223,956,957],{"class":243}," 20",[223,959,960],{"class":229},") {\n",[223,962,964,967,970],{"class":225,"line":963},19,[223,965,966],{"class":229},"    buffer.",[223,968,969],{"class":236},"shift",[223,971,972],{"class":229},"();\n",[223,974,976],{"class":225,"line":975},20,[223,977,321],{"class":229},[223,979,981,984,987,989,991],{"class":225,"line":980},21,[223,982,983],{"class":229},"context.",[223,985,986],{"class":236},"set",[223,988,803],{"class":229},[223,990,806],{"class":375},[223,992,993],{"class":229},", buffer);\n",[223,995,997],{"class":225,"line":996},22,[223,998,833],{"emptyLinePlaceholder":832},[223,1000,1002],{"class":225,"line":1001},23,[223,1003,1004],{"class":250},"\u002F\u002F Initialize alert message\n",[223,1006,1008,1011,1014,1016,1019],{"class":225,"line":1007},24,[223,1009,1010],{"class":787},"let",[223,1012,1013],{"class":229}," alertMessage ",[223,1015,854],{"class":787},[223,1017,1018],{"class":375}," \"✓ Process Stable\"",[223,1020,860],{"class":229},[223,1022,1024],{"class":225,"line":1023},25,[223,1025,833],{"emptyLinePlaceholder":832},[223,1027,1029],{"class":225,"line":1028},26,[223,1030,1031],{"class":250},"\u002F\u002F Check rules if we have enough data\n",[223,1033,1035,1037,1039,1041,1044,1047],{"class":225,"line":1034},27,[223,1036,843],{"class":787},[223,1038,948],{"class":229},[223,1040,951],{"class":243},[223,1042,1043],{"class":787}," >=",[223,1045,1046],{"class":243}," 7",[223,1048,960],{"class":229},[223,1050,1052,1055,1058,1060,1063,1066,1068,1071,1074],{"class":225,"line":1051},28,[223,1053,1054],{"class":787},"    const",[223,1056,1057],{"class":243}," recent",[223,1059,794],{"class":787},[223,1061,1062],{"class":229}," buffer.",[223,1064,1065],{"class":236},"slice",[223,1067,803],{"class":229},[223,1069,1070],{"class":787},"-",[223,1072,1073],{"class":243},"7",[223,1075,1076],{"class":229},");\n",[223,1078,1080,1082,1085,1087,1090,1093,1095,1099,1102],{"class":225,"line":1079},29,[223,1081,1054],{"class":787},[223,1083,1084],{"class":243}," values",[223,1086,794],{"class":787},[223,1088,1089],{"class":229}," recent.",[223,1091,1092],{"class":236},"map",[223,1094,803],{"class":229},[223,1096,1098],{"class":1097},"s4XuR","r",[223,1100,1101],{"class":787}," =>",[223,1103,1104],{"class":229}," r.value);\n",[223,1106,1108],{"class":225,"line":1107},30,[223,1109,833],{"emptyLinePlaceholder":832},[223,1111,1113],{"class":225,"line":1112},31,[223,1114,1115],{"class":250},"    \u002F\u002F Rule 2: Seven points on one side of the center line\n",[223,1117,1119,1121,1124,1126,1129,1132,1134,1137,1139,1142,1145],{"class":225,"line":1118},32,[223,1120,1054],{"class":787},[223,1122,1123],{"class":243}," allAbove",[223,1125,794],{"class":787},[223,1127,1128],{"class":229}," values.",[223,1130,1131],{"class":236},"every",[223,1133,803],{"class":229},[223,1135,1136],{"class":1097},"v",[223,1138,1101],{"class":787},[223,1140,1141],{"class":229}," v ",[223,1143,1144],{"class":787},">",[223,1146,1147],{"class":229}," current.avg);\n",[223,1149,1151,1153,1156,1158,1160,1162,1164,1166,1168,1170,1173],{"class":225,"line":1150},33,[223,1152,1054],{"class":787},[223,1154,1155],{"class":243}," allBelow",[223,1157,794],{"class":787},[223,1159,1128],{"class":229},[223,1161,1131],{"class":236},[223,1163,803],{"class":229},[223,1165,1136],{"class":1097},[223,1167,1101],{"class":787},[223,1169,1141],{"class":229},[223,1171,1172],{"class":787},"\u003C",[223,1174,1147],{"class":229},[223,1176,1178,1181,1184,1186],{"class":225,"line":1177},34,[223,1179,1180],{"class":787},"    if",[223,1182,1183],{"class":229}," (allAbove ",[223,1185,812],{"class":787},[223,1187,1188],{"class":229}," allBelow) {\n",[223,1190,1192,1195,1197,1200],{"class":225,"line":1191},35,[223,1193,1194],{"class":229},"        alertMessage ",[223,1196,854],{"class":787},[223,1198,1199],{"class":375}," \"⚠️ Process shift detected – 7 points on one side of center\"",[223,1201,860],{"class":229},[223,1203,1205],{"class":225,"line":1204},36,[223,1206,1207],{"class":229},"    }\n",[223,1209,1211],{"class":225,"line":1210},37,[223,1212,833],{"emptyLinePlaceholder":832},[223,1214,1216],{"class":225,"line":1215},38,[223,1217,1218],{"class":250},"    \u002F\u002F Rule 3: Seven points trending up or down\n",[223,1220,1222,1225,1228,1230,1233],{"class":225,"line":1221},39,[223,1223,1224],{"class":787},"    let",[223,1226,1227],{"class":229}," trending ",[223,1229,854],{"class":787},[223,1231,1232],{"class":243}," true",[223,1234,860],{"class":229},[223,1236,1238,1240,1243,1245,1248,1251,1254,1256,1258,1261],{"class":225,"line":1237},40,[223,1239,1054],{"class":787},[223,1241,1242],{"class":243}," increasing",[223,1244,794],{"class":787},[223,1246,1247],{"class":229}," values[",[223,1249,1250],{"class":243},"1",[223,1252,1253],{"class":229},"] ",[223,1255,1144],{"class":787},[223,1257,1247],{"class":229},[223,1259,1260],{"class":243},"0",[223,1262,1263],{"class":229},"];\n",[223,1265,1267,1270,1273,1275,1278,1280,1283,1286,1288,1290,1292,1295,1298],{"class":225,"line":1266},41,[223,1268,1269],{"class":787},"    for",[223,1271,1272],{"class":229}," (",[223,1274,1010],{"class":787},[223,1276,1277],{"class":229}," i ",[223,1279,854],{"class":787},[223,1281,1282],{"class":243}," 2",[223,1284,1285],{"class":229},"; i ",[223,1287,1172],{"class":787},[223,1289,1128],{"class":229},[223,1291,951],{"class":243},[223,1293,1294],{"class":229},"; i",[223,1296,1297],{"class":787},"++",[223,1299,960],{"class":229},[223,1301,1303,1306,1309,1312,1315,1318,1321,1323,1326,1329],{"class":225,"line":1302},42,[223,1304,1305],{"class":787},"        if",[223,1307,1308],{"class":229}," ((increasing ",[223,1310,1311],{"class":787},"&&",[223,1313,1314],{"class":229}," values[i] ",[223,1316,1317],{"class":787},"\u003C=",[223,1319,1320],{"class":229}," values[i ",[223,1322,1070],{"class":787},[223,1324,1325],{"class":243}," 1",[223,1327,1328],{"class":229},"]) ",[223,1330,1331],{"class":787},"||\n",[223,1333,1335,1338,1341,1344,1346,1348,1351,1353,1355,1357],{"class":225,"line":1334},43,[223,1336,1337],{"class":229},"            (",[223,1339,1340],{"class":787},"!",[223,1342,1343],{"class":229},"increasing ",[223,1345,1311],{"class":787},[223,1347,1314],{"class":229},[223,1349,1350],{"class":787},">=",[223,1352,1320],{"class":229},[223,1354,1070],{"class":787},[223,1356,1325],{"class":243},[223,1358,1359],{"class":229},"])) {\n",[223,1361,1363,1366,1368,1371],{"class":225,"line":1362},44,[223,1364,1365],{"class":229},"            trending ",[223,1367,854],{"class":787},[223,1369,1370],{"class":243}," false",[223,1372,860],{"class":229},[223,1374,1376,1379],{"class":225,"line":1375},45,[223,1377,1378],{"class":787},"            break",[223,1380,860],{"class":229},[223,1382,1384],{"class":225,"line":1383},46,[223,1385,1386],{"class":229},"        }\n",[223,1388,1390],{"class":225,"line":1389},47,[223,1391,1207],{"class":229},[223,1393,1395,1397],{"class":225,"line":1394},48,[223,1396,1180],{"class":787},[223,1398,1399],{"class":229}," (trending) {\n",[223,1401,1403,1405,1407],{"class":225,"line":1402},49,[223,1404,1194],{"class":229},[223,1406,854],{"class":787},[223,1408,1409],{"class":229}," increasing\n",[223,1411,1413,1416],{"class":225,"line":1412},50,[223,1414,1415],{"class":787},"            ?",[223,1417,1418],{"class":375}," \"⚠️ Increasing trend – check for tool wear\"\n",[223,1420,1422,1425,1428],{"class":225,"line":1421},51,[223,1423,1424],{"class":787},"            :",[223,1426,1427],{"class":375}," \"⚠️ Decreasing trend – check material quality\"",[223,1429,860],{"class":229},[223,1431,1433],{"class":225,"line":1432},52,[223,1434,1207],{"class":229},[223,1436,1438],{"class":225,"line":1437},53,[223,1439,321],{"class":229},[223,1441,1443],{"class":225,"line":1442},54,[223,1444,833],{"emptyLinePlaceholder":832},[223,1446,1448,1451,1453],{"class":225,"line":1447},55,[223,1449,1450],{"class":229},"msg.payload ",[223,1452,854],{"class":787},[223,1454,1455],{"class":229}," alertMessage;\n",[223,1457,1459,1462],{"class":225,"line":1458},56,[223,1460,1461],{"class":787},"return",[223,1463,868],{"class":229},[10,1465,1466],{},"The following image demonstrates the advanced alerting system in action, detecting specific patterns beyond simple control limit violations:",[10,1468,1469,1473],{},[567,1470],{"alt":1471,"dataZoomable":219,"src":1472},"SPC system detecting process drift in real-time, showing chart responding to simulated measurement changes and triggering alerts","\u002Fblog\u002F2025\u002F07\u002Fimages\u002Fsimulated-drift-alert.gif",[572,1474,1475],{},"Real-time SPC monitoring detecting process drift and triggering appropriate alerts based on trend analysis",[23,1477,1479],{"id":1478},"connecting-to-real-equipment","Connecting to Real Equipment",[10,1481,1482],{},"Time to connect your actual machines. The approach depends on what equipment you have.",[10,1484,1485,1486,1489,1490,1493,1494,1498],{},"For modern PLCs - anything from the last decade like Siemens S7-1200\u002F1500, Allen-Bradley ControlLogix, or Omron NX - you'll use OPC UA. It's already built into these PLCs. Enable it in the configuration, install ",[121,1487,1488],{},"node-red-contrib-opcua"," from the FlowFuse palette, and point it at your PLC. The endpoint looks like ",[121,1491,1492],{},"opc.tcp:\u002F\u002F192.168.1.100:4840",". Browse for your measurement tags and connect them to your SPC flow. ",[80,1495,1497],{"href":1496},"\u002Fblog\u002F2025\u002F07\u002Freading-and-writing-plc-data-using-opc-ua\u002F","Full OPC UA guide here",".",[10,1500,1501,1502,1505,1506,1498],{},"Older equipment speaks Modbus TCP. Check your manual's appendix for the register map. Install ",[121,1503,1504],{},"node-red-contrib-modbus",", configure it with your device's IP address and the register holding your measurement (like 40001 for holding registers). Almost every industrial device from the last 30 years supports this. ",[80,1507,1509],{"href":1508},"\u002Fnode-red\u002Fprotocol\u002Fmodbus\u002F","Modbus tutorial here",[10,1511,1512,1513,1517],{},"For everything else, get creative. Old gauges with RS-232 ports work fine with a USB adapter and the serial node - ",[80,1514,1516],{"href":1515},"\u002Fblog\u002F2025\u002F07\u002Fconnect-legacy-equipment-serial-flowfuse\u002F","see our serial port guide",". Machines that dump CSV files can be monitored with the watch node. Manual measurements need just a simple dashboard form, one input field, one submit button. Don't overcomplicate it.",[10,1519,1520],{},"Before connecting to SPC, always test with inject → protocol node → debug to make sure data flows. Once you see measurements in the debug panel, wire it to your SPC node and you're monitoring real processes.",[23,1522,1524],{"id":1523},"the-money-you're-leaving-on-the-table","The Money You're Leaving on the Table",[10,1526,1527],{},"Remember that manufacturer from the forum processing 400,000 parts annually with a 4% scrap rate? That's 16,000 parts straight to the trash. At just $10 per part, that's $160,000 in annual waste. Cut that rate to 2% with SPC and you save $80,000 yearly.",[10,1529,1530],{},"But here's what most people miss - the $10 part cost is just the beginning. Consider what every defective part also burned through:",[116,1532,1533,1539,1545],{},[106,1534,1535,1538],{},[33,1536,1537],{},"Machine time",": Say 3 minutes at $200\u002Fhour = another $10 gone",[106,1540,1541,1544],{},[33,1542,1543],{},"Labor",": About 15 minutes handling the defect at $30\u002Fhour = $7.50 more",[106,1546,1547,1550],{},[33,1548,1549],{},"Materials",": The raw stock you'll never get back",[10,1552,1553],{},"That \"$10 part\" actually cost you around $27.50 to scrap. Those 16,000 defects? Try $440,000 in real losses.",[10,1555,1556],{},"SPC attacks all of this simultaneously. When your process stays in control, you're not just saving parts - you're saving machine capacity, labor hours, and materials. Plus stable processes need less inspection, letting you redeploy quality staff to improvement projects instead of firefighting.",[10,1558,1559,1562],{},[33,1560,1561],{},"Quick ROI calculation",": Take your annual defect count, multiply by your true cost per defect (part + machine + labor), then multiply by 0.5 for a conservative estimate. That's your yearly savings potential with SPC. Most manufacturers see payback in under 3 months.",[10,1564,1565],{},"SPC works. It's not magic, it's not complicated, and it doesn't have to be expensive. It's just math applied to manufacturing data in real-time.",[10,1567,1568],{},"The tools exist. Node-RED gets you started, but FlowFuse keeps you running in production. With built-in high availability, your SPC charts stay live even if a server fails. Multiple engineers can work on the same flows without conflicts. Deploy updates to 50 production lines with one click. When downtime costs thousands per hour, you need a platform built for manufacturing.",[23,1570,1572],{"id":1571},"start-preventing-defects-today","Start Preventing Defects Today",[10,1574,1575],{},"Every day without SPC is money left on the table. Those 16,000 scrapped parts per year? The warranty claims from undetected drift? All preventable.",[10,1577,1578],{},"Here's your path to production-ready SPC:",[103,1580,1581,1590,1596,1602],{},[106,1582,1583,1589],{},[33,1584,1585],{},[80,1586,1588],{"href":82,"rel":1587},[84],"Start Free with FlowFuse"," - Get your instance running in minutes",[106,1591,1592,1595],{},[33,1593,1594],{},"Follow this tutorial"," - Build your first SPC chart today",[106,1597,1598,1601],{},[33,1599,1600],{},"Connect one machine"," - Start with your most critical measurement",[106,1603,1604,1607],{},[33,1605,1606],{},"Expand gradually"," - Add more parameters as you prove value",[10,1609,1610,1611,1615,1616,1620],{},"Don't wait for the perfect plan. Don't form another committee. Pick one measurement that matters and start monitoring it today. Need help getting started? ",[80,1612,1614],{"href":1613},"\u002Fbook-demo\u002F","Book a demo"," to discuss your specific requirements or ",[80,1617,1619],{"href":1618},"\u002Fcontact-us\u002F","contact our team"," for enterprise deployment guidance.",[10,1622,1623],{},"Because somewhere right now, one of your machines is drifting out of spec. The only question is whether you'll catch it in time.",[10,1625,1626],{},[33,1627,1628],{},[80,1629,1631],{"href":82,"rel":1630},[84],"Build Your First SPC Dashboard Now →",[23,1633,1635],{"id":1634},"references","References",[103,1637,1638,1646,1654,1662,1670],{},[106,1639,1640,1645],{},[80,1641,1644],{"href":1642,"rel":1643},"https:\u002F\u002Fwww.sixsigmaonline.org\u002Fsix-sigma-statistical-process-control\u002F",[84],"Six Sigma Online - Statistical Process Control"," - Background on manufacturers saving thousands with quality control methods",[106,1647,1648,1653],{},[80,1649,1652],{"href":1650,"rel":1651},"https:\u002F\u002Fwww.practicalmachinist.com\u002Fforum\u002Fthreads\u002Fscrap-rates.234251\u002F",[84],"Practical Machinist Forum - Scrap Rates Discussion"," - Real manufacturer example: 400,000 parts\u002Fyear with 4% scrap rate",[106,1655,1656,1661],{},[80,1657,1660],{"href":1658,"rel":1659},"https:\u002F\u002Fservicechannel.com\u002Freports\u002Fscrap-rate\u002F",[84],"ServiceChannel - Industry Scrap Rate Report"," - Industry data confirming 4-5% scrap rates are standard",[106,1663,1664,1669],{},[80,1665,1668],{"href":1666,"rel":1667},"https:\u002F\u002Fwww.itl.nist.gov\u002Fdiv898\u002Fhandbook\u002Fpmc\u002Fsection1\u002Fpmc12.htm",[84],"NIST Engineering Statistics Handbook - Statistical Process Control"," - Official definition and explanation of SPC principles",[106,1671,1672,1677],{},[80,1673,1676],{"href":1674,"rel":1675},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWalter_A._Shewhart",[84],"Walter Shewhart - Wikipedia"," - SPC creator at Bell Labs in the 1920s",[1679,1680,1681],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":219,"searchDepth":233,"depth":233,"links":1683},[1684,1685,1695,1696,1697,1698,1699],{"id":25,"depth":233,"text":26},{"id":71,"depth":233,"text":72,"children":1686},[1687,1688,1689,1690,1691,1692,1693,1694],{"id":90,"depth":254,"text":91},{"id":97,"depth":254,"text":98},{"id":136,"depth":254,"text":137},{"id":177,"depth":254,"text":178},{"id":324,"depth":254,"text":325},{"id":502,"depth":254,"text":503},{"id":577,"depth":254,"text":578},{"id":633,"depth":254,"text":634},{"id":728,"depth":233,"text":729},{"id":1478,"depth":233,"text":1479},{"id":1523,"depth":233,"text":1524},{"id":1571,"depth":233,"text":1572},{"id":1634,"depth":233,"text":1635},"md",{"navTitle":5,"excerpt":1702},{"type":7,"value":1703},[1704],[10,1705,12],{},"\u002Fblog\u002F2025\u002F07\u002Fquality-control-automation-spc-charts",{"title":5,"description":12},"blog\u002F2025\u002F07\u002Fquality-control-automation-spc-charts","hVPiqZDetbn52z-efh0paoeLoX8j8G1njxdQeSDtf_U",1780132428064]