ls2tp — Compilateur Fanuc LS → TP
Compilateur open-source de programmes Fanuc LS (ASCII) vers le format TP binaire, compatible avec les contrôleurs R-30iB Mate Plus (V9.30+).
Équivalent libre de l'outil WinOLPC de Fanuc Robotics.
🎯 Objectif
Permettre l'écriture et la compilation de programmes pour robots Fanuc sans dépendre des outils Windows propriétaires (Roboguide, WinOLPC). Le compilateur produit des fichiers .TP chargables directement sur une baie robot R-30iB.
📦 Installation
git clone https://gitea-8eze.srv1554967.hstgr.cloud/hermes/ls2tp.git
cd ls2tp
pip install -e ".[dev]"
🚀 Utilisation
Analyser un fichier LS
# Analyse lexicale (tokens)
ls2tp lex monprog.ls
# Analyse syntaxique (AST)
ls2tp parse monprog.ls
Compiler LS → TP
ls2tp compile monprog.ls -o monprog.tp
Analyser un fichier TP binaire
# Analyse complète
tp_dump monprog.tp
# Header uniquement
tp_dump monprog.tp --header-only
# Comparer deux fichiers TP
tp_dump prog1.tp --compare prog2.tp
# Dump hexadécimal
tp_dump monprog.tp --hex
🏗️ Architecture
ls2tp/
├── ls2tp/
│ ├── __init__.py # Métadonnées du package
│ ├── cli.py # Interface en ligne de commande
│ ├── lexer.py # Analyseur lexical LS → tokens
│ ├── parser.py # Analyseur syntaxique tokens → AST
│ ├── tokens.py # Définitions des tokens et types
│ └── tp_format.py # Structures du format binaire TP
├── tools/
│ └── tp_dump.py # Analyseur hexadécimal TP
├── tests/
│ └── test_lexer_parser.py
└── pyproject.toml
🔬 État du projet
✅ Implémenté
- Lexer LS : tokenisation complète du format LS Fanuc
- Mots-clés, opérateurs, registres (R/PR/SR/...)
- Mouvements (J/L/C/A), terminaisons (FINE/CNT)
- Directives (/PROG, /MN, /POS, /ATTR)
- Commentaires, chaînes, nombres
- Parser LS : construction d'un AST
- Programme, headers, instructions de mouvement
- CALL, JMP/LBL, WAIT, IF/ENDIF
- Assignations de registres, définitions de positions
- Analyseur TP (
tp_dump) : hex dump et analyse structurelle- Parsing du header TP (magic, version, nom, timestamp)
- Dump hexadécimal formaté (style xxd)
- Comparaison de fichiers TP
- Détection de version
🚧 En cours
- Rétro-ingénierie du format TP binaire — nécessite des paires de fichiers LS/TP pour déduire la correspondance exacte entre instructions LS et opcodes binaires.
📋 À faire
- Compilateur LS → TP (nécessite les paires LS/TP)
- Encodage des positions (joints, cartésien, configurations)
- Gestion des offsets et programs multi-groupes
- Support des instructions avancées (SELECT, FOR, TIMER, etc.)
- Validation par chargement sur Roboguide / robot réel
🔑 Format TP — Connaissances actuelles
Le format binaire TP est propriétaire Fanuc et non documenté publiquement. Les connaissances ci-dessous proviennent de travaux de rétro-ingénierie :
Structure générale
┌──────────────┐
│ HEADER │ 64+ bytes : signature, version, nom, timestamp
├──────────────┤
│ INSTR TABLE │ Table d'offsets vers chaque instruction
├──────────────┤
│ INSTR DATA │ Opcodes (1-2 bytes) + operandes
├──────────────┤
│ POS DATA │ Positions (float32 × 6 axes) + config
├──────────────┤
│ FOOTER │ Checksum / padding
└──────────────┘
Header TP (hypothèse)
| Offset | Taille | Champ |
|---|---|---|
| 0x00 | 4 | Magic number |
| 0x04 | 2 | Version contrôleur |
| 0x06 | 16 | Nom du programme |
| 0x16 | 4 | Timestamp |
| 0x1A | 2 | Nombre d'instructions |
| 0x1C | 2 | Nombre de positions |
| 0x1E | 4 | Offset table instructions |
| 0x22 | 4 | Offset données positions |
| 0x26 | 4 | Taille totale |
⚠️ Ces offsets sont hypothétiques et doivent être validés par l'analyse de fichiers TP réels.
🤝 Contribution
Pour aider à la rétro-ingénierie du format, fournissez des paires de fichiers .LS et .TP (le même programme en source et compilé), idéalement :
- Un programme minimal (
ENDuniquement) - Un programme avec 1 mouvement (
J P[1] 100% FINE) - Des programmes de complexité croissante
📚 Références
- tp_plus — Compilateur TP+ → LS (Ruby)
- frfformats — Librairie Python de parsing de formats Fanuc
- fanucpy — Interface Python pour robots Fanuc
📄 Licence
MIT — Copyright (c) 2026 Julien Baumeyer