<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>공압실린더 &#8211; MyEngNote</title>
	<atom:link href="https://myengnote.com/tag/%ea%b3%b5%ec%95%95%ec%8b%a4%eb%a6%b0%eb%8d%94/feed/" rel="self" type="application/rss+xml" />
	<link>https://myengnote.com</link>
	<description></description>
	<lastBuildDate>Wed, 08 Jul 2026 04:42:18 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>
	<item>
		<title>공압 실린더 계산기 &#038; 시뮬레이터</title>
		<link>https://myengnote.com/pneumatic-cylinder-air-consumption-force-calculator/</link>
					<comments>https://myengnote.com/pneumatic-cylinder-air-consumption-force-calculator/#respond</comments>
		
		<dc:creator><![CDATA[동동]]></dc:creator>
		<pubDate>Sun, 21 Jun 2026 23:26:31 +0000</pubDate>
				<category><![CDATA[공학계산기]]></category>
		<category><![CDATA[공기소모량]]></category>
		<category><![CDATA[공압실린더]]></category>
		<category><![CDATA[공압추력]]></category>
		<category><![CDATA[공장자동화]]></category>
		<category><![CDATA[피스톤속도]]></category>
		<guid isPermaLink="false">https://myengnote.com/pneumatic-cylinder-air-consumption-force-calculator/</guid>

					<description><![CDATA[실린더 보어 내경, 로드경, 작동 스트로크, 제어 압력 및 분당 작동 주기를 입력하여 실린더 추력(N)과 에어 소모량(NL/min)을 실시간 해석하는 공장 자동화 설계용 물리 시뮬레이터입니다.]]></description>
										<content:encoded><![CDATA[
<h2 style="font-size: 1.6em; font-weight: 800; color: #0c0e25; border-bottom: 2px solid #00f2fe; padding-bottom: 8px; margin-bottom: 20px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 공압 실린더 계산기 &#038; 시뮬레이터</h2>


<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&#038;family=Outfit:wght@400;500;600;700;800&#038;display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
/* Scoped & Isolated Styles for pneumatic-cylinder-wrapper */
        /* Modern Reset and Design Tokens */
        .pneumatic-cylinder-wrapper *, .pneumatic-cylinder-wrapper *::before, .pneumatic-cylinder-wrapper *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .pneumatic-cylinder-wrapper {
            --color-bg-dark: #f8f9fd;
            --color-bg-deep: #ffffff;
            --color-panel-bg: rgba(255, 255, 255, 0.85);
            --color-border: rgba(0, 0, 0, 0.06);
            --color-border-hover: rgba(0, 0, 0, 0.12);
            --color-text-main: #1e293b;
            --color-text-muted: #475569;
            --color-text-dark: #94a3b8;
            --color-cyan: #0284c7;
            --color-cyan-glow: rgba(2, 132, 199, 0.15);
            --color-magenta: #db2777;
            --color-magenta-glow: rgba(219, 39, 119, 0.15);
            --color-purple: #7c3aed;
            --color-purple-glow: rgba(124, 58, 237, 0.12);
            --color-success: #10b981;
            --color-warning: #f59e0b;
            --gradient-primary: linear-gradient(135deg, var(--color-cyan) 0%, var(--color-purple) 100%);
            --gradient-accent: linear-gradient(135deg, var(--color-magenta) 0%, var(--color-purple) 100%);
            --gradient-panel: linear-gradient(180deg, rgba(255, 255, 255, 0.9) 0%, rgba(248, 250, 252, 0.95) 100%);
            --font-heading: 'Outfit', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
            --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
            --shadow-neon-cyan: 0 0 15px var(--color-cyan-glow);
            --shadow-neon-magenta: 0 0 15px var(--color-magenta-glow);
            --shadow-card: 0 8px 32px 0 rgba(15, 23, 42, 0.05);
            --blur-glass: blur(16px);
        }
        .pneumatic-cylinder-wrapper {
            background-color: var(--color-bg-dark);
            color: var(--color-text-main);
            font-family: var(--font-body);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            overflow-x: hidden;
            position: relative;
        }
        .app-background-glow {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: -1;
            overflow: hidden;
            pointer-events: none;
        }
        .app-background-glow::before, 
        .app-background-glow::after {
            content: '';
            position: absolute;
            width: 600px;
            height: 600px;
            border-radius: 50%;
            filter: blur(140px);
            opacity: 0.15;
        }
        .app-background-glow::before {
            background: var(--color-cyan);
            top: -10%;
            right: -5%;
            animation: pulse-slow 15s infinite alternate;
        }
        .app-background-glow::after {
            background: var(--color-purple);
            bottom: -10%;
            left: -5%;
            animation: pulse-slow 20s infinite alternate-reverse;
        }
        @keyframes pulse-slow {
            0% { transform: scale(1) translate(0, 0); opacity: 0.12; }
            100% { transform: scale(1.2) translate(50px, 50px); opacity: 0.22; }
        }
        .app-container {
            width: 100%;
            max-width: 1440px;
            padding: 24px;
            display: flex;
            flex-direction: column;
            gap: 24px;
        }
        .app-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 20px 24px;
            background: var(--color-panel-bg);
            backdrop-filter: var(--blur-glass);
            border: 1px solid var(--color-border);
            border-radius: 16px;
            box-shadow: var(--shadow-card);
        }
        .logo-area {
            display: flex;
            align-items: center;
            gap: 16px;
        }
        .logo-icon {
            font-size: 32px;
            background: linear-gradient(135deg, var(--color-cyan), var(--color-purple));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .logo-area h1 {
            font-family: var(--font-heading);
            font-weight: 800;
            font-size: 24px;
            letter-spacing: 1px;
            background: linear-gradient(90deg, var(--color-text-main), var(--color-text-muted));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .logo-area .subtitle {
            font-size: 12px;
            color: var(--color-text-muted);
            font-weight: 500;
            letter-spacing: 0.5px;
        }
        .header-badge {
            display: flex;
            align-items: center;
            gap: 10px;
            background: rgba(16, 185, 129, 0.1);
            border: 1px solid rgba(16, 185, 129, 0.2);
            padding: 6px 14px;
            border-radius: 20px;
        }
        .pulse-dot {
            width: 8px;
            height: 8px;
            background-color: var(--color-success);
            border-radius: 50%;
            box-shadow: 0 0 10px var(--color-success);
            animation: pulse-dot-anim 1.5s infinite;
        }
        @keyframes pulse-dot-anim {
            0% { transform: scale(0.9); opacity: 0.6; }
            50% { transform: scale(1.2); opacity: 1; }
            100% { transform: scale(0.9); opacity: 0.6; }
        }
        .badge-text {
            font-size: 11px;
            font-weight: 600;
            color: var(--color-success);
            letter-spacing: 0.5px;
        }
        .app-main-grid {
            display: grid;
            grid-template-columns: 340px 1fr 340px;
            gap: 24px;
            align-items: start;
        }
        .panel {
            background: var(--gradient-panel);
            backdrop-filter: var(--blur-glass);
            border: 1px solid var(--color-border);
            border-radius: 20px;
            padding: 24px;
            box-shadow: var(--shadow-card);
            display: flex;
            flex-direction: column;
            gap: 20px;
            transition: border-color 0.3s ease, box-shadow 0.3s ease;
        }
        .panel:hover {
            border-color: var(--color-border-hover);
        }
        .panel-header {
            display: flex;
            align-items: center;
            gap: 12px;
            border-bottom: 1px solid var(--color-border);
            padding-bottom: 14px;
        }
        .panel-header i {
            font-size: 18px;
        }
        .panel-header h2 {
            font-family: var(--font-heading);
            font-size: 18px;
            font-weight: 600;
            letter-spacing: 0.5px;
        }
        .text-cyan { color: var(--color-cyan); }
        .text-magenta { color: var(--color-magenta); }
        .text-purple { color: var(--color-purple); }
        .control-panel {
            grid-column: 1;
        }
        .input-group {
            display: flex;
            flex-direction: column;
            gap: 8px;
        }
        .input-label-row {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .input-label-row label {
            font-size: 13px;
            font-weight: 600;
            color: var(--color-text-main);
            display: flex;
            align-items: center;
            gap: 8px;
        }
        .helper-text {
            font-size: 10px;
            color: var(--color-text-muted);
            font-weight: 500;
        }
                .number-input-wrapper {
            display: flex;
            position: relative;
            border-radius: 8px;
            overflow: hidden;
            border: 1px solid var(--color-border);
            background: #ffffff;
            transition: all 0.2s ease;
        }
        .number-input-wrapper:focus-within {
            border-color: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
        .number-input-wrapper:focus-within {
            border-color: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
                .custom-number-input {
            flex: 1;
            width: 0;
            min-width: 0;
            background: #f8fafc !important;
            border: none !important;
            outline: none !important;
            color: #0f172a !important;
            padding: 10px 14px !important;
            font-family: var(--font-body) !important;
            font-size: 15px !important;
            font-weight: 700 !important;
            text-align: right !important;
            box-shadow: none !important;
            -webkit-appearance: none !important;
            -moz-appearance: textfield !important;
        }
        .custom-number-input::-webkit-outer-spin-button,
        .custom-number-input::-webkit-inner-spin-button {
            -webkit-appearance: none;
            margin: 0;
        }
        .custom-number-input::-webkit-outer-spin-button,
        .custom-number-input::-webkit-inner-spin-button {
            -webkit-appearance: none;
            margin: 0;
        }
                .unit-badge {
            background: rgba(0, 0, 0, 0.03);
            color: var(--color-text-muted);
            font-size: 11px;
            font-weight: 700;
            padding: 0 14px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-left: 1px solid var(--color-border);
            pointer-events: none;
            flex-shrink: 0;
        }
        .custom-slider {
            -webkit-appearance: none;
            width: 100%;
            height: 6px;
            border-radius: 3px;
            background: rgba(0, 0, 0, 0.05);
            outline: none;
            margin: 8px 0;
            transition: background 0.2s ease;
        }
        .custom-slider::-webkit-slider-thumb {
            -webkit-appearance: none;
            appearance: none;
            width: 18px;
            height: 18px;
            border-radius: 50%;
            cursor: pointer;
            transition: transform 0.1s ease, box-shadow 0.2s ease;
        }
        #slider-d::-webkit-slider-thumb {
            background: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan);
        }
        #slider-d::-webkit-slider-thumb:hover { transform: scale(1.2); }
        #slider-rod::-webkit-slider-thumb {
            background: var(--color-purple);
            box-shadow: 0 0 10px var(--color-purple);
        }
        #slider-rod::-webkit-slider-thumb:hover { transform: scale(1.2); }
        #slider-stroke::-webkit-slider-thumb {
            background: var(--color-success);
            box-shadow: 0 0 10px var(--color-success);
        }
        #slider-stroke::-webkit-slider-thumb:hover { transform: scale(1.2); }
        #slider-p::-webkit-slider-thumb {
            background: var(--color-magenta);
            box-shadow: 0 0 10px var(--color-magenta);
        }
        #slider-p::-webkit-slider-thumb:hover { transform: scale(1.2); }
        #slider-cycle::-webkit-slider-thumb {
            background: var(--color-warning);
            box-shadow: 0 0 10px var(--color-warning);
        }
        #slider-cycle::-webkit-slider-thumb:hover { transform: scale(1.2); }
        .presets-section {
            display: flex;
            flex-direction: column;
            gap: 12px;
            border-top: 1px solid var(--color-border);
            padding-top: 18px;
        }
        .presets-section h3 {
            font-size: 13px;
            font-weight: 700;
            color: var(--color-text-main);
            display: flex;
            align-items: center;
            gap: 8px;
        }
        .presets-grid {
            display: grid;
            grid-template-columns: 1fr;
            gap: 8px;
        }
        .preset-btn {
            background: rgba(0, 0, 0, 0.015);
            border: 1px solid var(--color-border);
            border-radius: 10px;
            padding: 10px 12px;
            cursor: pointer;
            color: var(--color-text-main);
            display: flex;
            align-items: center;
            gap: 12px;
            text-align: left;
            transition: all 0.2s ease;
        }
        .preset-btn:hover {
            background: rgba(0, 0, 0, 0.04);
            transform: translateX(4px);
        }
        .preset-btn.active {
            background: linear-gradient(90deg, var(--color-cyan-glow), var(--color-purple-glow));
            border-color: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
        .preset-icon {
            width: 28px;
            height: 28px;
            background: rgba(0, 0, 0, 0.02);
            border-radius: 8px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 12px;
            color: var(--color-cyan);
        }
        .preset-btn:hover .preset-icon, .preset-btn.active .preset-icon {
            background: var(--gradient-primary);
            color: #fff;
        }
        .preset-details {
            display: flex;
            flex-direction: column;
            gap: 2px;
        }
        .preset-name {
            font-size: 13px;
            font-weight: 600;
            color: var(--color-text-main);
        }
        .preset-spec {
            font-size: 11px;
            color: var(--color-text-muted);
            font-weight: 500;
        }
        .simulation-panel {
            grid-column: 2;
            align-self: start;
            justify-content: flex-start;
        }
        .simulation-panel .panel-header {
            justify-content: space-between;
        }
        .canvas-scale-indicator {
            font-size: 11px;
            color: var(--color-text-muted);
            background: rgba(0, 0, 0, 0.02);
            padding: 4px 10px;
            border-radius: 6px;
            border: 1px solid var(--color-border);
        }
        .canvas-wrapper {
            position: relative;
            width: 100%;
            background: radial-gradient(circle at center, #ffffff 0%, #f1f5f9 100%);
            border: 1px solid rgba(0, 0, 0, 0.06);
            border-radius: 16px;
            overflow: hidden;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        #physics-canvas {
            display: block;
            width: 100%;
            height: auto;
            aspect-ratio: 16 / 10;
        }
        .simulation-metrics-strip {
            display: flex;
            background: rgba(0, 0, 0, 0.01);
            border: 1px solid var(--color-border);
            border-radius: 12px;
            padding: 12px 20px;
            justify-content: space-around;
            align-items: center;
            gap: 10px;
            margin-top: 10px;
        }
        .mini-metric {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 4px;
            text-align: center;
        }
        .mini-metric .label {
            font-size: 10px;
            font-weight: 600;
            color: var(--color-text-muted);
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
        .mini-metric .value {
            font-size: 14px;
            font-weight: 700;
            color: var(--color-text-main);
            font-family: var(--font-heading);
        }
        .mini-divider {
            width: 1px;
            height: 24px;
            background: rgba(0, 0, 0, 0.03);
        }
        .air-readout-box {
            background: linear-gradient(135deg, rgba(2, 132, 199, 0.08) 0%, rgba(138, 43, 226, 0.03) 100%);
            border: 1px solid rgba(2, 132, 199, 0.25);
            border-radius: 16px;
            padding: 20px;
            text-align: center;
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 6px;
            box-shadow: 0 0 15px rgba(2, 132, 199, 0.05);
        }
        .air-title {
            font-size: 11px;
            font-weight: 700;
            color: var(--color-cyan);
            letter-spacing: 1px;
            text-transform: uppercase;
        }
        .air-value {
            font-family: var(--font-heading);
            font-weight: 800;
            font-size: 26px;
            background: linear-gradient(90deg, var(--color-text-main), var(--color-cyan));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .air-type {
            font-size: 11px;
            font-weight: 600;
            color: var(--color-text-muted);
        }
        .results-grid {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }
        .result-card {
            background: rgba(255, 255, 255, 0.85);
            border: 1px solid var(--color-border);
            border-radius: 12px;
            padding: 12px 16px;
            display: flex;
            align-items: center;
            gap: 16px;
            transition: all 0.2s ease;
        }
        .result-card:hover {
            transform: translateY(-2px);
            border-color: rgba(2, 132, 199, 0.2);
            background: rgba(2, 132, 199, 0.03);
        }
        .card-icon {
            width: 38px;
            height: 38px;
            background: rgba(0, 0, 0, 0.015);
            border: 1px solid var(--color-border);
            border-radius: 10px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 14px;
            color: var(--color-text-muted);
        }
        .card-content {
            display: flex;
            flex-direction: column;
            gap: 2px;
        }
        .card-unit {
            font-size: 11px;
            font-weight: 600;
            color: var(--color-text-muted);
        }
        .card-value {
            font-family: var(--font-heading);
            font-weight: 700;
            font-size: 17px;
            color: var(--color-text-main);
        }
        .formula-card {
            background: rgba(0, 0, 0, 0.01);
            border: 1px solid var(--color-border);
            border-radius: 12px;
            padding: 16px;
            display: flex;
            flex-direction: column;
            gap: 8px;
            font-size: 12px;
        }
        .formula-card h4 {
            font-weight: 700;
            color: var(--color-text-main);
        }
        .formula-equation {
            font-family: monospace;
            color: var(--color-cyan);
            font-size: 13px;
            background: #f8fafc;
            padding: 8px 10px;
            border-radius: 6px;
            border: 1px solid var(--color-border);
            text-align: center;
        }
        /* Container Query */
        @container pneumatic-container (max-width: 1100px) {
            .app-main-grid {
                grid-template-columns: 1fr 1fr;
                gap: 20px;
            }
            .control-panel {
                grid-column: 1;
            }
            .simulation-panel {
                grid-column: 2;
                align-self: start;
            }
            .results-panel {
                grid-column: 1 / span 2;
                display: grid;
                grid-template-columns: 1fr 1.2fr;
                gap: 20px;
            }
            .results-panel .panel-header {
                grid-column: 1 / span 2;
            }
            .air-readout-box {
                grid-column: 1;
                grid-row: 2;
            }
            .results-grid {
                grid-column: 2;
                grid-row: 2;
            }
        }
        @container pneumatic-container (max-width: 768px) {
            .app-main-grid {
                grid-template-columns: 1fr;
            }
            .control-panel, .simulation-panel, .results-panel {
                grid-column: 1;
            }
            .results-panel {
                display: flex;
                flex-direction: column;
                gap: 16px;
            }
            .air-readout-box, .results-grid {
                grid-column: auto;
                grid-row: auto;
            }
            .panel-header h2 {
                white-space: normal !important;
                font-size: 15px !important;
            }
            .app-header {
                flex-direction: column;
                gap: 16px;
                text-align: center;
            }
            .logo-area {
                flex-direction: column;
                gap: 8px;
            }
        }
/* ━━ WordPress 레이아웃 Override: 디자인 1 (2열 컴팩트 대칭 레이아웃) ━━ */
.pneumatic-cylinder-wrapper .app-main-grid,
.pneumatic-cylinder-wrapper .main-grid,
.pneumatic-cylinder-wrapper .sim-grid {
    display: grid !important;
    grid-template-columns: 340px 1fr !important;
    gap: 24px !important;
    align-items: start !important;
}
/* 3열 레이아웃을 2열 레이아웃으로 변경하는 특화 스타일 */
.pneumatic-cylinder-wrapper .right-column {
    display: flex !important;
    flex-direction: column !important;
    gap: 24px !important;
    min-width: 0 !important;
    grid-column: 2 !important;
}
.pneumatic-cylinder-wrapper .simulation-panel,
.pneumatic-cylinder-wrapper .canvas-panel,
.pneumatic-cylinder-wrapper .sim-panel {
    grid-column: auto !important;
    order: 1 !important;
    align-self: stretch !important;
}
.pneumatic-cylinder-wrapper .control-panel {
    grid-column: 1 !important;
}
/* 2열 통합 결과 분석 영역 레이아웃 */
.pneumatic-cylinder-wrapper .simulation-results-section {
    display: grid !important;
    grid-template-columns: 1.1fr 1.3fr !important;
    gap: 20px !important;
    border-top: 1px solid var(--color-border) !important;
    padding-top: 20px !important;
    margin-top: 10px !important;
    align-items: stretch !important;
}
/* Readout Box 스타일 */
.pneumatic-cylinder-wrapper .simulation-results-section .ratio-readout-box,
.pneumatic-cylinder-wrapper .simulation-results-section .re-readout-box,
.pneumatic-cylinder-wrapper .simulation-results-section .status-readout-box,
.pneumatic-cylinder-wrapper .simulation-results-section .flow-readout-box,
.pneumatic-cylinder-wrapper .simulation-results-section [class*="readout-box"],
.pneumatic-cylinder-wrapper .simulation-results-section .gauge-container {
    grid-column: 1 !important;
    grid-row: 1 !important;
    margin: 0 !important;
    height: auto !important;
    display: flex !important;
    flex-direction: column !important;
    justify-content: center !important;
}
.pneumatic-cylinder-wrapper .simulation-results-section .results-grid {
    grid-column: 2 !important;
    grid-row: 1 !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 12px !important;
    justify-content: flex-start !important;
}
.pneumatic-cylinder-wrapper .simulation-results-section .results-grid .result-card {
    flex: none !important;
    display: flex !important;
    align-items: center !important;
    min-height: 72px !important;
    height: auto !important;
    padding: 12px 16px !important;
}
.pneumatic-cylinder-wrapper .simulation-results-section .formula-card {
    grid-column: 1 / span 2 !important;
    grid-row: 2 !important;
}
/* 모바일/반응형 (800px 이하) ── 항상 세로형(1열) 정렬 및 시뮬레이터 캔버스 최상단 배치 */
@media (max-width: 800px) {
    .pneumatic-cylinder-wrapper .app-main-grid,
    .pneumatic-cylinder-wrapper .main-grid,
    .pneumatic-cylinder-wrapper .sim-grid {
        grid-template-columns: 1fr !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .pneumatic-cylinder-wrapper .control-panel {
        order: 2 !important;
        width: 100% !important;
    }
    .pneumatic-cylinder-wrapper .right-column {
        order: 1 !important;
        width: 100% !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .pneumatic-cylinder-wrapper .simulation-panel,
    .pneumatic-cylinder-wrapper .canvas-panel,
    .pneumatic-cylinder-wrapper .sim-panel,
    .pneumatic-cylinder-wrapper .canvas-section {
        order: -1 !important;
    }
    .pneumatic-cylinder-wrapper .simulation-results-section {
        grid-template-columns: 1fr !important;
    }
    .pneumatic-cylinder-wrapper .simulation-results-section .ratio-readout-box,
    .pneumatic-cylinder-wrapper .simulation-results-section .re-readout-box,
    .pneumatic-cylinder-wrapper .simulation-results-section .status-readout-box,
    .pneumatic-cylinder-wrapper .simulation-results-section .flow-readout-box,
    .pneumatic-cylinder-wrapper .simulation-results-section [class*="readout-box"],
    .pneumatic-cylinder-wrapper .simulation-results-section .gauge-container {
        grid-column: 1 !important;
        grid-row: auto !important;
        height: auto !important;
    }
    .pneumatic-cylinder-wrapper .simulation-results-section .results-grid {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
    .pneumatic-cylinder-wrapper .simulation-results-section .formula-card {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
}
.pneumatic-cylinder-wrapper .app-container,
.pneumatic-cylinder-wrapper .main-container {
    max-width: 100% !important;
    padding: 12px !important;
}
/* Premium Advice/Formula Card & Typography Overrides */
.pneumatic-cylinder-wrapper .simulation-results-section .formula-card,
.pneumatic-cylinder-wrapper .results-panel .formula-card {
    background: #ffffff !important;
    border: 1px solid var(--color-border) !important;
    border-radius: 12px !important;
    padding: 16px !important;
    box-shadow: var(--shadow-card) !important;
    transition: all 0.2s ease !important;
    display: flex !important;
    flex-direction: column !important;
    justify-content: center !important;
    gap: 8px !important;
}
.pneumatic-cylinder-wrapper .simulation-results-section .formula-card h4,
.pneumatic-cylinder-wrapper .results-panel .formula-card h4 {
    font-size: 14px !important;
    font-weight: 700 !important;
    color: var(--color-text-main) !important;
    margin-top: 0 !important;
    margin-bottom: 4px !important;
    word-break: keep-all !important;
    line-height: 1.4 !important;
    display: flex !important;
    align-items: center !important;
    gap: 8px !important;
}
.pneumatic-cylinder-wrapper .formula-equation {
    font-family: 'Outfit', 'Cambria Math', 'Times New Roman', monospace !important;
    white-space: nowrap !important;
    overflow-x: auto !important;
    word-break: keep-all !important;
    text-align: center !important;
}
.pneumatic-cylinder-wrapper #text-judgment {
    font-size: 12px !important;
    font-weight: 500 !important;
    color: var(--color-text-muted) !important;
    line-height: 1.6 !important;
    word-break: keep-all !important;
}
</style>
<div class="pneumatic-cylinder-wrapper" style="position: relative; width: 100%; box-sizing: border-box; overflow: hidden; margin: 30px auto; border-radius: 20px;">
    <div class="app-background-glow" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; pointer-events: none; overflow: hidden;"></div>
    <div style="position: relative; z-index: 2; width: 100%;">
    <div class="app-container">
        <header class="app-header">
            <div class="logo-area">
                <div class="logo-icon"><i class="fa-solid fa-wind"></i></div>
                <div>
                    <h1>PNEUMATIC CYLINDER</h1>
                    <div class="subtitle">공압 실린더 대기압 환산 에어 소모량 &#038; 추력 계산기</div>
                </div>
            </div>
            <div class="header-badge">
                <div class="pulse-dot"></div>
                <span class="badge-text">PNEUMATIC POWER</span>
            </div>
        </header>
        <div class="app-main-grid">
            <!-- Controls -->
            <div class="panel control-panel">
                <div class="panel-header text-cyan">
                    <i class="fa-solid fa-sliders"></i>
                    <h2>실린더 변수 및 공기 상태</h2>
                </div>
                <!-- Bore D -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-d"><i class="fa-solid fa-circle-dot text-cyan"></i> 실린더 보어 내경 (D)</label>
                        <span class="helper-text">범위: 12 ~ 125 mm</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-d" class="custom-number-input" min="12" max="125" value="50">
                        <span class="unit-badge">mm</span>
                    </div>
                    <input type="range" id="slider-d" class="custom-slider" min="12" max="125" value="50">
                </div>
                <!-- Rod d -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-rod"><i class="fa-solid fa-circle text-purple"></i> 피스톤 로드 지름 (d)</label>
                        <span class="helper-text">범위: 4 ~ 40 mm</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-rod" class="custom-number-input" min="4" max="40" value="20">
                        <span class="unit-badge">mm</span>
                    </div>
                    <input type="range" id="slider-rod" class="custom-slider" min="4" max="40" value="20">
                </div>
                <!-- Stroke S -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-stroke"><i class="fa-solid fa-arrows-left-right text-success"></i> 행정 스트로크 (S)</label>
                        <span class="helper-text">범위: 50 ~ 1000 mm</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-stroke" class="custom-number-input" min="50" max="1000" value="300">
                        <span class="unit-badge">mm</span>
                    </div>
                    <input type="range" id="slider-stroke" class="custom-slider" min="50" max="1000" value="300">
                </div>
                <!-- Pressure P -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-p"><i class="fa-solid fa-compress text-magenta"></i> 공급 공기 압력 (P)</label>
                        <span class="helper-text">범위: 1.0 ~ 10.0 bar</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-p" class="custom-number-input" min="1.0" max="10.0" step="0.1" value="6.0">
                        <span class="unit-badge">bar</span>
                    </div>
                    <input type="range" id="slider-p" class="custom-slider" min="10" max="100" value="60">
                </div>
                <!-- Cycle Speed N -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-cycle"><i class="fa-solid fa-arrow-rotate-right text-warning"></i> 분당 작동 주기 (N)</label>
                        <span class="helper-text">범위: 5 ~ 60 cycles/min</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-cycle" class="custom-number-input" min="5" max="60" value="20">
                        <span class="unit-badge">cycles/min</span>
                    </div>
                    <input type="range" id="slider-cycle" class="custom-slider" min="5" max="60" value="20">
                </div>
                <!-- Presets -->
                <div class="presets-section">
                    <h3><i class="fa-solid fa-network-wired"></i> 기구 설계 프리셋</h3>
                    <div class="presets-grid">
                        <button class="preset-btn" data-preset="clamp">
                            <div class="preset-icon"><i class="fa-solid fa-paperclip"></i></div>
                            <div class="preset-details">
                                <span class="preset-name">미니 정밀 클램프</span>
                                <span class="preset-spec">20A / 8A, S100</span>
                            </div>
                        </button>
                        <button class="preset-btn" data-preset="pickplace">
                            <div class="preset-icon"><i class="fa-solid fa-hand-holding-hand"></i></div>
                            <div class="preset-details">
                                <span class="preset-name">표준 픽앤플레이스 실린더</span>
                                <span class="preset-spec">50A / 20A, S300</span>
                            </div>
                        </button>
                        <button class="preset-btn" data-preset="heavyLift">
                            <div class="preset-icon"><i class="fa-solid fa-angles-up"></i></div>
                            <div class="preset-details">
                                <span class="preset-name">고중량 수직 리프터</span>
                                <span class="preset-spec">100A / 32A, S500</span>
                            </div>
                        </button>
                    </div>
                </div>
            </div>
            <!-- Auto Injected Right Column wrapper for Design 1 -->
            <div class="right-column">
                <div class="panel simulation-panel">
                                <div class="panel-header text-purple">
                                    <div style="display: flex; align-items: center; gap: 12px;">
                                        <i class="fa-solid fa-display"></i>
                                        <h2>공압 구동 행정 및 압축공기 배기 가시화</h2>
                                    </div>
                                    <div class="canvas-scale-indicator" id="txt-canvas-scale">절대 압축비: 6.92배</div>
                                </div>
                                <div class="canvas-wrapper">
                                    <canvas id="physics-canvas" width="640" height="400"></canvas>
                                </div>
                                <div class="simulation-metrics-strip">
                                    <div class="mini-metric">
                                        <span class="label">1회 왕복당 필요 체적</span>
                                        <span class="value" id="mini-v-cycle">1.03 L</span>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <span class="label">전진 이론 추력</span>
                                        <span class="value" id="mini-f-ext">1,178 N</span>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <span class="label">후진 이론 추력</span>
                                        <span class="value" id="mini-f-ret">989 N</span>
                                    </div>
                                </div>
                            <div class="simulation-results-section">
                                <div class="air-readout-box">
                                    <span class="air-title">FREE AIR CONSUMPTION RATE</span>
                                    <span class="air-value" id="txt-air-flow">143.5 L/min <span>(ANR)</span></span>
                                    <span class="air-type" id="txt-air-type-label">대기압 환산(Standard) 소모 유량</span>
                                </div>
                                <div class="results-grid">
                                    <div class="result-card">
                                        <div class="card-icon text-cyan"><i class="fa-solid fa-circle-down"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">전진 가압 추력 (Extend Force)</span>
                                            <span class="card-value" id="txt-force-ext">1,178 N (120.1 kgf)</span>
                                        </div>
                                    </div>
                                    <div class="result-card">
                                        <div class="card-icon text-purple"><i class="fa-solid fa-circle-up"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">후진 수축 추력 (Retract Force)</span>
                                            <span class="card-value" id="txt-force-ret">989 N (100.8 kgf)</span>
                                        </div>
                                    </div>
                                </div>
                                <div class="formula-card">
                                        <h4><i class="fa-solid fa-circle-info text-cyan"></i> 대기압 환산 에어 소모 공식</h4>
                                        <div class="formula-equation">Q_free = V_cycle &times; CR &times; N</div>
                                        <p>
                                            * CR(압축비) = (P + 1.013)/1.013 로 압축 가압된 기체가 대기압 방출 시 팽창하는 부피를 반영합니다.
                                        </p>
                                    </div>
                            </div>
                </div>
            </div>
        </div>
        <!-- Disclaimer Footer -->
        <footer class="app-disclaimer" style="margin-top: 20px; padding: 12px 16px; background: rgba(0, 0, 0, 0.015); border: 1px solid var(--color-border); border-radius: 12px; font-size: 11px; color: var(--color-text-muted); line-height: 1.5; text-align: left; display: flex; gap: 10px; align-items: flex-start; clear: both;">
            <i class="fa-solid fa-circle-info" style="color: var(--color-cyan); font-size: 14px; margin-top: 2px; flex-shrink: 0;"></i>
            <span><strong>면책 조항 (Disclaimer):</strong> 본 시뮬레이터의 계산 결과는 교육 및 참고용으로만 제공되며, 실제 제품 설계나 제작 시에는 반드시 최신 공학 규격 및 공식 표준 설계 기준을 재확인하시기 바랍니다. 계산 값의 무결성을 보장하지 않으며, 이로 인해 발생하는 직접적/간접적 손해에 대해 제작자 및 본 블로그는 어떠한 책임을 지지 않습니다.</span>
        </footer>
</div>
    </div>
</div>
<script>
        (function() {
            // State
            const state = {
                d: 50,      // Bore mm
                rod: 20,    // Rod mm
                stroke: 300,// mm
                p: 6.0,     // bar
                cycle: 20,  // cycles/min
                strokePct: 0.1,
                direction: 1,
                lastTime: 0,
                exhaustBubbles: []
            };
            // DOM Elements
            const inputD = document.getElementById('input-d');
            const sliderD = document.getElementById('slider-d');
            const inputRod = document.getElementById('input-rod');
            const sliderRod = document.getElementById('slider-rod');
            const inputStroke = document.getElementById('input-stroke');
            const sliderStroke = document.getElementById('slider-stroke');
            const inputP = document.getElementById('input-p');
            const sliderP = document.getElementById('slider-p');
            const inputCycle = document.getElementById('input-cycle');
            const sliderCycle = document.getElementById('slider-cycle');
            const txtAirFlow = document.getElementById('txt-air-flow');
            const txtForceExt = document.getElementById('txt-force-ext');
            const txtForceRet = document.getElementById('txt-force-ret');
            const miniVCycle = document.getElementById('mini-v-cycle');
            const miniFExt = document.getElementById('mini-f-ext');
            const miniFRet = document.getElementById('mini-f-ret');
            const presetButtons = document.querySelectorAll('.preset-btn');
            const canvas = document.getElementById('physics-canvas');
            const ctx = canvas.getContext('2d');
            function getDPR() {
                return window.devicePixelRatio || 1;
            }
            function initCanvas() {
                const dpr = getDPR();
                const rect = canvas.getBoundingClientRect();
                canvas.width = rect.width * dpr;
                canvas.height = rect.height * dpr;
                ctx.scale(dpr, dpr);
            }
            window.addEventListener('resize', initCanvas);
            initCanvas();
            setTimeout(initCanvas, 300);
            // Clamp Rod <= Bore - 6
            function validateRodDiameter() {
                const maxAllowedRod = state.d - 6;
                if (state.rod > maxAllowedRod) {
                    state.rod = maxAllowedRod;
                    inputRod.value = state.rod;
                    sliderRod.value = state.rod;
                }
                sliderRod.max = maxAllowedRod;
            }
            // Sync
            function syncDFromSlider() {
                state.d = parseInt(sliderD.value);
                inputD.value = state.d;
                validateRodDiameter();
                clearPresets();
                updateCalculations();
            }
            function syncDFromInput() {
                let val = parseInt(inputD.value);
                if (isNaN(val)) { val = 50; }
                if (val < 12) { val = 12; }
                if (val > 125) { val = 125; }
                state.d = val;
                inputD.value = val;
                sliderD.value = val;
                validateRodDiameter();
                clearPresets();
                updateCalculations();
            }
            function syncRodFromSlider() {
                state.rod = parseInt(sliderRod.value);
                inputRod.value = state.rod;
                validateRodDiameter();
                clearPresets();
                updateCalculations();
            }
            function syncRodFromInput() {
                let val = parseInt(inputRod.value);
                if (isNaN(val)) { val = 20; }
                if (val < 4) { val = 4; }
                if (val > state.d - 6) { val = state.d - 6; }
                state.rod = val;
                inputRod.value = val;
                sliderRod.value = val;
                validateRodDiameter();
                clearPresets();
                updateCalculations();
            }
            function syncStrokeFromSlider() {
                state.stroke = parseInt(sliderStroke.value);
                inputStroke.value = state.stroke;
                clearPresets();
                updateCalculations();
            }
            function syncStrokeFromInput() {
                let val = parseInt(inputStroke.value);
                if (isNaN(val)) { val = 300; }
                if (val < 50) { val = 50; }
                if (val > 1000) { val = 1000; }
                state.stroke = val;
                inputStroke.value = val;
                sliderStroke.value = val;
                clearPresets();
                updateCalculations();
            }
            function syncPFromSlider() {
                state.p = parseFloat(sliderP.value) / 10;
                inputP.value = state.p.toFixed(1);
                clearPresets();
                updateCalculations();
            }
            function syncPFromInput() {
                let val = parseFloat(inputP.value);
                if (isNaN(val)) { val = 6.0; }
                if (val < 1.0) { val = 1.0; }
                if (val > 10.0) { val = 10.0; }
                state.p = val;
                inputP.value = val.toFixed(1);
                sliderP.value = Math.round(val * 10);
                clearPresets();
                updateCalculations();
            }
            function syncCycleFromSlider() {
                state.cycle = parseInt(sliderCycle.value);
                inputCycle.value = state.cycle;
                clearPresets();
                updateCalculations();
            }
            function syncCycleFromInput() {
                let val = parseInt(inputCycle.value);
                if (isNaN(val)) { val = 20; }
                if (val < 5) { val = 5; }
                if (val > 60) { val = 60; }
                state.cycle = val;
                inputCycle.value = val;
                sliderCycle.value = val;
                clearPresets();
                updateCalculations();
            }
            sliderD.addEventListener('input', syncDFromSlider);
            inputD.addEventListener('change', syncDFromInput);
            sliderRod.addEventListener('input', syncRodFromSlider);
            inputRod.addEventListener('change', syncRodFromInput);
            sliderStroke.addEventListener('input', syncStrokeFromSlider);
            inputStroke.addEventListener('change', syncStrokeFromInput);
            sliderP.addEventListener('input', syncPFromSlider);
            inputP.addEventListener('change', syncPFromInput);
            sliderCycle.addEventListener('input', syncCycleFromSlider);
            inputCycle.addEventListener('change', syncCycleFromInput);
            // Presets
            function loadPreset(presetKey) {
                clearPresets();
                presetButtons.forEach(function(btn) {
                    if (btn.dataset.preset === presetKey) {
                        btn.classList.add('active');
                    }
                });
                if (presetKey === 'clamp') {
                    state.d = 20;
                    state.rod = 8;
                    state.stroke = 100;
                    state.p = 5.0;
                    state.cycle = 30;
                } else if (presetKey === 'pickplace') {
                    state.d = 50;
                    state.rod = 20;
                    state.stroke = 300;
                    state.p = 6.0;
                    state.cycle = 20;
                } else if (presetKey === 'heavyLift') {
                    state.d = 100;
                    state.rod = 32;
                    state.stroke = 500;
                    state.p = 7.0;
                    state.cycle = 12;
                }
                inputD.value = state.d;
                sliderD.value = state.d;
                inputRod.value = state.rod;
                sliderRod.value = state.rod;
                inputStroke.value = state.stroke;
                sliderStroke.value = state.stroke;
                inputP.value = state.p.toFixed(1);
                sliderP.value = Math.round(state.p * 10);
                inputCycle.value = state.cycle;
                sliderCycle.value = state.cycle;
                validateRodDiameter();
                updateCalculations();
            }
            function clearPresets() {
                presetButtons.forEach(function(btn) {
                    btn.classList.remove('active');
                });
            }
            presetButtons.forEach(function(btn) {
                btn.addEventListener('click', function() {
                    loadPreset(btn.dataset.preset);
                });
            });
            // Calcs
            function updateCalculations() {
                const patm = 1.01325; // standard atm in bar
                const cr = (state.p + patm) / patm; // compression ratio
                const aPush = (Math.PI * Math.pow(state.d, 2)) / 4; // mm2
                const aPull = (Math.PI * (Math.pow(state.d, 2) - Math.pow(state.rod, 2))) / 4; // mm2
                // Thrust Force = P * A
                // 1 bar = 0.1 N/mm²
                const fPushN = state.p * 0.1 * aPush;
                const fPushKg = fPushN / 9.80665;
                txtForceExt.innerText = Math.round(fPushN).toLocaleString() + ' N (' + fPushKg.toFixed(1) + ' kgf)';
                miniFExt.innerText = Math.round(fPushN).toLocaleString() + ' N';
                const fPullN = state.p * 0.1 * aPull;
                const fPullKg = fPullN / 9.80665;
                txtForceRet.innerText = Math.round(fPullN).toLocaleString() + ' N (' + fPullKg.toFixed(1) + ' kgf)';
                miniFRet.innerText = Math.round(fPullN).toLocaleString() + ' N';
                // V_cycle in Liters = (A_push + A_pull) * S_mm / 1,000,000
                const strokeM = state.stroke / 1000;
                const vCycle = ((aPush + aPull) * strokeM) / 1000000; // cubic meters
                const vCycleL = vCycle * 1000; // Liters
                miniVCycle.innerText = vCycleL.toFixed(2) + ' L';
                // Q_free = V_cycle_liters * CR * N (L/min ANR)
                const qFree = vCycleL * cr * state.cycle;
                txtAirFlow.innerHTML = qFree.toFixed(1) + ' L/min <span style="display: block; font-size: 0.75em; opacity: 0.85; margin-top: 4px; -webkit-text-fill-color: var(--color-text-muted); color: var(--color-text-muted); background: none; -webkit-background-clip: initial;">(ANR)</span>';
                const txtCanvasScale = document.getElementById('txt-canvas-scale');
                if (txtCanvasScale) {
                    txtCanvasScale.innerText = `절대 압축비: ${cr.toFixed(2)}배 (Compress ratio)`;
                }
            }
            // Exhaust bubbles generator
            function ExhaustBubble(x, y, vx, vy) {
                this.x = x;
                this.y = y;
                this.vx = vx;
                this.vy = vy;
                this.life = 1.0;
                this.decay = 0.05 + Math.random() * 0.08;
                this.size = 1.5 + Math.random() * 2.5;
            }
            // Draw Pneumatic Cylinder Cycle
            function draw(currentTime) {
                requestAnimationFrame(draw);
                let dt = (currentTime - state.lastTime) / 1000;
                if (isNaN(dt)) { dt = 0.016; }
                if (dt < 0) { dt = 0.016; }
                if (dt > 0.1) { dt = 0.016; }
                state.lastTime = currentTime;
                const dpr = getDPR();
                const width = canvas.width / dpr;
                const height = canvas.height / dpr;
                const gridScale = Math.min(width / 640, height / 400);
                ctx.clearRect(0, 0, width, height);
                // Grid
                ctx.save();
                ctx.strokeStyle = 'rgba(2, 132, 199, 0.04)';
                ctx.lineWidth = 1;
                for (let x = 0; x < width; x += 30 * gridScale) {
                    ctx.beginPath();
                    ctx.moveTo(x, 0);
                    ctx.lineTo(x, height);
                    ctx.stroke();
                }
                for (let y = 0; y < height; y += 30 * gridScale) {
                    ctx.beginPath();
                    ctx.moveTo(0, y);
                    ctx.lineTo(width, y);
                    ctx.stroke();
                }
                ctx.restore();
                // Compute stroke cycle speeds based on cycle frequency N (cycles per minute)
                const cycleTime = 60 / state.cycle;
                const cycleSpeed = 2 / cycleTime; // travel per second
                // Redefine scale as 1 for local coordinate system
                const scale = 1;
                // Geometry mapping
                const cylH = 20 + ((state.d - 12) / 113) * 110;
                const rodH = 6 + ((state.rod - 4) / 36) * 54;
                const cylL = 140 + (state.stroke / 1000) * 260; // cylinder tube length
                const cylLeft = 100;
                const cy = height / 2;
                const cylTop = cy - cylH / 2;
                const cylBottom = cy + cylH / 2;
                // Piston left coord
                const pistonThick = 20;
                const maxTravel = cylL - pistonThick - 6;
                const pistonLeft = cylLeft + 3 + state.strokePct * maxTravel;
                const rodLength = maxTravel + 60;
                // Calculate max extended span for auto-zoom scaling
                const rodRight_max = (cylLeft + 3 + 0.95 * maxTravel) + pistonThick + rodLength;
                const xMin = cylLeft - 40; // Allow space for D dimension label
                const xMax = rodRight_max + 75; // Allow space for d dimension label
                const yMin = cylTop - 35; // Allow space for S dimension label
                const yMax = cylBottom + 35; // Allow space for ports/arrows/bubbles
                const W_draw = xMax - xMin;
                const H_draw = yMax - yMin;
                const padding = 20;
                const scaleX = (width - padding * 2) / W_draw;
                const scaleY = (height - padding * 2) / H_draw;
                const zoom = Math.min(scaleX, scaleY);
                const cx_draw = (xMin + xMax) / 2;
                const cy_draw = (yMin + yMax) / 2;
                const dx = width / 2 - cx_draw * zoom;
                const dy = height / 2 - cy_draw * zoom;
                ctx.save();
                ctx.translate(dx, dy);
                ctx.scale(zoom, zoom);
                if (state.direction === 1) {
                    state.strokePct += cycleSpeed * dt;
                    if (state.strokePct >= 0.95) {
                        state.strokePct = 0.95;
                        state.direction = -1;
                        // Spawn pop exhaust bubbles at right port
                        spawnExhaustAtPort(cylLeft + cylL - 27 * scale, cylBottom);
                    }
                } else {
                    state.strokePct -= cycleSpeed * dt;
                    if (state.strokePct <= 0.05) {
                        state.strokePct = 0.05;
                        state.direction = 1;
                        // Spawn pop exhaust bubbles at left port
                        spawnExhaustAtPort(cylLeft + 27 * scale, cylBottom);
                    }
                }
                // Active chamber lighting colors (Glowing sky-blue for compressed air)
                const airColor = 'rgba(2, 132, 199, 0.35)';
                const neutralColor = 'rgba(241, 245, 249, 0.15)';
                let leftChamber = neutralColor;
                let rightChamber = neutralColor;
                if (state.direction === 1) {
                    leftChamber = airColor;
                } else {
                    rightChamber = airColor;
                }
                // Helper spawn
                function spawnExhaustAtPort(px, py) {
                    for (let e = 0; e < 15; e++) {
                        const vx = (Math.random() - 0.5) * 12;
                        const vy = (0.5 + Math.random() * 3) * 15; // blow down
                        state.exhaustBubbles.push(new ExhaustBubble(px, py + 8 * scale, vx, vy));
                    }
                }
                // 1. Draw Left and Right Chambers
                ctx.save();
                ctx.fillStyle = leftChamber;
                ctx.fillRect(cylLeft + 3 * scale, cylTop + 3 * scale, pistonLeft - cylLeft - 3 * scale, cylH - 6 * scale);
                ctx.fillStyle = rightChamber;
                ctx.fillRect(pistonLeft + pistonThick, cylTop + 3 * scale, cylLeft + cylL - pistonLeft - pistonThick - 3 * scale, cylH - 6 * scale);
                ctx.restore();
                // 2. Draw rod (Extend steel rod out)
                ctx.save();
                const rodGrad = ctx.createLinearGradient(pistonLeft, cy - rodH/2, pistonLeft, cy + rodH/2);
                rodGrad.addColorStop(0, '#f8fafc');
                rodGrad.addColorStop(0.3, '#e2e8f0');
                rodGrad.addColorStop(0.6, '#94a3b8');
                rodGrad.addColorStop(1, '#475569');
                ctx.fillStyle = rodGrad;
                ctx.fillRect(pistonLeft + pistonThick, cy - rodH/2, rodLength, rodH);
                ctx.strokeStyle = '#475569';
                ctx.lineWidth = 1.5;
                ctx.strokeRect(pistonLeft + pistonThick, cy - rodH/2, rodLength, rodH);
                ctx.restore();
                // 3. Draw Piston block inside
                ctx.save();
                const pistonGrad = ctx.createLinearGradient(pistonLeft, cylTop, pistonLeft + pistonThick, cylTop);
                pistonGrad.addColorStop(0, '#64748b');
                pistonGrad.addColorStop(0.5, '#f1f5f9');
                pistonGrad.addColorStop(1, '#334155');
                ctx.fillStyle = pistonGrad;
                ctx.fillRect(pistonLeft, cylTop + 2 * scale, pistonThick, cylH - 4 * scale);
                ctx.strokeStyle = '#1e293b';
                ctx.lineWidth = 2 * scale;
                ctx.strokeRect(pistonLeft, cylTop + 2 * scale, pistonThick, cylH - 4 * scale);
                // Cyan dynamic seals
                ctx.fillStyle = '#0284c7';
                ctx.fillRect(pistonLeft + 3 * scale, cylTop + 2 * scale, 4 * scale, 3 * scale);
                ctx.fillRect(pistonLeft + 3 * scale, cylBottom - 5 * scale, 4 * scale, 3 * scale);
                ctx.fillRect(pistonLeft + 13 * scale, cylTop + 2 * scale, 4 * scale, 3 * scale);
                ctx.fillRect(pistonLeft + 13 * scale, cylBottom - 5 * scale, 4 * scale, 3 * scale);
                ctx.restore();
                // 4. Draw Cylinder sleeve with Tie-rods (premium modern industrial look)
                ctx.save();
                ctx.strokeStyle = '#64748b';
                ctx.lineWidth = 4 * scale;
                // Tie-rods (top and bottom horizontal bars running slightly offset)
                ctx.strokeStyle = '#94a3b8';
                ctx.lineWidth = 2.5 * scale;
                ctx.beginPath();
                ctx.moveTo(cylLeft - 10 * scale, cylTop - 6 * scale);
                ctx.lineTo(cylLeft + cylL + 10 * scale, cylTop - 6 * scale);
                ctx.moveTo(cylLeft - 10 * scale, cylBottom + 6 * scale);
                ctx.lineTo(cylLeft + cylL + 10 * scale, cylBottom + 6 * scale);
                ctx.stroke();
                // Tie-rod nuts
                ctx.fillStyle = '#64748b';
                ctx.fillRect(cylLeft - 14 * scale, cylTop - 9 * scale, 6 * scale, 6 * scale);
                ctx.fillRect(cylLeft - 14 * scale, cylBottom + 3 * scale, 6 * scale, 6 * scale);
                ctx.fillRect(cylLeft + cylL + 8 * scale, cylTop - 9 * scale, 6 * scale, 6 * scale);
                ctx.fillRect(cylLeft + cylL + 8 * scale, cylBottom + 3 * scale, 6 * scale, 6 * scale);
                // Main casing tube
                ctx.fillStyle = 'rgba(255, 255, 255, 0.3)';
                ctx.strokeStyle = '#475569';
                ctx.lineWidth = 4 * scale;
                ctx.strokeRect(cylLeft, cylTop, cylL, cylH);
                // Cap end (left aluminum block)
                ctx.fillStyle = '#cbd5e1';
                ctx.fillRect(cylLeft - 6 * scale, cylTop - 3 * scale, 14 * scale, cylH + 6 * scale);
                ctx.strokeRect(cylLeft - 6 * scale, cylTop - 3 * scale, 14 * scale, cylH + 6 * scale);
                // Rod end cover (right block with gap for rod)
                ctx.fillRect(cylLeft + cylL - 8 * scale, cylTop - 3 * scale, 14 * scale, cylH + 6 * scale);
                ctx.strokeRect(cylLeft + cylL - 8 * scale, cylTop - 3 * scale, 14 * scale, cylH + 6 * scale);
                // Oil ports
                ctx.fillStyle = '#334155';
                ctx.fillRect(cylLeft + 20 * scale, cylBottom, 14 * scale, 8 * scale);
                ctx.fillRect(cylLeft + cylL - 34 * scale, cylBottom, 14 * scale, 8 * scale);
                ctx.restore();
                // 5. Draw active air venting bubbles
                ctx.save();
                ctx.fillStyle = 'rgba(2, 132, 199, 0.6)';
                state.exhaustBubbles = state.exhaustBubbles.filter(function(b) { return b.life > 0; });
                state.exhaustBubbles.forEach(function(b) {
                    b.x += b.vx * dt * 25 * scale;
                    b.y += b.vy * dt * 25 * scale;
                    b.vy += 0.5 * dt * scale; // slight downward drift
                    b.life -= b.decay;
                    ctx.beginPath();
                    ctx.arc(b.x, b.y, b.size * scale, 0, Math.PI * 2);
                    ctx.fill();
                });
                ctx.restore();
                // 6. Draw pneumatic flow vector signals
                ctx.save();
                ctx.strokeStyle = '#0284c7';
                ctx.fillStyle = '#0284c7';
                ctx.lineWidth = 3 * scale;
                if (state.direction === 1) {
                    // Left port: input air flow arrows
                    ctx.beginPath();
                    ctx.moveTo(cylLeft + 27 * scale, cylBottom + 20 * scale);
                    ctx.lineTo(cylLeft + 27 * scale, cylBottom + 4 * scale);
                    ctx.lineTo(cylLeft + 23 * scale, cylBottom + 10 * scale);
                    ctx.moveTo(cylLeft + 27 * scale, cylBottom + 4 * scale);
                    ctx.lineTo(cylLeft + 31 * scale, cylBottom + 10 * scale);
                    ctx.stroke();
                    // Right port: exhaust air escaping arrow
                    ctx.beginPath();
                    ctx.moveTo(cylLeft + cylL - 27 * scale, cylBottom + 4 * scale);
                    ctx.lineTo(cylLeft + cylL - 27 * scale, cylBottom + 20 * scale);
                    ctx.lineTo(cylLeft + cylL - 31 * scale, cylBottom + 14 * scale);
                    ctx.moveTo(cylLeft + cylL - 27 * scale, cylBottom + 20 * scale);
                    ctx.lineTo(cylLeft + cylL - 23 * scale, cylBottom + 14 * scale);
                    ctx.stroke();
                } else {
                    // Right port: input air flow arrows
                    ctx.beginPath();
                    ctx.moveTo(cylLeft + cylL - 27 * scale, cylBottom + 20 * scale);
                    ctx.lineTo(cylLeft + cylL - 27 * scale, cylBottom + 4 * scale);
                    ctx.lineTo(cylLeft + cylL - 31 * scale, cylBottom + 10 * scale);
                    ctx.moveTo(cylLeft + cylL - 27 * scale, cylBottom + 4 * scale);
                    ctx.lineTo(cylLeft + cylL - 23 * scale, cylBottom + 10 * scale);
                    ctx.stroke();
                    // Left port: exhaust escaping
                    ctx.beginPath();
                    ctx.moveTo(cylLeft + 27 * scale, cylBottom + 4 * scale);
                    ctx.lineTo(cylLeft + 27 * scale, cylBottom + 20 * scale);
                    ctx.lineTo(cylLeft + 23 * scale, cylBottom + 14 * scale);
                    ctx.moveTo(cylLeft + 27 * scale, cylBottom + 20 * scale);
                    ctx.lineTo(cylLeft + 31 * scale, cylBottom + 14 * scale);
                    ctx.stroke();
                }
                ctx.restore();
                // 7. Draw dimension annotations (D, d, S)
                ctx.save();
                ctx.strokeStyle = 'rgba(100, 116, 139, 0.4)';
                ctx.fillStyle = 'rgba(100, 116, 139, 0.6)';
                ctx.lineWidth = 1;
                function drawArrowhead(ctx, x, y, angle, size = 5) {
                    ctx.save();
                    ctx.translate(x, y);
                    ctx.rotate(angle);
                    ctx.beginPath();
                    ctx.moveTo(0, 0);
                    ctx.lineTo(-size, -size * 0.4);
                    ctx.lineTo(-size * 0.8, 0);
                    ctx.lineTo(-size, size * 0.4);
                    ctx.closePath();
                    ctx.fill();
                    ctx.restore();
                }
                // 1. Bore Diameter D (Vertical line on the left)
                const dLineX = cylLeft - 22;
                ctx.beginPath();
                ctx.moveTo(cylLeft, cylTop);
                ctx.lineTo(dLineX - 4, cylTop);
                ctx.moveTo(cylLeft, cylBottom);
                ctx.lineTo(dLineX - 4, cylBottom);
                ctx.stroke();
                ctx.beginPath();
                ctx.moveTo(dLineX, cylTop);
                ctx.lineTo(dLineX, cylBottom);
                ctx.stroke();
                drawArrowhead(ctx, dLineX, cylTop, -Math.PI / 2, 5);
                drawArrowhead(ctx, dLineX, cylBottom, Math.PI / 2, 5);
                ctx.save();
                ctx.translate(dLineX - 6, cy);
                ctx.rotate(-Math.PI / 2);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'bottom';
                ctx.fillStyle = '#475569';
                ctx.font = '500 11px Inter, sans-serif';
                ctx.fillText(`D = ${state.d} mm`, 0, 0);
                ctx.restore();
                // 2. Rod Diameter d (Vertical line on the right)
                const rodRight = pistonLeft + pistonThick + rodLength;
                const dRodLineX = rodRight + 12;
                const rodTop = cy - rodH / 2;
                const rodBottom = cy + rodH / 2;
                ctx.beginPath();
                ctx.moveTo(rodRight, rodTop);
                ctx.lineTo(dRodLineX + 4, rodTop);
                ctx.moveTo(rodRight, rodBottom);
                ctx.lineTo(dRodLineX + 4, rodBottom);
                ctx.stroke();
                ctx.beginPath();
                ctx.moveTo(dRodLineX, rodTop);
                ctx.lineTo(dRodLineX, rodBottom);
                ctx.stroke();
                if (rodH >= 12) {
                    drawArrowhead(ctx, dRodLineX, rodTop, -Math.PI / 2, 4);
                    drawArrowhead(ctx, dRodLineX, rodBottom, Math.PI / 2, 4);
                }
                ctx.save();
                ctx.translate(dRodLineX + 6, cy);
                ctx.textAlign = 'left';
                ctx.textBaseline = 'middle';
                ctx.fillStyle = '#475569';
                ctx.font = '500 11px Inter, sans-serif';
                ctx.fillText(`d = ${state.rod} mm`, 0, 0);
                ctx.restore();
                // 3. Stroke S (Horizontal line on top)
                const sLineY = cylTop - 18;
                const sStart = cylLeft + 3;
                const sEnd = cylLeft + 3 + maxTravel;
                ctx.beginPath();
                ctx.moveTo(sStart, cylTop);
                ctx.lineTo(sStart, sLineY - 4);
                ctx.moveTo(sEnd, cylTop);
                ctx.lineTo(sEnd, sLineY - 4);
                ctx.stroke();
                ctx.beginPath();
                ctx.moveTo(sStart, sLineY);
                ctx.lineTo(sEnd, sLineY);
                ctx.stroke();
                drawArrowhead(ctx, sStart, sLineY, Math.PI, 5);
                drawArrowhead(ctx, sEnd, sLineY, 0, 5);
                ctx.save();
                ctx.translate((sStart + sEnd) / 2, sLineY - 6);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'bottom';
                ctx.fillStyle = '#475569';
                ctx.font = '500 11px Inter, sans-serif';
                ctx.fillText(`S = ${state.stroke} mm`, 0, 0);
                ctx.restore();
                ctx.restore();
                // Restore outer auto-zoom scale state
                ctx.restore();
            }
            // Copy & right click block with nested if
            document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
                alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                return false;
            }, { capture: true });
            document.addEventListener('selectstart', function(e) {
                e.preventDefault();
                return false;
            }, { capture: true });
            document.addEventListener('keydown', function(e) {
                if (e.key === 'F12') {
                    e.preventDefault();
                    alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                    return false;
                }
                if (e.ctrlKey) {
                    if (e.key === 'u' || e.key === 'c' || e.key === 's' || e.key === 'U' || e.key === 'C' || e.key === 'S') {
                        e.preventDefault();
                        alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                        return false;
                    }
                    if (e.shiftKey) {
                        if (['i','I','j','J','c','C'].includes(e.key)) {
                            e.preventDefault();
                            alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                            return false;
                        }
                    }
                }
            }, { capture: true });
            // Initialize
            loadPreset('pickplace');
            requestAnimationFrame(draw);
        })();
</script>


<div style="background: linear-gradient(135deg, rgba(0,242,254,0.03), rgba(138,43,226,0.03)); border: 1px solid rgba(0,242,254,0.15); border-radius: 12px; padding: 18px 24px; margin: 25px auto 35px auto; font-size: 0.95em; color: #4b5563; line-height: 1.7; font-family: sans-serif;">
    <strong style="color: #1f2937; font-size: 1.05em; display: flex; align-items: center; gap: 8px;">
        <span style="font-size: 1.2em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> 간편 사용 설명서
    </strong>
    <ol style="margin: 10px 0 0 0; padding-left: 20px;">
        <li style="margin-bottom: 6px;"><strong>실린더 물리 형상 설정: 실린더 보어 내경(mm), 피스톤 로드 지름(mm) 및 구동할 스트로크 행정 길이(mm)를 결정합니다.</strong></li>
<li style="margin-bottom: 6px;">제어용 공기 공급 조건 입력: 자동화 장비의 공급 공기 압력(bar) 및 분당 실린더의 구동 빈도(Cycle/min)를 설정합니다.</li>
<li style="margin-bottom: 6px;">실시간 압축공기 분사 및 피스톤 거동 확인: 행정에 동기화하여 압축 에어가 유입되고 실린더가 매끄럽게 왕복 작동하며, 배기 포트에서 여분의 에어가 소모 배출되는 과정을 시각적으로 목격합니다.</li>
<li style="margin-bottom: 6px;">공기 소모량 정량 판독: 계측 보드에서 토출되는 대기압 환산 분당 에어 소모량(NL/min)을 확인하여 공장 컴프레셔 공급 마진 및 튜브 구경 적격성을 실시간 평가합니다.</li>
    </ol>
</div>


<details class="premium-seo-accordion" style="border: 1px solid rgba(0,0,0,0.08); border-radius: 12px; background: #fbfbfc; padding: 0; margin: 30px auto; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.01); font-family: sans-serif;">
    <summary style="display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; font-size: 1.1em; font-weight: 700; color: #1f2937; cursor: pointer; user-select: none; outline: none; list-style: none;">
        <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 공압 실린더 이론 추력 계산 공식 및 컴프레셔 연동 대기압 환산 에어 소모량(NL/min)</span>
        <span class="accordion-arrow" style="font-size: 0.9em; color: #9ca3af; transition: transform 0.2s ease;">▼</span>
    </summary>
    <div style="padding: 0 24px 24px 24px; border-top: 1px solid rgba(0,0,0,0.04); background: #ffffff; border-radius: 0 0 12px 12px; font-size: 0.98em; color: #374151; line-height: 1.8;">
        <div style="margin-top: 20px;">
            <h3>1. 공압 실린더 작동 압력에 따른 물리적 왕복 추력(Thrust Force) 계산</h3>
<p>유압과 달리 공기압 제어는 상대적으로 저압(주로 5 ~ 7 bar)을 사용하며, 실린더 재질도 가벼운 알루미늄 합금 위주로 설계됩니다. 복동 공압 실린더의 기하학적 전진/후진 추력 공식은 유체 단면적에 공급 계장 공기 압력(<code>P</code>)을 곱하여 연산합니다.</p><p><strong>① 전진 추력 (Extend Force, F_extend):</strong></p><p style="text-align: center; font-weight: bold; background: #e0f2fe; padding: 16px; border-radius: 8px; font-size: 1.05em; color: #0369a1;">F_extend = P_bar &times; 10&#038;sup5; &times; (&pi; &times; D&sup2; / 4 &times; 10⁻⁶) &nbsp;[N]</p><p><strong>② 후진 추력 (Retract Force, F_retract):</strong></p><p style="text-align: center; font-weight: bold; background: #e0f2fe; padding: 16px; border-radius: 8px; font-size: 1.05em; color: #0369a1;">F_retract = P_bar &times; 10&#038;sup5; &times; (&pi; &times; (D&sup2; &#8211; d&sup2;) / 4 &times; 10⁻⁶) &nbsp;[N]</p><p>여기서 <code>D</code>는 실린더 보어 내경(mm), <code>d</code>는 로드 지름(mm), <code>P_bar</code>는 게이지 작동 압력(bar)입니다. <code>1 kgf &approx; 9.80665 N</code> 단위 관계를 적용하여 현장용 중량 단위로 변환해 줍니다.</p>
<h3>2. 대기압 환산 에어 소모량 (Air Consumption in Normal Liters, NL/min) 수학 공식</h3>
<p>공기압 실린더를 구동할 때 소비되는 유량계 기준의 압축에어 체적은 컴프레셔 용량을 산정하기 위해 반드시 **표준 대기압 상태(Normal State: 0℃, 1기압)로 환산된 체적 유량(NL/min)**으로 계산해야 합니다. 압력이 가해진 실린더 체적이 대기 중으로 방출되며 기하급수적으로 부풀기 때문입니다.</p><p><strong>① 절대압 압축비 (Compression Ratio, CR):</strong></p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">CR = (P_gauge + P_atm) / P_atm &approx; (P_bar + 1.013) / 1.013</p><p><strong>② 1회 왕복 주기당 Compressed 에어 체적 (V_cycle):</strong> 스트로크(<code>S</code>, mm)에 따른 실린더 전/후진 챔버 체적을 합산합니다.</p><p style="text-align: center; font-weight: bold; background: #f3f4f6; padding: 12px; border-radius: 8px;">V_cycle [Liters] = (A_push_mm&sup2; + A_pull_mm&sup2;) &times; (S_mm / 1000) / 1,000</p><p><strong>③ 최종 대기압 환산 분당 에어 소모량 (Q_free, NL/min):</strong> 분당 왕복 사이클 속도(<code>N</code>, cycles/min)를 연동합니다.</p><p style="text-align: center; font-weight: bold; background: #e0f2fe; padding: 16px; border-radius: 8px; font-size: 1.05em; color: #0369a1;">Q_free = V_cycle &times; CR &times; N &nbsp;[NL/min]</p>
<h3>3. 실무 공압 유량 설계 및 배관 밸브 선정 제약</h3>
<p>계산된 공기 소모량(<code>NL/min</code>)은 실린더를 움직이는 솔레노이드 밸브(Solenoid Valve)의 유량 통과 능력 계수인 **Cv값(또는 유효단면적 S)**을 결정하는 직결 척도입니다. 소모 유량에 비해 밸브나 에어 튜브 호스의 구경이 너무 작으면 관로 저항으로 인해 실린더가 설계 속도대로 작동하지 못하고 반응이 현저히 지연되므로 반드시 본 연산 데이터를 가이드라인으로 활용해야 합니다.</p>
        </div>
    </div>
</details>
<style>
details.premium-seo-accordion[open] summary .accordion-arrow { transform: rotate(180deg); color: #00f2fe; }
details.premium-seo-accordion summary::-webkit-details-marker { display: none; }
details.premium-seo-accordion:hover { border-color: rgba(0,242,254,0.3); }
</style>

]]></content:encoded>
					
					<wfw:commentRss>https://myengnote.com/pneumatic-cylinder-air-consumption-force-calculator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>공압 실린더 행정 선정의 기초 (Definition of Pneumatic Cylinder Stroke)</title>
		<link>https://myengnote.com/pneumatic-cylinder-stroke-definition-selection-guide/</link>
					<comments>https://myengnote.com/pneumatic-cylinder-stroke-definition-selection-guide/#respond</comments>
		
		<dc:creator><![CDATA[동동]]></dc:creator>
		<pubDate>Thu, 07 May 2026 10:48:05 +0000</pubDate>
				<category><![CDATA[배관/유공압]]></category>
		<category><![CDATA[Pneumatic]]></category>
		<category><![CDATA[Stroke]]></category>
		<category><![CDATA[공압실린더]]></category>
		<category><![CDATA[기계설계]]></category>
		<category><![CDATA[실린더선정]]></category>
		<category><![CDATA[행정]]></category>
		<guid isPermaLink="false">https://myengnote.com/pneumatic-cylinder-stroke-definition-selection-guide/</guid>

					<description><![CDATA[공압 실린더 선정 시 가장 기본이 되는 행정의 개념과 실무적인 고려 사항을 다룹니다. 행정 거리 결정 오류가 장비 성능과 내구성에 미치는 영향을 현장 사례와 함께 상세히 분석합니다.... <a href="https://myengnote.com/pneumatic-cylinder-stroke-definition-selection-guide/" style="text-decoration:none; color:#0073aa; font-weight:bold;">[본문 전체보기 >]</a>]]></description>
										<content:encoded><![CDATA[<p>지금도 생생하게 기억나는 현장의 기억이 있습니다. 자동차 부품 조립 라인의 자동화 설비 구축 당시, 실린더의 행정 거리를 단 5mm 잘못 산정한 것만으로 전체 공정의 택트 타임이 무너지고, 결국 고가의 실린더가 파손되었던 사건입니다. 공압 실린더에서 행정, 즉 스트로크는 피스톤이 이동할 수 있는 최대 거리를 의미하며, 이는 장비의 물리적인 가동 범위를 결정하는 가장 핵심적인 요소입니다. 단순히 카탈로그에서 숫자를 고르는 것 이상의 정밀한 계산과 물리적 이해가 뒷받침되지 않으면, 기계는 곧 비명을 지르게 됩니다. </p>
<h2>실무 필드 로그 및 분석 (Field Log &#038; Analysis)</h2>
<p>작년 가을, 한 대형 가전기기 조립 라인에서 발생한 문제입니다. 해당 공정에는 SMC 사의 공압 실린더 모델 CP96SD63-150C가 장착되어 있었습니다. 이 실린더는 팔레트를 정지시키고 정위치로 밀어주는 역할을 수행하고 있었는데, 가동 후 불과 2주 만에 실린더 로드 끝부분의 나사산이 마모되고 내부 완충 기구가 파손되는 현상이 보고되었습니다.</p>
<p>현장에서 정밀 진단을 실시한 결과, 설계 데이터상의 행정 거리는 150mm였으나, 실제 작업물이 멈춰야 하는 물리적 지점은 147.2mm였습니다. 즉, 실린더의 피스톤이 내부 끝단에 닿기 전에 외부 스토퍼에 의해 강제로 멈춰지고 있었던 것입니다. 공압 실린더는 이동 끝단에서 공기의 압축성을 이용해 충격을 흡수해야 하는데, 행정 설정 오류로 인해 피스톤이 운동 에너지를 고스란히 로드와 외부 구조물에 전달하고 있었습니다. 85Hz 수준의 고주파 진동이 장비 전체로 퍼지고 있었으며, 이로 인해 발생한 가동 중단 비용은 시간당 수천만 원에 달했습니다.</p>
<p>이 문제는 단순한 수치 오차를 넘어, <strong>KS B ISO 4393(공압 실린더의 행정 시리즈)</strong> 규격에서 정의하는 이론적 행정과 실제 유효 행정의 차이를 간과했기 때문에 발생했습니다. 결국 실린더의 행정을 140mm로 하향 조정하고, 부족한 거리는 로드 엔드 어댑터를 통해 보정함으로써 충격 흡수 기능을 정상화할 수 있었습니다. 이를 통해 장비 유지보수 비용을 연간 15% 이상 절감하는 성과를 거두었습니다.</p>
<h2>행정의 정의와 물리적 메커니즘</h2>
<p>행정은 피스톤의 &#8216;출발점&#8217;과 &#8216;도착점&#8217; 사이의 거리입니다. 하지만 공압이라는 유체의 특성을 고려하면 이는 단순한 길이 이상의 의미를 가집니다. 공압 실린더 내부에서는 압축 공기가 피스톤 단면적에 작용하여 힘(F = P × A)을 발생시키고, 이 힘이 일정한 거리 동안 작용하면서 운동 에너지를 형성합니다.</p>
<p>이때 우리가 반드시 고려해야 할 것이 이론적 행정과 실제 필요 행정의 구분입니다. 기구 설계자가 100mm의 이동이 필요하다고 해서 딱 100mm 행정의 실린더를 선정하는 것은 위험한 도박입니다. 기계적인 조립 오차, 부품의 열팽창, 그리고 장시간 사용에 따른 위치 변화를 고려하면 반드시 5~10mm 정도의 <strong>여유 행정</strong>을 두는 것이 현명합니다.</p>
<div style="border-left: 5px solid #3b82f6; background-color: #eff6ff; padding: 15px; margin: 30px 0; border-radius: 10px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);">
<div style="display: flex; align-items: center; margin-bottom: 12px;"> <span style="font-size: 30px; margin-right: 15px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> <span style="font-weight: bold; color: #1e40af; font-size: 1.2em;">핵심 요약</span> </div>
<div style="color: #444; line-height: 1.8; font-size: 1.05em;"> 공압 실린더의 행정은 단순히 이동 거리가 아니라, 위치 제어의 정밀도와 내구성을 결정짓는 물리적 한계치입니다. 적절한 행정 선정은 설비의 에너지 효율 및 수명과 직결됩니다. </div>
</div>
<p>행정이 길어질수록 실린더 로드에 가해지는 횡하중에 취약해집니다. 로드가 길게 뻗어 나올수록 지렛대 원리에 의해 내부 가이드와 씰에 가해지는 마찰력이 기하급수적으로 증가하기 때문입니다. 이는 곧 작동 불능이나 압축 공기 누설로 이어집니다. 따라서 긴 행정이 필요한 경우에는 실린더의 튜브 내경을 키우거나 별도의 외부 가이드를 설치하여 로드의 굽힘 강성을 확보해야 합니다.</p>
<h2>이론과 현실의 간극을 메우는 방법</h2>
<p>현장에서 흔히 하는 실수 중 하나는 실린더의 행정 끝단을 기계적인 정지점으로 사용하는 것입니다. 실린더 내부의 완충 기구(Cushion)는 피스톤이 커버에 부딪힐 때의 충격을 줄여주지만, 이는 보조적인 수단일 뿐입니다. 고속 작동이나 중량물 운반 시에는 실린더의 행정 범위를 모두 사용하기보다는, 외부 스토퍼나 쇼크 업쇼버를 활용해 물리적인 정지 위치를 잡아주는 것이 장비 수명 연장의 비결입니다.</p>
<p>또한, 행정 거리에 따른 공기 소모량도 계산에 넣어야 합니다. 행정이 길어질수록 한 번의 왕복에 필요한 공기의 부피가 커지며, 이는 공압 시스템 전체의 압력 강하를 유발할 수 있습니다. 시스템의 응답성을 높이려면 필요한 최소한의 행정만을 사용하는 것이 효율적입니다. 이를 위해 설계 단계에서 공압 매니폴드 블록의 역할을 정확히 이해하고, 공기의 흐름을 최적화하는 배관 설계가 선행되어야 합니다.</p>
<div style="border-left: 5px solid #ef4444; background-color: #fef2f2; padding: 15px; margin: 30px 0; border-radius: 10px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);">
<div style="display: flex; align-items: center; margin-bottom: 12px;"> <span style="font-size: 30px; margin-right: 15px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> <span style="font-weight: bold; color: #991b1b; font-size: 1.2em;">주의사항</span> </div>
<div style="color: #444; line-height: 1.8; font-size: 1.05em;"> 실린더 행정이 1000mm를 초과하는 장행정 모델의 경우, 로드의 자중으로 인한 처짐 현상이 발생합니다. 반드시 지지 기구나 가이드 레일을 설계에 반영하십시오. </div>
</div>
<h2>초보 엔지니어들이 흔히 하는 실수와 대책</h2>
<p>신입 엔지니어들은 종종 실린더를 선정할 때 로드 끝단의 나사산 길이를 행정 거리와 혼동하곤 합니다. 행정은 순수하게 피스톤이 움직이는 거리이며, 로드 엔드의 나사산이나 부착물 치수는 별도로 관리해야 합니다. 특히 조립 시에는 원터치 피팅의 체결 상태를 명확히 확인하여, 행정 가동 중 발생하는 진동에 의해 호스가 이탈되는 사고를 미연에 방지해야 합니다.</p>
<p>또한, 모터 기반의 액추에이터와 공압 실린더를 동일한 시각으로 봐서는 안 됩니다. 공압은 중간 정지가 어렵고 양 끝단의 행정 제어에 특화되어 있습니다. 따라서 정밀한 다점 위치 제어가 필요한 곳에 무리하게 장행정 공압 실린더를 적용하는 것은 제어 난이도를 높이고 유지보수 비용을 증가시키는 원인이 됩니다.</p>
<div style="border-left: 5px solid #f59e0b; background-color: #fffbeb; padding: 15px; margin: 30px 0; border-radius: 10px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);">
<div style="display: flex; align-items: center; margin-bottom: 12px;"> <span style="font-size: 30px; margin-right: 15px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> <span style="font-weight: bold; color: #92400e; font-size: 1.2em;">현장 전문가의 팁</span> </div>
<div style="color: #444; line-height: 1.8; font-size: 1.05em;"> 실린더 행정을 선정할 때는 항상 센서의 감지 위치를 고려하십시오. 오토 스위치가 감지할 수 있는 최소 행정 거리가 카탈로그에 명시되어 있으므로 이를 반드시 확인해야 합니다. </div>
</div>
<h2>결론 및 제언</h2>
<p>공압 실린더의 행정은 단순한 &#8216;길이&#8217;가 아니라, 장비의 <strong>신뢰성</strong>을 결정짓는 척도입니다. 물리적인 에너지 흐름을 이해하고, 여유 치수를 확보하며, 외부 환경에 따른 변화를 예측하는 것만이 완벽한 설계를 가능하게 합니다. 이론적인 계산값에 안주하지 않고 실제 조립 환경에서의 간섭 조건과 부하의 관성 모멘트를 시뮬레이션하는 습관이 중요합니다. 행정 선정의 기본을 지키는 것, 그것이 바로 다운타임 없는 강건한 설비를 만드는 첫걸음입니다.</p>
<div style="overflow-x: auto; white-space: nowrap;">
<div style="overflow-x: auto; white-space: nowrap; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); margin: 20px 0; border: 1px solid #e5e7eb;">
<table style="border-collapse: collapse; width: 100%; min-width: 700px; font-size: 15px; text-align: left; background-color: #ffffff;">
<tr style="background-color: #f3f4f6;">
<th style="padding: 15px; border-bottom: 3px solid #4b5563; background-color: #1f2937; color: #ffffff; font-weight: bold; text-transform: uppercase; letter-spacing: 0.05em;">구분</th>
<th style="padding: 15px; border-bottom: 3px solid #3b82f6; background-color: #1f2937; color: #ffffff; font-weight: bold; text-transform: uppercase; letter-spacing: 0.05em;">표준 행정</th>
<th style="padding: 15px; border-bottom: 3px solid #10b981; background-color: #1f2937; color: #ffffff; font-weight: bold; text-transform: uppercase; letter-spacing: 0.05em;">장행정</th>
</tr>
<tr>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; background-color: #f9fafb; font-weight: bold; color: #374151;">범위</td>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; color: #4b5563;">50mm ~ 500mm</td>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; color: #4b5563;">600mm 이상</td>
</tr>
<tr>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; background-color: #f9fafb; font-weight: bold; color: #374151;">주요 고려사항</td>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; color: #4b5563;">완충 효율, 센서 감지</td>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; color: #4b5563;">로드 처짐, 좌굴 강도, 가이드 보강</td>
</tr>
<tr>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; background-color: #f9fafb; font-weight: bold; color: #374151;">추천 적용</td>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; color: #4b5563;">일반 클램핑, 푸싱</td>
<td style="padding: 12px 15px; border-bottom: 1px solid #e5e7eb; color: #4b5563;">이송 장치, 리프트</td>
</tr>
</table>
</div>
</div>
<h2>0. 연관글</h2>
<p><!-- START_SIMULATOR_LINK_CARD_pneumatic_cylinder --><a href="https://myengnote.com/pneumatic-cylinder-air-consumption-force-calculator/" target="_blank" rel="noopener noreferrer" class="eng-simulator-card" style="text-decoration: none; background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 15px; margin: 10px 0; transition: box-shadow 0.2s; display: table; width: 100%; box-sizing: border-box;"><span style="display: table-cell; vertical-align: middle;"><span style="font-size: 30px; margin-right: 15px; float: left;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ee.png" alt="🧮" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span style="display: block; overflow: hidden;"><span style="display: block; font-size: 0.9em; color: #10b981; font-weight: bold; margin-bottom: 4px;">실시간 공학 시뮬레이터 추천</span><span style="display: block; font-size: 1.1em; font-weight: bold; color: #111827;">공압 실린더 공기 소비량 계산기 &#038; 실시간 2D 물리 시뮬레이터</span></span></span><span style="display: table-cell; vertical-align: middle; width: 40px; text-align: right; color: #10b981; font-size: 24px; font-weight: bold;">→</span></a><!-- END_SIMULATOR_LINK_CARD_pneumatic_cylinder --><a href="https://myengnote.com/importance-of-fully-inserting-hose-in-one-touch-fittings/" style="text-decoration: none; background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 15px; margin: 10px 0; transition: box-shadow 0.2s; display: table; width: 100%; box-sizing: border-box;"> <span style="display: table-cell; vertical-align: middle;"> <span style="font-size: 30px; margin-right: 15px; float: left;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> <span style="display: block; overflow: hidden;"> <span style="display: block; font-size: 0.9em; color: #6b7280; margin-bottom: 4px;">함께 보면 좋은 글</span> <span style="display: block; font-size: 1.1em; font-weight: bold; color: #111827;">원터치 피팅 호스 조립 시 끝까지 밀어 넣어야 하는 이유</span> </span> </span> <span style="display: table-cell; vertical-align: middle; width: 40px; text-align: right; color: #3b82f6; font-size: 24px; font-weight: bold;">→</span><br />
</a><a href="https://myengnote.com/motor-vs-actuator-application-differences/" style="text-decoration: none; background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 15px; margin: 10px 0; transition: box-shadow 0.2s; display: table; width: 100%; box-sizing: border-box;"> <span style="display: table-cell; vertical-align: middle;"> <span style="font-size: 30px; margin-right: 15px; float: left;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> <span style="display: block; overflow: hidden;"> <span style="display: block; font-size: 0.9em; color: #6b7280; margin-bottom: 4px;">함께 보면 좋은 글</span> <span style="display: block; font-size: 1.1em; font-weight: bold; color: #111827;">모터와 액추에이터의 용도별 차이점</span> </span> </span> <span style="display: table-cell; vertical-align: middle; width: 40px; text-align: right; color: #3b82f6; font-size: 24px; font-weight: bold;">→</span><br />
</a><a href="https://myengnote.com/pneumatic-manifold-block-role-structure-guide/" style="text-decoration: none; background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 15px; margin: 10px 0; transition: box-shadow 0.2s; display: table; width: 100%; box-sizing: border-box;"> <span style="display: table-cell; vertical-align: middle;"> <span style="font-size: 30px; margin-right: 15px; float: left;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> <span style="display: block; overflow: hidden;"> <span style="display: block; font-size: 0.9em; color: #6b7280; margin-bottom: 4px;">함께 보면 좋은 글</span> <span style="display: block; font-size: 1.1em; font-weight: bold; color: #111827;">공압 매니폴드 블록의 역할과 내부 구조 이해하기</span> </span> </span> <span style="display: table-cell; vertical-align: middle; width: 40px; text-align: right; color: #3b82f6; font-size: 24px; font-weight: bold;">→</span><br />
</a></p>
<hr style="border: 0; border-top: 1px solid #eee; margin: 40px 0 20px 0;">
<p style="text-align: center; font-size: 0.85em; color: #888; margin-bottom: 20px;">
    본 콘텐츠는 저작권법의 보호를 받으며, 무단 전재 및 재배포를 금지합니다.<br />
    Copyright 2026. 동동 All rights reserved.
</p>
<p><!-- Protection Scripts --></p>
<div id="protection-script" style="display:none;">
<script>
document.addEventListener('contextmenu', function(e) {
    e.preventDefault();
    alert('이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.');
});
document.addEventListener('keydown', function(e) {
    if (e.ctrlKey && (e.key === 'c' || e.key === 'u' || e.key === 'a')) {
        e.preventDefault();
        alert('무단 복제를 금지합니다.');
    }
});
</script></p>
<style>
.entry-content {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
</style>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://myengnote.com/pneumatic-cylinder-stroke-definition-selection-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>공압 실린더 기본 구조 및 트러블 슈팅 (Pneumatic Cylinder Basic Structure and Troubleshooting)</title>
		<link>https://myengnote.com/pneumatic-cylinder-structure-troubleshooting-guide/</link>
					<comments>https://myengnote.com/pneumatic-cylinder-structure-troubleshooting-guide/#respond</comments>
		
		<dc:creator><![CDATA[동동]]></dc:creator>
		<pubDate>Mon, 26 Jan 2026 22:14:35 +0000</pubDate>
				<category><![CDATA[배관/유공압]]></category>
		<category><![CDATA[Actuator]]></category>
		<category><![CDATA[Fluid Power]]></category>
		<category><![CDATA[Pneumatic Cylinder]]></category>
		<category><![CDATA[공압실린더]]></category>
		<category><![CDATA[뉴매틱]]></category>
		<category><![CDATA[실린더구조]]></category>
		<category><![CDATA[액츄에이터]]></category>
		<category><![CDATA[작동원리]]></category>
		<guid isPermaLink="false">https://myengnote.com/pneumatic-cylinder-structure-troubleshooting-guide/</guid>

					<description><![CDATA[빠르고 정확한 구동이 핵심인 공압 실린더, 현장 엔지니어가 알려주는 기본 구조와 누설 방지 비법을 공개합니다.... <a href="https://myengnote.com/pneumatic-cylinder-structure-troubleshooting-guide/" style="text-decoration:none; color:#0073aa; font-weight:bold;">[본문 전체보기 >]</a>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">1. 현장 트러블 슈팅 이야기</h2>
<p class="wp-block-paragraph">안녕하세요. 현장에서 유공압 시스템을 오랫동안 다뤄온 선배 엔지니어입니다. 실린더는 자동화 라인의 핵심 구동 부품이지만, 의외로 간단한 실수 때문에 고장이 많이 납니다.</p>
<p class="wp-block-paragraph">제가 한번은 자동차 부품 조립 라인을 방문했는데, 새 실린더를 설치한 지 한 달도 안 되어 피스톤 로드가 휘고 구동부에 긁힌 자국(스크래치)이 심하게 생겨서 작동 불능 상태가 된 경우가 있었습니다. 당황한 후배가 실린더 자체가 불량인 것 같다고 했지만, 실제 원인은 실린더 외부, 즉 <strong>설치 불량</strong>이었습니다.</p>
<p class="wp-block-paragraph">실린더가 부품을 밀 때 설계하중(축 방향 하중) 외에 심각한 측면 하중을 받고 있었던 것입니다. 공압 실린더는 유압 실린더와 달리 측면 하중에 매우 취약합니다. 로드(봉)가 하중을 지지하는 용도가 아니라, 오직 피스톤의 직선 운동을 전달하는 용도이기 때문이죠. 로드가 휘어지면서 실린더 튜브 내부의 피스톤과 튜브 벽면 사이가 비정상적으로 마찰하고, 결국 씰이 파손되어 공기가 새고 내부 부품이 고착되는 현상이 발생한 것입니다. 이처럼 실린더의 성능은 구조 자체뿐만 아니라, 주변 기계 구조와의 정밀한 결합 상태에 따라 결정됩니다.</p>
<div style="border-left: 5px solid #3b82f6; background-color: #eff6ff; padding: 20px; margin: 10px 0; display: flex; align-items: center;">
<div style="font-size: 30px; margin-right: 15px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
<div>
        <strong style="color: #1e40af; font-size: 1.1em;">이론: 공압 실린더의 핵심 4요소</strong><br />
        <span style="color: #1e40af;">공압 실린더는 압축 공기의 에너지를 직선 운동으로 변환합니다. 핵심 구성 요소는 <strong>튜브(Tube), 피스톤(Piston), 로드(Rod)</strong>, 그리고 기밀을 유지하는 <strong>패킹(Seal)</strong>입니다. 이 중 하나라도 문제가 생기면 추력 저하와 에어 누설이 발생합니다.</span>
    </div>
</div>
<p class="wp-block-paragraph">
<h2 class="wp-block-heading">2. 자주 묻는 질문</h2>
<h3 class="wp-block-heading">Q. 공압 실린더의 핵심 구성 요소는 무엇이며, 어떤 원리로 움직이나요?</h3>
<p class="wp-block-paragraph">A. 실린더는 공기압 에너지를 기계적 운동 에너지(직선 왕복 운동)로 변환하는 장치입니다. 구조는 보기보다 간단하지만, 정밀한 가공이 필수적입니다. 핵심 구성 요소는 다음 네 가지입니다:</p>
<ul class="wp-block-list">
<li><strong>실린더 튜브:</strong> 피스톤이 왕복 운동을 하는 몸체입니다. 내벽이 매끄럽게 가공되어야 씰의 마모를 줄이고 누설을 방지합니다. 알루미늄이나 스테인리스 강재를 사용하며, 특히 내면은 경면 처리되어 있습니다.</li>
<li><strong>피스톤:</strong> 튜브 내부에서 움직이는 원형 부품입니다. 피스톤 헤드에 장착된 씰이 튜브 내벽과 밀착하여 전진 및 후진 챔버를 분리합니다. 이 챔버 사이에 압력 차이(차압)를 만들어 운동을 유발합니다.</li>
<li><strong>피스톤 로드:</strong> 피스톤의 움직임을 외부로 전달하는 막대기입니다. 일반적으로 강재에 경질 크롬 도금 처리를 하여 내구성과 내식성을 높입니다. 로드의 표면 손상은 곧 씰 손상으로 이어지므로, 표면 상태 유지가 생명입니다.</li>
<li><strong>헤드 및 커버 (Head &amp; Cover):</strong> 튜브의 양쪽 끝을 막고 로드를 지지하는 부품입니다. 특히 로드 측 커버에는 로드 씰과 와이퍼 씰이 장착되어 압력 누설을 방지하고 외부 이물질 유입을 막습니다.</li>
</ul>
<p class="wp-block-paragraph"><strong>작동 원리 (차압 구동):</strong><br />
대부분의 실린더는 양방향 작동 방식입니다. 전진 시에는 로드 측 챔버의 공기를 배출하고, 피스톤 측 챔버에 압축 공기를 공급합니다. 피스톤의 유효 면적 차이 때문에 발생하는 압력 불균형(차압)이 피스톤을 밀어내는 힘, 즉 추력이 됩니다. 후진 시에는 반대로 작동합니다.</p>
<div style="overflow-x: auto;">
<table border="1">
<thead>
<tr>
<th>구분</th>
<th>주요 기능</th>
<th>현장에서의 중요성</th>
</tr>
</thead>
<tbody>
<tr>
<td>피스톤 씰</td>
<td>전진/후진 챔버의 완벽한 분리</td>
<td>내부 누설 방지. 실린더 출력이 떨어지는 주범입니다.</td>
</tr>
<tr>
<td>피스톤 로드 씰</td>
<td>로드를 따라 외부로 공기가 새는 것 방지</td>
<td>외부 누설 방지. 마찰열, 압력, 로드 표면 상태에 의해 수명이 결정됩니다.</td>
</tr>
<tr>
<td>쿠션 기구</td>
<td>행정 끝에서 충격 흡수</td>
<td>소음 감소 및 기계 부품 보호. 적절한 쿠션 밸브 조정이 필수입니다.</td>
</tr>
</tbody>
</table>
</div>
<p class="wp-block-paragraph">실제 현장에서는 이 <a href="https://myengnote.com/linear-seal-selection-design-mechanical-engineering/"><strong>리니어 씰 종류와 설계 적용 실무</strong></a>를 이해하는 것이 실린더 수명 관리에 결정적입니다. 로드 씰이 마모되면 단순히 공기만 새는 것이 아니라, 외부 습기나 먼지가 실린더 내부로 유입되어 피스톤까지 손상시키는 연쇄 반응이 일어납니다.</p>
<h3 class="wp-block-heading">Q. 갑작스러운 실린더 작동 불량이나 공기 누설은 왜 발생하며, 즉시 점검할 곳은 어디인가요?</h3>
<p class="wp-block-paragraph">A. 실린더 고장의 90%는 씰 문제와 로드의 정렬 불량에서 옵니다. 갑자기 실린더 속도가 느려지거나, 행정 거리를 다 채우지 못하고 멈춘다면 다음 세 가지를 반드시 확인해야 합니다.</p>
<div style="border-left: 5px solid #f59e0b; background-color: #fffbeb; padding: 20px; margin: 10px 0; display: flex; align-items: center;">
<div style="font-size: 30px; margin-right: 15px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
<div>
        <strong style="color: #92400e; font-size: 1.1em;">경험/팁: 고장의 80%는 &#8216;수분&#8217;과 &#8216;편하중&#8217;</strong><br />
        <span style="color: #92400e;">실린더 수명 단축의 주범은 에어 라인의 수분 유입과 설치 시 발생하는 편하중(Side Load)입니다. 에어 드라이어 점검은 필수이며, 로드 끝단에 <strong>플로팅 조인트(Floating Joint)</strong>를 설치하면 편심을 보정하여 수명을 2배 이상 늘릴 수 있습니다.</span>
    </div>
</div>
<p class="wp-block-paragraph">
<h4 class="wp-block-heading">1. 압축 공기 품질 및 공급 압력</h4>
<p class="wp-block-paragraph">압축 공기에 수분이나 오일 성분이 너무 많거나, 필터 관리가 안 되어 미세 이물질이 유입되면 씰에 손상을 줍니다. 또한, 실린더가 요구하는 최소 작동 압력이 일정하게 유지되는지 압력 게이지를 통해 확인하세요. 특히 공장 전체 부하가 걸리는 아침 시간에 압력이 순간적으로 떨어지면서 실린더가 원하는 힘을 내지 못하고 주저앉는 경우가 많습니다.</p>
<h4 class="wp-block-heading">2. 로드 씰 주변 외부 누설 점검</h4>
<p class="wp-block-paragraph">실린더 로드가 전진된 상태에서 로드와 커버 접합부 주변에 비눗물을 살짝 뿌려보세요. 거품이 생긴다면 로드 씰이 손상된 것입니다. 씰 손상의 가장 흔한 원인은 다음과 같습니다:</p>
<ul class="wp-block-list">
<li><strong>측면 하중으로 인한 로드 휨:</strong> 로드가 미세하게 휘면 씰이 로드 표면을 따라 균일하게 밀착하지 못하고 한쪽만 집중적으로 마모됩니다.</li>
<li><strong>이물질 유입:</strong> 로드에 붙은 용접 스패터, 먼지, 금속 가루 등이 와이퍼 씰을 뚫고 들어가 로드 씰을 찢거나 긁어냅니다. 정기적으로 로드 표면을 깨끗한 천으로 닦아 관리해 주는 작은 습관이 중요합니다.</li>
</ul>
<h4 class="wp-block-heading">3. 내부 누설 (피스톤 씰) 점검</h4>
<p class="wp-block-paragraph">실린더를 완전히 전진시킨 상태에서, 로드 측 포트(공기 배출구)를 막고 피스톤 측 포트를 대기 상태로 두세요. 만약 피스톤 씰에 손상이 있다면, 피스톤 측 챔버에서 로드 측 챔버로 공기가 새어 나가면서 실린더가 천천히 후진하게 됩니다. 실린더의 추력이 눈에 띄게 약해졌다면 이 내부 누설을 의심해야 합니다.</p>
<div style="overflow-x: auto; white-space: nowrap;">
<table style="border-collapse: collapse; width: 100%; min-width: 600px; font-size: 14px; text-align: left;">
<thead>
<tr style="background-color: #f3f4f6; border-bottom: 2px solid #374151;">
<th style="padding: 12px; font-weight: bold; color: #111827;">고장 증상 (Symptom)</th>
<th style="padding: 12px; font-weight: bold; color: #111827;">예상 원인 (Cause)</th>
<th style="padding: 12px; font-weight: bold; color: #111827;">점검 및 조치 방법 (Solution)</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #e5e7eb;">
<td style="padding: 10px; color: #374151; font-weight: bold;">작동 안 함 / 움직임 느림</td>
<td style="padding: 10px; color: #4b5563;">공급 압력 부족, 밸브 고착</td>
<td style="padding: 10px; color: #6b7280;">레귤레이터 설정압 확인 (0.4~0.5MPa), 배관 꺾임 체크</td>
</tr>
<tr style="border-bottom: 1px solid #e5e7eb; background-color: #f9fafb;">
<td style="padding: 10px; color: #374151; font-weight: bold;">로드 측 에어 누설</td>
<td style="padding: 10px; color: #4b5563;">로드 패킹(Rod Seal) 마모</td>
<td style="padding: 10px; color: #6b7280;">편하중 여부 확인 후 패킹 교체, 플로팅 조인트 설치</td>
</tr>
<tr style="border-bottom: 1px solid #e5e7eb;">
<td style="padding: 10px; color: #374151; font-weight: bold;">저킹 (Stick-Slip) 현상</td>
<td style="padding: 10px; color: #4b5563;">윤활 부족, 내부 마찰 증대</td>
<td style="padding: 10px; color: #6b7280;">그리스(Grease) 도포 상태 확인, 속도 제어 밸브 조절</td>
</tr>
<tr style="border-bottom: 1px solid #e5e7eb; background-color: #f9fafb;">
<td style="padding: 10px; color: #374151; font-weight: bold;">말단 충격음 발생</td>
<td style="padding: 10px; color: #4b5563;">쿠션 설정 불량</td>
<td style="padding: 10px; color: #6b7280;">쿠션 니들(Needle)을 시계 방향으로 돌려 감속 구간 확보</td>
</tr>
</tbody>
</table>
</div>
<h3 class="wp-block-heading">Q. 실린더 수명 연장을 위한 설치 및 사양 선정 시 현장 전문가의 팁은 무엇인가요?</h3>
<p class="wp-block-paragraph">A. 실린더는 소모품이지만, 제대로 설치하고 선정하면 설계 수명의 2~3배 이상 사용할 수 있습니다. 제가 항상 강조하는 현장 팁은 세 가지입니다.</p>
<h4 class="wp-block-heading">1. 정밀한 정렬과 외부 가이드 사용</h4>
<p class="wp-block-paragraph">앞서 이야기했듯이, 실린더의 적(敵)은 측면 하중입니다. 부하가 실린더 중심축과 일치하도록 정렬해야 합니다. 만약 부득이하게 편심 하중이나 측면 하중이 가해진다면, 반드시 외부 가이드 장치(예: 리니어 부쉬 가이드, 리니어 슬라이드)를 사용하여 실린더 로드가 오직 축 방향 하중만 받도록 보호해야 합니다. 가이드를 사용할 때 실린더와 가이드의 설치 면이 수평 및 수직 방향으로 <strong><a href="https://myengnote.com/dimensional-tolerance-iso-it-grade-selection-guide/">치수 공차 ISO IT 등급표 선정 기준 해설</a></strong>에 따라 정밀하게 일치하는지 확인해야 합니다. 아주 미세한 뒤틀림도 로드에 부담을 줍니다.</p>
<h4 class="wp-block-heading">2. 쿠션 밸브의 적절한 조정 (완충 기능)</h4>
<p class="wp-block-paragraph">실린더가 행정 끝에 도달할 때 충격이 크면 소음과 진동뿐만 아니라 피스톤, 커버, 마운팅 부품에 구조적인 스트레스를 줍니다. 공압 실린더에는 충격 완화를 위한 쿠션 밸브가 달려 있습니다. 이 밸브를 너무 꽉 조이면 끝단 속도가 너무 느려져 사이클 타임이 길어지고, 너무 느슨하게 풀면 &#8216;쿵&#8217; 하는 큰 충격이 발생합니다.</p>
<p class="wp-block-paragraph"><strong>조정 팁:</strong> 쿠션 밸브를 완전히 잠근 상태에서(가장 느리게) 시작하여, 실린더가 행정 끝에서 부드럽게 감속하면서도 사이클 타임에 지장을 주지 않는 최적의 지점까지 미세하게 풀어주세요. 특히 고속 작동이 필요한 실린더의 경우, <strong>ISO 15552 (KS B 6151)</strong> 규격에 맞는 고성능 실린더를 선정하는 것도 중요합니다.</p>
<h4 class="wp-block-heading">3. 급유 시스템 점검</h4>
<p class="wp-block-paragraph">최신 실린더는 대부분 불필요한 급유가 필요 없는 무급유형으로 나오지만, 이는 최초 제작 시 씰과 튜브 내벽에 그리스가 도포되어 있기 때문입니다. 만약 실린더를 분해 수리했거나, 오랜 기간 사용했다면, 압축 공기 라인에 루브리케이터(Lubricator, 급유 장치)를 설치하여 정제된 미세 오일 미스트를 공급해 주는 것이 수명 연장에 도움이 됩니다. 단, 무급유 사양 실린더에 오일을 주입하기 시작했다면, 오일 공급을 중단해서는 안 됩니다. 씰이 부풀어 오르거나 마모 패턴이 바뀌어 오히려 고장을 유발할 수 있기 때문입니다.</p>
<p><a href="https://myengnote.com/bolt-loosening-prevention-nut-prevailing-wedge-ks-iso-guide/" style="display: block; text-decoration: none; color: inherit; background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 20px; margin: 10px 0; transition: box-shadow 0.2s; display: flex; justify-content: space-between; align-items: center;"></p>
<div style="display: flex; align-items: center;">
<div style="font-size: 30px; margin-right: 15px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
<div style="display: flex; flex-direction: column;">
            <span style="font-size: 0.9em; color: #6b7280; margin-bottom: 4px;">관련 트러블슈팅</span><br />
            <strong style="font-size: 1.1em; color: #111827;">진동에 강한 와셔 선택과 볼트 풀림 방지 기술 보기</strong>
        </div>
</p></div>
<div style="color: #3b82f6; font-size: 24px; font-weight: bold;">&rarr;</div>
<p></a></p>
<p class="wp-block-paragraph">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="625" src="https://myengnote.com/wp-content/uploads/2026/01/Gemini_Generated_Image_mc1dj0mc1dj0mc1d-1024x625.jpg" alt="공압 실린더 단면도" class="wp-image-980" srcset="https://myengnote.com/wp-content/uploads/2026/01/Gemini_Generated_Image_mc1dj0mc1dj0mc1d-1024x625.jpg 1024w, https://myengnote.com/wp-content/uploads/2026/01/Gemini_Generated_Image_mc1dj0mc1dj0mc1d-300x183.jpg 300w, https://myengnote.com/wp-content/uploads/2026/01/Gemini_Generated_Image_mc1dj0mc1dj0mc1d-768x468.jpg 768w, https://myengnote.com/wp-content/uploads/2026/01/Gemini_Generated_Image_mc1dj0mc1dj0mc1d-1536x937.jpg 1536w, https://myengnote.com/wp-content/uploads/2026/01/Gemini_Generated_Image_mc1dj0mc1dj0mc1d.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p class="wp-block-paragraph">
<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 마치며</h3>
<p class="wp-block-paragraph">공압 실린더는 구조가 단순해 보이지만, 기계 요소, 재료 공학, 유체 역학이 결합된 정밀 부품입니다. 실린더 고장을 줄이는 핵심은 &#8216;측면 하중 제로화&#8217;와 &#8216;깨끗하고 안정적인 공기 공급&#8217;입니다. 신규 설비 설치 시에는 실린더 로드와 부하의 축 정렬 상태를 반드시 확인하고, 일상 점검 시에는 로드 표면의 미세한 흠집이나 씰 주변의 누설 여부를 놓치지 마세요. 이 두 가지만 철저히 관리해도 실린더 관련 트러블 슈팅 시간의 절반 이상을 줄일 수 있을 것입니다. 현장에서 늘 안전하고 효율적인 작업 되시길 바랍니다.</p>
<h2 class="wp-block-heading">0. 연관글</h2>
<ul class="wp-block-list">
<li>실린더 성능 저하의 숨은 주범, 누설 방지 씰의 모든 것: <a href="https://myengnote.com/hydraulic-cylinder-rod-seal-groove-design-material-selection/">유압 실린더 로드 씰의 완벽한 밀봉을 위한 홈 설계 기준 및 재질 선정 지침</a></li>
<li>공압 시스템의 효율을 떨어뜨리는 압력 문제를 이해하려면: <a href="https://myengnote.com/bernoulli-equation-pressure-velocity-guide/">베르누이 방정식: 압력-속도 해설</a></li>
</ul>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<p class="has-text-align-center wp-block-paragraph">
    본 콘텐츠는 저작권법의 보호를 받으며, 무단 전재 및 재배포를 금지합니다.<br />
    Copyright 2026. 동동 All rights reserved.
</p>
<p class="wp-block-paragraph"><script><br />
document.addEventListener('contextmenu', function(e) {<br />
    e.preventDefault();<br />
    alert('이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.');<br />
});<br />
document.addEventListener('keydown', function(e) {<br />
    if (e.ctrlKey && (e.key === 'c' || e.key === 'u' || e.key === 'a')) {<br />
        e.preventDefault();<br />
        alert('무단 복제를 금지합니다.');<br />
    }<br />
});<br />
</script></p>
<style>
.entry-content {<br />
    -webkit-user-select: none;<br />
    -moz-user-select: none;<br />
    -ms-user-select: none;<br />
    user-select: none;<br />
}<br />
</style>
<p><!-- START_SIMULATOR_LINK_CARD_pneumatic_cylinder --><a href="https://myengnote.com/pneumatic-cylinder-air-consumption-force-calculator/" target="_blank" rel="noopener noreferrer" class="eng-simulator-card" style="text-decoration: none; background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); padding: 15px; margin: 10px 0; transition: box-shadow 0.2s; display: table; width: 100%; box-sizing: border-box;"><span style="display: table-cell; vertical-align: middle;"><span style="font-size: 30px; margin-right: 15px; float: left;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ee.png" alt="🧮" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span style="display: block; overflow: hidden;"><span style="display: block; font-size: 0.9em; color: #10b981; font-weight: bold; margin-bottom: 4px;">실시간 공학 시뮬레이터 추천</span><span style="display: block; font-size: 1.1em; font-weight: bold; color: #111827;">공압 실린더 공기 소비량 계산기 &#038; 실시간 2D 물리 시뮬레이터</span></span></span><span style="display: table-cell; vertical-align: middle; width: 40px; text-align: right; color: #10b981; font-size: 24px; font-weight: bold;">→</span></a><!-- END_SIMULATOR_LINK_CARD_pneumatic_cylinder --></p>
]]></content:encoded>
					
					<wfw:commentRss>https://myengnote.com/pneumatic-cylinder-structure-troubleshooting-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
