An industrial-grade Model Context Protocol (MCP) server delivering autonomous, bi-directional pair-programming and engineering integration between cutting-edge AI assistants (Antigravity CLI/IDE, Claude Desktop, Cursor, VS Code) and Horner Automation Cscape 10.2 (Build 10.2.751.4) for OCS (Operator Control Station) controllers.
The system bridges modern LLMs with legacy industrial automation software through a multi-tier pipeline: Win32 message loop instrumentation, UIAutomation 3.0, low-level OLE2 / Compound File Binary Format (CFBF) parsing, pure-Python IEC 61131-3 Structured Text AST validation, and deterministic scan-cycle simulation—enabling autonomous logic generation, static verification, in-GUI Error Check compilation, HMI screen management, and Modbus telemetry scaling under an uncompromising fail-closed hardware lockout policy.
Important
Complete Technical Documentation & Handoff Guide:
For comprehensive architectural deep dives, forensic diagnostics, and maintenance guidelines, consult the master handoff manual:
MANUAL_DE_INGENIERIA_Y_HANDOFF_PROYECTO.md (also mirrored under docs/MANUAL_DE_INGENIERIA_Y_HANDOFF_PROYECTO.md).
Caution
All physical hardware communication channels (COM1–COM256, \\.\COM*, /dev/tty*, CAN*, USB*, JTAG) and companion flashing executables (PGMUpdateUtility.exe, DfuSeCommand.exe, STMFlashLoader.exe, WinJTAG.exe) are strictly blocked fail-closed by SecurityGuard.
Any programmatic attempt to open physical serial/USB ports or trigger download menu commands (ID_PROGRAM_DOWNLOAD = 32827, ID_CONTROLLER_DOWNLOAD = 33149) immediately raises HardwareLockoutError / SecurityError with zero bytes sent to hardware.
Physical PLC commissioning is strictly reserved for Phase P7 manual loading by authorized field personnel via USB cable or MicroSD (docs/HOW_TO_TEST_PHYSICAL_PLC.md).
- Interactive Session Boundary (
winsta0\Default): Live Cscape 10.2 Win32 handles (HWND) are driven exclusively by a dedicated supervisor on an interactive Windows desktop. All background MCP endpoints, AST parsing, and scan simulations run purely headless. - Pure IEC 61131-3 Structured Text Invariant: Logic is restricted to pure Structured Text (
.st). Legacy Advanced Ladder constructs (---[ ]---,---( )---,RUNG,NETWORK,OTE,XIC) are rejected at the lexer withERR_LADDER_FORBIDDEN. - ST-to-Ladder Native Barrier (
BLOCKED_NATIVE: DOCUMENT_ONLY): Cscape 10.2 maintains a segregated engine architecture between contacts and IEC ST. Native ST-to-Ladder conversion does not exist in Cscape 10.2 (docs/st_to_ld_conversion_blocked.md). - Straton K5 Legacy Quarantine: Legacy Copa-Data Straton K5 templates (
appli.k5p,appli.CPO) are permanently isolated inquarantine/straton_k5_legacy/with zero runtime dependencies. - Strict 4-State Status Contract: Every tool result conforms to:
status: "success" | "failed" | "blocked" | "inconclusive".
flowchart TD
subgraph CLIENTS["AI Engineering Clients (FastMCP stdio)"]
direction LR
C1["Google Antigravity CLI / IDE"]
C2["Claude Desktop"]
C3["Cursor / VS Code MCP"]
end
subgraph PROTOCOL["Protocol & Security Boundary"]
MCP["FastMCP JSON-RPC 2.0 Server<br/>(scripts/run_mcp_server.py)"]
SEC{"SecurityGuard<br/>(Fail-Closed)"}
end
subgraph ENGINE["Core Industrial Engines (src/)"]
AST["IEC 61131-3 Pure-Python AST<br/>Lexer, Parser & Anti-Ladder Guard"]
CFBF["CFBF / OLE2 Engine<br/>.csp / .cpj Binary Containers"]
SIM["In-Memory OCS Scan Engine<br/>%R, %AI, %AQ, %I, %Q, %M, %S"]
MODBUS["Modbus Telemetry Bridge<br/>Scaling & Scan List Reconciler"]
HMI["Native HMI Engine<br/>Screen Bindings & Widget Auditing"]
end
subgraph TARGETS["Execution Environments"]
WIN["Cscape 10.2 GUI Supervisor<br/>(winsta0\\Default | ListBox 372 | Ctrl+F7)"]
MEM["Deterministic Memory Sandbox<br/>(Cycle Snapshot & Waveforms)"]
HARDWARE["Physical Hardware: Horner OCS XL4<br/>(Fase P7 Manual Commissioning ONLY)"]
end
CLIENTS <==>|"JSON-RPC 2.0 (stdio)"| MCP
MCP --> SEC
SEC -->|"Validated Request"| AST
SEC -->|"Container Synthesis"| CFBF
SEC -->|"Scan Stepping"| SIM
SEC -->|"Modbus Scaling"| MODBUS
SEC -->|"HMI Screen Ops"| HMI
MCP -.->|"Win32 / UIAutomation"| WIN
SIM -.->|"Register Memory"| MEM
SEC x-.-x|"HARDWARE LOCKOUT (COM / USB Blocked)"| HARDWARE
classDef safe fill:#1e3a5f,stroke:#3b82f6,stroke-width:2px,color:#ffffff;
classDef warn fill:#4a154b,stroke:#a855f7,stroke-width:2px,color:#ffffff;
classDef blocked fill:#5c1d1d,stroke:#ef4444,stroke-width:2px,color:#ffffff;
class CLIENTS,PROTOCOL,ENGINE safe;
class WIN,MEM warn;
class HARDWARE blocked;
sequenceDiagram
autonumber
participant Agent as AI Coding Assistant (Antigravity / Claude)
participant Stdio as FastMCP stdio Transport
participant Server as Horner Cscape MCP Server
participant Sec as SecurityGuard
participant AST as Pure-Python ST Validator
participant CFBF as CFBF OLE2 Inspector (.csp / .cpj)
participant Win as Live Cscape 10.2 (winsta0\Default)
participant Sim as In-Memory Scan Runner
Note over Agent,Server: 1. Code Synthesis & Static Verification
Agent->>Stdio: cscape_validate_st(code)
Stdio->>Server: JSON-RPC tools/call
Server->>AST: Lex, parse & inspect syntax
AST-->>Server: AST Validated (Zero ladder tokens)
Server-->>Stdio: {"status": "success", "valid": true}
Stdio-->>Agent: Verification Passed
Note over Agent,Server: 2. Binary Container Mutation
Agent->>Stdio: cscape_new_iec_project(path="TankLevel.csp")
Stdio->>Server: JSON-RPC tools/call
Server->>CFBF: Allocate OLE2 sectors, SAT, SSAT & Logic Streams
CFBF-->>Server: Container Written & Verified
Server-->>Stdio: {"status": "success", "format": "CFBF_OLE2"}
Stdio-->>Agent: Project Created
Note over Agent,Win: 3. In-GUI Compiler Verification
Agent->>Stdio: cscape_compile(timeout_seconds=60)
Stdio->>Server: JSON-RPC tools/call
Server->>Win: Dispatch ID_PROGRAM_ERRORCHECK (Ctrl+F7)
Win-->>Server: Scrape ListBox 372 output (0 errors, 0 warnings)
Server-->>Stdio: {"status": "success", "errors": 0, "warnings": 0}
Stdio-->>Agent: Clean Build Confirmed
Note over Agent,Sim: 4. Discrete Scan Simulation
Agent->>Stdio: cscape_simulate_pou(code, inputs, steps=10)
Stdio->>Server: JSON-RPC tools/call
Server->>Sim: Execute cyclic scan steps with %S clock pulses
Sim-->>Server: Register snapshots (%R, %AI, %AQ, %M)
Server-->>Stdio: {"status": "success", "cycles_executed": 10}
Stdio-->>Agent: Deterministic Simulation Verified
Note over Agent,Sec: 5. Physical Download Attempt (Intercepted)
Agent->>Stdio: cscape_download_firmware(port="COM1")
Stdio->>Server: JSON-RPC tools/call
Server->>Sec: Intercept download attempt
Sec-->>Server: HardwareLockoutError: Physical port access prohibited
Server-->>Stdio: {"status": "blocked", "error_code": "HARDWARE_PORT_BLOCKED"}
Stdio-->>Agent: Action Refused Fail-Closed
- Interacts with production 32-bit MFC executable (
Cscape.exe, Build10.2.751.4). - Scrapes output logs from the Cscape MFC message pane (
ListBox ID 372/Frame 45011) for sub-second error localization. - Crash Resolution at
0x0051a4cd: Discovered that Cscape's docking pane library dereferences a null desktop context if invoked headlessly. Solved by binding execution to the active interactive desktop station (winsta0\Default) viauser32.OpenDesktopW. - Modal Dialog Sweeper: Detects and automatically dismisses modal
#32770dialogs (Save As prompts, tips, warnings) to prevent automation deadlocks.
- Low-level byte parser for Horner proprietary
.cspand.cpjproject containers (0xD0CF11E0A1B11AE1). - Navigates Sector Allocation Tables (
SAT), Short Sector Allocation Tables (SSAT), and internal directory trees. - Extracts and injects IEC logic streams (
Logic\POUs), variable symbol tables, and graphical HMI streams without inducing binary corruption. ERROR_SHARING_VIOLATIONResolution: Overcame Windows structured storage file locking by introducing transactional staging copies and atomic commits.
- Independent parser without external compiler toolchain dependencies.
- Full support for elementary data types (
BOOL,BYTE,WORD,DWORD,INT,DINT,UINT,UDINT,REAL,LREAL,TIME,STRING). - Standard Function Blocks (
TON,TOF,TP,CTU,CTD,CTUD). - Strict Anti-Ladder Interoperability Guard (
STLadderInteropGuard): Rejects ASCII ladder coils (---( )---), contacts (---[ ]---), and rung markers (RUNG,NETWORK) withERR_LADDER_FORBIDDEN.
- Pure-software cycle execution engine tracking Horner OCS memory spaces:
%R: Analog registers & 16-bit words%AI/%AQ: Analog inputs and outputs%I/%Q: Digital inputs and outputs%M/%T: Internal marker bits and temporary relays%S/%SR: System flags (%S1first scan,%S710ms pulse,%S8100ms pulse,%S91000ms pulse)
- Generates and persists register conversion specifications validated by SHA-256 hashes.
- Handles linear scaling calculations (
$0..32000 \to 0.0..100.0%$ ,$0..500\text{ L/min}$ ,$0..10\text{ bar}$ ) with transducer health quality flags. -
Fail-Closed Scan List Reconciler: Cscape 10.2 requires physical node responses to populate scan lists offline; the engine reconciles offline models with status
DISCREPANCY_EXPLAINED_OFFLINE_LOCKOUT.
A fully automated, production-grade closed-loop process control application was engineered, compiled, and verified through this MCP server:
- Main Controller: Pure Structured Text PID controller with anti-windup, hysteresis, high/low pressure safety trips, and duty/standby dual-pump alternation (
TankLevelControl.st). - Telemetry Scaling Bridge: Modbus signal scaling block with fault tolerance and signal degradation alarms (
FB_ModbusScaleQuality.st). - Native HMI Operator Screens: 3 native graphical screens (Screen 1: Plant Overview; Screen 2: Process Control & Alarm Summary; Screen 3: Real-Time Dual-Pen Trend Graph).
- Cscape 10.2 Build Verification: Verified in Cscape 10.2 with 0 errors, 0 warnings.
The server exposes 43 registered tools over JSON-RPC 2.0 stdio, partitioned into 7 functional domains:
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_launch_ide |
timeout_seconds |
Launches Cscape.exe on winsta0\Default, dismisses splash dialogs, sets IEC mode. |
Live GUI |
cscape_new_iec_project |
project_path, project_name |
Provisions an authentic native .csp/.cpj container configured for IEC 61131-3 ST. |
Production Offline |
cscape_open_project |
project_path |
Validates CFBF magic bytes and opens project in Cscape 10.2. | Live GUI |
cscape_insert_st |
pou_name, st_code, pou_type |
Injects validated ST source into active Cscape editor via clipboard/Win32. | Live GUI |
cscape_insert_st_pou |
project_path, pou_name, code |
Transactional POU injection with rollback on failure. | Production Offline |
cscape_compile |
timeout_seconds |
Dispatches Error Check (ID_PROGRAM_ERRORCHECK = 32826 / Ctrl+F7) to live Cscape. |
Live GUI |
cscape_get_build_output |
(none) | Scrapes Cscape MFC output listbox for diagnostics, line numbers, and error codes. | Live GUI |
cscape_read_variables |
file_path, merge_strategy |
Reads variables from CSV/XML (variables.csv/.xml) with register limit checks. |
Production Offline |
cscape_write_variables |
output_path, variables |
Writes Horner OCS variables to CSV/XML with bit-of-word indexing and overlap validation. | Production Offline |
cscape_import_variables |
file_path, merge_strategy |
Alias for cscape_read_variables. |
Production Offline |
cscape_export_variables |
output_path, variables |
Alias for cscape_write_variables. |
Production Offline |
cscape_run_simulation |
steps, inputs |
Stepping simulation with %S system clock flags (%S1, %S7, %S8, %S9). | Production Offline |
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_validate_st |
code |
AST lexing, parsing, block closure verification, and ladder rejection. | Production Offline |
cscape_create_project |
name, description |
Initializes an offline project workspace structure with manifest. | Production Offline |
cscape_add_st_pou |
project_name, pou_name, code |
Validates and injects an IEC 61131-3 Structured Text POU into project. | Production Offline |
cscape_inspect_variables |
project_name |
Categorizes variables across project POUs and global scopes. | Production Offline |
cscape_compile_project |
project_name, clean_build |
Headless compilation pass, memory estimation, and error diagnostics. | Production Offline |
cscape_get_diagnostics |
project_name |
Retrieves compilation diagnostics, warnings, and project health indicators. | Production Offline |
cscape_simulate_pou |
code, inputs, steps |
Pure-software multi-cycle simulation of ST logic with snapshot logs. | Production Offline |
cscape_export_project |
project_name, output_format |
Packages project into structured JSON, XML, or ST archives. | Production Offline |
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_simulate_cycle |
cycle_count, inputs |
Advances in-memory OCS scan cycles with custom register overrides. | Production Offline |
cscape_read_register |
register_address |
Reads current value and type metadata for an OCS register (%R, %AI, %AQ, %I, %Q, %M). | Production Offline |
cscape_write_register |
register_address, value |
Writes value to in-memory register with boundary and type validation. | Production Offline |
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_hmi_inventory |
project_path |
Scans CFBF container for configured HMI screens, widgets, and dynamic elements. | Production Offline |
cscape_hmi_apply_group |
project_path, group_config |
Applies batch widget group configuration to native HMI screen definitions. | Production Offline |
cscape_hmi_read_properties |
project_path, screen_id |
Extracts graphical and dynamic binding properties for a given HMI screen. | Production Offline |
cscape_hmi_verify_bindings |
project_path, bindings |
Verifies that HMI screen elements map correctly to allocated OCS registers. | Production Offline |
cscape_hmi_save_close_reopen |
project_path |
Performs container roundtrip verification ensuring zero HMI stream corruption. | Production Offline |
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_fixture_request_to_spec |
request_text |
Generates a deterministic fixture specification from engineering requirements. | Production Offline |
cscape_fixture_create |
spec_config |
Synthesizes a new test fixture with predefined register tables and ST harness. | Production Offline |
cscape_fixture_selective_edit |
fixture_id, modifications |
Applies surgical edits to specific POU or register blocks in an existing fixture. | Production Offline |
cscape_fixture_revision_impact |
fixture_id, proposed_diff |
Computes dependency and downstream impact analysis for proposed logic changes. | Production Offline |
cscape_fixture_durability_check |
fixture_id, cycles |
Evaluates fixture durability under extended cycle counts (up to 100,000 cycles). | Production Offline |
cscape_fixture_detect_conflict |
fixture_id_a, fixture_id_b |
Detects overlapping register allocations or conflicting variable definitions. | Production Offline |
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_modbus_create_config |
config_spec |
Creates Modbus RTU/TCP master/slave scaling bridge configuration. | Production Offline |
cscape_modbus_persist_config |
config_data, file_path |
Persists Modbus mapping specifications with SHA-256 validation. | Production Offline |
cscape_modbus_read_config |
file_path |
Reads and validates stored Modbus PV provider configurations. | Production Offline |
cscape_modbus_protocol_check |
config_path |
Validates baud rate, parity, stop bits, slave IDs, and register address limits. | Production Offline |
cscape_modbus_conversion_doc |
output_path |
Generates engineering walkthroughs for Modbus register scaling. | Production Offline |
cscape_validate_scan_list_evidence |
evidence_path |
Validates air-gapped cryptographic proofs for Modbus scan list records. | Production Offline |
cscape_inspect_scan_list |
project_path, require_populated |
Inspects native CFBF scan list stream (fail-closed if populated offline). | Fail-Closed Safe |
cscape_reconcile_scan_list |
project_path, inventory_path |
Reconciles planned slave inventory against native container with discrepancy logs. | Production Offline |
| Tool Name | Parameters | Description | Status |
|---|---|---|---|
cscape_package_offline_bundle |
bundle_name, target_dir |
Assembles air-gapped release archive with SHA-256 cryptographic manifests. | Production Offline |
| Resource URI | Description |
|---|---|
cscape://projects |
Lists all active and archived projects in the local workspace. |
cscape://project/{name}/state |
Real-time state of the specified project (POUs, variables, targets). |
cscape://project/{name}/diagnostics |
Compilation history, syntax check logs, and memory estimates. |
cscape://templates |
Catalog of built-in production Structured Text templates. |
cscape://template/{name} |
Structured Text source code for a specific template (e.g. motor_starter, pid_loop). |
cscape://safety/status |
Current hardware lockout state, blocked ports, and prohibited commands. |
generate_iec_st_controller: Directs the agent to generate compliant, verified IEC 61131-3 Structured Text for industrial processes.refactor_ladder_to_st: Translates legacy ladder logic rungs into deterministic Structured Text with equivalent safety interlocks.debug_st_diagnostics: Analyzes compiler error logs or simulation traces to locate syntax errors, unclosed blocks, or type mismatches.simulate_st_logic: Formulates a test bench matrix of input vectors across time steps to verify edge cases and alarm thresholds.
- Operating System: Windows 10 or Windows 11 (64-bit).
- Python: Python 3.10, 3.11, or 3.12 (64-bit).
- Horner Cscape: Horner APG Cscape 10.2 (Build 10.2.751.4) installed (optional for offline AST/simulation modes; required for live GUI Error Check gate).
# 1. Clone repository
git clone https://github.com/armando-token/horner-cscape-mcp.git C:\HornerAI\horner-cscape-mcp
cd C:\HornerAI\horner-cscape-mcp
# 2. Create and activate virtual environment
python -m venv .venv
.\.venv\Scripts\Activate.ps1
# 3. Install package in editable development mode
pip install -e .
pip install pytest pydantic fastmcp psutil# Run the FastMCP server over stdio transport
.\.venv\Scripts\python.exe scripts\run_mcp_server.py
# Inspect server version
.\.venv\Scripts\python.exe scripts\run_mcp_server.py --version# Execute security lockout and fail-closed test suite
.\.venv\Scripts\python.exe -m pytest tests/test_security.py -v
# Run complete regression test suite
.\.venv\Scripts\pytest.exe -qAll tests execute deterministically in offline mode without requiring live PLC hardware.
Connect the Horner Cscape MCP Server to your preferred AI engineering environment:
Location: Workspace .gemini/settings.json or global configuration:
{
"mcpServers": {
"horner-cscape": {
"command": "C:/HornerAI/horner-cscape-mcp/.venv/Scripts/python.exe",
"args": [
"C:/HornerAI/horner-cscape-mcp/scripts/run_mcp_server.py"
],
"env": {
"PYTHONUNBUFFERED": "1"
}
}
}
}Location: %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"horner-cscape": {
"command": "C:\\HornerAI\\horner-cscape-mcp\\.venv\\Scripts\\python.exe",
"args": [
"C:\\HornerAI\\horner-cscape-mcp\\scripts\\run_mcp_server.py"
],
"env": {
"PYTHONUNBUFFERED": "1",
"CSCAPE_BIN_PATH": "C:\\Program Files (x86)\\Horner APG\\Cscape\\Cscape.exe"
}
}
}
}Location: .cursor/mcp.json or .vscode/mcp.json:
{
"mcpServers": {
"horner-cscape": {
"command": "C:\\HornerAI\\horner-cscape-mcp\\.venv\\Scripts\\python.exe",
"args": [
"C:\\HornerAI\\horner-cscape-mcp\\scripts\\run_mcp_server.py"
],
"env": {
"PYTHONUNBUFFERED": "1"
}
}
}
}horner-cscape-mcp/
├── MANUAL_DE_INGENIERIA_Y_HANDOFF_PROYECTO.md # Master engineering manual & technical handoff
├── README.md # Primary project presentation & architecture guide
├── CONTRIBUTING.md # Contribution guidelines & safety rules
├── CODE_OF_CONDUCT.md # Industrial engineering code of conduct
├── LICENSE # MIT License
├── pyproject.toml # Python package configuration & dependencies
│
├── src/ # CORE SOURCE CODE
│ ├── automation/ # Win32 / UIAutomation Cscape 10.2 driver
│ │ ├── cscape_win32.py # Win32 messaging, HWND control & pane scraping
│ │ └── supervisor.py # Desktop watchdog & modal dialog sweeper
│ ├── cscape/ # Cscape internal state & Modbus bridging
│ ├── iec/ & iec61131/ # IEC 61131-3 pure-Python AST lexer & parser
│ ├── mcp/ # FastMCP JSON-RPC 2.0 server implementation
│ │ ├── server.py # 43 registered MCP tools & resource routes
│ │ └── schemas.py # Pydantic input/output schemas (39+ models)
│ ├── parser/ # CFBF / OLE2 binary engine (.csp / .cpj)
│ ├── security/ # Fail-closed security guard & port interceptor
│ │ └── guard.py # Physical COM/USB port and flash blockers
│ └── simulation/ # Deterministic in-memory OCS scan engine
│
├── tests/ # AUTOMATED TEST SUITE (227+ passing)
│ ├── test_security.py # Fail-closed hardware ban & port isolation
│ ├── test_ast.py # Pure Structured Text AST verification
│ ├── test_cfbf.py # CFBF OLE2 stream read/write verification
│ └── ... # Integration, stress & closed-loop tests
│
├── scripts/ # ENTRYPOINT & SUPERVISION SCRIPTS
│ ├── run_mcp_server.py # FastMCP stdio server entrypoint
│ └── cscape_supervisor.py # Dedicated Win32 GUI watchdog launcher
│
├── docs/ # DETAILED TECHNICAL SPECIFICATIONS
│ ├── MANUAL_DE_INGENIERIA_Y_HANDOFF_PROYECTO.md # Engineering manual mirror
│ ├── mcp_server_reference.md # Complete API tool reference & schemas
│ ├── HOW_TO_TEST_MCP.md # Local verification instructions
│ ├── safety_and_security.md # Security architecture specification
│ ├── cscape_save_failed_diagnosis.md # Sharing violation forensic analysis
│ ├── st_to_ld_conversion_blocked.md # Architectural boundary documentation
│ ├── HOW_TO_TEST_PHYSICAL_PLC.md # Phase P7 manual hardware loading guide
│ └── CORE_08_09_10_RUNTIME_GAPS_AND_ROADMAP.md # Hardware commissioning roadmap
│
└── quarantine/ # ISOLATED LEGACY ARTIFACTS
└── straton_k5_legacy/ # Quarantined Copa-Data Straton K5 files
Physical controller flashing is strictly deferred to manual execution by authorized commissioning engineers. Automated scripts, FastMCP servers, and AI agents are permanently locked out fail-closed from physical communication ports.
To commission on physical hardware:
- Review the step-by-step Standard Operating Procedure:
docs/HOW_TO_TEST_PHYSICAL_PLC.mdanddocs/P7_MANUAL_COMMISSIONING_PROCEDURE.md. - Execute the bilingual pre-download safety checklist:
docs/P7_MANUAL_LOAD_CHECKLIST.md. - Connect programming cable (USB Mini-B or MJ1 RS-232/RS-485 serial) and manually execute
Controller -> Download(Ctrl+F9) within Cscape 10.2.
Contributions are welcome! Please ensure:
- All changes adhere to the Pure IEC 61131-3 Structured Text invariant (
ERR_LADDER_FORBIDDEN). - No hardware communication ports (
COM*,CAN*,USB*,JTAG) are unblocked. - Every new tool conforms strictly to the 4-state status contract:
status: "success" | "failed" | "blocked" | "inconclusive". - All unit and integration tests pass via
pytest.
See CONTRIBUTING.md for full guidelines.
This project is licensed under the MIT License — see the LICENSE file for details.
