Die Lizenzschlüssel gehen raus. Der Countdown zum Launch läuft.

Damit Ihr Agent
TwinCAT nicht mehr errät.

plcsense gibt KI-Agenten einen korrekten, nur lesenden Blick auf Ihre TwinCAT-Solution und die Bibliotheken, die sie referenziert: aufgelöste Symbole, echte Bibliotheks-APIs, zur jeweiligen Version passende Dokumentation und Diagnosen für Structured Text.

Es läuft als Prozess auf Ihrem Rechner: Ihr Code wird zur Analyse nie hochgeladen. Zum Lesen braucht es kein TwinCAT XAE, und in Ihr Projekt wird nichts zurückgeschrieben.

  • TwinCAT 3
  • Structured Text
  • IEC 61131-3
  • MCP
  • nur lesend
  • läuft lokal
plcsense
$ plcsense tool list_plc_libraries
Solution SealingCell.sln · 1 PLC project

SealingCell (1 library)
  AcmeSealingLib 1.0.0.0 · resolved (reference) · 4 types

$ plcsense tool read_plc_source --symbol_name FB_SealHead
FunctionBlock FB_SealHead · __library__/FB_SealHead.st
[source=vendor_library, confidence=source_provided,
 library=AcmeSealingLib]

Declaration · L4-15
FUNCTION_BLOCK FB_SealHead
VAR
    _phase    : E_SealPhase;
    _dose     : ST_SealDose;
    _tripCode : UINT;
    …
END_VAR

$ plcsense tool validate_plc_project
Ok · 1 project · 2 types · 0 errors

Echte CLI-Ausgabe für die Demo-Solution. Agenten rufen dieselben Tools über MCP auf.

Countdown zum Launch

Die Lizenzschlüssel dieser Runde gehen raus

Wir bereiten plcsense mit Hochdruck auf den öffentlichen Launch vor, mit Zieltermin 29. Oktober 2026. Hinterlassen Sie unten Ihre E-Mail-Adresse, wir schreiben einmal, am Tag des Launches.

Beim Launch benachrichtigen lassen

plcsense strebt einen Launch am 29. Oktober 2026 an.

Das Problem

Agenten scheitern an PLC-Code, weil sie raten

Wenn ein Agent Structured Text schreiben soll, ruft er Methoden auf, die es nicht gibt, setzt vorhandene Aufrufe auf den falschen Typ, erfindet Enum-Werte und vermischt Bibliotheksversionen. Das ist kein Tippfehler. Was er dafür bräuchte, ist über kompilierte Archive und das verstreut, was ein Build zufällig übrig lässt, nie die ganze Bibliothek, und nirgendwo steht, was davon noch stimmt.

  1. Bibliotheken sind Archive, kein Quellcode

    Die Typen, von denen Ihr Code abhängt, stecken in referenzierten .library-Dateien, nicht als Quelltext im Workspace. Ein Sprachmodell kann darin nichts lesen, also füllt der Agent die Lücke mit Namen, die plausibel klingen.

  2. Structured Text kommt in Trainingsdaten kaum vor

    Modelle haben um Größenordnungen mehr C# gesehen als ST. Was zurückkommt, sieht nach der Sprache aus und kompiliert nicht. Und die Beispiele, aus denen sie gelernt haben, hinken den Bibliotheken, die Sie einsetzen, um Jahre hinterher.

  3. Die geltende Version bleibt unsichtbar

    In Ihrer Solution gilt pro Bibliothek genau eine bestimmte Version. Im Prompt steht nicht, welche, also mischt ein Agent unbekümmert die API eines Releases hinein, das Sie nie installiert haben.

  4. Die Methode gibt es. Nur nicht auf diesem Typ.

    In einer großen Solution steht dieselbe Hilfsmethode auf einem anderen Typ. Grep findet sie. Der Agent setzt den Aufruf auf den Typ, nach dem Sie gefragt haben. Die Zeile sieht nach Structured Text aus. Kompilieren tut sie nicht.

Echte Beispiele

Echte Prompts, echte Antworten

Jedes Beispiel beginnt mit einem Prompt, den man einem Agenten so stellen würde. Beide Seiten zeigen die Antwort. Links ohne plcsense, nur aus den Projektdateien und dem Build-Dump. Rechts mit. Geht es um Code, ist die Antwort Structured Text, und die linke Seite kompiliert nicht.

Beispiel

Prompt

