<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="img/cts-logo-dark.png">
<img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/cts-logo.png" alt="CTS cds-text-sync" width="480">
</picture>
</p>
<p align="center"><b>텍스트 형태의 CODESYS 프로젝트: Git, 에디터 및 AI 에이전트가 작업하고, IDE는 동기화 상태를 유지합니다.</b></p>
cds-text-sync
Release
License
Discord
바이너리(binary) CODESYS 프로젝트를 Git, 에디터, CI 도구 및 LLM 에이전트가 이해할 수 있는 폴더로 변환합니다. 이 프로젝트를 내보내어 디스크에서 텍스트를 검토하거나 변경한 다음, CODESYS로 다시 가져옵니다.
본 도구는 공식 CODESYS 제품이 아닌 독립적인 MIT 라이선스 도구입니다.
1. 빠른 시작 (Quick start)
요구 사항: Windows 10 또는 11, CODESYS V3.5 SP16 이상 (SP16 Patch 9 x86 및 SP22 x64에서 테스트됨), 그리고 Git (동기화 폴더는 Git 저장소이므로, 팀의 프로젝트 파일에는 Git LFS가 포함되어야 합니다). cts와 IDE 내부 에이전트는 .NET Framework 4.8 프로그램이며, Windows 10 1903 이상에 포함되어 있습니다.
도구 및 CODESYS 메뉴 항목을 설치합니다:
im https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/main/irm/setup.ps1 | iex
[!IMPORTANT]
4.0. cds-text-sync는 이제 cts.exe이며 CODESYS 내부의 에이전트입니다. Project_*.py 스크립트는 사라졌습니다. 3.x 동기화 폴더는 사용되지 않으며, 마지막 3.x 릴리스인 3.4.1은 설치 프로그램 메뉴에서 한 가지 선택지로 남아 있습니다. 4.0으로 업그레이드하기에는 변경 사항, 삭제할 내용 및 되돌아가는 방법이 나열되어 있습니다.
cds-text-sync 툴바 버튼 (<img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/cts-button.png" alt="CTS 두 화살표 버튼" height="20">)은 에이전트를 시작하고 빠른 창을 열어주며, 이는 Tools > Scripting > Scripts > C > cds-text-sync와 동일합니다. 설치 프로그램은 스크립트와 아이콘을 CODESYS의 형제 폴더인 Script Commands에 배치하고 표준(Standard)에 버튼을 추가합니다. 만약 설정 중 CODESYS가 열려 있었다면, CODESYS를 닫고 cts install --toolbar를 실행하십시오. 각 프로젝트에서 중요한 경로는 다음과 같습니다:
- CODESYS에서 프로젝트를 열고 CODESYS가 시작될 때마다 에이전트를 한 번 시작합니다: 툴바 버튼 또는 Tools > Scripting > Scripts > C > cds-text-sync (또는
cts project open --launch로 프로젝트를 엽니다). 아무것도 스스로 이를 시작하지 않습니다. 실행되기 전까지 Alt+Q는 아무 동작도 하지 않으며, cts는 IDE를 찾지 못합니다.
- Alt+Q를 누른 다음
8 설정(Settings) 및 1 동기화 폴더(Sync folder)를 선택합니다. 엔터를 누르면 제안된 폴더(.project 파일이 위치한 복제본, 그렇지 않다면 옆에 있는 <프로젝트>-cts)가 사용되거나, 직접 입력할 수 있습니다 (cts set-sync-folder PATH도 동일하게 작동합니다). 프로젝트는 ID만 유지하며, 각 머신은 자신만의 폴더를 기억하기 때문에 어디에서 열린 .project의 사본이라도 다시 찾을 수 있습니다. 해당 폴더는 즉시 Git 저장소 루트가 됩니다: 만약 없으면 git init을 실행하고, 생성된 파일에 대한 무시 규칙을 설정하며, 첫 커밋을 수행합니다. 나중에 같은 행은 이동을 위한 폴더 대화 상자를 열고; Alt+Q를 사용 중이라면 8도 키를 변경합니다.
다른 사람이 설정한 프로젝트에 참여하기: 팀에서 저장소를 공유하는 방식대로 해당 저장소를 가져옵니다 (git clone), 제공받은 .project 파일(또는 저장소가 가지고 있는 파일)을 열고 Alt+Q를 누릅니다. 창이 이 행에 열리면서 클론 위치를 묻습니다. 한 번 선택합니다. 다른 프로젝트 폴더는 거부됩니다. 저장소 내의 .project 파일은 소유자(프로젝트를 설정한 컴퓨터)의 것이므로, 이곳을 대체할 수 있는 것은 cts commit --publish뿐이며, 사용자의 커밋에는 .st 파일만 포함되고 .project 파일은 절대 포함되지 않습니다.
3. 빠른 창에서 새 폴더에 대해 2(IDE -> Disk)를 눌러 프로젝트를 project-view/로 작성합니다. 이 창은 브랜치와 각 측면에서 변경된 내용을 보여줍니다.
4. project-view/를 편집한 후, 1(Disk -> IDE)을 누르면 편집 내용이 IDE로 전달되고, 3은 비교(디스크 또는 브랜치)를 수행하며, 5는 커밋하고, 7은 브랜치 병합 및 이력을 위해 Git 프로그램(GitHub Desktop, VS Code, Zed: 설정에서 선택 가능)에서 폴더를 엽니다. 셸(shell)에서는 동일한 단계가 각각 cts export, cts import, cts compare, cts commit, 그리고 cts open입니다.
<p><img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/quick-window.png" alt="빠른 창: 브랜치, 동기화 폴더 및 각 측면에서 변경된 내용, 그리고 번호가 매겨진 명령어" width="420"></p>
cts compare는 디스크, IDE, 그리고 그 어느 쪽보다 이전의 마지막 동기화 시점 사이에 무엇이 다른지 보여주며, 빠른 창의 3을 누르면 동일한 차이점을 diff 프로그램에서 열어줍니다. 양쪽 모두 변경된 객체는 병합됩니다. 편집 내용이 겹칠 경우, 먼저 1과 2가 충돌(conflict) 창을 엽니다: 이러한 각 객체가 나란히 표시되며, 다른 줄이 표시되고, 각각 Disk wins, IDE wins 또는 Merge by hand... 옵션이 제공됩니다:
<p><img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/conflict-window.png" alt="충돌 창: FB_Motor가 IDE와 디스크에서 같은 줄에 변경됨, 나란히 표시됨" width="100%"></p>
빠른 창(quick window)의 설정 페이지에서는 동기화 폴더(sync folder), 프로그램 실행, 빠른 키, 이 PC의 역할 및 권한에 대해 다룹니다. 디스크상의 파일은 별도의 설정이 없습니다 (POU당 하나의 .st 파일, 텍스트 목록용 .csv). 해당 항목이 도구 > 스크립팅(Tools > Scripting) 아래에 나타나지 않으면 설치 가이드를 참조하십시오.
2. Git 워크플로우 (Git workflows)
project-view/는 프로젝트와 일대일로 매핑됩니다: POU, GVL, DUT 또는 인터페이스는 하나의 .st 파일(내부 메서드, 속성 및 액션 포함)이며, 텍스트 목록은 .csv입니다. 장치(devices), 작업(tasks), 시각화(visualizations) 및 기타 비-ST 구조는 네이티브 XML로 유지됩니다. cts export는 Git이 검토할 수 있는 내용과 CODESYS가 다시 가져올 수 있는 내용을 모두 제공하며, cts import는 변경되거나, 새로 추가되었거나, 이름이 바뀌었거나 제거된 파일을 객체별로 되돌립니다.
설정된 뷰 루트(project-view/가 기본값)는 편집 가능하고 Git 추적되는 트리입니다. cts는 임시 파일을 외부의 .git/cts/ 아래에 보관합니다. project-view/와 cds-text-sync.json은 커밋에 포함해야 합니다. 동기화 기준(sync base, refs/cts/base)은 디스크와 IDE가 마지막으로 합의한 내용을 기록하므로, cts는 어느 쪽이 변경되었는지 알려줄 수 있습니다. 팀 작업의 경우 기능 브랜치(feature branches)에서 작업하고 프로젝트 소유자(project owner)가 병합하기 전에 변경 사항을 검토하도록 하십시오. 팀으로 작업하기에서는 소유자와 동료의 단계를 안내합니다.
3. 프로젝트에서 오류를 찾고 싶습니다 (I want to find errors in my project)
먼저 프로젝트를 내보낸(export) 다음, 분석기(analyzer)를 실행하여 .st 파일을 검사하십시오. 이는 오프라인으로 작동하므로 CODESYS 창이나 PLC 연결이 필요하지 않습니다.
cts analyze --workspace C:\path\to\sync-folder
cts analyze --workspace C:\path\to\sync-folder --sarif findings.sarif # CI/코드 스캐닝
cts analyze rules
...
IDE에서 빠른 창(quick window)의 '더 보기(More)'를 클릭하고, **정적 분석(Static analysis)**을 열면 결과 창이 나타납니다.
<p><img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/analyze-window.png"
alt="심각도별 발견 사항, 표시된 줄 및 규칙 문서가 포함된 결과 창"
width="100%"></p>
자세한 내용은 정적 분석을 참조하십시오.
단 하나의 명령어로 "배포 가능한지?"를 확인합니다
cts verify는 적용 가능한 모든 검사(정적 분석, SVG 스케치 린트, 그리고 (CODESYS가 열려 있는 경우) 컴파일러)를 실행하고 단일 판결과 단일 종료 코드를 반환합니다. 오프라인 단계는 읽기 전용만 수행하며; 컴파일러 단계는 IDE 빌드 상태에 접근하고 --with-test는 PLC에 쓰기 작업을 하므로, 이 두 가지는 읽기 전용이 아닙니다.
cts --pretty verify --sync-folder C:\path\to\sync-folder
cts verify --with-test # 또한 PLC에서 .test/ 계획을 실행합니다
cts test는 시뮬레이션에서 ST 테스트를 실행합니다: 시뮬레이션의 두 번째 장치가 공유 POU를 테스트하는 TaskApp을 가지고, GVL TestResult에 카운트하고, 각 테스트를 런타임 로그에 기록합니다. 모든 실행은 해당 로그를 파일(cts guide tests)로 저장합니다. 그동안 프로덕션 애플리케이션은 온라인 상태를 유지할 수 있습니다.
실행할 수 없는 검사(IDE가 열려 있지 않음)는 skipped로 보고되며, 해당 실행을 불완전한 상태로 표시하지만 결코 실패로 전환되지는 않습니다. 종료 코드: 0은 통과, 1은 실제 문제, 2는 시작 불가, 3은 --incomplete error와 함께 불완전합니다.
<details>
<summary><strong aria-expanded="false" aria-controls="content">▶ 클릭하여 열기: CODESYS 내부의 빠른 ST 포맷팅</strong></summary>
Structured Text 객체가 지저분해 보이고 전체 Analyzer를 여는 것이 불필요할 경우, 포맷 창을 엽니다: Alt+Q, 0 (More), 1 Format ST 또는 Quick Window More, 1 Format ST. 이 기능은 열려 있는 IDE 객체 내에서 변수 선언을 정렬하고 구조적 코드 들여쓰기를 복구합니다.
</details>
- 목록은 프로젝트의 모든 Structured Text 객체를 보여주며, 포매터가 변경할 부분은 해당 라인 수와 함께 표시됩니다. 필터 상자로 범위를 좁힐 수 있습니다.
- 선택된 객체는 IDE에서 보이는 형태와 포맷팅된 형태를 나란히 보여주며, 양쪽 모두에 변경된 줄이 표시됩니다. 이전 변경(Previous change) / 다음 변경(Next change) (Shift+F8 / F8)을 사용하여 이동할 수 있습니다.
- **적용(Apply)**은 해당 객체를 기록하고 다음 객체로 넘어가서 수정합니다. **건너뛰기(Skip)**는 아무것도 기록하지 않고 넘어갑니다. 다시 불러오기(Reload) (F5)는 IDE를 다시 읽어옵니다. 목록을 읽은 이후에 편집된 객체는 덮어쓰여지지 않고 거부됩니다. 적용된 변경 사항을 되돌리려면 일반 CODESYS Undo 명령어를 사용하십시오.
동일한 포매팅은 셸(shell)에서도 실행할 수 있습니다: cts fmt는 변경될 내용을 나열하고, cts fmt NAME --write를 사용하여 적용합니다.
더 자세한 내용: 스크립트 개요.
</details>
<details>
<summary><strong
>▶ 클릭하여 열기: FSM 전환 맵(FSM transition map)</strong></strong
></summary>
코드가 상태 기계(state machine)를 기반으로 구축되어 있고 빠르게 확인해야 하는 경우가 많다면 — 익숙하지 않은 CASE 구문이든, 6개월 전 본인의 코드든 상관없이 — 빠른 창을 열고 'More', 4 FSM map (Alt+Q, 0, 4)를 선택하세요. 에이전트(agent)의 창은 프로젝트의 Structured Text(저장되지 않은 편집 포함) 내의 기계들을 나열하고, 선택된 것을 GRAFCET 다이어그램으로 그립니다:
번호가 매겨진 단계들, 전환(transition)마다 하나의 막대와 그 옆에 수용성(receptivity)이 표시되며, 여러 갈래로 뻗어 나가는 발산(divergence)을 가진 단계가 있습니다. 단계나 전환을 클릭하면 그 뒤에 있는 Structured Text를 읽을 수 있습니다. IDE에 로그인되어 있는 동안, Live는 PLC가 현재 위치한 단계와 그곳으로 이끈 전환을 선택된 인스턴스에 대해 그려줍니다. 셸에서는 cts fsm이 동일한 기계들을 나열하고, cts fsm --disk를 사용하여 내보낸 파일에서 읽어옵니다.
<p><img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/fsm-live.gif"
alt="Live 모드의 FSM 창: 실행 중인 PLC의 신호등 기능 블록, 활성화된 단계 및 이동한 전환이 표시됨"
width="100%"></p>
</details>
더 자세한 내용은 Script overview 및 cts fsm --help를 참조하십시오.
</details>
4. 프로젝트 제어를 위한 LLM 에이전트 사용하기
에이전트를 CODESYS에서 시작합니다 (툴바 버튼 또는 Tools > Scripting > Scripts > C > cds-text-sync). 이 기능을 실행하면 빠른 창(quick window)이 열리고 현재 열려 있는 프로젝트가 cts CLI에 노출됩니다. 에이전트는 IDE를 클릭할 필요 없이 내보내기, 검사, 변경, 비교, 가져오기 및 빌드 작업을 수행할 수 있습니다:
cts status # 프로젝트, PLC 및 동기화 폴더 확인
cts set-sync-folder C:\path\to\sync --save # 에이전트를 통해 구성
cts set-sync-folder --save # 또는 제안된 폴더 ('.project' 파일이 위치한 클론)
...
LLM 에이전트(왼쪽)가 CODESYS에서 열린 프로젝트(오른쪽)를 cts를 통해 작업하는 과정: 함수 블록을 편집하고, 함수를 추가하며, HMI 화면을 그리고, 빌드하고, 시뮬레이션에 다운로드하며, 실시간 값을 읽고 쓰고, 분석을 실행한 후 커밋합니다:
<p><img src="https://raw.githubusercontent.com/ArthurkaX/cds-text-sync/HEAD/img/agent_demo.gif"
alt="cts를 통해 CODESYS IDE를 구동하는 LLM 에이전트: 편집, 빌드, 시각화, 시뮬레이션, 실시간 값, 분석, 커밋"
width="100%"></p>
한 번에 여러 IDE 사용하기: 에이전트를 하나의 프로젝트로 지정
실행 중인 각 CODESYS IDE는 ide-<pid>로 주소 지정됩니다. 해당 IDE에서 Alt+Q, 0 (More), 그리고 3을 누르면 준비된 줄(ready line)이 복사됩니다:
!cts --target ide-6128 --expect-project example_lib --help