Repository navigation
4.0.0-beta.2
Pre-release
Pre-release
Fixes and additions since 4.0.0-beta.1, most of them found by running cts against a real project. Install or update with the same PowerShell line as before (L, the main branch). The full list is in CHANGELOG.md.
Upgrading: what changes
- The built-in deny list no longer has
delete_pou: deleting all of an object's files deletes it in the IDE unless the project denies that key, and a denied delete refuses the whole import, which the refusal says. cts commitand the quick window's5Commit the disk and6Commit the disk, publish commit the folder as it is on disk, not the IDE; they warn when the IDE differs, and the message prompt counts the IDE edits2IDE -> Disk would carry first.
Sync
- Folders of the POUs tab work like the folders below an application: export writes
<Folder>/.cds-object.xmlwith its objects inside (before, they landed at the root ofproject-view/), and import creates objects and folders in them and moves objects between them. A new folder at the root ofproject-view/goes to the POUs tab, and an object moves between the POUs and the Devices tab and to the root ofproject-view/both ways. A folder renamed on disk or in the IDE keeps its GUID;cts syncremoves a folder the IDE deleted with its files, andimport --forcebrings a folder and its objects the IDE deleted back from disk. An IDE body added to an object whose.sthad no// --- implementation ---line reaches the file. - An object goes into the folder of its parents' names even where CODESYS records other labels for them (a project a script made: a task configuration named
TaskConfiguration, labelledTask Configuration, belowPlc Logic, labelledPLC Logic), so its files no longer split into two folders that differ in case or spacing.cts comparenames folders git tracks in two spellings that differ only in case, which Windows holds as one. - A view file changed on disk while
cts import,cts exportorcts syncruns (by an editor or another program; cts commands wait for each other) is not overwritten, and its sync base does not take that change: the answer names it (changed_meanwhile) and the nextcts compareshows it. A new file whose object the IDE did not take (unapplied) stays out of the sync base, so the next sync carries it again instead of taking the IDE's side. - An object, text list or save the agent refuses during
cts importorcts syncis named (unapplied,save_error) and the rest still lands and is answered; a call with no reply in time or over a broken connection ends the command, its outcome unknown, and the answer says the IDE may hold part of the changes:cts compareshows what still differs and running the command again carries the rest. cts importandcts syncof several large screens read every one back; before, a screen past the agent's first reply was reportedunappliedthough it had landed.cts comparenames an ignored file the IDE holds otherwise than the disk, andcts import --include-ignored PATHcarries one; its sync base then takes the file, so carrying it back later works the same way.- An XML object saved by one CODESYS version and exported by another (an SP16 Library Manager opened in SP22, which writes an unset field as
<Null>where SP16 wrote an empty<Array>and adds empty fields) compares unchanged. - A folder on a mapped network drive, a
substdrive or behind a link is the repository's root when git's own root is (git names it by its UNC path or target).cts set-sync-folderwithout a path offers the git repository a project lies in, where a folder beside the project inside that repository was always refused.
IDE, PLC and dialogs
- Every call of a command names the project it began with, and the agent refuses it (
project_changed, nothing done) once the IDE has another project open. With a copy of the project open in a second IDE, a command without--targetnames both project files andCTS_TARGET. - A question the IDE showed and closed again while a command ran is named under its line (
dialog seen meanwhile,dialogs_seenin--json).cts project opennames a dialog the load leaves on screen (Project Environment) with its answer line,cts agent listnames the dialog an IDE is blocked by, andcts project open --launchrefuses at once in session 0. cts project close --save|--discard --quitcloses the project and exits CODESYS; the refusal for unsaved changes names--saveand--discard.cts resetanswers once the application has stopped, so acts startright after it starts the application; a reset the deny list refuses points to the download it allows.cts writeconfirms a number only when the read-back is the value written: a whole number exactly, a REAL as one float, any other number as one double.cts connectandcts downloadsay under their line that the IDE stays online.cts downloadandcts testsaysaved=by-idewhen CODESYS saved the project on its own while they ran; in a repository with no commit yet,cts downloadsays that, not each uncommitted file.cts plc-log --tail 0prints every entry.cts project device-typesnames--filterfirst when its list is long.
Tests and build
cts test --plcruns the tests on the device's PLC, and--repeat Nruns them N times (a warm reset between runs when the deny list allows it) and names each failing test with its run. Each run waits for its own records, which reach the runtime's log a moment afterTestResult.Done; a run whoseTEST_STARTdoes not come did not run and fails.cts build --all-objectsmarks the messages of objects no task callsnot called by any task(not_calledin--json); errors that name an unknown type or identifier come with the namespaces of the libraries the Library Manager references qualified-only.
Libraries and docs
- New
cts liblists the library references, andcts lib set --qualified-only,lib addandlib removechange them on disk forcts import. cts docs --show NAMEprints one library symbol (Standard.TON,NBS.TCP_Client) without writing the bundle.