Schreibe Structured Text, der Service_11 aus GVL_MTP automatisch startet.

Ohne plcsense

GVL_MTP.Service_11.StartAutomaticAsync(0);

In einem großen MTP-Projekt deklarieren andere Services StartAutomaticAsync. Grep findet diese Methoden, also setzt der Agent den Aufruf auf Service_11.

Mit plcsense

IF GVL_MTP.Service_11.SetAutomaticInternal() THEN
  GVL_MTP.Service_11.ProcedureInt := E_MTP_P_Service_11.Proc_11_Automatic;
  GVL_MTP.Service_11.CommandInt := E_MTP_Command.Start;
END_IF

FB_MTP_Service_11 deklariert diese Methode nicht. Mit SetAutomaticInternal umschalten, dann ProcedureInt und CommandInt setzen.

Woran die rechte Seite das erkennt read_plc_source · FB_MTP_Service_11
FUNCTION_BLOCK FB_MTP_Service_11
METHOD PUBLIC Idle : BOOL
METHOD PUBLIC ToOffline : BOOL
METHOD PUBLIC ToOnline : BOOL

FB_MTP_Service_11 im Projekt · ZComponents

Prompt

Setze den MTP-PID pid zurück. pid ist ein Tc3_MTP.FB_MTP_PIDCtrl.

Ohne plcsense

pid.Reset();

In dieser Solution gibt es schon einen ZCore-PID mit Reset(). Der Agent setzt denselben Aufruf auf den MTP-Regler.

Mit plcsense

pid.ResetPID();

Die Methode heißt ResetPID. Reset gibt es auf diesem Funktionsbaustein nicht.

Woran die rechte Seite das erkennt read_plc_source · FB_MTP_PIDCtrl
FUNCTION_BLOCK FB_MTP_PIDCtrl
METHOD ResetPID : BOOL

Tc3_MTP

Prompt

Wandle unixTs in einen String um. Das Projekt hat ZAux und ZPlatform.

Ohne plcsense

s := builder.AppendUlint(unixTs).ToString();
s := ZPlatform.UlintToStr(unixTs);

Die Hilfsfunktion wird nicht benutzt und fehlt deshalb im Build-Dump. Der Agent erfindet UlintToStr und schreibt das Ergebnis nach s. S ist ein TwinCAT-Schlüsselwort (IL Set), der Name geht also nicht durch den Compiler. validate_plc_project meldet das.

Mit plcsense

str := ZAux.TimestampToString(unixTs);
ZPlatform.TimestampToString(unixTs, str);

Beide Bibliotheken nennen es TimestampToString. ZAux gibt den String zurück. ZPlatform schreibt in str. Die Variable darf nicht s heißen.

Woran die rechte Seite das erkennt read_plc_source · TimestampToString
FUNCTION TimestampToString : ZCore.ZString  (* ZAux *)
VAR_INPUT timestamp : ULINT; END_VAR

FUNCTION TimestampToString  (* ZPlatform *)
VAR_INPUT timestamp : ULINT; END_VAR
VAR_IN_OUT str : ZCore.ZString; END_VAR

ZAux 1.6.0.26 · ZPlatform 1.6.0.26

Prompt

Lies Eingangswort 3 des Reinigungsroboters nach nIn.

Ohne plcsense

nIn := _robot.Cleaning.GetInData(3);

Der Methodenname gehört zur Drive-Schnittstelle. Der Agent ruft ihn auf Cleaning auf.

Mit plcsense

nIn := _drive.GetInData(3);

Cleaning ist ein IRobot. GetInData gehört auf die IRobotDrive-Instanz, nicht auf den Roboter. Der Roboter gibt dieses Drive nicht frei.

Woran die rechte Seite das erkennt read_plc_source · IRobotDrive#GetInData
METHOD GetInData : DINT
VAR_INPUT
  inData : UINT;
END_VAR

IRobot · IRobotDrive, im Projekt

Prompt

Stelle den ZCore-PID _pid auf Anti-Windup mit Back-Calculation um.

Ohne plcsense

_pid.SetAntiWindup(ZCore.PidAntiWindup.BackCalculation);

Der Typ wird nicht benutzt und fehlt deshalb im Build-Dump. Der Agent erfindet PidAntiWindup.BackCalculation und einen Setter, den es nicht gibt.

Mit plcsense

_pid.SetAntiWindupType(ZCore.PidAntiWindupType.ConditionalClamping);

