{
  "$schema": "https://motion.metatwinmaker.com/twins.schema.json",
  "schemaVersion": 1,
  "site": {
    "id": "motion",
    "name": "MotionMeta",
    "url": "https://motion.metatwinmaker.com",
    "parent": "https://metatwinmaker.com",
    "domain": "Motion control",
    "focus": "Logix integrated motion: servo axes, coordinated motion, camming and gearing, robot and CNC control, taught on machines you can run, break and fix in the browser.",
    "notice": "MotionMeta is not affiliated with Rockwell Automation. Its machines are look-alikes; no maker's product is modelled.",
    "units": "SI",
    "environment": {
      "name": "Lab hall",
      "description": "An 18 by 12 m lab hall with every twin at its own station; visitors walk it in first person and step up to a station to use it.",
      "url": "https://motion.metatwinmaker.com/bench/walk",
      "model": "https://motion.metatwinmaker.com/models/lab_hall.glb",
      "triangles": 11660,
      "coordinates": "Metres on the floor plan: x to the right, z towards the front wall."
    },
    "sections": [
      {
        "id": "academy",
        "name": "Academy",
        "url": "https://motion.metatwinmaker.com/academy",
        "description": "Lessons run on the bench."
      },
      {
        "id": "support",
        "name": "Support",
        "url": "https://motion.metatwinmaker.com/support",
        "description": "A fault lookup with causes, checks and reproductions."
      },
      {
        "id": "museum",
        "name": "Museum",
        "url": "https://motion.metatwinmaker.com/museum",
        "description": "A sourced timeline of motion control hardware."
      },
      {
        "id": "rooms",
        "name": "Rooms",
        "url": "https://motion.metatwinmaker.com/rooms",
        "description": "Shared sessions where an instructor drives and a class follows."
      }
    ],
    "features": [
      "Every twin runs live in the browser, with no install.",
      "Troubleshooting scenarios: run a test, try fixes, test again.",
      "Trends with command and actual, one measure per panel.",
      "Walk the hall in first person.",
      "Record any station as an MP4."
    ]
  },
  "vocabulary": {
    "categories": [
      {
        "id": "motion-trainer",
        "label": "Motion trainer",
        "description": "A teaching rig built to show one or two servo axes on their own: tuning, moves, faults."
      },
      {
        "id": "process-machine",
        "label": "Process machine",
        "description": "A machine that transforms material continuously or in batches: casting, winding, forming."
      },
      {
        "id": "machine-tool",
        "label": "Machine tool",
        "description": "A machine that cuts metal to a drawing under a part program: mills and lathes."
      },
      {
        "id": "assembly",
        "label": "Assembly",
        "description": "A station that joins parts: pressing, inserting, fastening, with checks."
      },
      {
        "id": "material-handling",
        "label": "Material handling",
        "description": "Moving products between processes: conveyors, independent cart tracks, transfers."
      },
      {
        "id": "robotics",
        "label": "Robotics",
        "description": "Articulated arms and their cells, programmed as coordinated motion."
      },
      {
        "id": "intralogistics",
        "label": "Intralogistics",
        "description": "Storing and moving goods inside a plant: mobile robots, storage and retrieval."
      },
      {
        "id": "production-line",
        "label": "Production line",
        "description": "Several machines joined by conveyors and transport into one line, run end to end from raw part to stored goods."
      }
    ],
    "industries": [
      {
        "id": "general-manufacturing",
        "label": "General manufacturing",
        "description": "Discrete manufacturing of any kind."
      },
      {
        "id": "automotive",
        "label": "Automotive",
        "description": "Vehicle and component manufacturing."
      },
      {
        "id": "aerospace",
        "label": "Aerospace",
        "description": "Aircraft, space and defence structures."
      },
      {
        "id": "metals",
        "label": "Metals",
        "description": "Melting, casting and primary metal processing."
      },
      {
        "id": "packaging-consumer",
        "label": "Packaging and consumer goods",
        "description": "Packaging lines, food and beverage, and consumer products."
      },
      {
        "id": "electronics",
        "label": "Electronics",
        "description": "Electronics and electrical assembly."
      },
      {
        "id": "warehousing-logistics",
        "label": "Warehousing and logistics",
        "description": "Distribution centres, stores and in-plant logistics."
      },
      {
        "id": "energy",
        "label": "Energy",
        "description": "Energy equipment, including pressure vessels for hydrogen and gas storage."
      },
      {
        "id": "machining-job-shop",
        "label": "Machining and job shops",
        "description": "Contract and in-house machining of metal parts."
      }
    ],
    "concepts": [
      {
        "id": "point-to-point",
        "label": "Point-to-point moves",
        "description": "Moving an axis from rest to a target and stopping there (MAM)."
      },
      {
        "id": "s-curve",
        "label": "S-curve and trapezoidal profiles",
        "description": "Limiting speed, acceleration and jerk on a move, and what each costs in time."
      },
      {
        "id": "jog-home",
        "label": "Jogging and homing",
        "description": "Moving an axis by hand and establishing its position reference."
      },
      {
        "id": "servo-tuning",
        "label": "Servo loop tuning",
        "description": "Position, velocity and torque loop gains, bandwidth and filters, and their stability."
      },
      {
        "id": "feedforward",
        "label": "Feedforward",
        "description": "Velocity and acceleration feedforward that remove the following error a loop leaves."
      },
      {
        "id": "following-error",
        "label": "Following error",
        "description": "The gap between the commanded and actual position, and the faults it trips."
      },
      {
        "id": "inertia-mismatch",
        "label": "Load inertia and mismatch",
        "description": "What changes when the load's inertia or mass differs from what the drive assumes."
      },
      {
        "id": "backlash-compliance",
        "label": "Backlash and compliance",
        "description": "Gearbox dead zones, shaft and belt stiffness, resonance and load feedback."
      },
      {
        "id": "vibration-resonance",
        "label": "Vibration and resonance",
        "description": "Mechanical resonances, sway and chatter, and how motion profiles and filters excite or avoid them."
      },
      {
        "id": "electronic-gearing",
        "label": "Electronic gearing",
        "description": "Locking one axis to another at a ratio (MAG), as in threading."
      },
      {
        "id": "electronic-camming",
        "label": "Electronic camming",
        "description": "Following a master axis through a cam profile (MAPC), as in winding."
      },
      {
        "id": "coordinated-motion",
        "label": "Coordinated motion",
        "description": "Several axes moving together on one path: linear and circular moves (MCLM, MCCM), blending."
      },
      {
        "id": "robot-kinematics",
        "label": "Robot kinematics",
        "description": "Transforming between joint and Cartesian coordinates (MCTO), frames and tool offsets."
      },
      {
        "id": "conveyor-tracking",
        "label": "Conveyor tracking",
        "description": "Following a moving target, such as a part on a belt (MDCC)."
      },
      {
        "id": "independent-cart",
        "label": "Independent cart technology",
        "description": "Many movers on one track of linear motor segments: handoffs, spacing, switches, IDs."
      },
      {
        "id": "vision-guidance",
        "label": "Vision guidance",
        "description": "A camera finding parts for a robot, and pairing each with where the conveyor was when it fired."
      },
      {
        "id": "cnc-programming",
        "label": "CNC part programs",
        "description": "G-code part programs run as coordinated motion: offsets, compensation, canned cycles."
      },
      {
        "id": "spindle-control",
        "label": "Spindle control",
        "description": "Spindle speed, load, constant surface speed (G96) and its clamp (G50)."
      },
      {
        "id": "tension-control",
        "label": "Tension control",
        "description": "Keeping web or fibre tension with a dancer, a PI loop and feedforward."
      },
      {
        "id": "force-control",
        "label": "Force and press-fit control",
        "description": "Pressing to a position or a force, force–distance signatures and frame stretch."
      },
      {
        "id": "multi-axis-sequencing",
        "label": "Multi-axis sequencing",
        "description": "A PLC stepping several axes through a cycle, with handshakes and interlocks."
      },
      {
        "id": "mobile-navigation",
        "label": "Mobile navigation",
        "description": "Path planning, path following, docking and fleet dispatch for mobile robots."
      },
      {
        "id": "feedback-devices",
        "label": "Feedback devices",
        "description": "Motor and load encoders, laser distance sensors, and what happens when they drop out."
      },
      {
        "id": "fault-diagnosis",
        "label": "Fault diagnosis",
        "description": "Reading a fault and its trend back to a cause, and the reset that clears it."
      },
      {
        "id": "tool-compensation",
        "label": "Tool compensation",
        "description": "Tool length and nose radius offsets, and wear offsets."
      },
      {
        "id": "process-quality",
        "label": "Process quality",
        "description": "Measuring the product against its specification and tracing defects to the motion."
      },
      {
        "id": "line-performance",
        "label": "Line throughput and OEE",
        "description": "How a line of machines runs as one: its bottleneck, the buffers between machines, starved and held-up machines, first-out alarms and OEE."
      }
    ],
    "safety": [
      {
        "id": "light-curtain",
        "label": "Light curtain",
        "description": "An optical guard that stops hazardous motion when broken."
      },
      {
        "id": "door-interlock",
        "label": "Door interlock",
        "description": "A guard door that holds the spindle and axes while it is open."
      },
      {
        "id": "laser-scanner",
        "label": "Safety laser scanner",
        "description": "Warning and protective fields that slow and stop a mobile robot."
      },
      {
        "id": "safe-stop",
        "label": "Stop categories",
        "description": "Controlled and uncontrolled stops, and what a fault does to the drive."
      },
      {
        "id": "overtravel",
        "label": "Overtravel limits",
        "description": "Hardware and software limits at the ends of an axis's travel."
      }
    ],
    "audiences": [
      {
        "id": "maintenance-technician",
        "label": "Maintenance technician",
        "description": "Keeps machines running: reads faults, swaps parts, restores settings."
      },
      {
        "id": "controls-engineer",
        "label": "Controls engineer",
        "description": "Writes and commissions PLC and motion programs."
      },
      {
        "id": "machine-builder",
        "label": "Machine builder",
        "description": "Designs machines and chooses their motion architecture."
      },
      {
        "id": "student",
        "label": "Student",
        "description": "Learning motion control for the first time."
      },
      {
        "id": "process-engineer",
        "label": "Process engineer",
        "description": "Owns a process's quality and throughput."
      }
    ],
    "instructions": [
      {
        "id": "MSO",
        "label": "Motion Servo On",
        "description": "Enables an axis's drive and closes its loops."
      },
      {
        "id": "MSF",
        "label": "Motion Servo Off",
        "description": "Disables an axis's drive."
      },
      {
        "id": "MAS",
        "label": "Motion Axis Stop",
        "description": "Stops an axis's motion with a set deceleration."
      },
      {
        "id": "MAH",
        "label": "Motion Axis Home",
        "description": "Homes an axis to set its position reference."
      },
      {
        "id": "MAJ",
        "label": "Motion Axis Jog",
        "description": "Runs an axis at a speed until stopped."
      },
      {
        "id": "MAM",
        "label": "Motion Axis Move",
        "description": "Moves an axis to a position, absolute or incremental."
      },
      {
        "id": "MAG",
        "label": "Motion Axis Gear",
        "description": "Gears a slave axis to a master at a ratio."
      },
      {
        "id": "MAPC",
        "label": "Motion Axis Position Cam",
        "description": "Cams a slave axis to a master's position through a cam profile."
      },
      {
        "id": "MAFR",
        "label": "Motion Axis Fault Reset",
        "description": "Clears an axis's faults."
      },
      {
        "id": "MCLM",
        "label": "Motion Coordinated Linear Move",
        "description": "Moves a coordinate system's axes on a straight line, with termination types for blending."
      },
      {
        "id": "MCCM",
        "label": "Motion Coordinated Circular Move",
        "description": "Moves a coordinate system's axes on an arc."
      },
      {
        "id": "MCS",
        "label": "Motion Coordinated Stop",
        "description": "Stops a coordinate system's motion."
      },
      {
        "id": "MCTO",
        "label": "Motion Coordinated Transform with Orientation",
        "description": "Links a Cartesian coordinate system to a robot's joints through its kinematics."
      },
      {
        "id": "MAR",
        "label": "Motion Arm Registration",
        "description": "Arms an axis to latch its position when a registration input fires, as a camera's trigger."
      },
      {
        "id": "MCTP",
        "label": "Motion Calculate Transform Position",
        "description": "Works out one coordinate system's position from another's through a transform."
      },
      {
        "id": "MDCC",
        "label": "Master Driven Coordinated Control",
        "description": "Drives a coordinate system's moves from a moving master axis, for conveyor tracking."
      }
    ],
    "levels": [
      {
        "id": "introductory",
        "label": "Introductory",
        "description": "No motion background needed."
      },
      {
        "id": "intermediate",
        "label": "Intermediate",
        "description": "Knows what a servo axis and a trend are."
      },
      {
        "id": "advanced",
        "label": "Advanced",
        "description": "Commissions or maintains multi-axis machines."
      }
    ]
  },
  "jev": {
    "about": "Ready for Jev (TypeSafe AI). To classify a twin, send `api.model`, the twin's `jev.state` as `state` and these `questions`; Jev answers under the same keys. Each twin's `jev.expected` holds the answers its own tags give, to check Jev's against: an option id for the choice, the level's index for the score, true or false for each noul (compare with the noul's probability). Keys are `<facet>_<id>`, hyphens as underscores.",
    "api": {
      "endpoint": "https://api.typesafe.ai/v1/systemone",
      "method": "POST",
      "model": "jev-latest",
      "docs": "https://docs.typesafe.ai/api",
      "cloudflareAiGateway": {
        "endpoint": "https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/custom-{slug}/v1/systemone",
        "providerBaseUrl": "https://api.typesafe.ai",
        "headers": {
          "Authorization": "Bearer {TypeSafe API key}",
          "cf-aig-authorization": "Bearer {AI Gateway token}, on an authenticated gateway"
        },
        "docs": "https://developers.cloudflare.com/ai-gateway/configuration/custom-providers/"
      }
    },
    "questions": {
      "category": {
        "type": "choice",
        "instructions": "Which category of machine is the digital twin in the state?",
        "criteria": {
          "motion-trainer": "Motion trainer: A teaching rig built to show one or two servo axes on their own: tuning, moves, faults.",
          "process-machine": "Process machine: A machine that transforms material continuously or in batches: casting, winding, forming.",
          "machine-tool": "Machine tool: A machine that cuts metal to a drawing under a part program: mills and lathes.",
          "assembly": "Assembly: A station that joins parts: pressing, inserting, fastening, with checks.",
          "material-handling": "Material handling: Moving products between processes: conveyors, independent cart tracks, transfers.",
          "robotics": "Robotics: Articulated arms and their cells, programmed as coordinated motion.",
          "intralogistics": "Intralogistics: Storing and moving goods inside a plant: mobile robots, storage and retrieval.",
          "production-line": "Production line: Several machines joined by conveyors and transport into one line, run end to end from raw part to stored goods."
        }
      },
      "level": {
        "type": "score",
        "instructions": "How much motion control background does a visitor need to use the twin in the state?",
        "criteria": [
          "Introductory: No motion background needed.",
          "Intermediate: Knows what a servo axis and a trend are.",
          "Advanced: Commissions or maintains multi-axis machines."
        ]
      },
      "industry_general_manufacturing": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in general manufacturing (Discrete manufacturing of any kind.)?"
      },
      "industry_automotive": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in automotive (Vehicle and component manufacturing.)?"
      },
      "industry_aerospace": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in aerospace (Aircraft, space and defence structures.)?"
      },
      "industry_metals": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in metals (Melting, casting and primary metal processing.)?"
      },
      "industry_packaging_consumer": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in packaging and consumer goods (Packaging lines, food and beverage, and consumer products.)?"
      },
      "industry_electronics": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in electronics (Electronics and electrical assembly.)?"
      },
      "industry_warehousing_logistics": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in warehousing and logistics (Distribution centres, stores and in-plant logistics.)?"
      },
      "industry_energy": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in energy (Energy equipment, including pressure vessels for hydrogen and gas storage.)?"
      },
      "industry_machining_job_shop": {
        "type": "noul",
        "instructions": "Are machines like the one in the state used in machining and job shops (Contract and in-house machining of metal parts.)?"
      },
      "concept_point_to_point": {
        "type": "noul",
        "instructions": "Does the twin in the state teach point-to-point moves? Moving an axis from rest to a target and stopping there (MAM)."
      },
      "concept_s_curve": {
        "type": "noul",
        "instructions": "Does the twin in the state teach s-curve and trapezoidal profiles? Limiting speed, acceleration and jerk on a move, and what each costs in time."
      },
      "concept_jog_home": {
        "type": "noul",
        "instructions": "Does the twin in the state teach jogging and homing? Moving an axis by hand and establishing its position reference."
      },
      "concept_servo_tuning": {
        "type": "noul",
        "instructions": "Does the twin in the state teach servo loop tuning? Position, velocity and torque loop gains, bandwidth and filters, and their stability."
      },
      "concept_feedforward": {
        "type": "noul",
        "instructions": "Does the twin in the state teach feedforward? Velocity and acceleration feedforward that remove the following error a loop leaves."
      },
      "concept_following_error": {
        "type": "noul",
        "instructions": "Does the twin in the state teach following error? The gap between the commanded and actual position, and the faults it trips."
      },
      "concept_inertia_mismatch": {
        "type": "noul",
        "instructions": "Does the twin in the state teach load inertia and mismatch? What changes when the load's inertia or mass differs from what the drive assumes."
      },
      "concept_backlash_compliance": {
        "type": "noul",
        "instructions": "Does the twin in the state teach backlash and compliance? Gearbox dead zones, shaft and belt stiffness, resonance and load feedback."
      },
      "concept_vibration_resonance": {
        "type": "noul",
        "instructions": "Does the twin in the state teach vibration and resonance? Mechanical resonances, sway and chatter, and how motion profiles and filters excite or avoid them."
      },
      "concept_electronic_gearing": {
        "type": "noul",
        "instructions": "Does the twin in the state teach electronic gearing? Locking one axis to another at a ratio (MAG), as in threading."
      },
      "concept_electronic_camming": {
        "type": "noul",
        "instructions": "Does the twin in the state teach electronic camming? Following a master axis through a cam profile (MAPC), as in winding."
      },
      "concept_coordinated_motion": {
        "type": "noul",
        "instructions": "Does the twin in the state teach coordinated motion? Several axes moving together on one path: linear and circular moves (MCLM, MCCM), blending."
      },
      "concept_robot_kinematics": {
        "type": "noul",
        "instructions": "Does the twin in the state teach robot kinematics? Transforming between joint and Cartesian coordinates (MCTO), frames and tool offsets."
      },
      "concept_conveyor_tracking": {
        "type": "noul",
        "instructions": "Does the twin in the state teach conveyor tracking? Following a moving target, such as a part on a belt (MDCC)."
      },
      "concept_independent_cart": {
        "type": "noul",
        "instructions": "Does the twin in the state teach independent cart technology? Many movers on one track of linear motor segments: handoffs, spacing, switches, IDs."
      },
      "concept_vision_guidance": {
        "type": "noul",
        "instructions": "Does the twin in the state teach vision guidance? A camera finding parts for a robot, and pairing each with where the conveyor was when it fired."
      },
      "concept_cnc_programming": {
        "type": "noul",
        "instructions": "Does the twin in the state teach cnc part programs? G-code part programs run as coordinated motion: offsets, compensation, canned cycles."
      },
      "concept_spindle_control": {
        "type": "noul",
        "instructions": "Does the twin in the state teach spindle control? Spindle speed, load, constant surface speed (G96) and its clamp (G50)."
      },
      "concept_tension_control": {
        "type": "noul",
        "instructions": "Does the twin in the state teach tension control? Keeping web or fibre tension with a dancer, a PI loop and feedforward."
      },
      "concept_force_control": {
        "type": "noul",
        "instructions": "Does the twin in the state teach force and press-fit control? Pressing to a position or a force, force–distance signatures and frame stretch."
      },
      "concept_multi_axis_sequencing": {
        "type": "noul",
        "instructions": "Does the twin in the state teach multi-axis sequencing? A PLC stepping several axes through a cycle, with handshakes and interlocks."
      },
      "concept_mobile_navigation": {
        "type": "noul",
        "instructions": "Does the twin in the state teach mobile navigation? Path planning, path following, docking and fleet dispatch for mobile robots."
      },
      "concept_feedback_devices": {
        "type": "noul",
        "instructions": "Does the twin in the state teach feedback devices? Motor and load encoders, laser distance sensors, and what happens when they drop out."
      },
      "concept_fault_diagnosis": {
        "type": "noul",
        "instructions": "Does the twin in the state teach fault diagnosis? Reading a fault and its trend back to a cause, and the reset that clears it."
      },
      "concept_tool_compensation": {
        "type": "noul",
        "instructions": "Does the twin in the state teach tool compensation? Tool length and nose radius offsets, and wear offsets."
      },
      "concept_process_quality": {
        "type": "noul",
        "instructions": "Does the twin in the state teach process quality? Measuring the product against its specification and tracing defects to the motion."
      },
      "concept_line_performance": {
        "type": "noul",
        "instructions": "Does the twin in the state teach line throughput and oee? How a line of machines runs as one: its bottleneck, the buffers between machines, starved and held-up machines, first-out alarms and OEE."
      },
      "safety_light_curtain": {
        "type": "noul",
        "instructions": "Does the twin in the state have a light curtain? An optical guard that stops hazardous motion when broken."
      },
      "safety_door_interlock": {
        "type": "noul",
        "instructions": "Does the twin in the state have a door interlock? A guard door that holds the spindle and axes while it is open."
      },
      "safety_laser_scanner": {
        "type": "noul",
        "instructions": "Does the twin in the state have a safety laser scanner? Warning and protective fields that slow and stop a mobile robot."
      },
      "safety_safe_stop": {
        "type": "noul",
        "instructions": "Does the twin in the state have a stop categories? Controlled and uncontrolled stops, and what a fault does to the drive."
      },
      "safety_overtravel": {
        "type": "noul",
        "instructions": "Does the twin in the state have a overtravel limits? Hardware and software limits at the ends of an axis's travel."
      },
      "audience_maintenance_technician": {
        "type": "noul",
        "instructions": "Is the twin in the state useful to a maintenance technician? Keeps machines running: reads faults, swaps parts, restores settings."
      },
      "audience_controls_engineer": {
        "type": "noul",
        "instructions": "Is the twin in the state useful to a controls engineer? Writes and commissions PLC and motion programs."
      },
      "audience_machine_builder": {
        "type": "noul",
        "instructions": "Is the twin in the state useful to a machine builder? Designs machines and chooses their motion architecture."
      },
      "audience_student": {
        "type": "noul",
        "instructions": "Is the twin in the state useful to a student? Learning motion control for the first time."
      },
      "audience_process_engineer": {
        "type": "noul",
        "instructions": "Is the twin in the state useful to a process engineer? Owns a process's quality and throughput."
      }
    }
  },
  "twins": [
    {
      "id": "bench",
      "station": 1,
      "name": "Single-axis servo bench",
      "url": "https://motion.metatwinmaker.com/bench/overview",
      "summary": "One servo axis driving a ballscrew carriage: tune it, move it, fault it and reset it.",
      "description": "A teaching bench with a servo drive, a motor and a ballscrew carrying a carriage between two limit switches. The visitor enables the axis, jogs, homes and moves it, tunes its position and velocity loops with feedforward while watching command against actual, and reproduces faults such as excessive position error and overtravel to see the stop and the reset. Its physics and drive cascade run in the site's deterministic motion engine, and the Academy's lessons and the fault kiosk run on it.",
      "machine": {
        "class": "Single-axis servo trainer",
        "lookAlike": true,
        "workpiece": "None: a carriage on a ballscrew.",
        "control": "A Logix controller with integrated motion on servo drives: one axis, commanded by Motion Direct Commands.",
        "axes": [
          {
            "name": "Axis",
            "kind": "linear",
            "actuator": "Servo motor through a coupling and a ballscrew",
            "role": "Moves the carriage"
          }
        ]
      },
      "classification": {
        "category": "motion-trainer",
        "industries": ["general-manufacturing"],
        "concepts": [
          "point-to-point",
          "s-curve",
          "jog-home",
          "servo-tuning",
          "feedforward",
          "following-error",
          "fault-diagnosis"
        ],
        "instructions": ["MSO", "MSF", "MAJ", "MAM", "MAS", "MAH", "MAG", "MAFR"],
        "safety": ["overtravel", "safe-stop"],
        "audiences": ["student", "maintenance-technician", "controls-engineer"],
        "level": "introductory",
        "keywords": ["ballscrew", "servo drive", "tuning", "bandwidth", "trend", "lesson"]
      },
      "views": [
        {
          "id": "overview",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/bench/overview"
        },
        {
          "id": "drive",
          "label": "Drive close-up",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/bench/drive"
        },
        {
          "id": "carriage",
          "label": "Follow carriage",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/bench/carriage"
        },
        {
          "id": "screen",
          "label": "Screen",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/bench/screen"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/bench/walk"
        }
      ],
      "scenarios": [],
      "trends": [
        {
          "title": "Position",
          "unit": "m",
          "series": ["Command", "Actual"]
        },
        {
          "title": "Velocity",
          "unit": "m/s",
          "series": ["Command", "Actual"]
        },
        {
          "title": "Torque",
          "unit": "N·m",
          "series": ["Reference", "Applied"]
        },
        {
          "title": "Position error",
          "unit": "mm",
          "series": ["Error"]
        }
      ],
      "lessons": [
        {
          "id": "velocity-loop-tuning",
          "title": "Following error, bandwidth and feedforward",
          "summary": "Watch the position error during a move, raise the position loop bandwidth to shrink it, then remove most of what is left with velocity feedforward.",
          "minutes": 6,
          "track": "tuning",
          "url": "https://motion.metatwinmaker.com/academy/velocity-loop-tuning"
        }
      ],
      "faults": [
        {
          "id": "ExcessivePositionError",
          "title": "Excessive position error",
          "category": "axis",
          "url": "https://motion.metatwinmaker.com/support/fault/ExcessivePositionError"
        },
        {
          "id": "FeedbackLoss",
          "title": "Feedback loss",
          "category": "feedback",
          "url": "https://motion.metatwinmaker.com/support/fault/FeedbackLoss"
        },
        {
          "id": "Overtravel",
          "title": "Hardware overtravel",
          "category": "axis",
          "url": "https://motion.metatwinmaker.com/support/fault/Overtravel"
        },
        {
          "id": "SoftOvertravel",
          "title": "Software overtravel",
          "category": "axis",
          "url": "https://motion.metatwinmaker.com/support/fault/SoftOvertravel"
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/bench.glb",
        "manifest": "https://motion.metatwinmaker.com/models/bench.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 16896,
        "joints": [
          {
            "node": "AXIS_x_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_x_rot",
            "kind": "rotary"
          }
        ]
      },
      "hall": {
        "x": 0,
        "z": 1.14,
        "walkUrl": "https://motion.metatwinmaker.com/bench/walk"
      },
      "buildGuide": "https://motion.metatwinmaker.com/build/bench",
      "simulation": "Runs in the site's deterministic motion engine (Rust, compiled to WebAssembly) in a Web Worker.",
      "media": {
        "videos": []
      },
      "related": ["gantry"],
      "jev": {
        "state": {
          "twin": "Single-axis servo bench",
          "summary": "One servo axis driving a ballscrew carriage: tune it, move it, fault it and reset it.",
          "description": "A teaching bench with a servo drive, a motor and a ballscrew carrying a carriage between two limit switches. The visitor enables the axis, jogs, homes and moves it, tunes its position and velocity loops with feedforward while watching command against actual, and reproduces faults such as excessive position error and overtravel to see the stop and the reset. Its physics and drive cascade run in the site's deterministic motion engine, and the Academy's lessons and the fault kiosk run on it.",
          "machine": "Single-axis servo trainer",
          "workpiece": "None: a carriage on a ballscrew.",
          "control": "A Logix controller with integrated motion on servo drives: one axis, commanded by Motion Direct Commands.",
          "axes": [
            {
              "name": "Axis",
              "kind": "linear",
              "actuator": "Servo motor through a coupling and a ballscrew",
              "role": "Moves the carriage"
            }
          ],
          "troubleshooting": [],
          "trends": ["Position (m)", "Velocity (m/s)", "Torque (N·m)", "Position error (mm)"],
          "logixMotionInstructions": ["MSO", "MSF", "MAJ", "MAM", "MAS", "MAH", "MAG", "MAFR"]
        },
        "stateText": "Digital twin: Single-axis servo bench. One servo axis driving a ballscrew carriage: tune it, move it, fault it and reset it.\nA teaching bench with a servo drive, a motor and a ballscrew carrying a carriage between two limit switches. The visitor enables the axis, jogs, homes and moves it, tunes its position and velocity loops with feedforward while watching command against actual, and reproduces faults such as excessive position error and overtravel to see the stop and the reset. Its physics and drive cascade run in the site's deterministic motion engine, and the Academy's lessons and the fault kiosk run on it.\nMachine: Single-axis servo trainer. Workpiece: None: a carriage on a ballscrew.\nAxes: Axis (linear, Servo motor through a coupling and a ballscrew: Moves the carriage).\nControl: A Logix controller with integrated motion on servo drives: one axis, commanded by Motion Direct Commands.\nTrends shown: Position, Velocity, Torque, Position error.\nLogix motion instructions used: MSO, MSF, MAJ, MAM, MAS, MAH, MAG, MAFR.",
        "expected": {
          "category": "motion-trainer",
          "level": 0,
          "industry_general_manufacturing": true,
          "industry_automotive": false,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": true,
          "concept_s_curve": true,
          "concept_jog_home": true,
          "concept_servo_tuning": true,
          "concept_feedforward": true,
          "concept_following_error": true,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": false,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": true,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": true,
          "audience_process_engineer": false
        }
      }
    },
    {
      "id": "ladle",
      "station": 2,
      "name": "Pouring cell",
      "url": "https://motion.metatwinmaker.com/ladle",
      "summary": "A tilting ladle pouring copper into two indexing casting wheels, with gearbox faults to find.",
      "description": "A ladle on trunnions tilts on a servo through a gearbox to pour molten copper into the molds of two casting wheels, one on each side, which index the next empty mold to the pour station between pours. The load's mass and gravity torque change as the ladle empties, and the gearboxes have backlash and compliance. Ten troubleshooting scenarios cover tuning with a full ladle, buzz at standstill, hunting on the load encoder, clunks through backlash and wheel gearboxes that are worn, chipped or dry.",
      "machine": {
        "class": "Tilting-ladle casting cell with two casting wheels",
        "lookAlike": true,
        "workpiece": "Molten copper in, cast ingots out.",
        "control": "A Logix controller with integrated motion on servo drives: the tilt and both wheels, sequenced by the PLC.",
        "axes": [
          {
            "name": "Ladle tilt",
            "kind": "rotary",
            "actuator": "Servo motor through a gearbox",
            "role": "Tilts the ladle to pour"
          },
          {
            "name": "Wheel A",
            "kind": "rotary",
            "actuator": "Servo motor through a gearbox",
            "role": "Indexes the left wheel's molds"
          },
          {
            "name": "Wheel B",
            "kind": "rotary",
            "actuator": "Servo motor through a gearbox",
            "role": "Indexes the right wheel's molds"
          }
        ]
      },
      "classification": {
        "category": "process-machine",
        "industries": ["metals"],
        "concepts": [
          "servo-tuning",
          "inertia-mismatch",
          "backlash-compliance",
          "vibration-resonance",
          "feedback-devices",
          "multi-axis-sequencing",
          "fault-diagnosis"
        ],
        "instructions": ["MAM", "MAS", "MAFR"],
        "safety": ["safe-stop"],
        "audiences": ["maintenance-technician", "controls-engineer", "process-engineer"],
        "level": "intermediate",
        "keywords": [
          "foundry",
          "copper",
          "ladle",
          "casting wheel",
          "gearbox",
          "backlash",
          "load encoder"
        ]
      },
      "views": [
        {
          "id": "ladle",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/ladle"
        },
        {
          "id": "ladle-side",
          "label": "Ladle side on",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/ladle/side"
        },
        {
          "id": "ladle-wheel-a",
          "label": "Wheel A",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/ladle/wheel-a"
        },
        {
          "id": "ladle-wheel-b",
          "label": "Wheel B",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/ladle/wheel-b"
        },
        {
          "id": "ladle-drive",
          "label": "Ladle gearbox",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/ladle/drive"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "6",
          "url": "https://motion.metatwinmaker.com/ladle/walk"
        }
      ],
      "scenarios": [
        {
          "id": "rings-when-full",
          "title": "Rings when the ladle is full",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/rings-when-full",
          "report": "Tuned it on the empty ladle and it was crisp. Full of copper, every small correction sets the ladle rocking.",
          "lookFor": "The ladle angle rocking at a few hertz after the step, and growing. Refill with 30 kg and the same test settles.",
          "test": "Tilt to −8°, then a sharp 2° step to −10°",
          "symptom": {
            "measure": "Ladle swing, ° peak to peak",
            "above": 1
          },
          "fixesToTry": [
            "Schedule the gains on the fill",
            "Set the system inertia for a full ladle",
            "Schedule the gains, and the position loop back to 2 Hz"
          ],
          "cause": "The velocity loop's gain is its bandwidth times the system inertia. Tuned empty, it is set for 0.043 kg·m² at the motor; full, the ladle is 0.11 kg·m², so the velocity loop's real bandwidth falls from 4 Hz to about 1.5 Hz, under the 3 Hz position loop around it, and the pair rings and grows. A ladle's inertia changes 2.6 times from full to empty, so one fixed set of gains cannot suit both: schedule the system inertia on the load cells' weight. What sway is left is the full ladle rocking on the gearbox's springiness, a little over 3 Hz; a position loop well under that settles it."
        },
        {
          "id": "buzz",
          "title": "Buzzes at standstill",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/buzz",
          "report": "Someone turned the gains up to stop the ringing. Now the drive buzzes, full or empty.",
          "lookFor": "Torque swinging between its limits while the ladle hardly moves.",
          "test": "Tilt to −8° and hold",
          "symptom": {
            "measure": "Ladle motor torque swing, N·m peak to peak",
            "above": 20
          },
          "fixesToTry": [
            "Velocity bandwidth back to 6 Hz",
            "Set the system inertia for the real fill"
          ],
          "cause": "Above the gearbox's resonance the motor only feels its own small inertia, so the highest usable velocity gain is set by the motor, not by the ladle. Gains tuned for a full ladle, then raised, go past it at any fill; the torque low-pass does not save it here. Keep the gain inside the motor's limit and carry the load's changes with scheduling instead."
        },
        {
          "id": "rattle-upright",
          "title": "Rattles when parked upright",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/rattle-upright",
          "report": "The encoder says the ladle is still, but you can see it rock when it waits upright between pours.",
          "lookFor": "Ladle angle rocking about a degree and a half while the motor angle barely moves.",
          "test": "Tilt to −5°, then back to the park angle and wait",
          "symptom": {
            "measure": "Ladle swing, ° peak to peak",
            "above": 0.8
          },
          "fixesToTry": [
            "Park at −5° so gravity loads one flank",
            "Rebuild the gearbox (0.3° backlash)"
          ],
          "cause": "Upright, gravity's torque on the ladle passes through zero, so nothing holds the gear teeth against either flank and the ladle floats in the backlash. The motor encoder sits on the motor side of the gearbox, so it cannot see it. Park a few degrees off upright, short of the lip, and gravity keeps one flank loaded."
        },
        {
          "id": "load-feedback-hunting",
          "title": "Hunts on the trunnion encoder",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/load-feedback-hunting",
          "report": "We fitted an encoder on the trunnion to get rid of the offset from the gearbox. Now the ladle hunts back and forth.",
          "lookFor": "Torque slamming to its limits and the ladle hunting a degree or more, even holding still.",
          "test": "Tilt to −8° and hold",
          "symptom": {
            "measure": "Ladle motor torque swing, N·m peak to peak",
            "above": 20
          },
          "fixesToTry": ["Close the loop on the motor encoder"],
          "cause": "With the loop closed on the ladle, the backlash and the gearbox's twist sit inside the loop: the motor moves, nothing happens at the ladle until the teeth meet, then it all arrives at once. Close the loop on the motor and use the trunnion encoder to check the ladle's real angle, or tune the dual loop far more gently."
        },
        {
          "id": "clunk-crossing",
          "title": "Clunks crossing between the molds",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/clunk-crossing",
          "report": "A loud clunk from the gearbox every time the ladle swings from mold A over to mold B.",
          "lookFor": "A spike in gear torque and a lurch in ladle angle as the ladle passes upright.",
          "test": "Tilt to −10° (mold A side), then across upright to +10° (mold B side)",
          "symptom": {
            "measure": "Ladle lurch, °/s",
            "above": 20
          },
          "fixesToTry": [
            "Gentler moves, and slow through upright (±2° at 2 °/s)",
            "Gentler moves only (20 °/s, 40 °/s²)"
          ],
          "cause": "Gravity pulls the ladle back toward upright from either side, so the gear holds it on one flank on the A side and the other flank on the B side. Crossing upright, and wherever the move's acceleration flips the torque, the load takes the gear across its backlash and the teeth hit; the faster the swing, the harder. Gentler moves soften every flank change, and a slow zone through upright lets the teeth meet gently where gravity hands the load across."
        },
        {
          "id": "wheel-hunts",
          "title": "Wheel hunts past the pour station",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/wheel-hunts",
          "report": "After the drive was swapped the wheel sails past the pour station and swings back and forth before it stops, if it stops.",
          "lookFor": "Wheel A's angle overshooting the new pocket by hundreds of millimetres and swinging, the torque slamming its limits.",
          "test": "Index wheel A one pocket, from 90° to 120°",
          "symptom": {
            "measure": "Wheel A overshoot at the pocket, mm",
            "above": 20
          },
          "fixesToTry": [
            "Use the wheel's inertia (clear the load ratio)",
            "Set the load ratio to the wheel's, 22"
          ],
          "cause": "The wheel and its molds are about 22 times the motor's inertia even through the 100:1 gearing. With the load ratio at 0 the velocity loop's gain is set for the motor alone, so its real bandwidth is some 23 times lower than asked, far under the position loop around it, and the pair swings. The gains only mean what they say once the drive knows the load it is moving."
        },
        {
          "id": "wheel-growls",
          "title": "Wheel growls at standstill",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/wheel-growls",
          "report": "We turned the wheel's velocity loop up to make it stop faster. Now it growls whenever it stands at the pour station.",
          "lookFor": "Wheel A's motor torque swinging between its limits at standstill while the wheel itself barely moves.",
          "test": "Index wheel A one pocket and hold",
          "symptom": {
            "measure": "Wheel A motor torque swing, N·m peak to peak",
            "above": 20
          },
          "fixesToTry": ["Velocity bandwidth back to 6 Hz"],
          "cause": "With a load this heavy the velocity loop's gain is large, but above the gear train's resonance the motor feels only its own small inertia, where that gain is far too high. The wheel's inertia sets how much gain it needs; the motor's sets how much it can take. That squeeze is what makes a high-inertia wheel hard to tune: settle it with the position loop and feedforward, not with more velocity gain."
        },
        {
          "id": "wheel-worn-gearbox",
          "title": "Wheel clunks and rocks at every stop",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/wheel-worn-gearbox",
          "report": "The wheel clunks at every stop and runs past the pour station before it comes back.",
          "lookFor": "Wheel A's angle running on past the pocket at the end of the index while the motor's has stopped, and a jump in gear torque as the teeth meet.",
          "test": "Index wheel A one pocket, from 90° to 120°",
          "symptom": {
            "measure": "Wheel A overshoot at the pocket, mm",
            "above": 8
          },
          "fixesToTry": ["Rebuild the gearbox (0.05° backlash)"],
          "cause": "Worn teeth leave half a degree of play at the wheel, 10 mm at the pockets. As the index decelerates, the wheel runs on through the play and hits the other flank; at standstill nothing loads either flank, so the wheel floats where the motor encoder cannot see it. No tuning closes play in the gears: rebuild the gearbox."
        },
        {
          "id": "wheel-chipped-tooth",
          "title": "Wheel knocks once a turn",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/wheel-chipped-tooth",
          "report": "A knock from the wheel's gearing once a turn, always between the same two pockets.",
          "lookFor": "A spike in wheel A's gear torque as the wheel passes 105°, between pockets 3 and 4, every time round.",
          "test": "Index wheel A one pocket, from 90° to 120°",
          "symptom": {
            "measure": "Wheel A peak gear torque, N·m",
            "above": 6000
          },
          "fixesToTry": ["Replace the ring gear"],
          "cause": "A chipped tooth on the ring gear lets the wheel fall back as its broken flank rolls through the mesh; then the next good tooth takes the whole load at once. It happens at one wheel angle, so it shows once a turn at the same place: note where on the trend and you have found the tooth. Keep running and the knock breaks more teeth."
        },
        {
          "id": "wheel-dry-gearbox",
          "title": "Wheel indexes late and runs hot",
          "url": "https://motion.metatwinmaker.com/ladle/troubleshoot/wheel-dry-gearbox",
          "report": "The wheel indexes late, the drive is hot, and it takes longer every shift.",
          "lookFor": "Wheel A's following error many times its usual 10 mm and the motor torque at its limit through the index.",
          "test": "Index wheel A one pocket, from 90° to 120°",
          "symptom": {
            "measure": "Wheel A peak following error at the pocket, mm",
            "above": 50
          },
          "fixesToTry": ["Drain and refill the gearbox oil"],
          "cause": "A dry or failing gearbox needs far more torque to turn the same wheel. The motor reaches its peak torque partway through the index, the wheel falls behind the command, and the drive runs hot. The gains are not the problem, so no retune helps: the torque trend rising over weeks is the early warning."
        }
      ],
      "trends": [
        {
          "group": "Ladle",
          "title": "Tilt",
          "unit": "°",
          "series": ["Command", "Ladle", "Motor ÷ ratio"]
        },
        {
          "group": "Ladle",
          "title": "Following error at the ladle",
          "unit": "°",
          "series": ["Command − ladle"]
        },
        {
          "group": "Ladle",
          "title": "Gear twist",
          "unit": "°",
          "series": ["Motor − ladle"]
        },
        {
          "group": "Ladle",
          "title": "Motor torque",
          "unit": "N·m",
          "series": ["Applied"]
        },
        {
          "group": "Ladle",
          "title": "Gear torque at the ladle",
          "unit": "N·m",
          "series": ["Through the teeth"]
        },
        {
          "group": "Ladle",
          "title": "Pour rate",
          "unit": "kg/s",
          "series": ["Over the lip"]
        },
        {
          "group": "Wheel A",
          "title": "Wheel angle",
          "unit": "°",
          "series": ["Command", "Wheel", "Motor ÷ ratio"]
        },
        {
          "group": "Wheel A",
          "title": "Following error at the pockets",
          "unit": "mm",
          "series": ["Command − wheel"]
        },
        {
          "group": "Wheel A",
          "title": "Gear twist",
          "unit": "°",
          "series": ["Motor − wheel"]
        },
        {
          "group": "Wheel A",
          "title": "Motor torque",
          "unit": "N·m",
          "series": ["Applied"]
        },
        {
          "group": "Wheel A",
          "title": "Gear torque at the wheel",
          "unit": "N·m",
          "series": ["Through the teeth"]
        },
        {
          "group": "Wheel A",
          "title": "Copper aboard",
          "unit": "kg",
          "series": ["In the pockets"]
        },
        {
          "group": "Wheel B",
          "title": "Wheel angle",
          "unit": "°",
          "series": ["Command", "Wheel", "Motor ÷ ratio"]
        },
        {
          "group": "Wheel B",
          "title": "Following error at the pockets",
          "unit": "mm",
          "series": ["Command − wheel"]
        },
        {
          "group": "Wheel B",
          "title": "Gear twist",
          "unit": "°",
          "series": ["Motor − wheel"]
        },
        {
          "group": "Wheel B",
          "title": "Motor torque",
          "unit": "N·m",
          "series": ["Applied"]
        },
        {
          "group": "Wheel B",
          "title": "Gear torque at the wheel",
          "unit": "N·m",
          "series": ["Through the teeth"]
        },
        {
          "group": "Wheel B",
          "title": "Copper aboard",
          "unit": "kg",
          "series": ["In the pockets"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/ladle.glb",
        "manifest": "https://motion.metatwinmaker.com/models/ladle.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 8040,
        "joints": [
          {
            "node": "AXIS_ladle_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_motor_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_wheel_a_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_wheel_b_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_wheel_a_motor_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_wheel_b_motor_rot",
            "kind": "rotary"
          }
        ]
      },
      "hall": {
        "x": 3.6,
        "z": 0.05,
        "walkUrl": "https://motion.metatwinmaker.com/ladle/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["bench"],
      "jev": {
        "state": {
          "twin": "Pouring cell",
          "summary": "A tilting ladle pouring copper into two indexing casting wheels, with gearbox faults to find.",
          "description": "A ladle on trunnions tilts on a servo through a gearbox to pour molten copper into the molds of two casting wheels, one on each side, which index the next empty mold to the pour station between pours. The load's mass and gravity torque change as the ladle empties, and the gearboxes have backlash and compliance. Ten troubleshooting scenarios cover tuning with a full ladle, buzz at standstill, hunting on the load encoder, clunks through backlash and wheel gearboxes that are worn, chipped or dry.",
          "machine": "Tilting-ladle casting cell with two casting wheels",
          "workpiece": "Molten copper in, cast ingots out.",
          "control": "A Logix controller with integrated motion on servo drives: the tilt and both wheels, sequenced by the PLC.",
          "axes": [
            {
              "name": "Ladle tilt",
              "kind": "rotary",
              "actuator": "Servo motor through a gearbox",
              "role": "Tilts the ladle to pour"
            },
            {
              "name": "Wheel A",
              "kind": "rotary",
              "actuator": "Servo motor through a gearbox",
              "role": "Indexes the left wheel's molds"
            },
            {
              "name": "Wheel B",
              "kind": "rotary",
              "actuator": "Servo motor through a gearbox",
              "role": "Indexes the right wheel's molds"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Rings when the ladle is full",
              "report": "Tuned it on the empty ladle and it was crisp. Full of copper, every small correction sets the ladle rocking."
            },
            {
              "problem": "Buzzes at standstill",
              "report": "Someone turned the gains up to stop the ringing. Now the drive buzzes, full or empty."
            },
            {
              "problem": "Rattles when parked upright",
              "report": "The encoder says the ladle is still, but you can see it rock when it waits upright between pours."
            },
            {
              "problem": "Hunts on the trunnion encoder",
              "report": "We fitted an encoder on the trunnion to get rid of the offset from the gearbox. Now the ladle hunts back and forth."
            },
            {
              "problem": "Clunks crossing between the molds",
              "report": "A loud clunk from the gearbox every time the ladle swings from mold A over to mold B."
            },
            {
              "problem": "Wheel hunts past the pour station",
              "report": "After the drive was swapped the wheel sails past the pour station and swings back and forth before it stops, if it stops."
            },
            {
              "problem": "Wheel growls at standstill",
              "report": "We turned the wheel's velocity loop up to make it stop faster. Now it growls whenever it stands at the pour station."
            },
            {
              "problem": "Wheel clunks and rocks at every stop",
              "report": "The wheel clunks at every stop and runs past the pour station before it comes back."
            },
            {
              "problem": "Wheel knocks once a turn",
              "report": "A knock from the wheel's gearing once a turn, always between the same two pockets."
            },
            {
              "problem": "Wheel indexes late and runs hot",
              "report": "The wheel indexes late, the drive is hot, and it takes longer every shift."
            }
          ],
          "trends": [
            "Tilt (°)",
            "Following error at the ladle (°)",
            "Gear twist (°)",
            "Motor torque (N·m)",
            "Gear torque at the ladle (N·m)",
            "Pour rate (kg/s)",
            "Wheel angle (°)",
            "Following error at the pockets (mm)",
            "Gear torque at the wheel (N·m)",
            "Copper aboard (kg)"
          ],
          "logixMotionInstructions": ["MAM", "MAS", "MAFR"]
        },
        "stateText": "Digital twin: Pouring cell. A tilting ladle pouring copper into two indexing casting wheels, with gearbox faults to find.\nA ladle on trunnions tilts on a servo through a gearbox to pour molten copper into the molds of two casting wheels, one on each side, which index the next empty mold to the pour station between pours. The load's mass and gravity torque change as the ladle empties, and the gearboxes have backlash and compliance. Ten troubleshooting scenarios cover tuning with a full ladle, buzz at standstill, hunting on the load encoder, clunks through backlash and wheel gearboxes that are worn, chipped or dry.\nMachine: Tilting-ladle casting cell with two casting wheels. Workpiece: Molten copper in, cast ingots out.\nAxes: Ladle tilt (rotary, Servo motor through a gearbox: Tilts the ladle to pour); Wheel A (rotary, Servo motor through a gearbox: Indexes the left wheel's molds); Wheel B (rotary, Servo motor through a gearbox: Indexes the right wheel's molds).\nControl: A Logix controller with integrated motion on servo drives: the tilt and both wheels, sequenced by the PLC.\nTroubleshooting scenarios: Rings when the ladle is full; Buzzes at standstill; Rattles when parked upright; Hunts on the trunnion encoder; Clunks crossing between the molds; Wheel hunts past the pour station; Wheel growls at standstill; Wheel clunks and rocks at every stop; Wheel knocks once a turn; Wheel indexes late and runs hot.\nTrends shown: Tilt, Following error at the ladle, Gear twist, Motor torque, Gear torque at the ladle, Pour rate, Wheel angle, Following error at the pockets, Gear torque at the wheel, Copper aboard.\nLogix motion instructions used: MAM, MAS, MAFR.",
        "expected": {
          "category": "process-machine",
          "level": 1,
          "industry_general_manufacturing": false,
          "industry_automotive": false,
          "industry_aerospace": false,
          "industry_metals": true,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": true,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": true,
          "concept_backlash_compliance": true,
          "concept_vibration_resonance": true,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": true,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": false,
          "audience_process_engineer": true
        }
      }
    },
    {
      "id": "gantry",
      "station": 3,
      "name": "Two-axis gantry",
      "url": "https://motion.metatwinmaker.com/gantry",
      "summary": "An X–Y gantry running coordinated lines and arcs, with its path plotted as it goes.",
      "description": "A Cartesian gantry with two servo axes on one coordinate system. The visitor commands each axis on its own, then coordinated linear and circular moves and corner-to-corner patterns, and watches the tool's path on an X–Y plot beside each axis's trend: how the axes' tuning and the move's limits shape the path's error. Its axes run in the site's deterministic motion engine.",
      "machine": {
        "class": "Two-axis Cartesian gantry",
        "lookAlike": true,
        "workpiece": "None: a tool head over a table.",
        "control": "A Logix controller with integrated motion on servo drives: two axes on one Cartesian coordinate system.",
        "axes": [
          {
            "name": "X",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "Moves the bridge"
          },
          {
            "name": "Y",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "Moves the tool head"
          }
        ]
      },
      "classification": {
        "category": "motion-trainer",
        "industries": ["general-manufacturing", "electronics", "packaging-consumer"],
        "concepts": [
          "coordinated-motion",
          "point-to-point",
          "s-curve",
          "servo-tuning",
          "following-error"
        ],
        "instructions": ["MSO", "MAM", "MCLM", "MCCM", "MCS", "MAFR"],
        "safety": ["overtravel"],
        "audiences": ["student", "controls-engineer"],
        "level": "introductory",
        "keywords": ["xy", "cartesian", "path", "contour", "interpolation"]
      },
      "views": [
        {
          "id": "gantry",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/gantry"
        },
        {
          "id": "gantry-top",
          "label": "Top down",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/gantry/top"
        },
        {
          "id": "gantry-tool",
          "label": "Follow tool",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/gantry/tool"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/gantry/walk"
        }
      ],
      "scenarios": [],
      "trends": [
        {
          "title": "X position",
          "unit": "m",
          "series": ["Command", "Actual"]
        },
        {
          "title": "Y position",
          "unit": "m",
          "series": ["Command", "Actual"]
        },
        {
          "title": "Velocity",
          "unit": "m/s",
          "series": ["X command", "X actual", "Y command", "Y actual"]
        },
        {
          "title": "Position error",
          "unit": "mm",
          "series": ["X", "Y"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/gantry.glb",
        "manifest": "https://motion.metatwinmaker.com/models/gantry.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 13412,
        "joints": [
          {
            "node": "AXIS_x_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_x_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_y_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_y_rot",
            "kind": "rotary"
          }
        ]
      },
      "hall": {
        "x": -3.6,
        "z": 0.05,
        "walkUrl": "https://motion.metatwinmaker.com/gantry/walk"
      },
      "simulation": "Runs in the site's deterministic motion engine (Rust, compiled to WebAssembly) in a Web Worker.",
      "media": {
        "videos": []
      },
      "related": ["bench", "cnc"],
      "jev": {
        "state": {
          "twin": "Two-axis gantry",
          "summary": "An X–Y gantry running coordinated lines and arcs, with its path plotted as it goes.",
          "description": "A Cartesian gantry with two servo axes on one coordinate system. The visitor commands each axis on its own, then coordinated linear and circular moves and corner-to-corner patterns, and watches the tool's path on an X–Y plot beside each axis's trend: how the axes' tuning and the move's limits shape the path's error. Its axes run in the site's deterministic motion engine.",
          "machine": "Two-axis Cartesian gantry",
          "workpiece": "None: a tool head over a table.",
          "control": "A Logix controller with integrated motion on servo drives: two axes on one Cartesian coordinate system.",
          "axes": [
            {
              "name": "X",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "Moves the bridge"
            },
            {
              "name": "Y",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "Moves the tool head"
            }
          ],
          "troubleshooting": [],
          "trends": ["X position (m)", "Y position (m)", "Velocity (m/s)", "Position error (mm)"],
          "logixMotionInstructions": ["MSO", "MAM", "MCLM", "MCCM", "MCS", "MAFR"]
        },
        "stateText": "Digital twin: Two-axis gantry. An X–Y gantry running coordinated lines and arcs, with its path plotted as it goes.\nA Cartesian gantry with two servo axes on one coordinate system. The visitor commands each axis on its own, then coordinated linear and circular moves and corner-to-corner patterns, and watches the tool's path on an X–Y plot beside each axis's trend: how the axes' tuning and the move's limits shape the path's error. Its axes run in the site's deterministic motion engine.\nMachine: Two-axis Cartesian gantry. Workpiece: None: a tool head over a table.\nAxes: X (linear, Servo motor and ballscrew: Moves the bridge); Y (linear, Servo motor and ballscrew: Moves the tool head).\nControl: A Logix controller with integrated motion on servo drives: two axes on one Cartesian coordinate system.\nTrends shown: X position, Y position, Velocity, Position error.\nLogix motion instructions used: MSO, MAM, MCLM, MCCM, MCS, MAFR.",
        "expected": {
          "category": "motion-trainer",
          "level": 0,
          "industry_general_manufacturing": true,
          "industry_automotive": false,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": true,
          "industry_electronics": true,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": true,
          "concept_s_curve": true,
          "concept_jog_home": false,
          "concept_servo_tuning": true,
          "concept_feedforward": false,
          "concept_following_error": true,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": true,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": false,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": false,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": false,
          "safety_overtravel": true,
          "audience_maintenance_technician": false,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": true,
          "audience_process_engineer": false
        }
      }
    },
    {
      "id": "track",
      "station": 4,
      "name": "Independent cart track",
      "url": "https://motion.metatwinmaker.com/track",
      "summary": "Eight movers on a loop of linear motor segments, with a switch into a machine lane and an entry merge.",
      "description": "A track of linear motor segments laid as a loop with a machine lane that leaves at a switch and merges back, and an entry lane where spare carts join. Each cart is a free mass pushed by the segment under it. Parts are loaded at the load station and taken off at the machine. Seven scenarios cover carts bunching, jumps at a segment joint, heavy carts rocking and overshooting, a segment fault stopping the loop, a late switch and carts lost after a power cut.",
      "machine": {
        "class": "Independent cart (linear motor) track",
        "lookAlike": true,
        "workpiece": "Parts carried on carts from a load station to a machine and back.",
        "control": "A Logix controller with integrated motion on servo drives: one axis per cart, a PLC routing them at the switch and the merges.",
        "axes": [
          {
            "name": "Carts (eight)",
            "kind": "linear",
            "actuator": "Linear motor segments, one servo each, with magnets on the carts",
            "role": "Each cart is its own axis along the track"
          },
          {
            "name": "Switch",
            "kind": "linear",
            "actuator": "A moving track section at the diverge",
            "role": "Sends carts into the machine lane"
          }
        ]
      },
      "classification": {
        "category": "material-handling",
        "industries": ["packaging-consumer", "automotive", "electronics"],
        "concepts": [
          "independent-cart",
          "inertia-mismatch",
          "servo-tuning",
          "feedback-devices",
          "multi-axis-sequencing",
          "fault-diagnosis"
        ],
        "instructions": ["MAM", "MAS", "MAFR"],
        "safety": ["safe-stop"],
        "audiences": ["controls-engineer", "machine-builder", "maintenance-technician"],
        "level": "advanced",
        "keywords": [
          "linear motor",
          "mover",
          "cart",
          "track",
          "switch",
          "merge",
          "collision avoidance"
        ]
      },
      "views": [
        {
          "id": "track",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/track"
        },
        {
          "id": "track-machine",
          "label": "Machine",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/track/machine"
        },
        {
          "id": "track-switch",
          "label": "Switch and entry",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/track/switch"
        },
        {
          "id": "track-load",
          "label": "Load station",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/track/load"
        },
        {
          "id": "track-cart",
          "label": "Follow cart",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/track/cart"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "6",
          "url": "https://motion.metatwinmaker.com/track/walk"
        }
      ],
      "scenarios": [
        {
          "id": "carts-bunch",
          "title": "Carts bunch up in the machine lane",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/carts-bunch",
          "report": "Since commissioning the carts queue nose to tail in the machine lane and the machine can't keep up.",
          "lookFor": "On cart B's gap to the cart ahead, every queued cart parked 400 mm behind the next; at the machine each cart takes longer to arrive after the last one leaves.",
          "test": "Run the line from the start of a shift for 12 s",
          "symptom": {
            "measure": "Time per part at the machine, s",
            "above": 2
          },
          "fixesToTry": ["Anti-collision gap back to 50 mm", "Anti-collision gap to 100 mm"],
          "cause": "The anti-collision gap is the room the controller keeps between each cart and the one ahead, so a cart can always stop short of it. Every cart in a queue sits a cart length plus the gap behind the next, and when the machine frees, the next cart has that whole distance to cover before work can start. At 400 mm, set after a bump during commissioning, every part waits for that move on top of the machine's own time, and fewer carts fit in the machine lane at all. Keep the gap to what a stop needs and fix the cause of a bump instead."
        },
        {
          "id": "handoff-jump",
          "title": "Carts jump at one joint",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/handoff-jump",
          "report": "Since segment 4 was swapped, every cart gives a little jump as it crosses onto it. Nothing faults.",
          "lookFor": "Cart A's following error spiking to a few millimetres each time it crosses onto segment 4 (the back straight's right half), and nowhere else.",
          "test": "Run the line from the start of a shift for 12 s",
          "symptom": {
            "measure": "Worst cart's peak following error, mm",
            "above": 2
          },
          "fixesToTry": ["Run the track's alignment on segment 4"],
          "cause": "Each segment reads a cart's position with its own sensors, and the track's alignment teaches each one where it sits on the loop. Segment 4 was fitted and never aligned, so it reads 3 mm out. At the handoff the new segment's reading of the same cart is 3 mm different from the last one's, and its controller pulls the cart 3 mm in one jolt. Tuning cannot fix a sensor that disagrees with its neighbour: run the alignment after any segment is replaced."
        },
        {
          "id": "heavy-cart-rocks",
          "title": "Loaded carts rock at the machine",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/heavy-cart-rocks",
          "report": "Since the new fixtures went on, loaded carts rock back and forth at the machine and take ages to settle. Empty ones are fine.",
          "lookFor": "Cart A, loaded, swinging a few millimetres either side of the machine's stop, the thrust swinging with it, and the machine waiting for it to settle.",
          "test": "Run the line from the start of a shift for 12 s",
          "symptom": {
            "measure": "Worst error while stopped, mm",
            "above": 1
          },
          "fixesToTry": ["Use the loaded PID set for a loaded cart's moves"],
          "cause": "A cart is only 3 kg; with its fixture and part it is 21 kg. The gains in the empty cart's PID set assume 3 kg, so on a loaded cart the velocity loop is seven times softer than set, slower than the position loop around it, and the pair rocks. The track keeps a PID set for each load for this reason, and the PLC has to ask for the loaded one in each loaded cart's move: the new program never did."
        },
        {
          "id": "station-overshoot",
          "title": "Loaded carts overshoot their stops",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/station-overshoot",
          "report": "To get more parts through we raised the moves' acceleration. Now loaded carts overshoot their stops in the machine lane and roll back.",
          "lookFor": "Cart D's following error growing through each loaded move while the thrust sits at its 100 N limit, then the cart running past its stop before it comes back.",
          "test": "Run the line from the start of a shift for 12 s",
          "symptom": {
            "measure": "Worst overshoot past a stop, mm",
            "above": 5
          },
          "fixesToTry": ["Loaded moves back to 3 m/s²", "Loaded moves at 4 m/s²"],
          "cause": "Stopping 21 kg at 8 m/s² takes 168 N, and a segment gives a cart at most 100 N. The command brakes on schedule; the cart cannot, so it falls behind on the way in and is still moving when its command stops, and it runs past before the controller brings it back. Empty carts manage 8 m/s² easily, which is why only loaded ones overshoot. Size each move's acceleration for the heaviest load it carries, with thrust to spare."
        },
        {
          "id": "segment-fault",
          "title": "One segment faults and the loop stops",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/segment-fault",
          "report": "Segment 3's light is red and the whole loop has stopped. Resetting it gets the line going, then it stops again.",
          "lookFor": "Every cart at a standstill: the ones behind segment 3 queued at the gap, the machine lane backed up behind them, the machine waiting, and segment 3's fault light red.",
          "test": "Run the line from the start of a shift for 12 s",
          "symptom": {
            "measure": "Longest wait for a part at the machine, s",
            "above": 3
          },
          "fixesToTry": [
            "Reset segment 3's fault",
            "Reseat the link cable into segment 3, then reset it"
          ],
          "cause": "Neighbouring segments talk over a link cable to hand a cart from one to the next. With the cable into segment 3 loose, the next handoff onto it times out and segment 3 faults; a faulted segment pushes no cart, and the controller treats it as a wall, so every cart behind it stops at the gap and the whole loop stands. A reset clears the fault but not its cause, so it comes back with the next cart across. Read the fault's text: it names the handoff and the link."
        },
        {
          "id": "switch-late",
          "title": "Carts stop dead at the switch",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/switch-late",
          "report": "Since the PLC program was changed, carts bound for the machine stop dead in front of the switch, then go. The switch was serviced last month and works.",
          "lookFor": "Cart B's speed dropping to nothing just before the diverge and its following error at zero there: it is held, not struggling. Count the seconds carts stand at the switch.",
          "test": "Run the line from the start of a shift for 12 s",
          "symptom": {
            "measure": "Seconds carts stood at the switch",
            "above": 0.1
          },
          "fixesToTry": [
            "Decide each cart's way 1 m before the switch",
            "Fit a faster switch actuator (0.25 s)"
          ],
          "cause": "The switch can only move while no cart is on it, and it takes time to move. The new program decides a cart's way only when the cart reaches the switch, so whenever the next cart needs the other way, the cart is already at the stop line when the switch starts to move, and it waits out the whole move. Decided a metre early, the switch moves while the cart is still on its way and the cart never sees it. A faster switch shortens each wait, but every machine-bound cart still stops."
        },
        {
          "id": "lost-ids",
          "title": "Carts lost or renumbered after a power cut",
          "url": "https://motion.metatwinmaker.com/track/troubleshoot/lost-ids",
          "report": "After this morning's power cut the line restarted, but the PLC sent parts to the wrong carts, and one cart isn't on the track's list at all.",
          "lookFor": "The track's numbers for the carts after the startup: cart D has none, and every other cart's number names a different cart in the PLC's part table.",
          "test": "Cut the power for a second, restore it and run the startup",
          "symptom": {
            "measure": "Carts lost or renumbered",
            "above": 0.5
          },
          "fixesToTry": [
            "Rebuild the part table from each cart's tag after startup",
            "Push cart D clear of the joint by hand"
          ],
          "cause": "The track numbers the carts at every startup, 1, 2, 3 … from the start of the loop, so a cart's number depends on where the carts happened to stop. The PLC kept this morning's numbers in its part table, so after the cut each number named a different cart. And a cart whose magnets straddle the joint between two segments is seen by neither at startup, so it gets no number at all. Track parts by each cart's own tag and rebuild the table after every startup; move a stranded cart onto one segment before restarting."
        }
      ],
      "trends": [
        {
          "group": "The cart picked",
          "title": "Position along the track",
          "unit": "m",
          "series": ["Command", "Cart"]
        },
        {
          "group": "The cart picked",
          "title": "Following error",
          "unit": "mm",
          "series": ["Command − cart"]
        },
        {
          "group": "The cart picked",
          "title": "Speed",
          "unit": "m/s",
          "series": ["Command", "Cart"]
        },
        {
          "group": "The cart picked",
          "title": "Thrust",
          "unit": "N",
          "series": ["Asked of the segment"]
        },
        {
          "group": "The cart picked",
          "title": "Gap to the cart ahead",
          "unit": "mm",
          "series": ["Bumper to bumper"]
        },
        {
          "group": "The cart picked",
          "title": "Machined",
          "unit": "parts",
          "series": ["Since the start"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/track.glb",
        "manifest": "https://motion.metatwinmaker.com/models/track.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 12628,
        "joints": [
          {
            "node": "AXIS_cart_A",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_B",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_C",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_D",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_E",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_F",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_G",
            "kind": "linear"
          },
          {
            "node": "AXIS_cart_H",
            "kind": "linear"
          }
        ]
      },
      "hall": {
        "x": 7.9,
        "z": 0.05,
        "walkUrl": "https://motion.metatwinmaker.com/track/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["robot", "amr"],
      "jev": {
        "state": {
          "twin": "Independent cart track",
          "summary": "Eight movers on a loop of linear motor segments, with a switch into a machine lane and an entry merge.",
          "description": "A track of linear motor segments laid as a loop with a machine lane that leaves at a switch and merges back, and an entry lane where spare carts join. Each cart is a free mass pushed by the segment under it. Parts are loaded at the load station and taken off at the machine. Seven scenarios cover carts bunching, jumps at a segment joint, heavy carts rocking and overshooting, a segment fault stopping the loop, a late switch and carts lost after a power cut.",
          "machine": "Independent cart (linear motor) track",
          "workpiece": "Parts carried on carts from a load station to a machine and back.",
          "control": "A Logix controller with integrated motion on servo drives: one axis per cart, a PLC routing them at the switch and the merges.",
          "axes": [
            {
              "name": "Carts (eight)",
              "kind": "linear",
              "actuator": "Linear motor segments, one servo each, with magnets on the carts",
              "role": "Each cart is its own axis along the track"
            },
            {
              "name": "Switch",
              "kind": "linear",
              "actuator": "A moving track section at the diverge",
              "role": "Sends carts into the machine lane"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Carts bunch up in the machine lane",
              "report": "Since commissioning the carts queue nose to tail in the machine lane and the machine can't keep up."
            },
            {
              "problem": "Carts jump at one joint",
              "report": "Since segment 4 was swapped, every cart gives a little jump as it crosses onto it. Nothing faults."
            },
            {
              "problem": "Loaded carts rock at the machine",
              "report": "Since the new fixtures went on, loaded carts rock back and forth at the machine and take ages to settle. Empty ones are fine."
            },
            {
              "problem": "Loaded carts overshoot their stops",
              "report": "To get more parts through we raised the moves' acceleration. Now loaded carts overshoot their stops in the machine lane and roll back."
            },
            {
              "problem": "One segment faults and the loop stops",
              "report": "Segment 3's light is red and the whole loop has stopped. Resetting it gets the line going, then it stops again."
            },
            {
              "problem": "Carts stop dead at the switch",
              "report": "Since the PLC program was changed, carts bound for the machine stop dead in front of the switch, then go. The switch was serviced last month and works."
            },
            {
              "problem": "Carts lost or renumbered after a power cut",
              "report": "After this morning's power cut the line restarted, but the PLC sent parts to the wrong carts, and one cart isn't on the track's list at all."
            }
          ],
          "trends": [
            "Position along the track (m)",
            "Following error (mm)",
            "Speed (m/s)",
            "Thrust (N)",
            "Gap to the cart ahead (mm)",
            "Machined (parts)"
          ],
          "logixMotionInstructions": ["MAM", "MAS", "MAFR"]
        },
        "stateText": "Digital twin: Independent cart track. Eight movers on a loop of linear motor segments, with a switch into a machine lane and an entry merge.\nA track of linear motor segments laid as a loop with a machine lane that leaves at a switch and merges back, and an entry lane where spare carts join. Each cart is a free mass pushed by the segment under it. Parts are loaded at the load station and taken off at the machine. Seven scenarios cover carts bunching, jumps at a segment joint, heavy carts rocking and overshooting, a segment fault stopping the loop, a late switch and carts lost after a power cut.\nMachine: Independent cart (linear motor) track. Workpiece: Parts carried on carts from a load station to a machine and back.\nAxes: Carts (eight) (linear, Linear motor segments, one servo each, with magnets on the carts: Each cart is its own axis along the track); Switch (linear, A moving track section at the diverge: Sends carts into the machine lane).\nControl: A Logix controller with integrated motion on servo drives: one axis per cart, a PLC routing them at the switch and the merges.\nTroubleshooting scenarios: Carts bunch up in the machine lane; Carts jump at one joint; Loaded carts rock at the machine; Loaded carts overshoot their stops; One segment faults and the loop stops; Carts stop dead at the switch; Carts lost or renumbered after a power cut.\nTrends shown: Position along the track, Following error, Speed, Thrust, Gap to the cart ahead, Machined.\nLogix motion instructions used: MAM, MAS, MAFR.",
        "expected": {
          "category": "material-handling",
          "level": 2,
          "industry_general_manufacturing": false,
          "industry_automotive": true,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": true,
          "industry_electronics": true,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": true,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": true,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": true,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": true,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": true,
          "audience_student": false,
          "audience_process_engineer": false
        }
      }
    },
    {
      "id": "robot",
      "station": 5,
      "name": "Robot cell",
      "url": "https://motion.metatwinmaker.com/robot",
      "summary": "A six-axis arm picking parts off a moving belt into a tray, programmed as Logix coordinated motion.",
      "description": "A generic six-axis articulated arm, a belt axis bringing parts past a photo-eye, and a six-slot tray, all run by one Logix controller under unified robot control. The program is written as the motion instructions a routine would use: a kinematic transform between joint and Cartesian coordinate systems, linear moves with termination types, tracking the moving belt and a coordinated stop. Six scenarios cover stopping at every point, faults in transit, gripping air, heavy parts, missing parts on the belt and clipping the tray's dividers.",
      "machine": {
        "class": "Six-axis articulated robot cell with conveyor tracking",
        "lookAlike": true,
        "workpiece": "Parts picked from a moving belt and placed in a tray.",
        "control": "A Logix controller with integrated motion on servo drives: six joint axes, joint and Cartesian coordinate systems linked by a transform.",
        "axes": [
          {
            "name": "J1–J6",
            "kind": "rotary",
            "actuator": "Servo motors through reducers",
            "role": "The arm's six joints"
          },
          {
            "name": "Belt",
            "kind": "linear",
            "actuator": "Servo motor driving a belt",
            "role": "Brings parts"
          }
        ]
      },
      "classification": {
        "category": "robotics",
        "industries": ["packaging-consumer", "automotive", "electronics"],
        "concepts": [
          "robot-kinematics",
          "coordinated-motion",
          "conveyor-tracking",
          "inertia-mismatch",
          "following-error",
          "multi-axis-sequencing"
        ],
        "instructions": ["MSO", "MSF", "MCTO", "MCTP", "MCLM", "MDCC", "MCS", "MAFR"],
        "safety": ["safe-stop"],
        "audiences": ["controls-engineer", "machine-builder"],
        "level": "advanced",
        "keywords": [
          "pick and place",
          "six axis",
          "articulated",
          "belt tracking",
          "gripper",
          "tray"
        ]
      },
      "views": [
        {
          "id": "robot",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/robot"
        },
        {
          "id": "robot-belt",
          "label": "Belt and pick",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/robot/belt"
        },
        {
          "id": "robot-tray",
          "label": "Tray",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/robot/tray"
        },
        {
          "id": "robot-cabinet",
          "label": "PLC and drives",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/robot/cabinet"
        },
        {
          "id": "robot-tool",
          "label": "Follow tool",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/robot/tool"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "6",
          "url": "https://motion.metatwinmaker.com/robot/walk"
        }
      ],
      "scenarios": [
        {
          "id": "stops-at-points",
          "title": "Robot stops dead at every point",
          "url": "https://motion.metatwinmaker.com/robot/troubleshoot/stops-at-points",
          "report": "After the routine was tidied up the cell takes longer per part, and the arm visibly stops at every point on its way.",
          "lookFor": "On the routine, every MCLM ends TT0 (Actual tolerance). On the tool's trend, its speed drops to zero at each point and stays there until the arm settles.",
          "test": "Run the cell for 24 s with a part always waiting",
          "symptom": {
            "measure": "Time per part, s",
            "above": 4.1
          },
          "fixesToTry": [
            "Blend the points on the way: Command tolerance (25 mm) above the part and the slot",
            "No settle (TT1) on every point but the grip and the place"
          ],
          "cause": "A move's termination type decides when the next move may start. Actual tolerance (TT0) waits until the arm has stopped and settled within half a millimetre of the point, which is right where the gripper opens or closes and wasted everywhere else. No settle (TT1) starts the next move as soon as this one's command has stopped; Command tolerance (TT2) starts it while the arm is still coming in, so the two moves blend and the arm never stops. Keep TT0 for the grip and the place, and blend the points the arm only passes through."
        },
        {
          "id": "transfer-fault",
          "title": "Arm faults on its way to the tray",
          "url": "https://motion.metatwinmaker.com/robot/troubleshoot/transfer-fault",
          "report": "A new programmer replaced the swing over to the tray with a straight-line move to save a few lines. Now the arm faults on the first part and stops.",
          "lookFor": "On the routine, the move to Over_Tray is an MCLM on Robot_Cart with no MCTP. On J2's trend its command climbs steeply as the tool closes on the robot's base, until J2 is asked to go faster than it can and faults.",
          "test": "Run the cell from the start of a shift for 20 s",
          "symptom": {
            "measure": "Robot faulted (1 = yes)",
            "above": 0.5
          },
          "fixesToTry": [
            "Make the transfer a joint move again: MCTP, then MCLM on Robot_Joints",
            "Slow the straight-line transfer to 200 mm/s"
          ],
          "cause": "A straight line from the belt to the tray behind the robot runs almost through the axis of J1. To keep the tool on that line the arm must fold back on itself as the wrist nears the base, and then swing J1 half a turn in the instant the wrist passes over it: a singularity, where the joints would have to move infinitely fast. The transform asks for it anyway. At full speed J2's fold faults first; slowed down, the arm gets as far as the axis and J1 faults there instead. Swing round with a joint move (the program turns the tray point into joint angles with MCTP and moves the joints there), and keep straight-line moves for the short approaches where the path matters."
        },
        {
          "id": "grips-air",
          "title": "Gripper closes above the part",
          "url": "https://motion.metatwinmaker.com/robot/troubleshoot/grips-air",
          "report": "Maintenance fitted shorter gripper fingers. Since then the gripper closes on nothing and every part goes into the reject bin.",
          "lookFor": "The routine is unchanged and the arm goes to every point. Look at the tool frame in the MCTO: it still says 160 mm, and the new fingers are 120 mm long.",
          "test": "Run the cell from the start of a shift for 20 s",
          "symptom": {
            "measure": "Worst grip error, mm",
            "above": 10
          },
          "fixesToTry": [
            "Set the tool frame to the new fingers (Z 120 mm) and run MCTO again",
            "Slow the approach to the part to 100 mm/s"
          ],
          "cause": "Every Cartesian point in the routine is where the tool centre point should go, and the MCTO's tool frame tells the transform where that is: 160 mm out from the flange, at the old fingertips. With 120 mm fingers the arm still puts that point on the part, so the real fingertips stop 40 mm above it. Measure and enter the new tool frame, then establish the transform again; the points stay as they are taught. Changing points instead would leave every other tool-frame move, such as a turn of the tool, pivoting about the wrong place."
        },
        {
          "id": "heavy-parts",
          "title": "Arm wanders off its path with the new parts",
          "url": "https://motion.metatwinmaker.com/robot/troubleshoot/heavy-parts",
          "report": "The cell now handles 6 kg castings instead of 2 kg brackets. The arm sags and wanders off its path while it carries one, and settles slowly at the tray.",
          "lookFor": "On the tool's trend, the path error climbs while the arm carries a part, and J2's and J3's following errors grow under the weight. The payload the program enters for the tool still says 2 kg.",
          "test": "Run the cell from the start of a shift for 20 s",
          "symptom": {
            "measure": "Worst path error carrying a part on a straight line, mm",
            "above": 1.5
          },
          "fixesToTry": [
            "Enter the new payload (6 kg) for the tool",
            "Raise J2's and J3's position loop gain to 30 /s"
          ],
          "cause": "The drives feed forward the torque the arm needs: its own weight and the payload's against gravity, and the inertia it accelerates. They know the payload only from what the program enters for the tool. With 2 kg entered and 6 kg in the gripper, J2 and J3 under-push by the weight of 4 kg on a long arm, and the position loops must take up the difference as following error, which shows at the tool as a sag off the path. Enter the real payload with the tool; stiffer loops only shave the error and make the arm harsher."
        },
        {
          "id": "misses-belt",
          "title": "Robot misses parts on the moving belt",
          "url": "https://motion.metatwinmaker.com/robot/troubleshoot/misses-belt",
          "report": "The routine was rewritten for a new belt. Now the robot goes down where the part was and closes beside it, so parts run off the end into the bin.",
          "lookFor": "On the routine, there is no MDCC between the photo-eye and the approach, and no MCS after the lift. The arm goes to the part's registered position, which the belt has carried on by the time it gets there.",
          "test": "Run the cell from the start of a shift for 20 s",
          "symptom": {
            "measure": "Worst grip error, mm",
            "above": 10
          },
          "fixesToTry": [
            "Track the belt: MDCC from the registration, MCS after the lift",
            "Slow the belt to 30 mm/s"
          ],
          "cause": "The photo-eye registers where a part was at one instant; the belt keeps it moving. MDCC gears the robot's Cartesian coordinate system to the belt's axis from that instant, so every move made after it lands on the part where it is, not where it was, and the arm follows it while it grips. Because the belt and the robot run in one controller, the belt's position needs no extra link to reach the robot. Without tracking, a slower belt only makes the miss smaller."
        },
        {
          "id": "clips-dividers",
          "title": "Parts catch the tray's dividers",
          "url": "https://motion.metatwinmaker.com/robot/troubleshoot/clips-dividers",
          "report": "To speed the cell up, someone opened the blend above each slot. Now parts catch the dividers on the way in and some land crooked.",
          "lookFor": "On the routine, the move to Above_Slot has a command tolerance of 80 mm, so the move down starts long before the arm is over the slot. On the tool's trend its height drops while it is still moving across.",
          "test": "Run the cell from the start of a shift for 20 s",
          "symptom": {
            "measure": "Deepest a part went into a divider, mm",
            "above": 2
          },
          "fixesToTry": [
            "Command tolerance on Above_Slot back to 10 mm",
            "Actual tolerance (TT0) at Above_Slot"
          ],
          "cause": "With Command tolerance the next move starts once the current one is within that distance of its end, and the two run at once: the corner is rounded off, more the larger the tolerance. Above a slot with only 10 mm between the part and the dividers, an 80 mm blend starts the drop while the part is still crossing into place, and it goes down over the divider. Keep the blend small where clearance is tight, or stop over the slot, and blend freely where the path is clear."
        }
      ],
      "trends": [
        {
          "group": "Tool",
          "title": "Tool height (Z)",
          "unit": "mm",
          "series": ["Command", "Tool"]
        },
        {
          "group": "Tool",
          "title": "Tool along the belt (Y)",
          "unit": "mm",
          "series": ["Command", "Tool"]
        },
        {
          "group": "Tool",
          "title": "Path error",
          "unit": "mm",
          "series": ["Off its command"]
        },
        {
          "group": "Tool",
          "title": "Tool speed",
          "unit": "mm/s",
          "series": ["Commanded"]
        },
        {
          "group": "Tool",
          "title": "Into a divider",
          "unit": "mm",
          "series": ["Part below a divider's top"]
        },
        {
          "group": "Tool",
          "title": "Placed",
          "unit": "parts",
          "series": ["Since the start"]
        },
        {
          "group": "The joint picked",
          "title": "J1 angle",
          "unit": "°",
          "series": ["Command", "Joint"]
        },
        {
          "group": "The joint picked",
          "title": "J1 following error",
          "unit": "°",
          "series": ["Command − joint"]
        },
        {
          "group": "The joint picked",
          "title": "J1 speed",
          "unit": "°/s",
          "series": ["Joint"]
        },
        {
          "group": "The joint picked",
          "title": "J1 torque",
          "unit": "N·m",
          "series": ["Drive"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/robot.glb",
        "manifest": "https://motion.metatwinmaker.com/models/robot.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 10372,
        "joints": [
          {
            "node": "AXIS_j1_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j2_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j3_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j4_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j5_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j6_rot",
            "kind": "rotary"
          }
        ]
      },
      "hall": {
        "x": -4,
        "z": 4.25,
        "walkUrl": "https://motion.metatwinmaker.com/robot/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["track", "amr"],
      "jev": {
        "state": {
          "twin": "Robot cell",
          "summary": "A six-axis arm picking parts off a moving belt into a tray, programmed as Logix coordinated motion.",
          "description": "A generic six-axis articulated arm, a belt axis bringing parts past a photo-eye, and a six-slot tray, all run by one Logix controller under unified robot control. The program is written as the motion instructions a routine would use: a kinematic transform between joint and Cartesian coordinate systems, linear moves with termination types, tracking the moving belt and a coordinated stop. Six scenarios cover stopping at every point, faults in transit, gripping air, heavy parts, missing parts on the belt and clipping the tray's dividers.",
          "machine": "Six-axis articulated robot cell with conveyor tracking",
          "workpiece": "Parts picked from a moving belt and placed in a tray.",
          "control": "A Logix controller with integrated motion on servo drives: six joint axes, joint and Cartesian coordinate systems linked by a transform.",
          "axes": [
            {
              "name": "J1–J6",
              "kind": "rotary",
              "actuator": "Servo motors through reducers",
              "role": "The arm's six joints"
            },
            {
              "name": "Belt",
              "kind": "linear",
              "actuator": "Servo motor driving a belt",
              "role": "Brings parts"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Robot stops dead at every point",
              "report": "After the routine was tidied up the cell takes longer per part, and the arm visibly stops at every point on its way."
            },
            {
              "problem": "Arm faults on its way to the tray",
              "report": "A new programmer replaced the swing over to the tray with a straight-line move to save a few lines. Now the arm faults on the first part and stops."
            },
            {
              "problem": "Gripper closes above the part",
              "report": "Maintenance fitted shorter gripper fingers. Since then the gripper closes on nothing and every part goes into the reject bin."
            },
            {
              "problem": "Arm wanders off its path with the new parts",
              "report": "The cell now handles 6 kg castings instead of 2 kg brackets. The arm sags and wanders off its path while it carries one, and settles slowly at the tray."
            },
            {
              "problem": "Robot misses parts on the moving belt",
              "report": "The routine was rewritten for a new belt. Now the robot goes down where the part was and closes beside it, so parts run off the end into the bin."
            },
            {
              "problem": "Parts catch the tray's dividers",
              "report": "To speed the cell up, someone opened the blend above each slot. Now parts catch the dividers on the way in and some land crooked."
            }
          ],
          "trends": [
            "Tool height (Z) (mm)",
            "Tool along the belt (Y) (mm)",
            "Path error (mm)",
            "Tool speed (mm/s)",
            "Into a divider (mm)",
            "Placed (parts)",
            "J1 angle (°)",
            "J1 following error (°)",
            "J1 speed (°/s)",
            "J1 torque (N·m)"
          ],
          "logixMotionInstructions": ["MSO", "MSF", "MCTO", "MCTP", "MCLM", "MDCC", "MCS", "MAFR"]
        },
        "stateText": "Digital twin: Robot cell. A six-axis arm picking parts off a moving belt into a tray, programmed as Logix coordinated motion.\nA generic six-axis articulated arm, a belt axis bringing parts past a photo-eye, and a six-slot tray, all run by one Logix controller under unified robot control. The program is written as the motion instructions a routine would use: a kinematic transform between joint and Cartesian coordinate systems, linear moves with termination types, tracking the moving belt and a coordinated stop. Six scenarios cover stopping at every point, faults in transit, gripping air, heavy parts, missing parts on the belt and clipping the tray's dividers.\nMachine: Six-axis articulated robot cell with conveyor tracking. Workpiece: Parts picked from a moving belt and placed in a tray.\nAxes: J1–J6 (rotary, Servo motors through reducers: The arm's six joints); Belt (linear, Servo motor driving a belt: Brings parts).\nControl: A Logix controller with integrated motion on servo drives: six joint axes, joint and Cartesian coordinate systems linked by a transform.\nTroubleshooting scenarios: Robot stops dead at every point; Arm faults on its way to the tray; Gripper closes above the part; Arm wanders off its path with the new parts; Robot misses parts on the moving belt; Parts catch the tray's dividers.\nTrends shown: Tool height (Z), Tool along the belt (Y), Path error, Tool speed, Into a divider, Placed, J1 angle, J1 following error, J1 speed, J1 torque.\nLogix motion instructions used: MSO, MSF, MCTO, MCTP, MCLM, MDCC, MCS, MAFR.",
        "expected": {
          "category": "robotics",
          "level": 2,
          "industry_general_manufacturing": false,
          "industry_automotive": true,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": true,
          "industry_electronics": true,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": true,
          "concept_inertia_mismatch": true,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": true,
          "concept_robot_kinematics": true,
          "concept_conveyor_tracking": true,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": false,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": false,
          "audience_controls_engineer": true,
          "audience_machine_builder": true,
          "audience_student": false,
          "audience_process_engineer": false
        }
      }
    },
    {
      "id": "amr",
      "station": 6,
      "name": "Mobile robot fleet",
      "url": "https://motion.metatwinmaker.com/amr",
      "summary": "A mobile robot carrying trays across the hall from the robot cell to the cart track, under a fleet manager.",
      "description": "A look-alike autonomous mobile robot with a differential drive plans its way across the lab hall's own floor plan, follows the path, docks at roller tray tables and charges on its charger. Safety laser scanners grow warning and protective fields with its speed, and a PLC handshake hands trays on and off. Five scenarios cover a late request, crawling past the cell, stopping in the aisle, docking short and running flat mid-shift.",
      "machine": {
        "class": "Autonomous mobile robot with fleet dispatch",
        "lookAlike": true,
        "workpiece": "Trays of parts moved between stations.",
        "control": "A fleet manager dispatching jobs, with a PLC handshake at each tray table.",
        "axes": [
          {
            "name": "Left and right wheels",
            "kind": "rotary",
            "actuator": "Wheel motors",
            "role": "Differential drive"
          }
        ]
      },
      "classification": {
        "category": "intralogistics",
        "industries": ["warehousing-logistics", "automotive", "general-manufacturing"],
        "concepts": ["mobile-navigation", "multi-axis-sequencing", "fault-diagnosis"],
        "instructions": [],
        "safety": ["laser-scanner", "safe-stop"],
        "audiences": ["controls-engineer", "process-engineer", "maintenance-technician"],
        "level": "intermediate",
        "keywords": ["amr", "agv", "fleet", "docking", "battery", "path planning", "lidar"]
      },
      "views": [
        {
          "id": "amr",
          "label": "Fleet terminal",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/amr"
        },
        {
          "id": "amr-cell",
          "label": "Cell pickup",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/amr/cell"
        },
        {
          "id": "amr-track",
          "label": "Track drop-off",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/amr/track"
        },
        {
          "id": "amr-hall",
          "label": "Across the hall",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/amr/hall"
        },
        {
          "id": "amr-follow",
          "label": "Follow robot",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/amr/follow"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "6",
          "url": "https://motion.metatwinmaker.com/amr/walk"
        }
      ],
      "scenarios": [
        {
          "id": "late-request",
          "title": "The robot cell waits on the mobile robot",
          "url": "https://motion.metatwinmaker.com/amr/troubleshoot/late-request",
          "report": "Since the robot cell's PLC was changed to save trips, the cell keeps stopping with a full tray in its hand while the mobile robot is on its way.",
          "lookFor": "On the fleet panel the cell asks for a pickup only once it is held: a tray ready and its tray-out table full. On the trend the cell stays held from that moment until the robot has docked and loaded.",
          "test": "Run the fleet and the cells for 4 minutes",
          "symptom": {
            "measure": "Seconds the robot cell stood held",
            "above": 5
          },
          "fixesToTry": [
            "Ask for a pickup as soon as one tray is out",
            "Raise the fleet's top speed to 2 m/s"
          ],
          "cause": "A pickup takes the robot the time to come from its charger, dock and load. Asking only once the cell has nowhere to put a tray means the cell stands for all of that time, every trip. Asking at the first tray starts the trip while the next ones are still being filled, and the table's three places cover the journey. A faster top speed hardly changes it: much of a trip is backing out, docking, loading and the slow zone by the cell, which top speed does not touch."
        },
        {
          "id": "slow-zone",
          "title": "The mobile robot crawls past the robot cell",
          "url": "https://motion.metatwinmaker.com/amr/troubleshoot/slow-zone",
          "report": "After a near miss, someone set a slow zone for the mobile robot. Now it crawls most of the way and the robot cell runs out of room for trays.",
          "lookFor": "On the fleet panel a 0.3 m/s zone covers the hall from its left wall to the door. On the trend the robot's speed sits at 0.3 m/s for most of each trip.",
          "test": "Run the fleet and the cells for 4 minutes",
          "symptom": {
            "measure": "Seconds the robot cell stood held",
            "above": 5
          },
          "fixesToTry": [
            "Limit the slow zone to the robot cell's surroundings (0.8 m/s)",
            "Raise the fleet's top speed to 2 m/s"
          ],
          "cause": "A speed zone caps the robot wherever its centre is inside it, whatever its top speed. The robot's own safety fields already slow and stop it for people in its path; a zone is for places where people are expected round a corner, such as the robot cell's guard. Spread over half the hall it more than doubles every trip, and the cell's three tray places no longer cover a pickup."
        },
        {
          "id": "stuck-aisle",
          "title": "The mobile robot stops in the aisle for good",
          "url": "https://motion.metatwinmaker.com/amr/troubleshoot/stuck-aisle",
          "report": "A pallet was left in the aisle by the robot cell. The mobile robot stopped in front of it and has not moved since.",
          "lookFor": "On the trend the nearest obstacle sits inside the protective field and the speed is zero. On the fleet panel, planning round obstacles is off.",
          "test": "Run the fleet and the cells for 4 minutes",
          "symptom": {
            "measure": "Longest stop for an obstacle, s",
            "above": 20
          },
          "fixesToTry": [
            "Let the robot plan round an obstacle after 3 s",
            "Lower the fleet's top speed to 1 m/s"
          ],
          "cause": "The robot's protective field stops it for anything in its way, as it must. What it does next is the fleet's setting: wait for the way to clear, or plan a new path round what it has seen. With planning off it waits for the obstacle to move, which is right for a person crossing and wrong for a pallet set down for the shift. With it on, the robot puts the pallet on its map and takes the next aisle."
        },
        {
          "id": "docks-short",
          "title": "Trays will not roll onto the robot at the cell",
          "url": "https://motion.metatwinmaker.com/amr/troubleshoot/docks-short",
          "report": "The robot cell's tray-out table was moved back a little when the floor was cleaned. Since then the mobile robot docks, then backs out again without the trays, over and over.",
          "lookFor": "In the jobs, each pickup fails: the deck never lines up with the table. The robot stops where its dock was taught, 110 mm short of the table, too far for the rollers.",
          "test": "Run the fleet and the cells for 4 minutes",
          "symptom": {
            "measure": "Transfers refused",
            "above": 0.5
          },
          "fixesToTry": [
            "Teach the robot cell's dock again",
            "Raise the fleet's top speed to 2 m/s"
          ],
          "cause": "A robot docks to the pose it was taught, not to the table: the map has walls, not where a table was pushed to this morning. The rollers bridge 40 mm, so 80 mm of movement is enough. Fix the table's place on the floor or teach the dock again where the table is now, and check the docks whenever a table, a stand or a conveyor end is moved."
        },
        {
          "id": "runs-flat",
          "title": "The mobile robot runs flat mid-shift",
          "url": "https://motion.metatwinmaker.com/amr/troubleshoot/runs-flat",
          "report": "The mobile robot stopped dead in the middle of the hall with a flat battery, in the middle of a job.",
          "lookFor": "On the fleet panel the low-battery level is 2 %, below the 3 % at which the robot stops to save its battery, so it never goes to charge in time.",
          "test": "Run the fleet and the cells for 4 minutes",
          "symptom": {
            "measure": "Stranded on a flat battery (1 = yes)",
            "above": 0.5
          },
          "fixesToTry": ["Send it to charge below 20 %", "Charge it to 90 % instead of 60 %"],
          "cause": "The fleet manager sends a robot to charge only when its battery drops below the low level, and only between jobs. Set below the level at which the robot protects its battery, that never happens in time: it takes another job and stops wherever it is when the battery reaches the floor. Keep the low level well above a job's worth of charge; how full it charges does not matter if it never goes."
        }
      ],
      "trends": [
        {
          "title": "Speed",
          "unit": "m/s",
          "series": ["Command", "Robot"]
        },
        {
          "title": "Obstacle ahead",
          "unit": "m",
          "series": ["Nearest (5 = clear)", "Protective field", "Warning field"]
        },
        {
          "title": "Battery",
          "unit": "%",
          "series": ["Charge"]
        },
        {
          "title": "Trays waiting at the cell",
          "unit": "trays",
          "series": ["On the tray-out table"]
        },
        {
          "title": "Robot cell held",
          "unit": "1 = held",
          "series": ["A tray with nowhere to go"]
        },
        {
          "title": "Delivered",
          "unit": "trays",
          "series": ["To the cart track"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/amr.glb",
        "manifest": "https://motion.metatwinmaker.com/models/amr.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 4268,
        "joints": []
      },
      "hall": {
        "x": 6.6,
        "z": 4.25,
        "walkUrl": "https://motion.metatwinmaker.com/amr/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["robot", "track", "asrs"],
      "jev": {
        "state": {
          "twin": "Mobile robot fleet",
          "summary": "A mobile robot carrying trays across the hall from the robot cell to the cart track, under a fleet manager.",
          "description": "A look-alike autonomous mobile robot with a differential drive plans its way across the lab hall's own floor plan, follows the path, docks at roller tray tables and charges on its charger. Safety laser scanners grow warning and protective fields with its speed, and a PLC handshake hands trays on and off. Five scenarios cover a late request, crawling past the cell, stopping in the aisle, docking short and running flat mid-shift.",
          "machine": "Autonomous mobile robot with fleet dispatch",
          "workpiece": "Trays of parts moved between stations.",
          "control": "A fleet manager dispatching jobs, with a PLC handshake at each tray table.",
          "axes": [
            {
              "name": "Left and right wheels",
              "kind": "rotary",
              "actuator": "Wheel motors",
              "role": "Differential drive"
            }
          ],
          "troubleshooting": [
            {
              "problem": "The robot cell waits on the mobile robot",
              "report": "Since the robot cell's PLC was changed to save trips, the cell keeps stopping with a full tray in its hand while the mobile robot is on its way."
            },
            {
              "problem": "The mobile robot crawls past the robot cell",
              "report": "After a near miss, someone set a slow zone for the mobile robot. Now it crawls most of the way and the robot cell runs out of room for trays."
            },
            {
              "problem": "The mobile robot stops in the aisle for good",
              "report": "A pallet was left in the aisle by the robot cell. The mobile robot stopped in front of it and has not moved since."
            },
            {
              "problem": "Trays will not roll onto the robot at the cell",
              "report": "The robot cell's tray-out table was moved back a little when the floor was cleaned. Since then the mobile robot docks, then backs out again without the trays, over and over."
            },
            {
              "problem": "The mobile robot runs flat mid-shift",
              "report": "The mobile robot stopped dead in the middle of the hall with a flat battery, in the middle of a job."
            }
          ],
          "trends": [
            "Speed (m/s)",
            "Obstacle ahead (m)",
            "Battery (%)",
            "Trays waiting at the cell (trays)",
            "Robot cell held (1 = held)",
            "Delivered (trays)"
          ],
          "logixMotionInstructions": []
        },
        "stateText": "Digital twin: Mobile robot fleet. A mobile robot carrying trays across the hall from the robot cell to the cart track, under a fleet manager.\nA look-alike autonomous mobile robot with a differential drive plans its way across the lab hall's own floor plan, follows the path, docks at roller tray tables and charges on its charger. Safety laser scanners grow warning and protective fields with its speed, and a PLC handshake hands trays on and off. Five scenarios cover a late request, crawling past the cell, stopping in the aisle, docking short and running flat mid-shift.\nMachine: Autonomous mobile robot with fleet dispatch. Workpiece: Trays of parts moved between stations.\nAxes: Left and right wheels (rotary, Wheel motors: Differential drive).\nControl: A fleet manager dispatching jobs, with a PLC handshake at each tray table.\nTroubleshooting scenarios: The robot cell waits on the mobile robot; The mobile robot crawls past the robot cell; The mobile robot stops in the aisle for good; Trays will not roll onto the robot at the cell; The mobile robot runs flat mid-shift.\nTrends shown: Speed, Obstacle ahead, Battery, Trays waiting at the cell, Robot cell held, Delivered.",
        "expected": {
          "category": "intralogistics",
          "level": 1,
          "industry_general_manufacturing": true,
          "industry_automotive": true,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": true,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": true,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": true,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": false,
          "audience_process_engineer": true
        }
      }
    },
    {
      "id": "asrs",
      "station": 7,
      "name": "Warehouse crane",
      "url": "https://motion.metatwinmaker.com/asrs",
      "summary": "A miniload crane storing and retrieving totes in a two-rack aisle, with mast sway to settle.",
      "description": "A miniload storage and retrieval crane travels an aisle between two racks of totes, hoists up its mast and reaches into a slot with telescopic forks; conveyors at the aisle's end hand totes to and from the mobile robot. Each axis moves point to point with an S-curve, and the tall mast sways after travel, so the forks wait for it to settle. Five scenarios cover waiting on sway, a replaced hoist drive, single cycles after a warehouse system update, double storage and a laser distance sensor dropping out.",
      "machine": {
        "class": "Miniload automated storage and retrieval crane",
        "lookAlike": true,
        "workpiece": "Totes stored in and retrieved from rack slots.",
        "control": "A Logix controller with integrated motion on servo drives: three axes stepped through each task by the PLC, orders from a warehouse system.",
        "axes": [
          {
            "name": "Travel",
            "kind": "linear",
            "actuator": "Servo motor",
            "role": "Along the aisle"
          },
          {
            "name": "Hoist",
            "kind": "linear",
            "actuator": "Servo motor",
            "role": "Up the mast"
          },
          {
            "name": "Forks",
            "kind": "linear",
            "actuator": "Servo motor",
            "role": "Telescopic arms into a slot"
          }
        ]
      },
      "classification": {
        "category": "intralogistics",
        "industries": ["warehousing-logistics", "general-manufacturing"],
        "concepts": [
          "point-to-point",
          "s-curve",
          "vibration-resonance",
          "feedback-devices",
          "multi-axis-sequencing",
          "fault-diagnosis"
        ],
        "instructions": ["MAM", "MAFR"],
        "safety": ["safe-stop"],
        "audiences": ["controls-engineer", "maintenance-technician", "process-engineer"],
        "level": "intermediate",
        "keywords": ["as/rs", "asrs", "stacker crane", "miniload", "tote", "rack", "sway"]
      },
      "views": [
        {
          "id": "asrs",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/asrs"
        },
        {
          "id": "asrs-aisle",
          "label": "Down the aisle",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/asrs/aisle"
        },
        {
          "id": "asrs-conveyors",
          "label": "Conveyors",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/asrs/conveyors"
        },
        {
          "id": "asrs-top",
          "label": "Top of the rack",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/asrs/top"
        },
        {
          "id": "asrs-handler",
          "label": "Follow handler",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/asrs/handler"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "6",
          "url": "https://motion.metatwinmaker.com/asrs/walk"
        }
      ],
      "scenarios": [
        {
          "id": "mast-sway",
          "title": "The crane waits at every stop before it reaches in",
          "url": "https://motion.metatwinmaker.com/asrs/troubleshoot/mast-sway",
          "report": "Since the travel drive was replaced, the crane stops at a slot and then just hangs there for several seconds before the arms go out. It is worst high up.",
          "lookFor": "On the trend, the handler's swing after each stop: it rings for seconds above the window. The new drive's travel moves are trapezoidal: the acceleration jumps straight to 2 m/s² and back.",
          "test": "Run six minutes of orders",
          "symptom": {
            "measure": "Seconds waiting for the mast to settle",
            "above": 10
          },
          "fixesToTry": [
            "Halve the travel acceleration to 1 m/s²",
            "Give the travel moves an S-curve, the jerk ramp as long as the mast's period"
          ],
          "cause": "A crane's mast is tall and light: it bends, and when the travel's acceleration changes in a step, it rings at its first mode (here 1.2 Hz) and dies away only slowly. The arms may not reach into a slot until the swing at the handler is inside a few millimetres. An S-curve whose jerk ramp lasts exactly one period of the mast adds the swing each ramp starts to the swing it stops, and they cancel: the mast arrives still. Lowering the acceleration only makes the swing smaller, not gone."
        },
        {
          "id": "one-axis",
          "title": "Orders pile up since the hoist drive was changed",
          "url": "https://motion.metatwinmaker.com/asrs/troubleshoot/one-axis",
          "report": "The hoist drive was changed in the spring, and the program with it. Since then the crane falls behind at busy times. It does not fault; it is just slower.",
          "lookFor": "On the trend, the hoist's speed and the travel's: the hoist only starts once the travel has stopped, so every move takes the two one after the other.",
          "test": "Run six minutes of orders",
          "symptom": {
            "measure": "Orders waiting at the end",
            "above": 2
          },
          "fixesToTry": [
            "Raise the hoist speed to 2 m/s",
            "Start the hoist move together with the travel move"
          ],
          "cause": "Travel and hoist are separate axes and can move at once: a move then takes as long as the slower of the two. The new program waited for the travel's move to finish (its PC bit) before it started the hoist's, so every move took both one after the other. Start both moves on the same rung, and wait for both to finish."
        },
        {
          "id": "single-cycles",
          "title": "Orders pile up since the warehouse system update",
          "url": "https://motion.metatwinmaker.com/asrs/troubleshoot/single-cycles",
          "report": "After the warehouse system was updated, retrieve orders and totes on the inbound conveyor pile up at the busy times. The crane looks busy all the time.",
          "lookFor": "Watch the crane after a store: it goes back to the conveyors empty, and only then out again for a retrieve.",
          "test": "Run six minutes of orders",
          "symptom": {
            "measure": "Orders waiting at the end",
            "above": 2
          },
          "fixesToTry": [
            "Raise the hoist speed to 2 m/s",
            "Pair each store with a retrieve (dual command cycles)"
          ],
          "cause": "In single command cycles the crane stores one tote and comes back empty, then goes out for a retrieve and comes back. In a dual command cycle it goes straight from the slot it stored in to the slot it retrieves from, and saves one empty trip in two. The update had set the system to single cycles."
        },
        {
          "id": "double-storage",
          "title": "The crane finds slots full that should be empty",
          "url": "https://motion.metatwinmaker.com/asrs/troubleshoot/double-storage",
          "report": "During a breakdown, totes were put away by hand. Since then the crane keeps reporting slots occupied that the warehouse system thinks are empty, and takes the tote somewhere else.",
          "lookFor": "The crane's photo-eye looks into a slot before a tote goes in. In the panel's events, 'slot occupied' for slots the record has as empty.",
          "test": "Run six minutes of orders",
          "symptom": {
            "measure": "Stores that found their slot full",
            "above": 0.5
          },
          "fixesToTry": ["Bypass the slot check", "Scan the rack and put the record right"],
          "cause": "The warehouse system stores by its record, not by looking. Totes put away by hand are in slots it thinks are empty, so it sends totes there; the photo-eye catches it and the tote goes elsewhere. Bypassing the check is worse: the tote strikes the one already in the slot and the crane faults. Scan the rack against the record after anyone has worked in it by hand."
        },
        {
          "id": "laser-dropout",
          "title": "The crane faults at the far end of the aisle",
          "url": "https://motion.metatwinmaker.com/asrs/troubleshoot/laser-dropout",
          "report": "Every so often the crane stops with 'travel position lost'. It is always at the far end of the aisle. A reset and it carries on.",
          "lookFor": "On the trend, the laser's return quality falls the further the crane is from the reflector, and is below the weak line in the far bays: the faults come there.",
          "test": "Run six minutes of orders",
          "symptom": {
            "measure": "Faults that stopped the crane",
            "above": 0.5
          },
          "fixesToTry": ["Lower the travel speed to 1.5 m/s", "Clean the laser's reflector"],
          "cause": "The travel position comes from a laser on the crane measuring the distance to a reflector at the aisle's end. The return weakens with distance; dust on the reflector weakens it everywhere, until in the far bays it drops out now and then, and the drive loses its position. Slowing down only keeps the crane longer where the return is weak. Clean the reflector, and check the laser's signal quality whenever the far bays fault."
        }
      ],
      "trends": [
        {
          "title": "Travel",
          "unit": "m",
          "series": ["Crane", "Handler"]
        },
        {
          "title": "Handler swing",
          "unit": "mm",
          "series": ["Handler off the crane", "Window to reach in"]
        },
        {
          "title": "Travel speed",
          "unit": "m/s",
          "series": ["Crane"]
        },
        {
          "title": "Hoist",
          "unit": "m",
          "series": ["Handler height"]
        },
        {
          "title": "Laser return",
          "unit": "%",
          "series": ["Quality", "Drops out below"]
        },
        {
          "title": "Orders waiting",
          "unit": "orders",
          "series": ["Retrieves and totes in"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/asrs.glb",
        "manifest": "https://motion.metatwinmaker.com/models/asrs.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 4448,
        "joints": [
          {
            "node": "AXIS_travel_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_sway_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_hoist_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_forks_lin",
            "kind": "linear"
          }
        ]
      },
      "hall": {
        "x": 0.3,
        "z": 4.45,
        "walkUrl": "https://motion.metatwinmaker.com/asrs/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["amr"],
      "jev": {
        "state": {
          "twin": "Warehouse crane",
          "summary": "A miniload crane storing and retrieving totes in a two-rack aisle, with mast sway to settle.",
          "description": "A miniload storage and retrieval crane travels an aisle between two racks of totes, hoists up its mast and reaches into a slot with telescopic forks; conveyors at the aisle's end hand totes to and from the mobile robot. Each axis moves point to point with an S-curve, and the tall mast sways after travel, so the forks wait for it to settle. Five scenarios cover waiting on sway, a replaced hoist drive, single cycles after a warehouse system update, double storage and a laser distance sensor dropping out.",
          "machine": "Miniload automated storage and retrieval crane",
          "workpiece": "Totes stored in and retrieved from rack slots.",
          "control": "A Logix controller with integrated motion on servo drives: three axes stepped through each task by the PLC, orders from a warehouse system.",
          "axes": [
            {
              "name": "Travel",
              "kind": "linear",
              "actuator": "Servo motor",
              "role": "Along the aisle"
            },
            {
              "name": "Hoist",
              "kind": "linear",
              "actuator": "Servo motor",
              "role": "Up the mast"
            },
            {
              "name": "Forks",
              "kind": "linear",
              "actuator": "Servo motor",
              "role": "Telescopic arms into a slot"
            }
          ],
          "troubleshooting": [
            {
              "problem": "The crane waits at every stop before it reaches in",
              "report": "Since the travel drive was replaced, the crane stops at a slot and then just hangs there for several seconds before the arms go out. It is worst high up."
            },
            {
              "problem": "Orders pile up since the hoist drive was changed",
              "report": "The hoist drive was changed in the spring, and the program with it. Since then the crane falls behind at busy times. It does not fault; it is just slower."
            },
            {
              "problem": "Orders pile up since the warehouse system update",
              "report": "After the warehouse system was updated, retrieve orders and totes on the inbound conveyor pile up at the busy times. The crane looks busy all the time."
            },
            {
              "problem": "The crane finds slots full that should be empty",
              "report": "During a breakdown, totes were put away by hand. Since then the crane keeps reporting slots occupied that the warehouse system thinks are empty, and takes the tote somewhere else."
            },
            {
              "problem": "The crane faults at the far end of the aisle",
              "report": "Every so often the crane stops with 'travel position lost'. It is always at the far end of the aisle. A reset and it carries on."
            }
          ],
          "trends": [
            "Travel (m)",
            "Handler swing (mm)",
            "Travel speed (m/s)",
            "Hoist (m)",
            "Laser return (%)",
            "Orders waiting (orders)"
          ],
          "logixMotionInstructions": ["MAM", "MAFR"]
        },
        "stateText": "Digital twin: Warehouse crane. A miniload crane storing and retrieving totes in a two-rack aisle, with mast sway to settle.\nA miniload storage and retrieval crane travels an aisle between two racks of totes, hoists up its mast and reaches into a slot with telescopic forks; conveyors at the aisle's end hand totes to and from the mobile robot. Each axis moves point to point with an S-curve, and the tall mast sways after travel, so the forks wait for it to settle. Five scenarios cover waiting on sway, a replaced hoist drive, single cycles after a warehouse system update, double storage and a laser distance sensor dropping out.\nMachine: Miniload automated storage and retrieval crane. Workpiece: Totes stored in and retrieved from rack slots.\nAxes: Travel (linear, Servo motor: Along the aisle); Hoist (linear, Servo motor: Up the mast); Forks (linear, Servo motor: Telescopic arms into a slot).\nControl: A Logix controller with integrated motion on servo drives: three axes stepped through each task by the PLC, orders from a warehouse system.\nTroubleshooting scenarios: The crane waits at every stop before it reaches in; Orders pile up since the hoist drive was changed; Orders pile up since the warehouse system update; The crane finds slots full that should be empty; The crane faults at the far end of the aisle.\nTrends shown: Travel, Handler swing, Travel speed, Hoist, Laser return, Orders waiting.\nLogix motion instructions used: MAM, MAFR.",
        "expected": {
          "category": "intralogistics",
          "level": 1,
          "industry_general_manufacturing": true,
          "industry_automotive": false,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": true,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": true,
          "concept_s_curve": true,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": true,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": true,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": false,
          "audience_process_engineer": true
        }
      }
    },
    {
      "id": "press",
      "station": 8,
      "name": "Servo press station",
      "url": "https://motion.metatwinmaker.com/press",
      "summary": "An electric press fitting pins into housings on a six-nest index table, judged by its force–depth curve.",
      "description": "A rod-style electric cylinder presses steel pins into housings on a six-nest rotary index table; the operator loads at the front behind a light curtain and a probe checks each pin's height. The press stops on position or force, and every press draws a force–depth curve judged against a window. Five scenarios cover pins pressed proud by frame stretch, overload faults, a new pin lot, parts crushed after the light curtain tripped and a slow program.",
      "machine": {
        "class": "Servo press-fit station with rotary index table",
        "lookAlike": true,
        "workpiece": "Pins pressed into housings.",
        "control": "A Logix controller with integrated motion on servo drives: the press and the table sequenced by the PLC, with in-process checks.",
        "axes": [
          {
            "name": "Press rod",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew in an electric cylinder, with a load cell",
            "role": "Presses the pin"
          },
          {
            "name": "Index table",
            "kind": "rotary",
            "actuator": "Servo motor",
            "role": "Brings the next nest under the press"
          }
        ]
      },
      "classification": {
        "category": "assembly",
        "industries": ["automotive", "electronics", "general-manufacturing"],
        "concepts": [
          "force-control",
          "point-to-point",
          "process-quality",
          "multi-axis-sequencing",
          "fault-diagnosis"
        ],
        "instructions": ["MAM", "MAJ", "MAS", "MCS", "MAFR"],
        "safety": ["light-curtain", "safe-stop"],
        "audiences": ["process-engineer", "controls-engineer", "maintenance-technician"],
        "level": "intermediate",
        "keywords": ["press fit", "electric cylinder", "force", "signature", "index table"]
      },
      "views": [
        {
          "id": "press",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/press"
        },
        {
          "id": "press-tool",
          "label": "Punch and nest",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/press/tool"
        },
        {
          "id": "press-table",
          "label": "Table from above",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/press/table"
        },
        {
          "id": "press-load",
          "label": "Operator's window",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/press/load"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/press/walk"
        }
      ],
      "scenarios": [
        {
          "id": "proud-pins",
          "title": "Every pin comes out a tenth proud",
          "url": "https://motion.metatwinmaker.com/press/troubleshoot/proud-pins",
          "report": "After the press was rebuilt, the height probe rejects nearly every part: each pin stands about 0.1 mm proud. The press says it went to 162.00 mm every time.",
          "lookFor": "On the force–depth plot, every pin stops short of 12 mm. The press goes to its position by the motor's encoder; the trend's force reaches 2 kN there.",
          "test": "Run six minutes of parts",
          "symptom": {
            "measure": "Parts rejected on height",
            "above": 2
          },
          "fixesToTry": [
            "Press to a force of 2 kN instead of a position",
            "Correct the end position for the frame's stretch (force ÷ 20 kN/mm)"
          ],
          "cause": "The press frame stretches under load, 0.1 mm at 2 kN here, so the tool is short of where the motor's encoder says it is. Pressing to the encoder's position leaves every pin proud by that stretch. Correct the target by the measured force over the frame's stiffness (or measure the tool's position directly). Pressing to a force is no cure for a pin with no shoulder: the force at depth varies with each part's fit, so the depth does too."
        },
        {
          "id": "overload",
          "title": "The press faults on overload every half minute",
          "url": "https://motion.metatwinmaker.com/press/troubleshoot/overload",
          "report": "Process engineering lengthened the hold at the end of the press to 3 s, to let the pins settle. Since then the press stops with a motor overload fault every half minute or so, and a reset only works after it has cooled.",
          "lookFor": "On the trend, the drive's load (its I²t) climbs with each part and trips at 100 %. The force holds at 2 kN for the whole dwell.",
          "test": "Run six minutes of parts",
          "symptom": {
            "measure": "Faults that stopped the press",
            "above": 0.5
          },
          "fixesToTry": [
            "Press in twice as fast (20 mm/s)",
            "Hold for 0.2 s at the end, then retract"
          ],
          "cause": "A servo press holds force with current: the motor's torque, and so its heating, goes with the force squared for as long as it holds. Holding 2 kN for 3 s of every 6 s puts the motor over its continuous rating, and its I²t protection trips. An interference fit does not need settling time; release after a short dwell. Pressing faster saves a little time but holds just as long."
        },
        {
          "id": "new-lot",
          "title": "Good parts rejected since the new pin lot",
          "url": "https://motion.metatwinmaker.com/press/troubleshoot/new-lot",
          "report": "Since the new lot of pins arrived, the press rejects four parts in five on its signature. The parts look fine. Someone suggested widening the window to ±50 %.",
          "lookFor": "On the force–depth plot, the curves end above the end box: the new lot's fit is tighter, so every good part needs about 2.4 kN where the window was taught for 2.0.",
          "test": "Run six minutes of parts",
          "symptom": {
            "measure": "Wrong verdicts",
            "above": 2
          },
          "fixesToTry": [
            "Widen the end box to ±50 % (1.0 to 3.0 kN)",
            "Teach the window again from 20 good parts of the new lot"
          ],
          "cause": "A signature window is taught from good parts, and good parts vary from lot to lot. Taught on the old lot, it rejects the new lot's good parts; widened to let them through, it also passes the loose fits, which need half the force and would fall out in use (wrong verdicts the other way). Teach it again from good parts of the new lot: mean ± 4 standard deviations keeps it tight."
        },
        {
          "id": "crushed",
          "title": "Every part crushed since the light curtain tripped",
          "url": "https://motion.metatwinmaker.com/press/troubleshoot/crushed",
          "report": "This morning the light curtain tripped while the table was turning. Since then every part has been crushed: the press faults on its force limit as soon as it touches the pin.",
          "lookFor": "Watch the table: it is no longer square to the press, so the pin is pressed off its bore. The table program indexes 60° on from wherever the table is (an incremental move).",
          "test": "Run six minutes of parts",
          "symptom": {
            "measure": "Parts crushed",
            "above": 0.5
          },
          "fixesToTry": [
            "Reset the light curtain at once, without the 0.5 s wait",
            "Index to each station's absolute angle (MAM absolute)"
          ],
          "cause": "A safe stop (SS1) brakes the table wherever it is. An incremental index then turns it 60° on from there, so every station after it is off by the part of the index that was done, and the press drives the pin into the housing's face beside its bore. Index to the station's absolute angle and an interrupted index simply finishes. (A station sensor that the press checks would have caught it too.)"
        },
        {
          "id": "slow-cycle",
          "title": "The press takes three times as long since its program changed",
          "url": "https://motion.metatwinmaker.com/press/troubleshoot/slow-cycle",
          "report": "After the press program was edited, output fell from over 15 parts a minute to about 5. Nothing faults and the parts are good.",
          "lookFor": "On the trend, the rod's position: it now goes all the way down at the slow press speed, 10 mm/s, instead of fast to just above the pin first.",
          "test": "Run six minutes of parts",
          "symptom": {
            "measure": "Seconds per part",
            "above": 5
          },
          "fixesToTry": [
            "Index the table twice as fast",
            "Approach at 200 mm/s to 3 mm above the pin, then press at 10 mm/s"
          ],
          "cause": "Pressing speed matters only while the tool is in contact; the 87 mm down to the pin can go at 200 mm/s. With the fast approach step gone, the press spends 9 s of every cycle creeping through air. Indexing the table faster saves a fraction of a second: the press is the bottleneck."
        }
      ],
      "trends": [
        {
          "title": "Rod",
          "unit": "mm",
          "series": ["Command", "Rod"]
        },
        {
          "title": "Force",
          "unit": "kN",
          "series": ["Load cell", "Force limit"]
        },
        {
          "title": "Table",
          "unit": "°",
          "series": ["Command", "Table"]
        },
        {
          "title": "Press motor load",
          "unit": "% I²t",
          "series": ["Load", "Fault at"]
        },
        {
          "title": "Light curtain",
          "unit": "1 = broken",
          "series": ["Broken"]
        },
        {
          "title": "Good parts",
          "unit": "parts",
          "series": ["Made"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/press.glb",
        "manifest": "https://motion.metatwinmaker.com/models/press.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 10544,
        "joints": [
          {
            "node": "AXIS_table_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_rod_lin",
            "kind": "linear"
          }
        ]
      },
      "hall": {
        "x": 7.3,
        "z": 4.6,
        "walkUrl": "https://motion.metatwinmaker.com/press/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["track"],
      "jev": {
        "state": {
          "twin": "Servo press station",
          "summary": "An electric press fitting pins into housings on a six-nest index table, judged by its force–depth curve.",
          "description": "A rod-style electric cylinder presses steel pins into housings on a six-nest rotary index table; the operator loads at the front behind a light curtain and a probe checks each pin's height. The press stops on position or force, and every press draws a force–depth curve judged against a window. Five scenarios cover pins pressed proud by frame stretch, overload faults, a new pin lot, parts crushed after the light curtain tripped and a slow program.",
          "machine": "Servo press-fit station with rotary index table",
          "workpiece": "Pins pressed into housings.",
          "control": "A Logix controller with integrated motion on servo drives: the press and the table sequenced by the PLC, with in-process checks.",
          "axes": [
            {
              "name": "Press rod",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew in an electric cylinder, with a load cell",
              "role": "Presses the pin"
            },
            {
              "name": "Index table",
              "kind": "rotary",
              "actuator": "Servo motor",
              "role": "Brings the next nest under the press"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Every pin comes out a tenth proud",
              "report": "After the press was rebuilt, the height probe rejects nearly every part: each pin stands about 0.1 mm proud. The press says it went to 162.00 mm every time."
            },
            {
              "problem": "The press faults on overload every half minute",
              "report": "Process engineering lengthened the hold at the end of the press to 3 s, to let the pins settle. Since then the press stops with a motor overload fault every half minute or so, and a reset only works after it has cooled."
            },
            {
              "problem": "Good parts rejected since the new pin lot",
              "report": "Since the new lot of pins arrived, the press rejects four parts in five on its signature. The parts look fine. Someone suggested widening the window to ±50 %."
            },
            {
              "problem": "Every part crushed since the light curtain tripped",
              "report": "This morning the light curtain tripped while the table was turning. Since then every part has been crushed: the press faults on its force limit as soon as it touches the pin."
            },
            {
              "problem": "The press takes three times as long since its program changed",
              "report": "After the press program was edited, output fell from over 15 parts a minute to about 5. Nothing faults and the parts are good."
            }
          ],
          "trends": [
            "Rod (mm)",
            "Force (kN)",
            "Table (°)",
            "Press motor load (% I²t)",
            "Light curtain (1 = broken)",
            "Good parts (parts)"
          ],
          "logixMotionInstructions": ["MAM", "MAJ", "MAS", "MCS", "MAFR"]
        },
        "stateText": "Digital twin: Servo press station. An electric press fitting pins into housings on a six-nest index table, judged by its force–depth curve.\nA rod-style electric cylinder presses steel pins into housings on a six-nest rotary index table; the operator loads at the front behind a light curtain and a probe checks each pin's height. The press stops on position or force, and every press draws a force–depth curve judged against a window. Five scenarios cover pins pressed proud by frame stretch, overload faults, a new pin lot, parts crushed after the light curtain tripped and a slow program.\nMachine: Servo press-fit station with rotary index table. Workpiece: Pins pressed into housings.\nAxes: Press rod (linear, Servo motor and ballscrew in an electric cylinder, with a load cell: Presses the pin); Index table (rotary, Servo motor: Brings the next nest under the press).\nControl: A Logix controller with integrated motion on servo drives: the press and the table sequenced by the PLC, with in-process checks.\nTroubleshooting scenarios: Every pin comes out a tenth proud; The press faults on overload every half minute; Good parts rejected since the new pin lot; Every part crushed since the light curtain tripped; The press takes three times as long since its program changed.\nTrends shown: Rod, Force, Table, Press motor load, Light curtain, Good parts.\nLogix motion instructions used: MAM, MAJ, MAS, MCS, MAFR.",
        "expected": {
          "category": "assembly",
          "level": 1,
          "industry_general_manufacturing": true,
          "industry_automotive": true,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": true,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": true,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": true,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": true,
          "concept_line_performance": false,
          "safety_light_curtain": true,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": false,
          "audience_process_engineer": true
        }
      }
    },
    {
      "id": "winder",
      "station": 9,
      "name": "Filament winder",
      "url": "https://motion.metatwinmaker.com/winder",
      "summary": "A four-axis wet winder laying carbon fibre on a pressure vessel's liner, its axes cammed to the spindle.",
      "description": "The mandrel turns on the spindle, the master axis; the carriage, the cross-feed and the payout eye's rotation are cammed to the spindle's angle, so the band lands where the winding pattern says at any speed. Four tows run through a dancer, whose servo feed holds the tension, and over a resin bath's drum. The liner's surface shows the band as it goes on. Five scenarios cover gaps between bands, slipping off the domes, breaks at the turns, dry parts and bare rings round the bosses.",
      "machine": {
        "class": "Four-axis wet filament winder",
        "lookAlike": true,
        "workpiece": "Carbon fibre tows and resin in, a wound pressure vessel out.",
        "control": "A Logix controller with integrated motion on servo drives: three axes cammed to the spindle, a tension loop on the dancer.",
        "axes": [
          {
            "name": "Spindle",
            "kind": "rotary",
            "actuator": "Servo motor",
            "role": "Turns the mandrel; the master"
          },
          {
            "name": "Carriage",
            "kind": "linear",
            "actuator": "Servo motor",
            "role": "Along the mandrel, cammed"
          },
          {
            "name": "Cross-feed",
            "kind": "linear",
            "actuator": "Servo motor",
            "role": "Towards the mandrel, cammed"
          },
          {
            "name": "Payout eye",
            "kind": "rotary",
            "actuator": "Servo motor",
            "role": "Turns the band flat, cammed"
          },
          {
            "name": "Dancer feed",
            "kind": "linear",
            "actuator": "Servo motor",
            "role": "Holds the fibre's tension"
          }
        ]
      },
      "classification": {
        "category": "process-machine",
        "industries": ["aerospace", "energy", "automotive"],
        "concepts": [
          "electronic-camming",
          "tension-control",
          "feedforward",
          "process-quality",
          "multi-axis-sequencing"
        ],
        "instructions": ["MAPC", "MAJ", "MAS", "MAFR"],
        "safety": ["light-curtain", "safe-stop"],
        "audiences": ["process-engineer", "controls-engineer", "machine-builder"],
        "level": "advanced",
        "keywords": [
          "composite",
          "carbon fibre",
          "carbon fiber",
          "pressure vessel",
          "hydrogen tank",
          "cam"
        ]
      },
      "views": [
        {
          "id": "winder",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/winder"
        },
        {
          "id": "winder-mandrel",
          "label": "The mandrel",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/winder/mandrel"
        },
        {
          "id": "winder-eye",
          "label": "Payout eye",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/winder/eye"
        },
        {
          "id": "winder-carriage",
          "label": "Tensioner and resin bath",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/winder/carriage"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/winder/walk"
        }
      ],
      "scenarios": [
        {
          "id": "gaps",
          "title": "Bare stripes between the helical bands",
          "url": "https://motion.metatwinmaker.com/winder/troubleshoot/gaps",
          "report": "A tow broke this morning; the operator cut it out and carried on with three. Since then the helical layers show bare liner between the bands, and quality has stopped the parts.",
          "lookFor": "On the mandrel, the bands no longer close up. In Pattern, the PLC still works the pattern out for a 16 mm band; three tows make 12 mm.",
          "test": "Wind two minutes of the part",
          "symptom": {
            "measure": "Bands with a gap beside them",
            "above": 5
          },
          "fixesToTry": [
            "Wind at half speed (15 rpm)",
            "Set the pattern's band to 12 mm, so the PLC works it out for three tows"
          ],
          "cause": "The pattern is worked out for the band's width: how many circuits cover the liner, and how far round from the last one each circuit's band goes on (16 mm here). Three tows lay 12 mm, so every band leaves 4 mm of bare liner beside the next. Tell the PLC the band it has and it works out 45 circuits instead of 34, which close up (or thread the fourth tow again). Speed has nothing to do with where the bands land: the carriage is cammed to the spindle."
        },
        {
          "id": "dome-slip",
          "title": "The band slips off the domes on the new liner",
          "url": "https://motion.metatwinmaker.com/winder/troubleshoot/dome-slip",
          "report": "Since the switch to liner B, with its bigger boss, the band slides off the domes at every turn and bunches up beside the boss. Someone suggests more tension to hold it down.",
          "lookFor": "In Pattern, the band is to turn 26 mm from the axis; liner B's boss is 35 mm across its radius. In Events, each slip and the friction the turn needed.",
          "test": "Wind two minutes of the part",
          "symptom": {
            "measure": "Turns where the band slipped",
            "above": 3
          },
          "fixesToTry": [
            "Raise the tension to 60 N",
            "Turn at 36 mm, just outside the new boss: the PLC sets the angle from it"
          ],
          "cause": "A band under tension on a curved surface takes the shortest path, a geodesic. On a dome a geodesic keeps r · sin α constant, so the angle on the cylinder decides where the band turns: sin α = 26 / 90 here, 16.8°. Liner B's boss is 35 mm, so that geodesic would run over the boss; the band is pulled round the boss's edge instead, on a path that needs more friction than a wet band has, and it slips. Set the turn just outside the boss and the PLC works out the angle (23.6°) and the pattern again. More tension presses the band down harder but pulls it sideways just as much harder; the friction it needs is the same."
        },
        {
          "id": "breaks",
          "title": "The fibre breaks at the turns since the speed went up",
          "url": "https://motion.metatwinmaker.com/winder/troubleshoot/breaks",
          "report": "To cut the cycle time, the helical speed went from 30 to 60 rpm. Since then the band breaks at nearly every turn, and the winder spends most of its time waiting to be tied in. The operator suggests less tension.",
          "lookFor": "On the trend, the dancer: at each turn it swings from stop to stop. The payout speed falls to a tenth as the band goes round the dome and comes back as it leaves; the feed, run on the dancer's position alone, is always behind.",
          "test": "Wind two minutes of the part",
          "symptom": {
            "measure": "Fibre breaks and slack",
            "above": 0.5
          },
          "fixesToTry": [
            "Lower the tension to 25 N",
            "Feed forward the payout speed the cam gives"
          ],
          "cause": "At a turn the band's payout speed drops from about 2 m/s to 0.2 m/s and back within a quarter of a second at 60 rpm. A feed run on the dancer's position alone changes speed only once the dancer has moved, and the faster the change, the further it moves: here, onto its stops. On the bottom stop the band goes slack and drops off the eye; on the top stop the fibre stretches and snaps. The PLC knows the payout speed from the cam: fed forward, the feed changes with it and the dancer hardly moves. Less tension does nothing for the dancer's travel."
        },
        {
          "id": "dry",
          "title": "Dry, pale parts since the resin bath was cleaned",
          "url": "https://motion.metatwinmaker.com/winder/troubleshoot/dry",
          "report": "The resin bath was stripped and cleaned at the weekend. Since then the parts come off pale and dry, and they fail the burst test. Someone suggests easing the tension so less resin is squeezed out.",
          "lookFor": "On the trend, the resin content: about 15 %, where it should be over 28 %. In Settings, the doctor blade's gap.",
          "test": "Wind two minutes of the part",
          "symptom": {
            "measure": "Passes short of resin",
            "above": 5
          },
          "fixesToTry": [
            "Lower the tension to 20 N to squeeze out less",
            "Set the doctor blade's gap back to 0.25 mm"
          ],
          "cause": "The drum carries a film of resin as thick as the doctor blade's gap, and each tow takes a share of it. Set back after cleaning at 0.10 mm, the film gives the tows well under half the resin they need: about 15 % by weight where the part wants 30 %. Less tension keeps a little more of it on the mandrel, but it cannot put back resin the tows never picked up."
        },
        {
          "id": "dome-miss",
          "title": "Bare rings round the bosses since the new program",
          "url": "https://motion.metatwinmaker.com/winder/troubleshoot/dome-miss",
          "report": "This part's program was copied over from the old two-axis winder. The cylinders are fine, but there is bare liner in a ring round each boss: the bands turn short of it. Someone suggests winding slower.",
          "lookFor": "Watch the eye at a turn: it stays out at the cylinder's radius, 79 mm from where the band turns. In Settings, whether the cross-feed follows the dome.",
          "test": "Wind two minutes of the part",
          "symptom": {
            "measure": "Turns short of the boss",
            "above": 5
          },
          "fixesToTry": [
            "Wind at half speed (15 rpm)",
            "Bring the eye in over the domes with the cross-feed"
          ],
          "cause": "Between the eye and the liner the band runs free, and the longer that free length, the further the band lands from where the cam meant it to. The eye here stays at the cylinder's radius, so at a turn there are 79 mm of free fibre and the band turns 4 mm short of the boss. A two-axis machine can do no better, but this one has a cross-feed: bring the eye in to 15 mm off the dome and the band lands within a millimetre of its place. Speed changes nothing about the geometry."
        }
      ],
      "trends": [
        {
          "title": "Spindle",
          "unit": "rpm",
          "series": ["Command", "Spindle"]
        },
        {
          "title": "Carriage",
          "unit": "mm",
          "series": ["Cam", "Carriage"]
        },
        {
          "title": "Cross-feed",
          "unit": "mm from the axis",
          "series": ["Cam", "Eye"]
        },
        {
          "title": "Tension",
          "unit": "N",
          "series": ["Tension", "Breaks at"]
        },
        {
          "title": "Dancer",
          "unit": "mm off its middle",
          "series": ["Dancer", "Its stop"]
        },
        {
          "title": "Resin content",
          "unit": "% by weight",
          "series": ["Last pass", "Least allowed"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/winder.glb",
        "manifest": "https://motion.metatwinmaker.com/models/winder.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 9516,
        "joints": [
          {
            "node": "AXIS_spindle_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_carriage_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_dancer_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_drum_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_crossfeed_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_eye_rot",
            "kind": "rotary"
          }
        ]
      },
      "hall": {
        "x": 4,
        "z": -2.62,
        "walkUrl": "https://motion.metatwinmaker.com/winder/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["lathe"],
      "jev": {
        "state": {
          "twin": "Filament winder",
          "summary": "A four-axis wet winder laying carbon fibre on a pressure vessel's liner, its axes cammed to the spindle.",
          "description": "The mandrel turns on the spindle, the master axis; the carriage, the cross-feed and the payout eye's rotation are cammed to the spindle's angle, so the band lands where the winding pattern says at any speed. Four tows run through a dancer, whose servo feed holds the tension, and over a resin bath's drum. The liner's surface shows the band as it goes on. Five scenarios cover gaps between bands, slipping off the domes, breaks at the turns, dry parts and bare rings round the bosses.",
          "machine": "Four-axis wet filament winder",
          "workpiece": "Carbon fibre tows and resin in, a wound pressure vessel out.",
          "control": "A Logix controller with integrated motion on servo drives: three axes cammed to the spindle, a tension loop on the dancer.",
          "axes": [
            {
              "name": "Spindle",
              "kind": "rotary",
              "actuator": "Servo motor",
              "role": "Turns the mandrel; the master"
            },
            {
              "name": "Carriage",
              "kind": "linear",
              "actuator": "Servo motor",
              "role": "Along the mandrel, cammed"
            },
            {
              "name": "Cross-feed",
              "kind": "linear",
              "actuator": "Servo motor",
              "role": "Towards the mandrel, cammed"
            },
            {
              "name": "Payout eye",
              "kind": "rotary",
              "actuator": "Servo motor",
              "role": "Turns the band flat, cammed"
            },
            {
              "name": "Dancer feed",
              "kind": "linear",
              "actuator": "Servo motor",
              "role": "Holds the fibre's tension"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Bare stripes between the helical bands",
              "report": "A tow broke this morning; the operator cut it out and carried on with three. Since then the helical layers show bare liner between the bands, and quality has stopped the parts."
            },
            {
              "problem": "The band slips off the domes on the new liner",
              "report": "Since the switch to liner B, with its bigger boss, the band slides off the domes at every turn and bunches up beside the boss. Someone suggests more tension to hold it down."
            },
            {
              "problem": "The fibre breaks at the turns since the speed went up",
              "report": "To cut the cycle time, the helical speed went from 30 to 60 rpm. Since then the band breaks at nearly every turn, and the winder spends most of its time waiting to be tied in. The operator suggests less tension."
            },
            {
              "problem": "Dry, pale parts since the resin bath was cleaned",
              "report": "The resin bath was stripped and cleaned at the weekend. Since then the parts come off pale and dry, and they fail the burst test. Someone suggests easing the tension so less resin is squeezed out."
            },
            {
              "problem": "Bare rings round the bosses since the new program",
              "report": "This part's program was copied over from the old two-axis winder. The cylinders are fine, but there is bare liner in a ring round each boss: the bands turn short of it. Someone suggests winding slower."
            }
          ],
          "trends": [
            "Spindle (rpm)",
            "Carriage (mm)",
            "Cross-feed (mm from the axis)",
            "Tension (N)",
            "Dancer (mm off its middle)",
            "Resin content (% by weight)"
          ],
          "logixMotionInstructions": ["MAPC", "MAJ", "MAS", "MAFR"]
        },
        "stateText": "Digital twin: Filament winder. A four-axis wet winder laying carbon fibre on a pressure vessel's liner, its axes cammed to the spindle.\nThe mandrel turns on the spindle, the master axis; the carriage, the cross-feed and the payout eye's rotation are cammed to the spindle's angle, so the band lands where the winding pattern says at any speed. Four tows run through a dancer, whose servo feed holds the tension, and over a resin bath's drum. The liner's surface shows the band as it goes on. Five scenarios cover gaps between bands, slipping off the domes, breaks at the turns, dry parts and bare rings round the bosses.\nMachine: Four-axis wet filament winder. Workpiece: Carbon fibre tows and resin in, a wound pressure vessel out.\nAxes: Spindle (rotary, Servo motor: Turns the mandrel; the master); Carriage (linear, Servo motor: Along the mandrel, cammed); Cross-feed (linear, Servo motor: Towards the mandrel, cammed); Payout eye (rotary, Servo motor: Turns the band flat, cammed); Dancer feed (linear, Servo motor: Holds the fibre's tension).\nControl: A Logix controller with integrated motion on servo drives: three axes cammed to the spindle, a tension loop on the dancer.\nTroubleshooting scenarios: Bare stripes between the helical bands; The band slips off the domes on the new liner; The fibre breaks at the turns since the speed went up; Dry, pale parts since the resin bath was cleaned; Bare rings round the bosses since the new program.\nTrends shown: Spindle, Carriage, Cross-feed, Tension, Dancer, Resin content.\nLogix motion instructions used: MAPC, MAJ, MAS, MAFR.",
        "expected": {
          "category": "process-machine",
          "level": 2,
          "industry_general_manufacturing": false,
          "industry_automotive": true,
          "industry_aerospace": true,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": false,
          "industry_energy": true,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": true,
          "concept_following_error": false,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": true,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": true,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": true,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": false,
          "concept_tool_compensation": false,
          "concept_process_quality": true,
          "concept_line_performance": false,
          "safety_light_curtain": true,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": false,
          "audience_controls_engineer": true,
          "audience_machine_builder": true,
          "audience_student": false,
          "audience_process_engineer": true
        }
      }
    },
    {
      "id": "cnc",
      "station": 10,
      "name": "CNC mill",
      "url": "https://motion.metatwinmaker.com/cnc",
      "summary": "An enclosed three-axis vertical mill running a part program as coordinated motion, cutting a block you can watch.",
      "description": "A compact vertical mill whose X, Y and Z are servo axes on one coordinate system and whose spindle has its own drive, with an eight-pocket tool carousel. A Logix controller runs the part program as coordinated linear and circular moves, and the block in the vise is cut as the tools pass. Five scenarios cover excessive position error after a drive change, quadrant bumps on a bore, a wrong tool length offset, chatter from a long holder and spindle overload.",
      "machine": {
        "class": "Three-axis vertical machining centre",
        "lookAlike": true,
        "workpiece": "An aluminium block milled to a pocket and a bore.",
        "control": "A Logix controller with integrated motion on servo drives: numerical control running RS274D part programs as coordinated motion.",
        "axes": [
          {
            "name": "X",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "The table"
          },
          {
            "name": "Y",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "The saddle"
          },
          {
            "name": "Z",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "The head"
          },
          {
            "name": "Spindle",
            "kind": "rotary",
            "actuator": "Spindle motor",
            "role": "Turns the tool"
          },
          {
            "name": "Carousel",
            "kind": "rotary",
            "actuator": "Indexing drive",
            "role": "Holds the tools"
          }
        ]
      },
      "classification": {
        "category": "machine-tool",
        "industries": ["machining-job-shop", "automotive", "aerospace"],
        "concepts": [
          "cnc-programming",
          "coordinated-motion",
          "servo-tuning",
          "feedforward",
          "following-error",
          "tool-compensation",
          "vibration-resonance",
          "spindle-control"
        ],
        "instructions": ["MCLM", "MCCM", "MCS", "MAFR"],
        "safety": ["door-interlock", "safe-stop"],
        "audiences": ["controls-engineer", "maintenance-technician", "machine-builder"],
        "level": "advanced",
        "keywords": [
          "milling",
          "g-code",
          "machining centre",
          "chatter",
          "quadrant glitch",
          "tool offset"
        ]
      },
      "views": [
        {
          "id": "cnc",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/cnc"
        },
        {
          "id": "cnc-spindle",
          "label": "Spindle and tool",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/cnc/spindle"
        },
        {
          "id": "cnc-part",
          "label": "The block in the vise",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/cnc/part"
        },
        {
          "id": "cnc-panel",
          "label": "CNC panel",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/cnc/panel"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/cnc/walk"
        }
      ],
      "scenarios": [
        {
          "id": "rapid-fault",
          "title": "Excessive position error on X since the drive was replaced",
          "url": "https://motion.metatwinmaker.com/cnc/troubleshoot/rapid-fault",
          "report": "X's servo drive was replaced on Friday. Since then the CNC stops on an Excessive Position Error on X a few times a part, always on a rapid. The operator has tried nursing it through at 50 % feed override.",
          "lookFor": "On the trend, X's following error: a few tenths of a millimetre while it cuts, and over its 4 mm tolerance on every rapid along X. In Axes, X's velocity feedforward.",
          "test": "Machine one part",
          "symptom": {
            "measure": "Excessive position error faults",
            "above": 0.5
          },
          "fixesToTry": [
            "Turn the feed override down to 50 %",
            "Set X's velocity feedforward back to 100 %"
          ],
          "cause": "With no velocity feedforward the position loop has to make the axis's speed out of its error: it needs an error of v / Kp to command a speed v. At the 10 m/min rapid with a 5 Hz position loop that is about 5.3 mm, past X's 4 mm tolerance. The new drive's axis came up with its velocity feedforward at 0 % where the old one had 100 %; with it back, the command carries the speed itself and the error falls to a few hundredths of a millimetre. The feed override does nothing for this: rapids follow the rapid override, not the feed override."
        },
        {
          "id": "bore-bumps",
          "title": "Bumps at the bore's quadrants since the axes were re-tuned",
          "url": "https://motion.metatwinmaker.com/cnc/troubleshoot/bore-bumps",
          "report": "The ballscrews were replaced and the axes re-tuned. Since then the bore measures out of round: the probe finds four little bumps, 90° apart. Someone suggests running it at half the feed.",
          "lookFor": "In Inspection, the bore's roundness. On the trend, the contour error on the bore's last circle: a spike each time X or Y turns round, at the circle's quadrants. In Axes, friction compensation.",
          "test": "Machine one part",
          "symptom": {
            "measure": "Bore roundness, µm",
            "above": 20
          },
          "fixesToTry": [
            "Turn the feed override down to 50 %",
            "Turn friction compensation back on for X and Y"
          ],
          "cause": "On a circle each axis stops and turns round twice: X at the top and bottom, Y at the sides. There the friction in its slideways flips from one direction to the other, and with nothing to anticipate it the velocity loop's integrator must wind all the way across before the axis moves off again. For those milliseconds the axis stands still while its command moves on, and the tool leaves a bump on the wall. Friction compensation adds the friction's force in the commanded direction, so the axis turns round on time. At half the feed the friction is just the same, and so are the bumps."
        },
        {
          "id": "deep-bore",
          "title": "The bore comes out half a millimetre deep since T2 was changed",
          "url": "https://motion.metatwinmaker.com/cnc/troubleshoot/deep-bore",
          "report": "T2, the 10 mm end mill, was changed for a new one this morning. Since then the bore measures 10.5 mm deep against 10.0 on the drawing. Someone thinks the new end mill cuts heavier and wants the feed slowed.",
          "lookFor": "In Tools and offsets, T2's length against H2, its length offset: the offset library still has the old end mill's length. On the inspection, the bore's depth.",
          "test": "Machine one part",
          "symptom": {
            "measure": "Bore depth off the drawing, µm",
            "above": 50
          },
          "fixesToTry": [
            "Turn the feed override down to 50 %",
            "Measure T2 on the tool setter, so H2 has its length"
          ],
          "cause": "The CNC puts the tool's tip where the program says by taking the tool's length, from the offset library (G43 H2), off the spindle's gauge line. The new end mill sticks out of its holder 0.5 mm further than the old one, and H2 still has the old length, so every Z the program gives comes out 0.5 mm lower and the bore is 10.5 mm deep. Measured on the tool setter, H2 has the new length and the bore comes out at 10.0 mm. The feed has nothing to do with where Z goes."
        },
        {
          "id": "chatter",
          "title": "Chatter in the pocket since T1 went into a long holder",
          "url": "https://motion.metatwinmaker.com/cnc/troubleshoot/chatter",
          "report": "To reach into a deeper fixture, T1 went into a holder 30 mm longer; it was measured and H1 set. Since then the machine screams in the pocket and the floor comes out covered in chatter marks. Someone suggests slowing the feed.",
          "lookFor": "In Chatter, the stability lobes of the tool as it is now and where the cut sits: 3 mm deep in a slot at 8000 rpm, above the lobes. On the trend, the vibration.",
          "test": "Machine one part",
          "symptom": {
            "measure": "Cuts that chattered",
            "above": 1
          },
          "fixesToTry": [
            "Turn the feed override down to 50 %",
            "Spindle override to 120 % (9600 rpm), onto the next lobe's peak"
          ],
          "cause": "Each tooth cuts the wavy surface the tooth before it left. When the waves line up the right way the vibration feeds itself and grows: chatter. How deep a cut can go before that happens depends on the spindle's speed, in lobes. Further out of its holder T1 is far more flexible and rings at 1450 Hz instead of 2900; at 8000 rpm its three teeth meet the waves in step for chatter, and a slot is stable only to about 1.3 mm, where the pocket takes 3 mm. At 9600 rpm the teeth pass at a third of the ringing frequency, near the top of a lobe, where 3 mm is stable. The feed changes the chip's thickness, not how the waves line up."
        },
        {
          "id": "overload",
          "title": "The spindle trips on overload in the pocket",
          "url": "https://motion.metatwinmaker.com/cnc/troubleshoot/overload",
          "report": "Since lunch the spindle drive trips on overload on every part, always in the pocket's first slot. Someone turned the spindle speed up 20 % to give it more power, and it still trips.",
          "lookFor": "On the trend, the spindle's load in the slot: well over 100 %. In Tools and offsets, T1's wear: it has cut a few hundred parts.",
          "test": "Machine one part",
          "symptom": {
            "measure": "Spindle overload trips",
            "above": 0.5
          },
          "fixesToTry": ["Spindle override to 120 %", "Change T1 for a new end mill"],
          "cause": "The power a cut takes is the volume of metal it removes each second times the energy each cubic millimetre takes, and a worn edge rubs as well as cuts: with T1 worn, the slot takes about half as much again as the spindle's rating. The spindle's drive lets that go for a second or so, then trips on overload. Turning the spindle faster removes the same volume each second (the feed is the same), so it takes the same power. A new end mill brings the slot back to about 70 %; a lower feed would too, at the cost of time."
        }
      ],
      "trends": [
        {
          "title": "Feed",
          "unit": "mm/min along the path",
          "series": ["Command", "Axes"]
        },
        {
          "title": "Following error",
          "unit": "mm",
          "series": ["X", "Y", "X's tolerance"]
        },
        {
          "title": "Spindle",
          "unit": "rpm",
          "series": ["Command", "Spindle"]
        },
        {
          "title": "Spindle load",
          "unit": "% of rated",
          "series": ["Load", "Rated"]
        },
        {
          "title": "Contour error",
          "unit": "µm off the programmed path",
          "series": ["Contour", "Profile tolerance"]
        },
        {
          "title": "Vibration",
          "unit": "µm at the tool",
          "series": ["Vibration", "Chatter marks from"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/cnc.glb",
        "manifest": "https://motion.metatwinmaker.com/models/cnc.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 11112,
        "joints": [
          {
            "node": "AXIS_y_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_x_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_z_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_spindle_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_carousel_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_doorl_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_doorr_lin",
            "kind": "linear"
          }
        ]
      },
      "hall": {
        "x": -6.6,
        "z": -2.45,
        "walkUrl": "https://motion.metatwinmaker.com/cnc/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["lathe", "gantry"],
      "jev": {
        "state": {
          "twin": "CNC mill",
          "summary": "An enclosed three-axis vertical mill running a part program as coordinated motion, cutting a block you can watch.",
          "description": "A compact vertical mill whose X, Y and Z are servo axes on one coordinate system and whose spindle has its own drive, with an eight-pocket tool carousel. A Logix controller runs the part program as coordinated linear and circular moves, and the block in the vise is cut as the tools pass. Five scenarios cover excessive position error after a drive change, quadrant bumps on a bore, a wrong tool length offset, chatter from a long holder and spindle overload.",
          "machine": "Three-axis vertical machining centre",
          "workpiece": "An aluminium block milled to a pocket and a bore.",
          "control": "A Logix controller with integrated motion on servo drives: numerical control running RS274D part programs as coordinated motion.",
          "axes": [
            {
              "name": "X",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "The table"
            },
            {
              "name": "Y",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "The saddle"
            },
            {
              "name": "Z",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "The head"
            },
            {
              "name": "Spindle",
              "kind": "rotary",
              "actuator": "Spindle motor",
              "role": "Turns the tool"
            },
            {
              "name": "Carousel",
              "kind": "rotary",
              "actuator": "Indexing drive",
              "role": "Holds the tools"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Excessive position error on X since the drive was replaced",
              "report": "X's servo drive was replaced on Friday. Since then the CNC stops on an Excessive Position Error on X a few times a part, always on a rapid. The operator has tried nursing it through at 50 % feed override."
            },
            {
              "problem": "Bumps at the bore's quadrants since the axes were re-tuned",
              "report": "The ballscrews were replaced and the axes re-tuned. Since then the bore measures out of round: the probe finds four little bumps, 90° apart. Someone suggests running it at half the feed."
            },
            {
              "problem": "The bore comes out half a millimetre deep since T2 was changed",
              "report": "T2, the 10 mm end mill, was changed for a new one this morning. Since then the bore measures 10.5 mm deep against 10.0 on the drawing. Someone thinks the new end mill cuts heavier and wants the feed slowed."
            },
            {
              "problem": "Chatter in the pocket since T1 went into a long holder",
              "report": "To reach into a deeper fixture, T1 went into a holder 30 mm longer; it was measured and H1 set. Since then the machine screams in the pocket and the floor comes out covered in chatter marks. Someone suggests slowing the feed."
            },
            {
              "problem": "The spindle trips on overload in the pocket",
              "report": "Since lunch the spindle drive trips on overload on every part, always in the pocket's first slot. Someone turned the spindle speed up 20 % to give it more power, and it still trips."
            }
          ],
          "trends": [
            "Feed (mm/min along the path)",
            "Following error (mm)",
            "Spindle (rpm)",
            "Spindle load (% of rated)",
            "Contour error (µm off the programmed path)",
            "Vibration (µm at the tool)"
          ],
          "logixMotionInstructions": ["MCLM", "MCCM", "MCS", "MAFR"]
        },
        "stateText": "Digital twin: CNC mill. An enclosed three-axis vertical mill running a part program as coordinated motion, cutting a block you can watch.\nA compact vertical mill whose X, Y and Z are servo axes on one coordinate system and whose spindle has its own drive, with an eight-pocket tool carousel. A Logix controller runs the part program as coordinated linear and circular moves, and the block in the vise is cut as the tools pass. Five scenarios cover excessive position error after a drive change, quadrant bumps on a bore, a wrong tool length offset, chatter from a long holder and spindle overload.\nMachine: Three-axis vertical machining centre. Workpiece: An aluminium block milled to a pocket and a bore.\nAxes: X (linear, Servo motor and ballscrew: The table); Y (linear, Servo motor and ballscrew: The saddle); Z (linear, Servo motor and ballscrew: The head); Spindle (rotary, Spindle motor: Turns the tool); Carousel (rotary, Indexing drive: Holds the tools).\nControl: A Logix controller with integrated motion on servo drives: numerical control running RS274D part programs as coordinated motion.\nTroubleshooting scenarios: Excessive position error on X since the drive was replaced; Bumps at the bore's quadrants since the axes were re-tuned; The bore comes out half a millimetre deep since T2 was changed; Chatter in the pocket since T1 went into a long holder; The spindle trips on overload in the pocket.\nTrends shown: Feed, Following error, Spindle, Spindle load, Contour error, Vibration.\nLogix motion instructions used: MCLM, MCCM, MCS, MAFR.",
        "expected": {
          "category": "machine-tool",
          "level": 2,
          "industry_general_manufacturing": false,
          "industry_automotive": true,
          "industry_aerospace": true,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": true,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": true,
          "concept_feedforward": true,
          "concept_following_error": true,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": true,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": true,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": true,
          "concept_spindle_control": true,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": false,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": false,
          "concept_tool_compensation": true,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": true,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": true,
          "audience_student": false,
          "audience_process_engineer": false
        }
      }
    },
    {
      "id": "lathe",
      "station": 11,
      "name": "Lathe",
      "url": "https://motion.metatwinmaker.com/lathe",
      "summary": "A two-axis CNC turning centre turning a threaded pin from bar and measuring it against its drawing.",
      "description": "A slant-bed turning centre with a three-jaw chuck on a servo spindle, an eight-station turret on X and Z, a tailstock and an interlocked door. Its part program faces, roughs, finishes with tool nose radius compensation and threads under constant surface speed with a spindle clamp, while the bar is cut, deflects under the cut and is measured feature by feature at the end. Five scenarios cover parts off size without nose radius compensation, a tapered shank without the tailstock, a thread lead error from a short lead-in, the bar slipping in the jaws and the spindle tripping on overspeed.",
      "machine": {
        "class": "Two-axis slant-bed CNC turning centre",
        "lookAlike": true,
        "workpiece": "A Ø20 mm steel bar turned to a threaded pin.",
        "control": "A Logix controller with integrated motion on servo drives: numerical control running a turning program, Z geared to the spindle for threading.",
        "axes": [
          {
            "name": "Spindle",
            "kind": "rotary",
            "actuator": "Servo spindle with a hydraulic chuck",
            "role": "Turns the bar"
          },
          {
            "name": "Z",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "Along the spindle"
          },
          {
            "name": "X",
            "kind": "linear",
            "actuator": "Servo motor and ballscrew",
            "role": "Across the spindle"
          },
          {
            "name": "Turret",
            "kind": "rotary",
            "actuator": "Indexing drive",
            "role": "Selects the tool"
          },
          {
            "name": "Tailstock quill",
            "kind": "linear",
            "actuator": "Hydraulic",
            "role": "Supports the bar's end"
          }
        ]
      },
      "classification": {
        "category": "machine-tool",
        "industries": ["machining-job-shop", "automotive", "energy"],
        "concepts": [
          "cnc-programming",
          "spindle-control",
          "electronic-gearing",
          "tool-compensation",
          "following-error",
          "process-quality"
        ],
        "instructions": ["MAG", "MAFR"],
        "safety": ["door-interlock", "safe-stop"],
        "audiences": ["controls-engineer", "maintenance-technician", "process-engineer"],
        "level": "advanced",
        "keywords": ["turning", "lathe", "g-code", "thread", "g96", "g42", "chuck", "tailstock"]
      },
      "views": [
        {
          "id": "lathe",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/lathe"
        },
        {
          "id": "lathe-cut",
          "label": "The cut",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/lathe/cut"
        },
        {
          "id": "lathe-turret",
          "label": "Turret and tools",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/lathe/turret"
        },
        {
          "id": "lathe-hmi",
          "label": "CNC panel",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/lathe/panel"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/lathe/walk"
        }
      ],
      "scenarios": [
        {
          "id": "nose-radius",
          "title": "The chamfer and the taper come out off size",
          "url": "https://motion.metatwinmaker.com/lathe/troubleshoot/nose-radius",
          "report": "Since the programs started coming from the new CAM post-processor, the chamfer and the 10° taper are rejected: both stand proud of their lines. The diameters are fine. The setter suggests taking a tenth off X's wear offset.",
          "lookFor": "In the program, the finishing pass: no G42. On the part, the chamfer and taper measure 0.3 and 0.13 mm off their lines; the straight diameters and the face are on size.",
          "test": "Turn one part",
          "symptom": {
            "measure": "Worst size or profile error, µm",
            "above": 30
          },
          "fixesToTry": [
            "Take 0.1 mm off X's wear offset",
            "Turn on tool nose radius compensation (G42, R0.8, tip 3)"
          ],
          "cause": "A program's X and Z are the insert's imaginary tip, the corner a sharp tool would have, but the insert cuts with a 0.8 mm radius. Along Z or X the radius touches where the tip would, so diameters and faces come out right; on a slope the radius stands off the line, by 0.41 × R on a 45° chamfer and 0.16 × R on a 10° taper. With G42 the CNC offsets the path so the nose's circle runs on the contour. A wear offset moves every diameter, so it trades the slopes' error for the diameters'."
        },
        {
          "id": "taper",
          "title": "The shank turns tapered, big at the free end",
          "url": "https://motion.metatwinmaker.com/lathe/troubleshoot/taper",
          "report": "To save the tailstock's 4 s, the program now turns the pin without it. Since then the Ø16 shank measures 0.05 mm bigger 30 mm from the end than 68 mm in. Someone suggests a lighter finishing feed.",
          "lookFor": "In the program: no M21. On the trend, the bar's deflection under the finishing cut grows towards the free end.",
          "test": "Turn one part",
          "symptom": {
            "measure": "Shank's taper over 38 mm, µm",
            "above": 20
          },
          "fixesToTry": [
            "Halve the finishing feed (0.075 mm/rev)",
            "Support the end with the tailstock's centre (M21)"
          ],
          "cause": "The pin stands 120 mm out of the jaws on a Ø16 shank: a cantilever. The cut's radial force pushes it away from the tool by F·a³/(3EI), a grows towards the free end, so the free end is cut bigger. A lighter feed lowers the force but not the cube: still twice the tolerance. The tailstock's centre props the end, and the deflection falls a hundredfold. The rule of thumb: more than three diameters out of the jaws, use the tailstock."
        },
        {
          "id": "thread-lead",
          "title": "The thread gauge won't start on the first threads",
          "url": "https://motion.metatwinmaker.com/lathe/troubleshoot/thread-lead",
          "report": "The program was tightened up and each threading pass now starts at Z0, right at the face. Since then the thread gauge won't start: the first threads are wrong, the rest are fine. The setter suggests a spring pass.",
          "lookFor": "In the program, the threading passes' Z start. On the part, the thread's lead error; on the trend, Z's lag behind its command at the start of each pass.",
          "test": "Turn one part",
          "symptom": {
            "measure": "Thread lead error, µm",
            "above": 30
          },
          "fixesToTry": [
            "Add a spring pass",
            "Start each threading pass 8 mm (four pitches) before the thread"
          ],
          "cause": "In G32 Z is geared to the spindle, 2 mm a turn, but it starts from rest and its position loop lags the command by speed ÷ gain (1.1 mm at 800 rpm). Until that lag has settled, Z is behind where a settled axis would be, so the lead is short; it settles exponentially, with a time constant of 1/Kv. Started 2 mm before the thread, the first threads are cut while it is still settling. Start far enough out (four pitches here) and the transient is over before the insert reaches the part. A spring pass repeats the same wrong lead."
        },
        {
          "id": "slip",
          "title": "The bar spins in the jaws on the roughing pass",
          "url": "https://motion.metatwinmaker.com/lathe/troubleshoot/slip",
          "report": "After a thin-walled sleeve job on Friday, the bar now spins in the jaws on the second roughing pass, and the part is scrapped. The operator suggests a lower cutting speed.",
          "lookFor": "In Settings, the chuck's pressure. On the trend, the cut's torque against the jaws' grip.",
          "test": "Turn one part",
          "symptom": {
            "measure": "Bars that slipped in the jaws",
            "above": 0.5
          },
          "fixesToTry": ["Lower the cutting speed to 120 m/min", "Set the chuck back to 20 bar"],
          "cause": "The jaws hold the bar by friction: grip torque is clamping force × friction × the bar's radius, and the clamping force is set by the chuck's hydraulic pressure. Turned down to 5 bar for a thin-walled sleeve and not set back, the jaws hold under 4 N·m, and a 0.9 mm roughing cut needs 4.4. Slowing down gives back only what the jaws' centrifugal force was taking: not enough. Set the pressure for the job (and check it when the job changes)."
        },
        {
          "id": "overspeed",
          "title": "The spindle trips at the end of every facing cut",
          "url": "https://motion.metatwinmaker.com/lathe/troubleshoot/overspeed",
          "report": "A new program faults at the end of every facing cut: 'spindle past the chuck's rated speed'. Someone suggests a lower cutting speed.",
          "lookFor": "On the trend, the spindle's speed climbing as the facing cut nears the centre. In the program: G96, and no G50.",
          "test": "Turn one part",
          "symptom": {
            "measure": "Spindle overspeed trips",
            "above": 0.5
          },
          "fixesToTry": [
            "Lower the cutting speed to 120 m/min",
            "Clamp the spindle at 3500 rpm (G50 S3500)"
          ],
          "cause": "Under constant surface speed (G96) the spindle turns at Vc ÷ (π × diameter), so as a facing cut nears the centre it asks for ever more: 180 m/min is 4000 rpm at Ø14.3 and infinite at the centre. Only G50's clamp (or the machine's own maximum, 5000 rpm, past the chuck's rating) stops it. A lower Vc only moves the point where it passes the chuck's rating nearer the centre. Every G96 program needs a G50 under the chuck's and the part's safe speed."
        }
      ],
      "trends": [
        {
          "title": "Spindle",
          "unit": "rpm",
          "series": ["Command", "Spindle", "Chuck's rating"]
        },
        {
          "title": "X",
          "unit": "mm, a diameter",
          "series": ["Command", "X"]
        },
        {
          "title": "Z",
          "unit": "mm",
          "series": ["Command", "Z"]
        },
        {
          "title": "Torque on the jaws",
          "unit": "N·m",
          "series": ["The cut's", "The jaws' grip"]
        },
        {
          "title": "Bar deflection",
          "unit": "µm",
          "series": ["At the tool"]
        },
        {
          "title": "Surface speed",
          "unit": "m/min",
          "series": ["At the tip"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/lathe.glb",
        "manifest": "https://motion.metatwinmaker.com/models/lathe.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 9026,
        "joints": [
          {
            "node": "AXIS_spindle_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_z_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_x_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_turret_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_quill_lin",
            "kind": "linear"
          },
          {
            "node": "AXIS_door_lin",
            "kind": "linear"
          }
        ]
      },
      "hall": {
        "x": 6.9,
        "z": -2.62,
        "walkUrl": "https://motion.metatwinmaker.com/lathe/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["cnc", "winder"],
      "jev": {
        "state": {
          "twin": "Lathe",
          "summary": "A two-axis CNC turning centre turning a threaded pin from bar and measuring it against its drawing.",
          "description": "A slant-bed turning centre with a three-jaw chuck on a servo spindle, an eight-station turret on X and Z, a tailstock and an interlocked door. Its part program faces, roughs, finishes with tool nose radius compensation and threads under constant surface speed with a spindle clamp, while the bar is cut, deflects under the cut and is measured feature by feature at the end. Five scenarios cover parts off size without nose radius compensation, a tapered shank without the tailstock, a thread lead error from a short lead-in, the bar slipping in the jaws and the spindle tripping on overspeed.",
          "machine": "Two-axis slant-bed CNC turning centre",
          "workpiece": "A Ø20 mm steel bar turned to a threaded pin.",
          "control": "A Logix controller with integrated motion on servo drives: numerical control running a turning program, Z geared to the spindle for threading.",
          "axes": [
            {
              "name": "Spindle",
              "kind": "rotary",
              "actuator": "Servo spindle with a hydraulic chuck",
              "role": "Turns the bar"
            },
            {
              "name": "Z",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "Along the spindle"
            },
            {
              "name": "X",
              "kind": "linear",
              "actuator": "Servo motor and ballscrew",
              "role": "Across the spindle"
            },
            {
              "name": "Turret",
              "kind": "rotary",
              "actuator": "Indexing drive",
              "role": "Selects the tool"
            },
            {
              "name": "Tailstock quill",
              "kind": "linear",
              "actuator": "Hydraulic",
              "role": "Supports the bar's end"
            }
          ],
          "troubleshooting": [
            {
              "problem": "The chamfer and the taper come out off size",
              "report": "Since the programs started coming from the new CAM post-processor, the chamfer and the 10° taper are rejected: both stand proud of their lines. The diameters are fine. The setter suggests taking a tenth off X's wear offset."
            },
            {
              "problem": "The shank turns tapered, big at the free end",
              "report": "To save the tailstock's 4 s, the program now turns the pin without it. Since then the Ø16 shank measures 0.05 mm bigger 30 mm from the end than 68 mm in. Someone suggests a lighter finishing feed."
            },
            {
              "problem": "The thread gauge won't start on the first threads",
              "report": "The program was tightened up and each threading pass now starts at Z0, right at the face. Since then the thread gauge won't start: the first threads are wrong, the rest are fine. The setter suggests a spring pass."
            },
            {
              "problem": "The bar spins in the jaws on the roughing pass",
              "report": "After a thin-walled sleeve job on Friday, the bar now spins in the jaws on the second roughing pass, and the part is scrapped. The operator suggests a lower cutting speed."
            },
            {
              "problem": "The spindle trips at the end of every facing cut",
              "report": "A new program faults at the end of every facing cut: 'spindle past the chuck's rated speed'. Someone suggests a lower cutting speed."
            }
          ],
          "trends": [
            "Spindle (rpm)",
            "X (mm, a diameter)",
            "Z (mm)",
            "Torque on the jaws (N·m)",
            "Bar deflection (µm)",
            "Surface speed (m/min)"
          ],
          "logixMotionInstructions": ["MAG", "MAFR"]
        },
        "stateText": "Digital twin: Lathe. A two-axis CNC turning centre turning a threaded pin from bar and measuring it against its drawing.\nA slant-bed turning centre with a three-jaw chuck on a servo spindle, an eight-station turret on X and Z, a tailstock and an interlocked door. Its part program faces, roughs, finishes with tool nose radius compensation and threads under constant surface speed with a spindle clamp, while the bar is cut, deflects under the cut and is measured feature by feature at the end. Five scenarios cover parts off size without nose radius compensation, a tapered shank without the tailstock, a thread lead error from a short lead-in, the bar slipping in the jaws and the spindle tripping on overspeed.\nMachine: Two-axis slant-bed CNC turning centre. Workpiece: A Ø20 mm steel bar turned to a threaded pin.\nAxes: Spindle (rotary, Servo spindle with a hydraulic chuck: Turns the bar); Z (linear, Servo motor and ballscrew: Along the spindle); X (linear, Servo motor and ballscrew: Across the spindle); Turret (rotary, Indexing drive: Selects the tool); Tailstock quill (linear, Hydraulic: Supports the bar's end).\nControl: A Logix controller with integrated motion on servo drives: numerical control running a turning program, Z geared to the spindle for threading.\nTroubleshooting scenarios: The chamfer and the taper come out off size; The shank turns tapered, big at the free end; The thread gauge won't start on the first threads; The bar spins in the jaws on the roughing pass; The spindle trips at the end of every facing cut.\nTrends shown: Spindle, X, Z, Torque on the jaws, Bar deflection, Surface speed.\nLogix motion instructions used: MAG, MAFR.",
        "expected": {
          "category": "machine-tool",
          "level": 2,
          "industry_general_manufacturing": false,
          "industry_automotive": true,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": false,
          "industry_electronics": false,
          "industry_warehousing_logistics": false,
          "industry_energy": true,
          "industry_machining_job_shop": true,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": true,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": true,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": false,
          "concept_conveyor_tracking": false,
          "concept_independent_cart": false,
          "concept_vision_guidance": false,
          "concept_cnc_programming": true,
          "concept_spindle_control": true,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": false,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": false,
          "concept_tool_compensation": true,
          "concept_process_quality": true,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": true,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": false,
          "audience_process_engineer": true
        }
      }
    },
    {
      "id": "delta",
      "station": 12,
      "name": "Delta robot",
      "url": "https://motion.metatwinmaker.com/delta",
      "summary": "A pick-and-place delta robot picking products off a moving belt by camera and packing them into trays.",
      "description": "A compact three-arm delta robot in an aluminium-profile cell with clear guards, over an infeed conveyor. A camera upstream finds each product and latches the conveyor's position as it fires; the robot's coordinate system locks to the moving belt to pick on the fly, then carries each product to a pocket in the tray, every path a chain of blended linear moves turned into the three arms' angles by the delta transform. Six scenarios cover a slow cycle from unblended corners, products landing off-centre from a profile without a jerk limit, longer forearms the coordinate system was not told about, a conveyor conversion constant left from the old pulley, a camera result paired with the wrong belt position, and an arm overloading on a heavier product.",
      "machine": {
        "class": "Three-axis delta (parallel) pick-and-place robot with conveyor tracking",
        "lookAlike": true,
        "workpiece": "Products picked from a moving belt and packed eight to a tray.",
        "control": "A Logix controller with integrated motion on servo drives: three arms in a delta coordinate system, a Cartesian one tied to it by a transform and locked to the conveyor while picking.",
        "axes": [
          {
            "name": "J1–J3",
            "kind": "rotary",
            "actuator": "Servo motors through gearboxes",
            "role": "The three upper arms, driving parallelogram forearms to the effector plate"
          },
          {
            "name": "J6",
            "kind": "rotary",
            "actuator": "Servo motor through a telescopic shaft",
            "role": "Turns the vacuum cup to set each product square"
          },
          {
            "name": "Conveyor",
            "kind": "linear",
            "actuator": "Belt drive with an encoder",
            "role": "The master the robot tracks"
          }
        ]
      },
      "classification": {
        "category": "robotics",
        "industries": ["packaging-consumer", "electronics", "general-manufacturing"],
        "concepts": [
          "robot-kinematics",
          "coordinated-motion",
          "conveyor-tracking",
          "vision-guidance",
          "s-curve",
          "vibration-resonance",
          "inertia-mismatch",
          "fault-diagnosis"
        ],
        "instructions": ["MSO", "MCTO", "MCLM", "MDCC", "MAR", "MCS", "MAFR"],
        "safety": ["safe-stop"],
        "audiences": ["controls-engineer", "machine-builder", "maintenance-technician"],
        "level": "advanced",
        "keywords": [
          "delta",
          "parallel robot",
          "pick and place",
          "packaging",
          "vision",
          "conveyor tracking",
          "vacuum"
        ]
      },
      "views": [
        {
          "id": "delta",
          "label": "Overview",
          "key": "1",
          "url": "https://motion.metatwinmaker.com/delta"
        },
        {
          "id": "delta-pick",
          "label": "The pick",
          "key": "2",
          "url": "https://motion.metatwinmaker.com/delta/pick"
        },
        {
          "id": "delta-tray",
          "label": "The tray",
          "key": "3",
          "url": "https://motion.metatwinmaker.com/delta/tray"
        },
        {
          "id": "delta-hmi",
          "label": "Operator panel",
          "key": "4",
          "url": "https://motion.metatwinmaker.com/delta/panel"
        },
        {
          "id": "walk",
          "label": "Walk the lab",
          "key": "5",
          "url": "https://motion.metatwinmaker.com/delta/walk"
        }
      ],
      "scenarios": [
        {
          "id": "slow-cycle",
          "title": "Products ride past the robot since the program was edited",
          "url": "https://motion.metatwinmaker.com/delta/troubleshoot/slow-cycle",
          "report": "Since the pick-and-place routine was tidied up, products ride off the end of the belt into the reject bin: about ten a minute. The robot looks busy the whole time and never faults.",
          "lookFor": "On the speed trend the cup stops dead at every corner of its path: up, over, down. The program's moves now end with No settle instead of blending.",
          "test": "Run half a minute of production",
          "symptom": {
            "measure": "Products that rode past unpicked",
            "above": 2
          },
          "fixesToTry": [
            "Raise the speed to 6 m/s",
            "Blend the corners: termination type Command tolerance, 25 mm"
          ],
          "cause": "A pick-and-place path is short moves joined at corners. With No settle each move must stop before the next may start, so the cup decelerates to nothing at the top of every lift and the bottom of every traverse. Command tolerance lets the next move start while this one is still within 25 mm of its end, so the two blend into a curve and the cup never stops between the pick and the place. On moves this short the robot hardly reaches its top speed, which is why raising it did little: the time is in the stops."
        },
        {
          "id": "ringing",
          "title": "Products land off-centre in the tray after the drives were updated",
          "url": "https://motion.metatwinmaker.com/delta/troubleshoot/ringing",
          "report": "After the drives were updated, products land off-centre in the tray's pockets, some hard against the side. The robot reaches the pockets as fast as it did before.",
          "lookFor": "On the cup's ring trend the effector shakes at about 22 Hz after every move; the speed trend's corners are sharp. The moves' jerk limit is gone: they now run a trapezoidal profile.",
          "test": "Run half a minute of production",
          "symptom": {
            "measure": "Products more than 1.5 mm off their pocket",
            "above": 2
          },
          "fixesToTry": [
            "Lower the speed to 2 m/s",
            "Set the jerk limit to 3000 m/s³ (an S-curve)"
          ],
          "cause": "The effector hangs on long, light forearms: a spring and a mass, ringing at about 22 Hz. A trapezoidal profile switches the acceleration on and off in an instant, and each switch strikes that spring, so the cup is still swinging a few millimetres when it lets go. A jerk limit ramps the acceleration over about a period of that ring (100 m/s² at 3000 m/s³ takes 33 ms), and little of it is excited. Slowing down does not help and can make it worse: it changes when the acceleration switches, not that it switches, and the strikes that once partly cancelled each other may now add."
        },
        {
          "id": "forearms",
          "title": "Every product lands 5 mm off since the forearms were replaced",
          "url": "https://motion.metatwinmaker.com/delta/troubleshoot/forearms",
          "report": "The forearms were replaced with a longer set after a crash. Since then every product lands about 5 mm off its pocket, and the cup sometimes misses a product altogether. The position on the panel says it is exactly where it should be.",
          "lookFor": "The cup's height trend sits below its command, and the cup off its path reads 4 to 6 mm in the tray, while the controller's own position is exactly on it. The coordinate system still has the old forearms' length.",
          "test": "Run half a minute of production",
          "symptom": {
            "measure": "Products more than 1.5 mm off their pocket",
            "above": 2
          },
          "fixesToTry": [
            "Home the three arms again",
            "Enter the new forearms' length (L2 = 770 mm) in the delta coordinate system"
          ],
          "cause": "The controller turns every point of the path into the three arms' angles through the delta transform, and the transform is only as good as the geometry it is given: L1, L2, the base offset and the end-effector offset. With the forearms 20 mm longer than configured, every point comes out lower and off to the side by an amount that changes across the workspace, so no single offset or re-homing removes it. The arms go exactly where they are told; the arithmetic that told them was for another robot. Entering the new length puts the transform right."
        },
        {
          "id": "conveyor-scale",
          "title": "The cup closes on air since the conveyor's pulley was changed",
          "url": "https://motion.metatwinmaker.com/delta/troubleshoot/conveyor-scale",
          "report": "The conveyor's drive pulley was changed for a bigger one. Since then the robot goes down on the belt and comes up empty, again and again, and nearly every product rides into the reject bin.",
          "lookFor": "Watch the cup as it goes down: it lands behind the product, by more the further the product has travelled from the camera. The conveyor's conversion constant is still the old pulley's.",
          "test": "Run half a minute of production",
          "symptom": {
            "measure": "Products that rode past unpicked",
            "above": 2
          },
          "fixesToTry": [
            "Slow the conveyor to 0.15 m/s",
            "Set the conveyor's conversion constant for the new pulley"
          ],
          "cause": "The robot never sees a product after the camera: it predicts where it is from how far the conveyor's encoder says the belt has moved since. The conversion constant turns encoder counts into millimetres of belt, and with a bigger pulley each count is more belt than it was. The controller's belt runs 2.5 % short of the real one, so over the 600 mm from the camera to the robot the product is 15 mm further on than the robot thinks. Slowing the belt changes nothing: the error is per millimetre of travel, not per second."
        },
        {
          "id": "registration",
          "title": "The cup lands behind every product since the camera was changed",
          "url": "https://motion.metatwinmaker.com/delta/troubleshoot/registration",
          "report": "A new camera program was loaded. Since then the cup lands just behind every product and comes up empty; at a crawl it would almost work.",
          "lookFor": "The cup lands about 10 mm upstream of each product, the same at every point of the window. The routine reckons the product's position from the conveyor's position when the camera's result arrives, not when it fired.",
          "test": "Run half a minute of production",
          "symptom": {
            "measure": "Products that rode past unpicked",
            "above": 2
          },
          "fixesToTry": [
            "Slow the conveyor to 0.15 m/s",
            "Use the conveyor position registered as the camera fired (MAR)"
          ],
          "cause": "The camera takes 50 ms to find a product after its trigger, and the belt moves 10 mm in that time. The product's position in the image is where it was when the camera fired, so it must be paired with the belt's position at that instant. The camera's trigger also latches the conveyor axis's position (a registration, armed by MAR) for exactly that. Paired with the belt's position when the result arrives, every product is reckoned 10 mm short. Slowing the belt shrinks the error but does not remove it."
        },
        {
          "id": "overload",
          "title": "An arm overloads as soon as the heavy product runs",
          "url": "https://motion.metatwinmaker.com/delta/troubleshoot/overload",
          "report": "A new product, nearly a kilogram, runs on the line for the first time. Within a second an arm faults on overload, every time it is reset.",
          "lookFor": "On the torque trend one arm's torque sits at its 45 N·m limit as the robot carries the product, until the drive gives up. With the light product it peaks under 40.",
          "test": "Run half a minute of production",
          "symptom": {
            "measure": "Faults that stopped the robot",
            "above": 0.5
          },
          "fixesToTry": [
            "Enter the product's mass (0.9 kg) as the payload",
            "Lower the acceleration to 50 m/s² and the jerk to 1500 m/s³"
          ],
          "cause": "Torque is mass times acceleration, through the arms. A product nine times heavier, accelerated at 100 m/s², asks the arms for more than their drives can give, and the drive faults when it has sat at its limit too long. Entering the payload lets the drive feed that torque forward instead of waiting for an error, which tracks the path better but asks for no less torque. Only less acceleration asks for less: at 50 m/s² the heavy product stays inside the limit, at a slower cycle that the line's slower rate for it allows."
        }
      ],
      "trends": [
        {
          "title": "Cup speed",
          "unit": "m/s",
          "series": ["Command"]
        },
        {
          "title": "Arm torque",
          "unit": "N·m",
          "series": ["J1", "J2", "J3", "Limit"]
        },
        {
          "title": "Cup height",
          "unit": "mm, from the robot's base",
          "series": ["Command", "Cup"]
        },
        {
          "title": "Cup off its path",
          "unit": "mm, across",
          "series": ["Off path"]
        },
        {
          "title": "Cup ring",
          "unit": "mm",
          "series": ["Ring"]
        },
        {
          "title": "Picks",
          "unit": "a minute",
          "series": ["Picks"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/delta.glb",
        "manifest": "https://motion.metatwinmaker.com/models/delta.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 6188,
        "joints": [
          {
            "node": "AXIS_j1_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j2_rot",
            "kind": "rotary"
          },
          {
            "node": "AXIS_j3_rot",
            "kind": "rotary"
          }
        ]
      },
      "hall": {
        "x": -2.2,
        "z": -2.85,
        "walkUrl": "https://motion.metatwinmaker.com/delta/walk"
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["robot", "track"],
      "jev": {
        "state": {
          "twin": "Delta robot",
          "summary": "A pick-and-place delta robot picking products off a moving belt by camera and packing them into trays.",
          "description": "A compact three-arm delta robot in an aluminium-profile cell with clear guards, over an infeed conveyor. A camera upstream finds each product and latches the conveyor's position as it fires; the robot's coordinate system locks to the moving belt to pick on the fly, then carries each product to a pocket in the tray, every path a chain of blended linear moves turned into the three arms' angles by the delta transform. Six scenarios cover a slow cycle from unblended corners, products landing off-centre from a profile without a jerk limit, longer forearms the coordinate system was not told about, a conveyor conversion constant left from the old pulley, a camera result paired with the wrong belt position, and an arm overloading on a heavier product.",
          "machine": "Three-axis delta (parallel) pick-and-place robot with conveyor tracking",
          "workpiece": "Products picked from a moving belt and packed eight to a tray.",
          "control": "A Logix controller with integrated motion on servo drives: three arms in a delta coordinate system, a Cartesian one tied to it by a transform and locked to the conveyor while picking.",
          "axes": [
            {
              "name": "J1–J3",
              "kind": "rotary",
              "actuator": "Servo motors through gearboxes",
              "role": "The three upper arms, driving parallelogram forearms to the effector plate"
            },
            {
              "name": "J6",
              "kind": "rotary",
              "actuator": "Servo motor through a telescopic shaft",
              "role": "Turns the vacuum cup to set each product square"
            },
            {
              "name": "Conveyor",
              "kind": "linear",
              "actuator": "Belt drive with an encoder",
              "role": "The master the robot tracks"
            }
          ],
          "troubleshooting": [
            {
              "problem": "Products ride past the robot since the program was edited",
              "report": "Since the pick-and-place routine was tidied up, products ride off the end of the belt into the reject bin: about ten a minute. The robot looks busy the whole time and never faults."
            },
            {
              "problem": "Products land off-centre in the tray after the drives were updated",
              "report": "After the drives were updated, products land off-centre in the tray's pockets, some hard against the side. The robot reaches the pockets as fast as it did before."
            },
            {
              "problem": "Every product lands 5 mm off since the forearms were replaced",
              "report": "The forearms were replaced with a longer set after a crash. Since then every product lands about 5 mm off its pocket, and the cup sometimes misses a product altogether. The position on the panel says it is exactly where it should be."
            },
            {
              "problem": "The cup closes on air since the conveyor's pulley was changed",
              "report": "The conveyor's drive pulley was changed for a bigger one. Since then the robot goes down on the belt and comes up empty, again and again, and nearly every product rides into the reject bin."
            },
            {
              "problem": "The cup lands behind every product since the camera was changed",
              "report": "A new camera program was loaded. Since then the cup lands just behind every product and comes up empty; at a crawl it would almost work."
            },
            {
              "problem": "An arm overloads as soon as the heavy product runs",
              "report": "A new product, nearly a kilogram, runs on the line for the first time. Within a second an arm faults on overload, every time it is reset."
            }
          ],
          "trends": [
            "Cup speed (m/s)",
            "Arm torque (N·m)",
            "Cup height (mm, from the robot's base)",
            "Cup off its path (mm, across)",
            "Cup ring (mm)",
            "Picks (a minute)"
          ],
          "logixMotionInstructions": ["MSO", "MCTO", "MCLM", "MDCC", "MAR", "MCS", "MAFR"]
        },
        "stateText": "Digital twin: Delta robot. A pick-and-place delta robot picking products off a moving belt by camera and packing them into trays.\nA compact three-arm delta robot in an aluminium-profile cell with clear guards, over an infeed conveyor. A camera upstream finds each product and latches the conveyor's position as it fires; the robot's coordinate system locks to the moving belt to pick on the fly, then carries each product to a pocket in the tray, every path a chain of blended linear moves turned into the three arms' angles by the delta transform. Six scenarios cover a slow cycle from unblended corners, products landing off-centre from a profile without a jerk limit, longer forearms the coordinate system was not told about, a conveyor conversion constant left from the old pulley, a camera result paired with the wrong belt position, and an arm overloading on a heavier product.\nMachine: Three-axis delta (parallel) pick-and-place robot with conveyor tracking. Workpiece: Products picked from a moving belt and packed eight to a tray.\nAxes: J1–J3 (rotary, Servo motors through gearboxes: The three upper arms, driving parallelogram forearms to the effector plate); J6 (rotary, Servo motor through a telescopic shaft: Turns the vacuum cup to set each product square); Conveyor (linear, Belt drive with an encoder: The master the robot tracks).\nControl: A Logix controller with integrated motion on servo drives: three arms in a delta coordinate system, a Cartesian one tied to it by a transform and locked to the conveyor while picking.\nTroubleshooting scenarios: Products ride past the robot since the program was edited; Products land off-centre in the tray after the drives were updated; Every product lands 5 mm off since the forearms were replaced; The cup closes on air since the conveyor's pulley was changed; The cup lands behind every product since the camera was changed; An arm overloads as soon as the heavy product runs.\nTrends shown: Cup speed, Arm torque, Cup height, Cup off its path, Cup ring, Picks.\nLogix motion instructions used: MSO, MCTO, MCLM, MDCC, MAR, MCS, MAFR.",
        "expected": {
          "category": "robotics",
          "level": 2,
          "industry_general_manufacturing": true,
          "industry_automotive": false,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": true,
          "industry_electronics": true,
          "industry_warehousing_logistics": false,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": true,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": true,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": true,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": true,
          "concept_robot_kinematics": true,
          "concept_conveyor_tracking": true,
          "concept_independent_cart": false,
          "concept_vision_guidance": true,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": false,
          "concept_mobile_navigation": false,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": false,
          "concept_line_performance": false,
          "safety_light_curtain": false,
          "safety_door_interlock": false,
          "safety_laser_scanner": false,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": true,
          "audience_student": false,
          "audience_process_engineer": false
        }
      }
    },
    {
      "id": "line",
      "station": null,
      "name": "Packaging line",
      "url": "https://motion.metatwinmaker.com/line",
      "summary": "The lab's machines joined into one autonomous line, from the press that makes each product to the warehouse rack that stores it, in a room of its own.",
      "description": "A packaging line in a room through the lab hall's door, built from the lab's own stations, each running its own controller and taking its work from the machine before it: the press makes each product, the cart track carries it to a transfer, the delta robot packs eight to a tray, the six-axis robot puts two trays in a case the erector has formed, the sealer tapes, labels and checks the case, the mobile robot takes it to the warehouse and the crane stores it. Nothing is made up between them, so a slow or stopped machine starves those after it and holds up those before it. A line controller starts the machines from the warehouse back and runs the line empty from the press on; a panel shows each machine's state and its time in each, the counts, the line's OEE and the alarms with the first out, and a dashboard each machine's state over the last ten minutes, the output a minute and what waits between the machines. Five scenarios cover a bottleneck at the transfer, a conveyor that holds no queue, products lost at the delta that starve the end of the line, faint labels the scanner cannot read, and a full warehouse whose shipping orders were held.",
      "machine": {
        "class": "Automated packaging line: press, transfer, delta robot, case packer, case erector and sealer, mobile robot and storage and retrieval",
        "lookAlike": true,
        "workpiece": "Housings with a pin pressed in, packed eight to a tray and two trays to a sealed, labelled case, stored in the warehouse's rack.",
        "control": "A Logix controller with integrated motion on servo drives on each machine, and a line controller over them: starting from the warehouse back, stopping from the press on, each machine's state, alarms with the first out, and the line's OEE.",
        "axes": [
          {
            "name": "Press",
            "kind": "linear",
            "actuator": "Servo rod actuator and an indexing table",
            "role": "Presses the pin into each housing"
          },
          {
            "name": "Cart track",
            "kind": "linear",
            "actuator": "Linear motor segments driving independent carts",
            "role": "Carries each product from the press to the transfer"
          },
          {
            "name": "Delta robot",
            "kind": "rotary",
            "actuator": "Three servo arms",
            "role": "Picks each product off the moving belt into a tray"
          },
          {
            "name": "Case packer",
            "kind": "rotary",
            "actuator": "Six-axis articulated arm",
            "role": "Puts the full trays into a case"
          },
          {
            "name": "Mobile robot",
            "kind": "rotary",
            "actuator": "Differential drive wheels",
            "role": "Takes the sealed cases to the warehouse"
          },
          {
            "name": "Warehouse crane",
            "kind": "linear",
            "actuator": "Travel, hoist and fork servo axes",
            "role": "Stores each case in the rack and retrieves the oldest to ship"
          }
        ]
      },
      "classification": {
        "category": "production-line",
        "industries": ["packaging-consumer", "warehousing-logistics", "general-manufacturing"],
        "concepts": [
          "line-performance",
          "fault-diagnosis",
          "process-quality",
          "conveyor-tracking",
          "independent-cart",
          "robot-kinematics",
          "mobile-navigation"
        ],
        "instructions": ["MSO", "MAM", "MCLM", "MCTO", "MDCC", "MAR", "MCS", "MAFR"],
        "safety": ["light-curtain", "laser-scanner", "safe-stop"],
        "audiences": ["process-engineer", "maintenance-technician", "controls-engineer", "student"],
        "level": "intermediate",
        "keywords": [
          "production line",
          "packaging line",
          "bottleneck",
          "buffer",
          "starved",
          "blocked",
          "OEE",
          "first-out alarm",
          "end of line",
          "case packing",
          "warehouse"
        ]
      },
      "views": [
        {
          "id": "door",
          "label": "Walk from the door",
          "url": "https://motion.metatwinmaker.com/line"
        },
        {
          "id": "overview",
          "label": "The whole line",
          "url": "https://motion.metatwinmaker.com/line/overview"
        },
        {
          "id": "press",
          "label": "Press",
          "url": "https://motion.metatwinmaker.com/line/1"
        },
        {
          "id": "track",
          "label": "Cart track",
          "url": "https://motion.metatwinmaker.com/line/2"
        },
        {
          "id": "delta",
          "label": "Delta robot",
          "url": "https://motion.metatwinmaker.com/line/3"
        },
        {
          "id": "packer",
          "label": "Case packer",
          "url": "https://motion.metatwinmaker.com/line/4"
        },
        {
          "id": "sealer",
          "label": "Case erector and sealer",
          "url": "https://motion.metatwinmaker.com/line/5"
        },
        {
          "id": "fleet",
          "label": "Mobile robot",
          "url": "https://motion.metatwinmaker.com/line/6"
        },
        {
          "id": "warehouse",
          "label": "Warehouse",
          "url": "https://motion.metatwinmaker.com/line/7"
        }
      ],
      "scenarios": [
        {
          "id": "bottleneck",
          "title": "The line packs a quarter fewer products since the transfer was changed",
          "url": "https://motion.metatwinmaker.com/line/troubleshoot/bottleneck",
          "report": "The transfer off the cart track got a new pusher with a soft start. Since then the line packs about a quarter fewer products a shift. The press stands held up for long stretches, so maintenance wants a longer conveyor after it.",
          "lookFor": "On the machine table the press is held up more and more, its outfeed conveyor full; the cart track after it, which used to wait for work now and then, never does; and the delta after the track waits for work more than it did. The transfer now takes 5 s a product; the press makes one every 3.6 s.",
          "test": "Run the line for four minutes from empty",
          "symptom": {
            "measure": "Products packed into trays",
            "below": 40
          },
          "fixesToTry": [
            "Lengthen the press's outfeed conveyor to hold 12 products",
            "Set the transfer back to 1.2 s a product"
          ],
          "cause": "A line makes what its slowest machine makes. The bottleneck is the machine that is always busy, with the one before it held up and the one after it waiting for work; here it is the track, whose transfer takes 5 s a product against the press's 3.6 s. A longer conveyor after the press only fills more slowly: the press is held up later, but the products still go through the transfer one every 5 s, so the line packs no more. Time gained anywhere but the bottleneck is lost, and time lost at the bottleneck is lost for the whole line."
        },
        {
          "id": "buffer",
          "title": "The press is held up while the delta waits for work",
          "url": "https://motion.metatwinmaker.com/line/troubleshoot/buffer",
          "report": "The transfer conveyor between the cart track and the delta robot got new controls last week. Since then the press and the cart track are held up much of the time, yet the delta waits for work, and it is the delta that gets the blame.",
          "lookFor": "Held up before, waiting after: the press and the track are held up, the delta after them waits for work, and none of them is busy all the time. Look between the track and the delta: the transfer conveyor carries one product at a time and the next goes on only once that one is off its far end.",
          "test": "Run the line for four minutes from empty",
          "symptom": {
            "measure": "Products packed into trays",
            "below": 40
          },
          "fixesToTry": [
            "Raise the delta's speed to 6 m/s",
            "Set the transfer conveyor to accumulate: up to 5 products"
          ],
          "cause": "A conveyor between two machines is a buffer: the products queued on it let each machine run at its own pace for a while, the one before filling it while the one after is busy, the one after emptying it while the one before is. Set to carry one product at a time, the transfer conveyor holds no queue, and every product waits out the conveyor's whole run before the next may follow: the line runs at the conveyor's transit, slower than any of its machines. The signature is a machine held up while the next one waits for work, with neither of them busy: the trouble is between them. Speeding up either machine changes nothing, because neither is the one holding the line."
        },
        {
          "id": "starved",
          "title": "The packer waits for trays all shift while the press runs flat out",
          "url": "https://motion.metatwinmaker.com/line/troubleshoot/starved",
          "report": "The conveyor under the delta robot got a bigger drive pulley at the weekend. Since then the packer, the sealer, the mobile robot and the warehouse wait for work all shift, while the press and the cart track run flat out.",
          "lookFor": "Waiting for work runs back up the line to the delta, which is busy. Follow the products: they reach the delta's belt and ride off its end, and the count of products lost climbs with each one. The cup goes down just behind every product and comes up empty.",
          "test": "Run the line for two minutes from empty",
          "symptom": {
            "measure": "Products lost on the way",
            "above": 5
          },
          "fixesToTry": [
            "Raise the delta's speed to 6 m/s",
            "Set the delta's conveyor conversion constant for the new pulley"
          ],
          "cause": "A starved machine is waiting on the machines before it, so the cause is upstream: walk up the line to the first machine that is not waiting. Here that is the delta, and it is busy, but its work is lost: it predicts where each product is from the conveyor's encoder, and with the bigger pulley the conversion constant makes the belt seem 2.5 % shorter than it is, so the cup lands behind every product. Nothing reaches a tray, and everything after the delta starves. A faster robot only misses sooner; the conversion constant for the new pulley puts the cup back on the product."
        },
        {
          "id": "no-read",
          "title": "Cases are kicked off at the sealer since the new labels came",
          "url": "https://motion.metatwinmaker.com/line/troubleshoot/no-read",
          "report": "A new label stock came in, glossy instead of paper. Since then the sealer kicks off about one case in two: the scanner says it cannot read the label. The scanner was cleaned and re-aimed twice.",
          "lookFor": "The rejected cases' trace reads 'the label did not scan'; the cases are full and the right weight. Look at a label: the barcode is faint, with gaps in its bars. The printer's darkness is still 18, set for the paper stock.",
          "test": "Run the line for seven minutes from empty",
          "symptom": {
            "measure": "Cases kicked off at the sealer",
            "above": 1
          },
          "fixesToTry": [
            "Clean the scanner's window and re-aim it",
            "Raise the printer's darkness to 24 for the glossy stock"
          ],
          "cause": "A thermal printer burns the barcode in with its print head's heat, and each label stock needs its own: a glossy synthetic stock takes more than paper. At the paper's darkness the bars come out faint and broken, and the scanner, which reads the contrast between bars and spaces, gets nothing it can decode from most of them. The scanner was never the problem, so cleaning it did nothing; the darkness the new stock needs gives bars it reads every time. A reject at the end of a machine is often made at its start."
        },
        {
          "id": "warehouse-full",
          "title": "No case goes into the warehouse since the stock count",
          "url": "https://motion.metatwinmaker.com/line/troubleshoot/warehouse-full",
          "report": "After the weekend's stock count the line starts as usual, but no case goes into the rack: they queue on the warehouse's inbound conveyor, and the mobile robot is soon waiting there with the next. Nothing is faulted.",
          "lookFor": "The warehouse is held up, with cases on its inbound conveyor that its crane never takes: every slot in its rack is full. Its shipping orders were held for the stock count and never released, so it ships nothing to make room.",
          "test": "Run the line for four minutes from empty",
          "symptom": {
            "measure": "Cases stored in the warehouse",
            "below": 1
          },
          "fixesToTry": [
            "Raise the crane's travel speed to 4 m/s",
            "Release the held shipping orders"
          ],
          "cause": "A blocked machine is waiting on the machines after it, so the cause is downstream: walk down the line to the last machine that is held up, and look past it. The warehouse makes room for a case only by shipping one: here its outbound orders were held for the stock count, the rack filled, and with no empty slot the crane has nowhere to put the case on its conveyor. Everything behind it fills up in turn: the robot's deck, the outfeed table, the sealer, the packer's stand. A faster crane has nothing to do; released orders ship the oldest stock and free the slots."
        }
      ],
      "trends": [
        {
          "group": "Dashboard",
          "title": "Machine states",
          "unit": "running, waiting for work, held up, faulted or stopped",
          "series": [
            "Press",
            "Cart track",
            "Delta robot",
            "Case packer",
            "Case erector and sealer",
            "Mobile robot",
            "Warehouse"
          ]
        },
        {
          "group": "Dashboard",
          "title": "Products",
          "unit": "a minute",
          "series": ["Made", "Packed"]
        }
      ],
      "model": {
        "url": "https://motion.metatwinmaker.com/models/line_room.glb",
        "manifest": "https://motion.metatwinmaker.com/models/line_room.manifest.json",
        "format": "glTF 2.0 binary",
        "units": "m",
        "triangles": 7216,
        "joints": []
      },
      "hall": null,
      "room": {
        "name": "Packaging line room",
        "url": "https://motion.metatwinmaker.com/line",
        "model": "https://motion.metatwinmaker.com/models/line_room.glb",
        "door": {
          "x": 4,
          "z": 6.4
        }
      },
      "simulation": "Runs as a deterministic, fixed-step physics and servo model on the page.",
      "media": {
        "videos": []
      },
      "related": ["press", "track", "delta", "robot", "amr", "asrs"],
      "jev": {
        "state": {
          "twin": "Packaging line",
          "summary": "The lab's machines joined into one autonomous line, from the press that makes each product to the warehouse rack that stores it, in a room of its own.",
          "description": "A packaging line in a room through the lab hall's door, built from the lab's own stations, each running its own controller and taking its work from the machine before it: the press makes each product, the cart track carries it to a transfer, the delta robot packs eight to a tray, the six-axis robot puts two trays in a case the erector has formed, the sealer tapes, labels and checks the case, the mobile robot takes it to the warehouse and the crane stores it. Nothing is made up between them, so a slow or stopped machine starves those after it and holds up those before it. A line controller starts the machines from the warehouse back and runs the line empty from the press on; a panel shows each machine's state and its time in each, the counts, the line's OEE and the alarms with the first out, and a dashboard each machine's state over the last ten minutes, the output a minute and what waits between the machines. Five scenarios cover a bottleneck at the transfer, a conveyor that holds no queue, products lost at the delta that starve the end of the line, faint labels the scanner cannot read, and a full warehouse whose shipping orders were held.",
          "machine": "Automated packaging line: press, transfer, delta robot, case packer, case erector and sealer, mobile robot and storage and retrieval",
          "workpiece": "Housings with a pin pressed in, packed eight to a tray and two trays to a sealed, labelled case, stored in the warehouse's rack.",
          "control": "A Logix controller with integrated motion on servo drives on each machine, and a line controller over them: starting from the warehouse back, stopping from the press on, each machine's state, alarms with the first out, and the line's OEE.",
          "axes": [
            {
              "name": "Press",
              "kind": "linear",
              "actuator": "Servo rod actuator and an indexing table",
              "role": "Presses the pin into each housing"
            },
            {
              "name": "Cart track",
              "kind": "linear",
              "actuator": "Linear motor segments driving independent carts",
              "role": "Carries each product from the press to the transfer"
            },
            {
              "name": "Delta robot",
              "kind": "rotary",
              "actuator": "Three servo arms",
              "role": "Picks each product off the moving belt into a tray"
            },
            {
              "name": "Case packer",
              "kind": "rotary",
              "actuator": "Six-axis articulated arm",
              "role": "Puts the full trays into a case"
            },
            {
              "name": "Mobile robot",
              "kind": "rotary",
              "actuator": "Differential drive wheels",
              "role": "Takes the sealed cases to the warehouse"
            },
            {
              "name": "Warehouse crane",
              "kind": "linear",
              "actuator": "Travel, hoist and fork servo axes",
              "role": "Stores each case in the rack and retrieves the oldest to ship"
            }
          ],
          "troubleshooting": [
            {
              "problem": "The line packs a quarter fewer products since the transfer was changed",
              "report": "The transfer off the cart track got a new pusher with a soft start. Since then the line packs about a quarter fewer products a shift. The press stands held up for long stretches, so maintenance wants a longer conveyor after it."
            },
            {
              "problem": "The press is held up while the delta waits for work",
              "report": "The transfer conveyor between the cart track and the delta robot got new controls last week. Since then the press and the cart track are held up much of the time, yet the delta waits for work, and it is the delta that gets the blame."
            },
            {
              "problem": "The packer waits for trays all shift while the press runs flat out",
              "report": "The conveyor under the delta robot got a bigger drive pulley at the weekend. Since then the packer, the sealer, the mobile robot and the warehouse wait for work all shift, while the press and the cart track run flat out."
            },
            {
              "problem": "Cases are kicked off at the sealer since the new labels came",
              "report": "A new label stock came in, glossy instead of paper. Since then the sealer kicks off about one case in two: the scanner says it cannot read the label. The scanner was cleaned and re-aimed twice."
            },
            {
              "problem": "No case goes into the warehouse since the stock count",
              "report": "After the weekend's stock count the line starts as usual, but no case goes into the rack: they queue on the warehouse's inbound conveyor, and the mobile robot is soon waiting there with the next. Nothing is faulted."
            }
          ],
          "trends": [
            "Machine states (running, waiting for work, held up, faulted or stopped)",
            "Products (a minute)"
          ],
          "logixMotionInstructions": ["MSO", "MAM", "MCLM", "MCTO", "MDCC", "MAR", "MCS", "MAFR"]
        },
        "stateText": "Digital twin: Packaging line. The lab's machines joined into one autonomous line, from the press that makes each product to the warehouse rack that stores it, in a room of its own.\nA packaging line in a room through the lab hall's door, built from the lab's own stations, each running its own controller and taking its work from the machine before it: the press makes each product, the cart track carries it to a transfer, the delta robot packs eight to a tray, the six-axis robot puts two trays in a case the erector has formed, the sealer tapes, labels and checks the case, the mobile robot takes it to the warehouse and the crane stores it. Nothing is made up between them, so a slow or stopped machine starves those after it and holds up those before it. A line controller starts the machines from the warehouse back and runs the line empty from the press on; a panel shows each machine's state and its time in each, the counts, the line's OEE and the alarms with the first out, and a dashboard each machine's state over the last ten minutes, the output a minute and what waits between the machines. Five scenarios cover a bottleneck at the transfer, a conveyor that holds no queue, products lost at the delta that starve the end of the line, faint labels the scanner cannot read, and a full warehouse whose shipping orders were held.\nMachine: Automated packaging line: press, transfer, delta robot, case packer, case erector and sealer, mobile robot and storage and retrieval. Workpiece: Housings with a pin pressed in, packed eight to a tray and two trays to a sealed, labelled case, stored in the warehouse's rack.\nAxes: Press (linear, Servo rod actuator and an indexing table: Presses the pin into each housing); Cart track (linear, Linear motor segments driving independent carts: Carries each product from the press to the transfer); Delta robot (rotary, Three servo arms: Picks each product off the moving belt into a tray); Case packer (rotary, Six-axis articulated arm: Puts the full trays into a case); Mobile robot (rotary, Differential drive wheels: Takes the sealed cases to the warehouse); Warehouse crane (linear, Travel, hoist and fork servo axes: Stores each case in the rack and retrieves the oldest to ship).\nControl: A Logix controller with integrated motion on servo drives on each machine, and a line controller over them: starting from the warehouse back, stopping from the press on, each machine's state, alarms with the first out, and the line's OEE.\nTroubleshooting scenarios: The line packs a quarter fewer products since the transfer was changed; The press is held up while the delta waits for work; The packer waits for trays all shift while the press runs flat out; Cases are kicked off at the sealer since the new labels came; No case goes into the warehouse since the stock count.\nTrends shown: Machine states, Products.\nLogix motion instructions used: MSO, MAM, MCLM, MCTO, MDCC, MAR, MCS, MAFR.",
        "expected": {
          "category": "production-line",
          "level": 1,
          "industry_general_manufacturing": true,
          "industry_automotive": false,
          "industry_aerospace": false,
          "industry_metals": false,
          "industry_packaging_consumer": true,
          "industry_electronics": false,
          "industry_warehousing_logistics": true,
          "industry_energy": false,
          "industry_machining_job_shop": false,
          "concept_point_to_point": false,
          "concept_s_curve": false,
          "concept_jog_home": false,
          "concept_servo_tuning": false,
          "concept_feedforward": false,
          "concept_following_error": false,
          "concept_inertia_mismatch": false,
          "concept_backlash_compliance": false,
          "concept_vibration_resonance": false,
          "concept_electronic_gearing": false,
          "concept_electronic_camming": false,
          "concept_coordinated_motion": false,
          "concept_robot_kinematics": true,
          "concept_conveyor_tracking": true,
          "concept_independent_cart": true,
          "concept_vision_guidance": false,
          "concept_cnc_programming": false,
          "concept_spindle_control": false,
          "concept_tension_control": false,
          "concept_force_control": false,
          "concept_multi_axis_sequencing": false,
          "concept_mobile_navigation": true,
          "concept_feedback_devices": false,
          "concept_fault_diagnosis": true,
          "concept_tool_compensation": false,
          "concept_process_quality": true,
          "concept_line_performance": true,
          "safety_light_curtain": true,
          "safety_door_interlock": false,
          "safety_laser_scanner": true,
          "safety_safe_stop": true,
          "safety_overtravel": false,
          "audience_maintenance_technician": true,
          "audience_controls_engineer": true,
          "audience_machine_builder": false,
          "audience_student": true,
          "audience_process_engineer": true
        }
      }
    }
  ]
}
