Documentation

Diagnostic Codes

Reference for PLC diagnostics with minimal examples that trigger each code.

Diagnostic Codes

This page lists the diagnostic codes emitted by the language server and plccheck. The examples are intentionally minimal. Most SCL examples are fragments that should be placed inside a normal block body or declaration section, and project-wide diagnostics may require the companion file or PLC-root setup described in the example.

SCL Lexer And Parser

CodeMeaningMinimal trigger example
SCL_LEX_UNTERMINATED_STRINGA single-quoted string literal is not closed.#Name := 'open;
SCL_LEX_UNEXPECTED_HASHA # local marker is not followed by an identifier.# := TRUE;
SCL_LEX_UNEXPECTED_TOKENThe lexer found a character that is not valid at that position.#Value := @;
SCL_LEX_UNTERMINATED_ATTRIBUTE_BLOCKA Siemens attribute block starts with { and never closes.{ S7_Optimized_Access := 'TRUE'
SCL_LEX_UNTERMINATED_QUOTED_IDENTIFIERA double-quoted identifier is not closed."OpenName := 1;
SCL_PARSE_DECL_INIT_UNEXPECTED_TOKENA declaration initializer has mismatched delimiters.VAR x : ARRAY[1..2] OF INT := [1, 2); END_VAR
SCL_PARSE_EXPECTED_TOKENA required punctuation token is missing.VAR x INT; END_VAR
SCL_PARSE_EXPECTED_KEYWORDA required keyword is missing.FUNCTION_BLOCK FB VAR x : INT; END_VAR
SCL_PARSE_EXPECTED_IDENTIFIERA declaration or construct expected an identifier.FUNCTION_BLOCK ; END_FUNCTION_BLOCK
SCL_PARSE_UNEXPECTED_TOKENA token appears where the parser recovery set does not allow it.FUNCTION_BLOCK FB BEGIN ; END_FUNCTION_BLOCK
SCL_EXPR_TRAILING_TOKENExpression parsing finished but extra tokens remained.#Value := 1 2;

SCL Type Definitions

CodeMeaningMinimal trigger example
SCL_TYPEDEF_EXPECTED_DECL_SEMICOLONA type declaration is not terminated with ;.TYPE T : INT T2 : INT; END_TYPE
SCL_TYPEDEF_UNTERMINATED_TYPE_SECTIONA TYPE section is missing END_TYPE.TYPE T : INT;
SCL_TYPEDEF_EXPECTED_TYPE_REFA type alias, field, or array element is missing its referenced type.TYPE T : ; END_TYPE
SCL_TYPEDEF_EXPECTED_FIELD_COLONA STRUCT field is missing : after its name.TYPE T : STRUCT Field INT; END_STRUCT; END_TYPE
SCL_TYPEDEF_EXPECTED_FIELD_SEMICOLONA STRUCT field declaration is missing ;.TYPE T : STRUCT Field : INT Next : INT; END_STRUCT; END_TYPE
SCL_TYPEDEF_UNTERMINATED_STRUCTA STRUCT declaration is missing END_STRUCT.TYPE T : STRUCT Field : INT; END_TYPE
SCL_TYPEDEF_ARRAY_BOUNDS_UNTERMINATEDAn ARRAY[ bounds list is missing ].TYPE T : ARRAY[1..10 OF INT; END_TYPE
SCL_TYPEDEF_ARRAY_EXPECT_OFAn array type is missing OF.TYPE T : ARRAY[1..10] INT; END_TYPE

SCL Semantic Checks

CodeMeaningMinimal trigger example
SCL_SEM_AT_UNDECLARED_TARGETA symbolic AT target does not exist.VAR_TEMP Overlay AT Missing.Target : BOOL; END_VAR
SCL_SEM_AT_INVALID_TARGET_PATHA symbolic AT target exists but the member path is invalid.VAR_TEMP Base : STRUCT Ok : BOOL; END_STRUCT; Overlay AT Base.Missing : BOOL; END_VAR
SCL_SEM_ASSIGN_UNDECLARED_TARGETAn assignment writes to an undeclared target.Missing := 1;
SCL_SEM_INVALID_DESIGNATOR_PATHA designator path references a member or index that cannot exist.#StructValue.Missing := 1;
SCL_SEM_REFERENCE_UNDECLARED_LOCALAn expression references an undeclared local symbol.#Out := #Missing;
SCL_SEM_ARRAY_INDEX_COUNTAn array is indexed with the wrong number of dimensions.#Arr[1, 2] := 0;
SCL_SEM_ARRAY_INDEX_TYPEAn array index is not integer-compatible.#Arr[TRUE] := 0;
SCL_SEM_ARRAY_INDEX_BOUNDSA constant array index is outside the declared bounds.#Arr[99] := 0;
SCL_SEM_ASSIGN_PRECISION_LOSSAn assignment is allowed but may lose sign or precision.#SmallInt := #RealValue;
SCL_SEM_ASSIGN_TYPEAn assignment is not type-compatible.#RealValue := T#1s;

SCL Call-Site Checks

CodeMeaningMinimal trigger example
SCL_CALL_UNKNOWN_PINA named call argument does not match a pin on the target FB or FC.#Motor(NotAPin := TRUE);
SCL_CALL_PIN_DIR_MISMATCHA named call argument uses := or => against the wrong pin direction.#Motor(Done := TRUE);
SCL_CALL_PIN_TYPEA named call argument has a type that cannot be assigned to or from the pin.#Motor(Start := 1.5);
SCL_DUPLICATE_INSTANCE_CALLThe same stateful FB instance is called more than once in one block.#Timer(IN := TRUE); #Timer(IN := FALSE);

PLC Tag Tables

CodeMeaningMinimal trigger example
TAGTABLE_DUPLICATE_TAG_NAMETwo XML tag-table rows use the same tag name.<Member Name="Start" /><Member Name="Start" />
TAGTABLE_TYPE_UNDEFINEDA tag-table row references a datatype not known in the PLC scope.<Member Name="Bad" Datatype="MissingType" />
TAGTABLE_GLOBAL_NAME_CONFLICTA tag name conflicts with another global PLC symbol.Tag XML defines Motor_FB while an SCL file also declares FUNCTION_BLOCK Motor_FB.

Project Library Resolution

CodeMeaningMinimal trigger example
PLCLIB_LINK_PARSEA .liblink placeholder cannot be parsed.Program blocks/Library/Foo.liblink contains malformed metadata.
PLCLIB_MISSING_TYPES_ROOTA .plc.json library path points to a missing or non-directory types root..plc.json contains "libraries": ["../missing-types"].
PLCLIB_TYPE_GUID_NOT_FOUNDA .liblink references a type GUID that no discovered .libinfo provides.A copied .liblink points to a library version that is not present under the configured Types root.
PLCLIB_VERSION_GUID_AMBIGUOUSThe type GUID exists, but the requested version cannot be selected unambiguously.Two .libinfo files share the same type GUID but do not match the .liblink version GUID.
PLCLIB_METADATA_PARSEA .libinfo or .libint sidecar cannot be parsed.Types/Library/Foo.libinfo contains malformed metadata.
PLCLIB_SOURCE_MISSINGLibrary metadata resolves, but the expected source file is missing.Foo.libint lists Foo.scl, but Foo.scl is not present next to the sidecar files.
CodeMeaningMinimal trigger example
S7RES_MISSING_DCLA .s7res file has no same-basename .s7dcl sibling.Motor.s7res exists, but Motor.s7dcl does not.
S7RES_DCL_DUPLICATE_REFSThe sibling .s7dcl references the same resource ID more than once.Motor.s7dcl contains two S7_NetworkTitle := "N01" assignments.
S7RES_COUNT_MISMATCHThe number of .s7res entries does not match unique .s7dcl references..s7res has N01 and N02, but .s7dcl only references N01.
S7RES_ID_NOT_REFERENCEDAn .s7res ID is not referenced by the sibling .s7dcl..s7res contains - id: N99, but .s7dcl never references N99.
S7RES_MISSING_IDA .s7dcl resource ID reference has no .s7res entry..s7dcl references S7_NetworkTitle := "N02" while .s7res only defines N01.
S7DCL_MISSING_IDA .s7dcl resource ID reference is missing from an existing sibling .s7res.Motor.s7dcl references S7_NetworkComment := "C01" while Motor.s7res lacks C01.
S7RES_EMPTY_IDA MultiLingualTexts entry has an empty id.- id:
S7RES_BAD_IDA resource ID is suspicious and not a simple alphanumeric identifier.- id: N-01
S7RES_MISSING_HEADERA .s7res file lacks the expected MultiLingualTexts: header..s7res starts directly with - id: N01.
S7RES_EMPTYA .s7res file has the header but no entries.MultiLingualTexts: with no - id: rows.

S7DCL Embedded SCL Networks

CodeMeaningMinimal trigger example
S7DCL_SCL_META_UNTERMINATEDMetadata before an SCL NETWORK has an unterminated {...} block.{ S7_Language := "SCL" NETWORK
S7DCL_SCL_UNTERMINATED_NETWORKAn SCL NETWORK is missing END_NETWORK.{ S7_Language := "SCL" } NETWORK #x := TRUE;
S7DCL_SCL_NETWORK_PARSEFallback for an embedded SCL parser diagnostic that did not include a specific code.{ S7_Language := "SCL" } NETWORK malformed SCL END_NETWORK
S7DCL_SCL_NETWORK_<SCL code>Embedded SCL lexer/parser diagnostics are downgraded to warnings and prefixed with S7DCL_SCL_NETWORK_.Missing ; inside an SCL NETWORK can produce S7DCL_SCL_NETWORK_SCL_PARSE_EXPECTED_TOKEN.

S7DCL FBD Network Syntax

Examples in this section assume an .s7dcl FBD network body, for example { S7_Language := "FBD" } NETWORK ... END_NETWORK.

CodeMeaningMinimal trigger example
S7DCL_FBD_META_UNTERMINATEDMetadata before or inside an FBD network has an unterminated {...} block.{ S7_Language := "FBD" NETWORK
S7DCL_FBD_EXPECT_NETWORKThe FBD parser was asked to parse a section that does not start with NETWORK.FBD metadata is followed by RUNG TRUE instead of NETWORK.
S7DCL_FBD_UNTERMINATED_NETWORKAn FBD NETWORK is missing END_NETWORK.NETWORK RUNG TRUE END_RUNG
S7DCL_FBD_DUP_WIRE_PRODUCERTwo rungs produce the same wire.END_RUNG wire#w1 appears on two rungs.
S7DCL_FBD_UNEXPECTEDThe FBD network contains a token other than RUNG or END_NETWORK.NETWORK BOX END_NETWORK
S7DCL_FBD_EXPECT_RUNGThe FBD rung parser was asked to parse a section that does not start with RUNG.NETWORK A(in2 := #Start) END_NETWORK
S7DCL_FBD_UNTERMINATED_RUNGAn FBD RUNG is missing END_RUNG.NETWORK RUNG TRUE A(in2 := #Start) END_NETWORK
S7DCL_FBD_EXPECT_LPARENAn FBD element or pin list is missing (.RUNG TRUE A in2 := #Start) END_RUNG
S7DCL_FBD_UNTERMINATED_EXPRAn FBD element, coil, or pin expression is missing a closing delimiter.RUNG TRUE Coil(#Out END_RUNG
S7DCL_FBD_UNTERMINATED_PINLISTA call or boolean operator pin list is not closed.RUNG TRUE A(in2 := #Start END_RUNG
S7DCL_FBD_EXPECT_PINA pin list entry does not start with a valid pin name.RUNG TRUE A(1 := #Start) END_RUNG
S7DCL_FBD_EXPECT_PIN_OPA pin name is not followed by := or =>.RUNG TRUE A(in2 #Start) END_RUNG
S7DCL_FBD_BOOL_OP_INVALID_RUNG_HEADERA boolean operator starts from a wire rung header.RUNG wire#w1 A(in2 := #Start) END_RUNG wire#w2
S7DCL_FBD_BOOL_OP_MISSING_OUTPUT_CONNECTORA boolean operator is missing a valid left-side BOOL connector.RUNG A(in2 := #Start) A(in2 := #Other) END_RUNG
S7DCL_FBD_PIN_INLINE_BOOL_EXPRA call pin contains inline AND or OR logic instead of FBD wires.RUNG TRUE MyFB(in1 := #A AND #B) END_RUNG
S7DCL_FBD_CALL_WIRE_PRODUCER_BEFORE_CONSUMERA call consumes a wire whose producer rung appears before the consuming call.First rung produces wire#w1; later call uses in1 := wire#w1.
S7DCL_FBD_WIRE_NO_PRODUCERA wire is consumed but no rung produces it.RUNG TRUE MyFB(in1 := wire#w9) END_RUNG

S7DCL FBD Semantic Checks

CodeMeaningMinimal trigger example
S7DCL_FBD_DUPLICATE_INSTANCE_CALLThe same stateful FB instance is called more than once in one block.Two FBD elements call #Timer(...) in the same enclosing block.
S7DCL_FBD_SEM_PIN_INPUT_TYPEAn input pin receives an incompatible expression type.MyFB(IntPin := TRUE) where IntPin expects INT.
S7DCL_FBD_SEM_PIN_OUTPUT_TYPEAn output pin writes to a target with an incompatible type.MyFB(Done => #Counter) where Done is BOOL and #Counter is INT.
S7DCL_FBD_SEM_UNRESOLVED_CALLA dotted FBD call cannot be resolved enough for pin validation.#Unknown.Nested(in1 := TRUE)
S7DCL_FBD_SEM_RUNG_HEADER_TYPEA rung header expression is not BOOL.RUNG #Counter where #Counter is INT.
S7DCL_FBD_SEM_INVALID_PATHA local or quoted designator path has an invalid member or index.Coil(#StructValue.Missing)
S7DCL_FBD_SEM_UNDECLARED_LOCALAn FBD expression references an undeclared local.Coil(#MissingLocal)
S7DCL_FBD_SEM_COIL_TARGET_TYPEA coil or S_SR operand target is not BOOL.Coil(#Counter) where #Counter is INT.
S7DCL_FBD_SEM_BOOL_OP_ARG_TYPEA boolean operator has a bad input pin name or non-BOOL input type.A(in1 := #Start) or A(in2 := #Counter)
S7DCL_FBD_SEM_BUILTIN_PIN_UNKNOWNA builtin FBD call uses a pin name that the builtin does not define.TON(BadPin := TRUE)
S7DCL_FBD_SEM_BUILTIN_PIN_TYPEA builtin FBD pin has the wrong direction or type.TON(IN => #Start) or TON(PT := TRUE)
S7DCL_FBD_SEM_BUILTIN_OPERAND_TARGETS_SR uses an operand that is not an assignable designator.S_SR(operand := TRUE)

S7DCL FBD Transpile Diagnostics

CodeMeaningMinimal trigger example
S7DCL_FBD_TX_BLOCK_MAPPINGTranspiling one .s7dcl file produces more than one SCL block output name.A single .s7dcl file declares two blocks.
S7DCL_FBD_TX_EMPTY_NETWORKAn FBD network has no emitted statements.NETWORK RUNG TRUE END_RUNG END_NETWORK
S7DCL_FBD_TX_EXPR_FALLBACKThe FBD-to-SCL transpiler cannot parse an expression and emits a fallback.MyFB(in1 := #A + )
S7DCL_FBD_TX_WIRE_CYCLE_FIXED_POINTThe FBD wire graph has a cycle and needs fixed-point lowering.wire#w1 and wire#w2 feed each other through boolean rungs.

S7DCL LAD Network Syntax

Examples in this section assume an .s7dcl LAD network body, for example { S7_Language := "LAD" } NETWORK ... END_NETWORK.

CodeMeaningMinimal trigger example
S7DCL_LAD_META_UNTERMINATEDMetadata before or inside a LAD network has an unterminated {...} block.{ S7_Language := "LAD" NETWORK
S7DCL_LAD_EXPECT_NETWORKThe LAD parser was asked to parse a section that does not start with NETWORK.LAD metadata is followed by RUNG instead of NETWORK.
S7DCL_LAD_UNTERMINATED_NETWORKA LAD NETWORK is missing END_NETWORK.NETWORK RUNG TRUE END_RUNG
S7DCL_LAD_UNEXPECTEDThe LAD network contains a token other than RUNG or END_NETWORK.NETWORK Contact(#Start) END_NETWORK
S7DCL_LAD_EXPECT_RUNGThe LAD rung parser was asked to parse a section that does not start with RUNG.NETWORK WIRE w1 END_NETWORK
S7DCL_LAD_UNTERMINATED_RUNGA LAD RUNG is missing END_RUNG.NETWORK RUNG Contact(#Start) END_NETWORK
S7DCL_LAD_EXPECT_WIRE_IDA WIRE token is missing its wire ID.RUNG WIRE END_RUNG
S7DCL_LAD_EXPECT_LPARENA LAD element is missing ( after its name.RUNG Contact #Start) END_RUNG
S7DCL_LAD_UNTERMINATED_EXPRA LAD element expression is missing ).RUNG Contact(#Start END_RUNG

S7DCL LAD Transpile Diagnostics

CodeMeaningMinimal trigger example
S7DCL_LAD_TX_BLOCK_MAPPINGTranspiling one .s7dcl file produces more than one SCL block output name.A single .s7dcl file declares two blocks.
S7DCL_LAD_TX_EMPTY_NETWORKA LAD network has no emitted statements.NETWORK RUNG TRUE END_RUNG END_NETWORK
S7DCL_LAD_TX_EXPR_FALLBACKThe LAD-to-SCL transpiler cannot parse an expression and emits a fallback.Contact(#A + )
S7DCL_LAD_TX_WIRE_CYCLE_FIXED_POINTThe LAD wire graph has a cycle and needs fixed-point lowering.Two LAD wire paths feed each other.

SCL Test Parser

CodeMeaningMinimal trigger example
SCLTEST_PARSE_EXPECT_TEST_CASEThe parser expected a TEST_CASE declaration.SET UUT.Start := TRUE;
SCLTEST_PARSE_DUPLICATE_TARGETA file declares TEST_TARGET more than once.TEST_TARGET "FB1"; TEST_TARGET "FB2";
SCLTEST_PARSE_TARGET_ENTRY_CONFLICTTEST_TARGET is combined with TEST_ENTRY.TEST_TARGET "FB1"; TEST_ENTRY "OB1";
SCLTEST_PARSE_DUPLICATE_ENTRYA file declares TEST_ENTRY more than once.TEST_ENTRY "OB1"; TEST_ENTRY "OB2";
SCLTEST_PARSE_ENTRY_TARGET_CONFLICTTEST_ENTRY is combined with TEST_TARGET.TEST_ENTRY "OB1"; TEST_TARGET "FB1";
SCLTEST_PARSE_TARGET_EXPECT_SYMBOLTEST_TARGET is missing its target symbol.TEST_TARGET ;
SCLTEST_PARSE_ENTRY_EXPECT_SYMBOLTEST_ENTRY is missing its entry symbol.TEST_ENTRY ;
SCLTEST_PARSE_TARGET_EXPECT_SEMICOLONTEST_TARGET is missing ;.TEST_TARGET "FB1"
SCLTEST_PARSE_ENTRY_EXPECT_SEMICOLONTEST_ENTRY is missing ;.TEST_ENTRY "OB1"
SCLTEST_PARSE_TARGET_AFTER_CASETEST_TARGET appears after a test case has started.TEST_CASE "A" END_TEST_CASE TEST_TARGET "FB1";
SCLTEST_PARSE_ENTRY_AFTER_CASETEST_ENTRY appears after a test case has started.TEST_CASE "A" END_TEST_CASE TEST_ENTRY "OB1";
SCLTEST_PARSE_EXPECT_END_TEST_CASEA test case is missing END_TEST_CASE.TEST_CASE "A" SET UUT.Start := TRUE;
SCLTEST_PARSE_EXPECT_CASE_NAMETEST_CASE is missing its name.TEST_CASE SET UUT.Start := TRUE; END_TEST_CASE
SCLTEST_PARSE_UNKNOWN_STEPA test case contains an unknown step keyword.TEST_CASE "A" POKE UUT.Start := TRUE; END_TEST_CASE
SCLTEST_PARSE_SET_EXPECT_TARGETSET is missing the target expression.TEST_CASE "A" SET := TRUE; END_TEST_CASE
SCLTEST_PARSE_SET_EXPECT_ASSIGNSET is missing :=.TEST_CASE "A" SET UUT.Start TRUE; END_TEST_CASE
SCLTEST_PARSE_SET_EXPECT_VALUESET is missing the value expression.TEST_CASE "A" SET UUT.Start := ; END_TEST_CASE
SCLTEST_PARSE_SET_EXPECT_SEMICOLONSET is missing ;.TEST_CASE "A" SET UUT.Start := TRUE END_TEST_CASE
SCLTEST_PARSE_HOLD_EXPECT_TARGETHOLD is missing the target expression.TEST_CASE "A" HOLD := TRUE; END_TEST_CASE
SCLTEST_PARSE_HOLD_EXPECT_ASSIGNHOLD is missing :=.TEST_CASE "A" HOLD UUT.Start TRUE; END_TEST_CASE
SCLTEST_PARSE_HOLD_EXPECT_VALUEHOLD is missing the value expression.TEST_CASE "A" HOLD UUT.Start := ; END_TEST_CASE
SCLTEST_PARSE_HOLD_EXPECT_SEMICOLONHOLD is missing ;.TEST_CASE "A" HOLD UUT.Start := TRUE END_TEST_CASE
SCLTEST_PARSE_RELEASE_EXPECT_TARGETRELEASE is missing the target expression.TEST_CASE "A" RELEASE ; END_TEST_CASE
SCLTEST_PARSE_RELEASE_EXPECT_SEMICOLONRELEASE is missing ;.TEST_CASE "A" RELEASE UUT.Start END_TEST_CASE
SCLTEST_PARSE_RELEASE_ALL_EXPECT_SEMICOLONRELEASE_ALL is missing ;.TEST_CASE "A" RELEASE_ALL END_TEST_CASE
SCLTEST_PARSE_WAIT_CYCLES_EXPECT_COUNTWAIT_CYCLES is missing the count expression.TEST_CASE "A" WAIT_CYCLES ; END_TEST_CASE
SCLTEST_PARSE_WAIT_CYCLES_EXPECT_SEMICOLONWAIT_CYCLES is missing ;.TEST_CASE "A" WAIT_CYCLES 1 END_TEST_CASE
SCLTEST_PARSE_WAIT_TIME_EXPECT_DURATIONWAIT_TIME is missing the duration expression.TEST_CASE "A" WAIT_TIME ; END_TEST_CASE
SCLTEST_PARSE_WAIT_TIME_EXPECT_SEMICOLONWAIT_TIME is missing ;.TEST_CASE "A" WAIT_TIME T#1s END_TEST_CASE
SCLTEST_PARSE_WAIT_UNTIL_EXPECT_LEFTWAIT_UNTIL is missing the left expression.TEST_CASE "A" WAIT_UNTIL = TRUE TIMEOUT T#1s; END_TEST_CASE
SCLTEST_PARSE_WAIT_UNTIL_EXPECT_OPERATORWAIT_UNTIL is missing its comparison operator.TEST_CASE "A" WAIT_UNTIL UUT.Done TRUE TIMEOUT T#1s; END_TEST_CASE
SCLTEST_PARSE_WAIT_UNTIL_EXPECT_RIGHTWAIT_UNTIL is missing the right expression.TEST_CASE "A" WAIT_UNTIL UUT.Done = TIMEOUT T#1s; END_TEST_CASE
SCLTEST_PARSE_WAIT_UNTIL_EXPECT_TIMEOUTWAIT_UNTIL is missing the TIMEOUT keyword.TEST_CASE "A" WAIT_UNTIL UUT.Done = TRUE T#1s; END_TEST_CASE
SCLTEST_PARSE_WAIT_UNTIL_EXPECT_TIMEOUT_DURATIONWAIT_UNTIL TIMEOUT is missing the duration expression.TEST_CASE "A" WAIT_UNTIL UUT.Done = TRUE TIMEOUT ; END_TEST_CASE
SCLTEST_PARSE_WAIT_UNTIL_EXPECT_SEMICOLONWAIT_UNTIL is missing ;.TEST_CASE "A" WAIT_UNTIL UUT.Done = TRUE TIMEOUT T#1s END_TEST_CASE
SCLTEST_PARSE_ASSERT_EXPECT_EXPRASSERT is missing its boolean expression.TEST_CASE "A" ASSERT ; END_TEST_CASE
SCLTEST_PARSE_ASSERT_EXPECT_SEMICOLONASSERT is missing ;.TEST_CASE "A" ASSERT UUT.Done = TRUE END_TEST_CASE
SCLTEST_PARSE_ASSERT_NEAR_EXPECT_LEFTASSERT_NEAR is missing its actual expression.TEST_CASE "A" ASSERT_NEAR := 1 TOLERANCE 0.1; END_TEST_CASE
SCLTEST_PARSE_ASSERT_NEAR_EXPECT_ASSIGNASSERT_NEAR is missing :=.TEST_CASE "A" ASSERT_NEAR UUT.Value 1 TOLERANCE 0.1; END_TEST_CASE
SCLTEST_PARSE_ASSERT_NEAR_EXPECT_RIGHTASSERT_NEAR is missing its expected expression.TEST_CASE "A" ASSERT_NEAR UUT.Value := TOLERANCE 0.1; END_TEST_CASE
SCLTEST_PARSE_ASSERT_NEAR_EXPECT_TOLERANCEASSERT_NEAR is missing TOLERANCE.TEST_CASE "A" ASSERT_NEAR UUT.Value := 1 0.1; END_TEST_CASE
SCLTEST_PARSE_ASSERT_NEAR_EXPECT_TOLERANCE_EXPRASSERT_NEAR TOLERANCE is missing its tolerance expression.TEST_CASE "A" ASSERT_NEAR UUT.Value := 1 TOLERANCE ; END_TEST_CASE
SCLTEST_PARSE_ASSERT_NEAR_EXPECT_SEMICOLONASSERT_NEAR is missing ;.TEST_CASE "A" ASSERT_NEAR UUT.Value := 1 TOLERANCE 0.1 END_TEST_CASE

SCL Test Semantic Checks

CodeMeaningMinimal trigger example
SCLTEST_SEM_UNDECLAREDA test expression references an undeclared symbol.ASSERT Missing = TRUE;
SCLTEST_SEM_INVALID_PATHA test expression uses an invalid designator path.ASSERT UUT.StructValue.Missing = 1;
SCLTEST_SEM_ASSIGN_TYPESET or HOLD assigns an incompatible type.SET UUT.RealValue := T#1s;
SCLTEST_SEM_RELEASE_WITHOUT_HOLDRELEASE targets a variable that was not previously held.RELEASE UUT.Start;
SCLTEST_SEM_ASSERT_TYPEASSERT is not a BOOL expression or compares incompatible types.ASSERT UUT.Count;
SCLTEST_SEM_WAIT_CYCLES_TYPEWAIT_CYCLES does not receive an integer-compatible expression.WAIT_CYCLES T#1s;
SCLTEST_SEM_WAIT_TIME_TYPEWAIT_TIME does not receive TIME or LTIME.WAIT_TIME 10;
SCLTEST_SEM_TIMEOUT_TYPEWAIT_UNTIL TIMEOUT does not receive TIME or LTIME.WAIT_UNTIL UUT.Done = TRUE TIMEOUT 10;
SCLTEST_SEM_COMPARE_TYPEWAIT_UNTIL compares incompatible expression types.WAIT_UNTIL UUT.Done = 1 TIMEOUT T#1s;
SCLTEST_SEM_ASSERT_NEAR_TYPEASSERT_NEAR lacks an equality comparison or uses non-numeric operands/tolerance.ASSERT_NEAR UUT.Done := TRUE TOLERANCE FALSE;
SCLTEST_SEM_UNKNOWN_TARGETTEST_TARGET does not resolve in the PLC scope.TEST_TARGET "Missing_FB";
SCLTEST_SEM_TARGET_KINDTEST_TARGET resolves to something other than a function or function block, or function metadata cannot load.TEST_TARGET "SomeDataBlock";

LSP And Workspace Fallbacks

CodeMeaningMinimal trigger example
LSP_ANALYZE_PIPELINE_ERRORThe LSP analysis pipeline failed before normal diagnostics could be published.Internal failure while analyzing an opened PLC document.
WORKSPACE_SCOPE_ERRORA PLC workspace scope could not be resolved.A broken .plc.json or unreadable scoped file prevents workspace indexing.