Der Typ heißt PidAntiWindupType. BackCalculation gibt es nicht. Die Felder sind IntegralLimitation und ConditionalClamping. Der Setter ist SetAntiWindupType. ConditionalClamping ist die Variante, die in der Sättigung nicht weiter integriert.

Woran die rechte Seite das erkennt read_plc_source · PidAntiWindupType
TYPE PidAntiWindupType :
(
  IntegralLimitation := 0,
  ConditionalClamping
);

ZCore 1.9.0.1 · Tutorial_Quickstart

Prompt

Welche Typen in diesem Quickstart implementieren IHaltable?

Ohne plcsense

Nur StateMachineImpl.
Quickstart-Sequenzen nicht.

Ein Grep im Build-Dump findet Implements IHaltable an StateMachineImpl. Der Agent hört dort auf.

Mit plcsense

Jede ISequence, auch
QuickstartSequenceAutomatic.

ISequence erweitert IHaltable. Damit implementiert jede Quickstart-Sequenz das Interface, auch wenn keine den Namen hinschreibt.

Woran die rechte Seite das erkennt find_plc_implementations · IHaltable
INTERFACE ISequence EXTENDS IObject, IError,
  ICancellationToken, IHaltable

ZCore · Tutorial_Quickstart

Prompt

Schreibe den Namen von test nach name. test ist ein FB_Test.

Ohne plcsense

name := test.GetName();

Im Build-Dump steht GetName, also ruft der Agent es auf.

Mit plcsense

(* GetName ist INTERNAL; einen Aufruf, den Sie schreiben dürfen, gibt es nicht *)

INTERNAL heißt: nur TcUnit selbst darf das aufrufen. In Ihrem Projekt geht diese Zeile nicht durch den Compiler.

Woran die rechte Seite das erkennt read_plc_source · FB_Test#GetName
METHOD INTERNAL GetName : T_MaxString

TcUnit_Zeugwerk 1.3.2.0

Prompt

Setze bFlag in diesem TcUnit-Test auf TRUE. Die Variable ist schreibgeschützt.

Ohne plcsense

WRITE_PROTECTED_BOOL(Ptr := bFlag, Value := TRUE);

Die Hilfsmethode wird nicht benutzt und fehlt deshalb im Build-Dump. Der Agent übergibt bFlag direkt.

Mit plcsense

WRITE_PROTECTED_BOOL(Ptr := ADR(bFlag), Value := TRUE);

Die Bibliothek will einen Zeiger. Der Aufruf geht mit ADR(bFlag), nicht mit bFlag.

Woran die rechte Seite das erkennt read_plc_source · WRITE_PROTECTED_BOOL
FUNCTION WRITE_PROTECTED_BOOL
VAR_INPUT
  Ptr : POINTER TO BOOL;
  Value : BOOL;
END_VAR

TcUnit_Zeugwerk 1.3.2.0

Ein Agent ist nicht deterministisch. Ohne plcsense kann derselbe Prompt eine andere Vermutung liefern, je nachdem, was gerade auf der Platte oder im Web liegt. Mit plcsense liegt der Typ im Kontext, deshalb landet derselbe Prompt viel eher bei derselben richtigen Antwort. Unter jedem Beispiel steht genau diese Quelle.

Was es kann

Vier typische Fehler, beantwortet aus Ihrem eigenen Projekt

Jede Antwort stammt aus den Dateien Ihrer Solution und den referenzierten Bibliotheken, mit Herkunftsangabe, damit Sie sehen, woher sie kommt.

Symbole auflösen statt grep

Grep findet eine offensichtliche Deklaration meist problemlos. Schwierig wird es, wenn Reset auf einem Dutzend unabhängiger Typen wirklich existiert und eine Textsuche nach Aufrufern fast die ganze Solution zurückgibt. Welche Überschreibung bei einem SUPER^-Aufruf läuft, entscheidet der tatsächliche Typ, nicht eine Zeichenkette in der Datei. plcsense löst nach Typ auf, nicht nach Text.

Bibliotheks-APIs ohne XAE

Auch Ihre eigene .library ist ein kompiliertes Archiv, keine Textdatei, die ein Agent einfach öffnen kann. plcsense liest sie direkt aus der Solution, damit ein Agent Member und Signaturen genau jener Version sieht, die Ihr Projekt referenziert, und nicht irgendeinen Stand, der zufällig in einem Bibliotheks-Repo ausgecheckt ist.

Dokumentation, die zur Version passt

Für Beckhoff-Bibliotheken holt plcsense automatisch die offiziellen Infosys-Texte und Hardware-Angaben, ohne dass Sie etwas einrichten müssen. Veröffentlichen Sie eigene Bibliotheken mit zkdoc, passend zur referenzierten Version, oder verweisen Sie auf Confluence-Cloud-Spaces, die Sie ohnehin nutzen. Alles außer Beckhoff ist optional und landet standardmäßig nicht in der Suche.

Diagnosen vor dem Commit

Prüft Structured Text und liefert Syntaxfehler in den Koordinaten der Originaldatei zurück, damit ein Agent seine eigene Änderung kontrollieren kann statt zu hoffen.

Lokal als Standard

Läuft auf Ihrem Rechner

plcsense ist ein lokaler Prozess, der lokale Dateien liest. Ihr Quellcode, Ihre eigenen Bibliotheken und die Projekte Ihrer Kunden werden zur Analyse nie hochgeladen, und dazwischen steht kein Cloud-Dienst, dem Sie vertrauen müssten. Was den Rechner verlässt, lässt sich vollständig auflisten.

Bleibt auf Ihrem Rechner

  • Ihre Solution und jede POU, DUT und GVL darin
  • Die referenzierten .library-Dateien
  • Dokumentation, die Sie lokal oder von Ihrem eigenen Server einbinden, plus optional Beckhoff Infosys und Confluence Cloud
  • Jede Anfrage Ihres Agenten und jede Antwort darauf

Was den Rechner verlässt

  • Lizenzprüfung. Ein regelmäßiger Aufruf an api.zeugwerk.dev mit Lizenzschlüssel und Maschinenkennung, nichts aus Ihrem Projekt.
  • Telemetrie mit Opt-out. Zähler dazu, welches Tool wie oft aufgerufen wurde, damit wir sehen, was wir verbessern sollten. Kein Code, keine Symbol- oder Dateinamen. Standardmäßig an, mit einer Variable aus.
  • Feedback mit Opt-in. Nur wenn Sie plcsense mit --enable-feedback starten, damit ein Agent ein falsches Ergebnis melden kann. Sonst wird nichts gesendet.

So weit reicht der Einfluss von plcsense. Ihr Agent gibt dieselbe Anfrage und Antwort trotzdem an sein eigenes Modell weiter, um damit zu arbeiten. Läuft dort ein Cloud-Modell, gehen auch Ihre Bibliotheks- und Quellcode-Inhalte an dessen Anbieter. Das ist die Modellwahl Ihres Agenten, nicht die von plcsense, und geschieht genauso, ob plcsense beteiligt ist oder nicht.

PLCSENSE_TELEMETRY=0

Setzen Sie diese Variable, dann werden keine Zähler mehr gesendet; alles andere funktioniert weiter. Was wir speichern und wie lange, steht in der Datenschutzerklärung.

Einrichtung

Läuft dort, wo Ihr Agent schon arbeitet

plcsense ist ein MCP-Server mit einer CLI davor. Ein Befehl richtet es im Projekt für den Client ein, den Sie verwenden.

  • Cursor
  • Claude Code
  • VS Code
  • Codex
  • Gemini CLI
einmalige Einrichtung
$ scoop install zeugwerk/plcsense
$ plcsense license activate <key>
$ plcsense setup cursor
.cursor/mcp.json
.Zeugwerk/plcsense.json (created with defaults)

Öffnen Sie den Ordner mit Ihrer .sln in Ihrem Agenten und führen Sie diese Befehle aus genau demselben Ordner aus.

Hauptweg ist Scoop plus Lizenzschlüssel. Für MCP-Configs über npm geht auch npx -y @zeugwerk/plcsense mcp (gleicher Token und gleiche Lizenz). Die Befehle können sich bis zum Launch noch ändern.

Grenzen

Bewusst nur lesend

plcsense liest. Ihr Editor schreibt, TwinCAT baut und deployt. Diese Trennung ist Absicht und keine Lücke, die wir schließen wollen.

Es schreibt nie in Ihr Projekt

Agenten ändern Dateien über den Editor. In Ihre Solution schreibt sonst nichts, es gibt weder Codegenerierung noch Scaffolding.

Keine Runtime, kein ADS, kein Deploy

Kein Zugriff auf die laufende Steuerung, kein Lesen oder Schreiben von Symbolen über ADS, kein Download auf ein Ziel.

Kein Ersatz für die IDE

Keine I/O-Baum-Bearbeitung, kein EtherCAT-Scan, keine Achskonfiguration. Das bleibt in XAE.

Es arbeitet mit Ihrer Solution, so wie sie ist

plcsense ist ein eigenes Produkt, das eigenständig verkauft und betreut wird. Es liest gewöhnliche TwinCAT-Projekte und gewöhnliche Bibliotheksdateien: kein Framework, das Sie übernehmen müssen, keine Projektvorlage, an die Sie sich halten müssen, und nichts, was Sie dazukaufen müssen. Wo Sie ohnehin mit zkdoc veröffentlichen, fügt es sich ein und liest, was Ihre Pipeline ausgibt; wo nicht, genügen die Bibliotheksdateien in der Solution.

Praktische Fragen

So bringen Sie es zum Laufen

Installation, Lizenz und wie Sie aktuell bleiben.

Wie installiere ich es?

Unter Windows setzen Sie Ihren Download-Token und führen einen PowerShell-Befehl aus. Der installiert plcsense über Scoop und aktiviert bei Bedarf Ihre Lizenz.

$env:PLCSENSE_TOKEN = '<your token>'
irm https://plcsense.com/install.ps1 | iex

Lieber den MCP-Client über npm einrichten? Derselbe PLCSENSE_TOKEN, Node.js 18+, heute Windows x64, und weiterhin eine kommerzielle Lizenz.

$env:PLCSENSE_TOKEN = '<your token>'
npx -y @zeugwerk/plcsense mcp

Download-Token und Lizenzschlüssel gibt es mit dem Early Access dieser Runde, der für neue Anmeldungen geschlossen ist; wenn Sie sich schon angemeldet haben, gehen die Schlüssel gerade laufend raus, Ihrer kann also noch unterwegs sein. Tragen Sie sich für die nächste Runde in die Launch-Liste ein. Das Installationsskript ist reiner Text, Sie können es vor dem Ausführen lesen.

Was brauche ich auf dem Rechner?

Windows, PowerShell und die TwinCAT-Solution, an der Sie arbeiten wollen. Weder TwinCAT noch XAE müssen installiert sein, damit plcsense Ihr Projekt und dessen Bibliotheken liest. Ist ein lokaler Managed-Libraries-Ordner vorhanden, wird er genutzt, und wenn Ihre Bibliotheken anderswo liegen, können Sie den Pfad umstellen. Der npm-Launcher braucht zusätzlich Node.js 18+.

Mit welchen Agenten funktioniert es?

Cursor, Claude Code, VS Code, Codex und Gemini CLI. Führen Sie den passenden Setup-Befehl in dem Ordner aus, den Sie in Ihrem Agenten öffnen und in dem Ihre TwinCAT-Solution-Dateien liegen: Er schreibt den MCP-Eintrag für diesen Client und eine .Zeugwerk/plcsense.json, in der Sie auf Ihre Dokumentation verweisen können. Nur im Projekt, an Ihrer globalen Agent-Konfiguration ändert sich nichts.

plcsense setup cursor
Was steht in der .Zeugwerk/plcsense.json?

plcsense setup <client> schreibt .Zeugwerk/plcsense.json einmal, mit jedem Schalter vorhanden und auf seinem Standardwert, damit die Datei selbst zeigt, was sich ändern lässt, statt es im Code zu verstecken. Nichts darin ist geheim, Sie können sie also bedenkenlos zusammen mit der Solution einchecken.

{
  "config_version": 4,
  "managed_libraries": {
    "root": "C:/TwinCAT/3.1/Components/Plc/Managed Libraries/"
  },
  "doc_sites": {
    "ZCore": { "root_template": "https://doc.zeugwerk.dev/{channel}/" },
    "AcmeSealingLib": { "root": "https://docs.acme.example/sealing/1.4/" }
  },
  "beckhoff_infosys": {
    "enabled": true,
    "cache_ttl_hours": 168,
    "crawl_delay_ms": 10,
    "extra_eligible_namespaces": []
  },
  "confluence": {
    "enabled": false,
    "base_url": "https://your-site.atlassian.net/wiki",
    "spaces": [],
    "library_namespaces": {}
  },
  "parser": { "backend": "TreeSitter" },
  "libraries": {
    "transitive_references": true,
    "max_depth": 8,
    "max_libraries": 250,
    "wrapper_hint_names": ["ZPlatform", "ZAux"],
    "hydration_profile": "signatures"
  },
  "validation": {
    "semantic_checks": true,
    "disabled_checks": []
  },
  "workspace": {
    "solutions": []
  }
}
config_version
Stempel des mitgelieferten Presets, keine Produktversion. setup schreibt eine Datei nur neu, wenn ihr Stempel hinter dem aktuellen liegt, und fragt vorher nach, sofern nichts anderes eingestellt ist.
managed_libraries.root
TwinCATs eigener Managed-Libraries-Ordner. Löst standardmäßig bereits %TWINCAT3DIR% auf; nur setzen, wenn Ihre Bibliotheken anderswo liegen.
doc_sites.<Namespace>
Wo die zkdoc-Ausgabe einer Bibliothek liegt, je Namespace, damit get_plc_type_documentation die Version liest, die Ihr Projekt tatsächlich referenziert. root_template löst dafür einen Platzhalter {channel}/{version} auf; root ist eine feste URL für eine Seite, die ihre Doku nicht versioniert.
beckhoff_infosys.*
Standardmäßig an, holt offizielle Beckhoff-Seiten für Beckhoff-Bibliotheken. cache_ttl_hours und crawl_delay_ms sind Cache- und Höflichkeits-Schalter; extra_eligible_namespaces ist ein Notausgang für eine Bibliothek ohne Tc2_/Tc3_-Namen und ohne Herstellerkennung.
confluence.*
Aus, bis Sie enabled setzen. base_url und spaces grenzen die optionale Confluence-Cloud-Anbindung ein; das Token selbst ist eine Umgebungsvariable, nie eine Zeile in dieser Datei.
parser.backend
Standardmäßig TreeSitter; Antlr ist die Ausweich-Engine für die Grammatik.
libraries.*
Wie weit die Bibliotheks-Hydration Referenzen folgt: transitive_references, max_depth und max_libraries begrenzen den Durchlauf; wrapper_hint_names meldet einer Validierungsprüfung Ihre eigene Wrapper-Konvention; hydration_profile ist "signatures" (Standard, ohne Methodenrümpfe) oder "full" (Quell-Bibliotheken behalten auch ihre Rümpfe).
validation.*
semantic_checks schaltet die zusätzlichen Prüfungen ganz ab, wenn eine öfter falsch als richtig liegt; disabled_checks unterdrückt stattdessen nur einen einzelnen Regel-Code.
workspace.solutions
Leer heißt: jede .sln, die direkt in dem geöffneten Ordner liegt, wird gemeinsam als ein Workspace geladen. Zwei Solutions nebeneinander sind eine normale Maschine, kein Fehler. Tragen Sie hier Pfade ein, um auf die Solutions einzugrenzen, an denen Sie gerade arbeiten, oder um eine hinzuzunehmen, die außerhalb des Ordners liegt: nur so sucht plcsense dort überhaupt. Solutions in Unterordnern werden nie von selbst aufgegriffen, ein Repository mit einem Dutzend davon lädt also nicht ein Dutzend Kopien derselben SPS-Projekte.

Das alles funktioniert bereits ohne jede Änderung. doc_sites ist der Abschnitt, den die meisten von Hand anpassen, um plcsense auf die Dokumentation ihrer eigenen Bibliotheken zu zeigen.

Ist das ein Language Server?

Nein. Es gibt kein LSP, keine Inline-Vervollständigung, keine Diagnosen im Editor: plcsense antwortet nur, wenn ein Agent eines seiner MCP-Tools aufruft. Wenn Sie das fragen, haben Sie aber schon das eigentliche Problem gefunden: Agenten raten bei TwinCAT-Code, weil ihnen niemand den fundierten, semantischen Blick auf eine Solution und ihre Bibliotheken gibt, den ein Language Server bei verbreiteten Sprachen liefert. Genau diese Lücke schließt plcsense, als MCP-Tool statt als LSP. Schreiben Sie uns im Formular der Launch-Liste, woran Sie arbeiten: Wer diesen Unterschied kennt, ist den meisten Demo-Anfragen schon voraus.

Wann merke ich den Unterschied wirklich?

Nicht bei einer einzeiligen Änderung an einem Funktionsbaustein, den Sie schon kennen und der in der offenen Datei steht. Die Datei zu lesen reicht dort, und ein Agent, der vom Bildschirm rät, wirkt genauso gut.

Sie merken den Unterschied, sobald die Arbeit diese Datei verlässt. Dazu gehören ein paar Zeilen gegen einen anderen Typ derselben Familie, eine Bibliothek, die Sie noch nicht aufgerufen haben, ein Interface mit mehreren Implementierungen, eine Umbenennung über viele POUs oder ein Projekt, das jemand anderes geschrieben hat.

Eine Textsuche oder die .tmc Ihres letzten TwinCAT-Builds kann für Namen, die schon auf dem Symbolbaum dieses Projekts liegen, immer noch korrekt aussehen. Beides findet keine Methode, die nur auf einem anderen Typ existiert, nicht den Rest einer Bibliothek, die Sie noch nicht aufgerufen haben, nicht welche Überschreibung tatsächlich läuft, und keinen einheitlichen Blick über mehrere PLC-Projekte. find_plc_implementations und find_plc_references antworten über den Typ, nicht über den Text.

Der Fehler, den das verhindern soll, ist oft eine Zeile, die nach Structured Text aussieht und nicht kompiliert: Die Methode gibt es, nur nicht auf diesem Typ. Es ist auch eine Umbenennung, die kompiliert und dabei eine Aufrufstelle still übersieht.

Funktioniert es mit CODESYS oder SIMATIC AX?

Heute nicht: Wir testen auf TwinCAT 3 und unterstützen TwinCAT 3. An der Engine ist allerdings wenig Beckhoff-spezifisch. Sie liest Structured Text nach IEC 61131-3, herstellerspezifisch ist die Schicht, die Projekte findet und Bibliotheken auflöst. Bei einer Toolchain, die ihre Quellen als reine ST-Dateien ablegt, ist genau diese Schicht die ganze Arbeit: Der Code von SIMATIC AX wäre damit weitgehend erreichbar, der Inhalt seiner Paket-Bibliotheken nicht. CODESYS braucht die Quellen als lesbare Dateien, also einen Export statt der binären Projektdatei. Schreiben Sie ins Formular, womit Sie arbeiten: Was nach TwinCAT kommt, ist genau die Art von Frage, die die Pilotphase entscheidet.

Gibt es einen Build für Linux oder macOS?

Noch nicht. Die Analyse selbst braucht kein Windows, aber Windows ist die einzige Plattform, für die wir heute ein Paket ausliefern, und das ist für Early Access die ehrliche Antwort. Schreiben Sie es ins Formular, wenn eine andere Plattform der Grund ist, weshalb Sie es nicht einsetzen können: genau das soll die Pilotphase klären.

Wie aktualisiere ich?

Scoop: scoop update plcsense, oder Installer erneut ausführen. npm: der nächste npx -y @zeugwerk/plcsense holt die veröffentlichte Version. Rechnen Sie im Early Access damit, häufig zu aktualisieren.

scoop update
scoop update plcsense
Was frage ich es am besten beim ersten Mal?

Öffnen Sie Ihre eigene Solution und fragen Sie nach einer Bibliothek, auf die Sie sich verlassen, die Sie aber noch nicht aufgerufen haben. Genau das deckt eine Textsuche oder die .tmc Ihres letzten Builds nicht ab, weil der Rest dieser Bibliothek nie auf dem Symbolbaum dieses Projekts gelandet ist.

"Wie rufe ich FB_SealHead aus AcmeSealingLib auf? Welche Methoden und Parameter hat es?"
"Welche Typen in diesem Projekt implementieren [ein Interface aus einer Bibliothek, die wir nutzen]?"
"Was sind die gültigen Werte von E_SealPhase in der referenzierten Version von AcmeSealingLib?"
"Wo wird ST_SealDose in dieser Solution verwendet?"
"Validiere dieses Projekt und behebe, was dabei herauskommt."

Das liegt mit Absicht nahe an der Demo-Ausgabe oben auf dieser Seite: Dieselben Tools beantworten das auf Ihrer eigenen Solution.

Wie bekomme ich einen Lizenzschlüssel?

Der Early Access dieser Runde ist für neue Anmeldungen geschlossen, wir verschicken die Lizenzschlüssel dafür gerade laufend, alle in dieser Runde sollten ihren bald haben. Tragen Sie sich in die Launch-Liste ein, wir schreiben, wenn plcsense öffentlich verfügbar ist, oder früher, falls vorher ein Platz frei wird.