Le microcode TILLYS est le langage de programmation propriétaire exécuté par les UTL TILLYS NG et TILLYS CUBE de TIL Technologies (groupe HIRSCH). Il définit le comportement de l’UTL face aux événements remontés par les lecteurs de badges, modules déportés et plages horaires.
Ce guide couvre la syntaxe complète, les 3 sections du programme, tous les registres et événements, ainsi que les fonctions clés (PULSE, SET_RDR_MODE, blocs SI/SINON/FINSI).
- 3 sections implicites : initialisation (1×) → combinatoire (boucle) → événementielle (sur trigger).
- Adressage 4 digits :
Xxyyzz= type + bus + adresse module + voie. - Entrées (D) = bornes I1, I2… Sorties (X) = relais R1/R2 + LED/buzzer lecteur.
- PULSE() interdit en combinatoire. Durée en 1/10e de seconde.
- Numérotation lecteurs : bus A = 1–8, bus B = 9–16, bus C = 17–24.
1. Qu’est-ce que le microcode TILLYS ?
Le microcode est un langage de programmation spécifique exécuté par chaque UTL TILLYS.
Il utilise des mnémoniques (noms courts) qui correspondent directement aux registres physiques et virtuels de l’automate : entrées de modules déportés, sorties de relais, plages horaires, états de lecteurs.
La combinaison de ces mnémoniques avec des opérateurs logiques, des opérateurs de test et des blocs conditionnels permet de rédiger des programmes allant de quelques lignes (porte simple) à plusieurs centaines de lignes (gestion intrusion + contrôle d’accès complexe).
Xxyyzz) est requise.Source : document officiel TIL Technologies / HIRSCH Secure SAS
2. Structure d’un programme microcode
Un programme microcode TILLYS est composé de 3 sections implicites, exécutées dans un ordre précis.
Elles ne sont pas déclarées explicitement : c’est leur position et leur contenu qui déterminent à quelle section elles appartiennent.
EV(condition) dont les instructions ne s’exécutent que lorsque la condition se produit (badge passé, entrée changée, plage horaire activée…).#INCLUDE ne peuvent pas avoir leur propre section initialisation.3. Adressage des registres TILLYS
Avec la TILLYS NG/CUBE et les modules déportés 16 entrées, la syntaxe des registres d’entrées (D, G) et de sorties (X) utilise désormais 4 chiffres au lieu de 3.
Décomposition d’une adresse
X A 01 03
│ │ │ └─ N° de voie / I/O sur le module (01 à 16)
│ │ └───── Adresse du module déporté sur le bus (01 à 16)
│ └──────── Bus de raccordement : A, B ou C
└─────────── Type de registre : D (entrée), G (entrée GTC), X (sortie)
Exemples :
DA0214 → Entrée n°14 du module @ adresse 02 sur bus A
XC1103 → Sortie n°03 du module @ adresse 11 sur bus C
XA0101 → Sortie n°01 du module @ adresse 01 sur bus A
Concrètement, sur une TILLYS NG avec un module MLP branché sur le bus A dont les deep switches sont réglés sur adresse 01, l’écriture XA0101 désigne la voie 01 de ce module qui correspond physiquement au relais 1 (typiquement câblé sur la gâche de la porte).
Types de registres disponibles
Le microcode distingue deux familles : les registres ToR (Tout ou Rien, valeur 0 ou 1) et les registres numériques (entiers 32 bits signés).
| Registre | Type | Accès | Description |
|---|---|---|---|
DA, DB, DC | ToR | RO | Entrées physiques logiques des modules déportés |
GA, GB, GC | ToR | RO | Entrées physiques GTC des modules déportés |
XA, XB, XC | ToR | RW | Sorties physiques logiques des modules déportés |
E, F | ToR | RO | Entrées physiques internes de l’UTL (1 à 3) |
V, R, M | ToR | RW | Registres virtuels logiques internes (1 à 128) |
VN, RN, MN | Numérique | RW | Registres virtuels numériques 32 bits (1 à 128) |
P | ToR | RO | Plages horaires (1 à 128) |
TN | Numérique | RW | Temporisations internes (1 à 32) |
SR1–SR9 | Numérique | RO | Registres système (heure, date, pile événements…) |
V sont volatils (perdus au reset). Les registres R sont rémanents (conservés en mémoire non volatile). Les registres M sont partagés entre les UTL via le réseau MICROSESAME.Correspondance bus / numérotation des lecteurs
Source de confusion fréquente : la numérotation des lecteurs dans les événements badge (Lyx) et clavier (CLVx) ne suit pas la même logique selon le bus.
| Bus | Adresses modules | Numéros lecteurs | Syntaxe événement | Claviers |
|---|---|---|---|---|
| Bus A | 01 à 08 | Lecteurs 1 à 8 | LA1 à LA8 | CLV1 à CLV8 |
| Bus B | 01 à 08 | Lecteurs 9 à 16 | LB1 à LB8 | CLV9 à CLV16 |
| Bus C | 01 à 08 | Lecteurs 17 à 24 | LC1 à LC8 | CLV17 à CLV24 |
LB3 dans les événements badge, mais ses registres physiques restent DB0301, XB0301. Ne pas confondre l’adresse physique du module (01–08) et le numéro de lecteur global (1–24).Adressage des sorties sur module MLP2
Chaque module déporté (MLP1, MLP2, MLD1, MLD2) expose ses entrées/sorties selon la convention Xxyyzz, avec un mapping fixe des voies selon leur fonction.
Sur un MLP2 (deux têtes de lecture) : le module consomme une seule adresse sur le bus mais expose des voies supplémentaires pour le second lecteur. La LED verte du lecteur 2 se trouve à la voie 06.
| Voie (zz) | Fonction | Type | Registre microcode |
|---|---|---|---|
| 01 | Relais 1 — commande gâche / électro-aimant | Sortie (X) | XA0101 |
| 02 | Relais 2 — commande gâche / électro-aimant | Sortie (X) | XA0102 |
| Lecteur 1 | |||
| 03 | LED verte (via SSCP) | Sortie (X) | XA0103 |
| 04 | LED rouge (via SSCP) | Sortie (X) | XA0104 |
| 05 | Buzzer (via SSCP) | Sortie (X) | XA0105 |
| Lecteur 2 | |||
| 06 | LED verte (via SSCP) | Sortie (X) | XA0106 |
| 07 | LED rouge (via SSCP) | Sortie (X) | XA0107 |
| 08 | Buzzer (via SSCP) | Sortie (X) | XA0108 |
SET_RDR_COLOR() pour le second lecteur d’un MLP2 : la fonction sera ignorée.Entrées physiques (D) : les bornes I1, I2, I3…
Les entrées physiques du MLP, sérigraphiées I1, I2, I3… (ou In1, In2… selon les versions) sur le bornier, correspondent aux registres D. C’est sur ces entrées que sont câblés les contacts de porte, boutons de sortie (REX), contacts d’arrachement et autres détecteurs en boucle EOL.
Sorties (X) : pas seulement les relais
Les sorties X regroupent toutes les commandes de sortie du module — pas uniquement les relais :
- Les voies 01 et 02 sont des relais secs (R1 et R2), accessibles physiquement sur le bornier du MLP. C’est là qu’on câble la gâche, l’électro-aimant ou un asservissement.
- Les voies 03, 04 et 05 sont des commandes logiques transmises au lecteur via le bus SSCP/RS485 qui le relie au MLP. Elles ne correspondent à aucune borne visible sur le MLP : l’ordre est transmis dans le câble du lecteur, et c’est le lecteur Evolution lui-même qui allume sa LED ou actionne son buzzer.
4. Section initialisation
La section initialisation est exécutée une seule fois, à la fin du téléchargement du microcode dans l’UTL. Elle ne se ré-exécute pas lors d’un téléchargement de badges, de plages horaires ou de jours fériés.
TEMPO() — Temporisation d’un registre ToR
Filtre les rebonds ou déclenchements intempestifs sur un registre ToR. Maximum 128 fonctions TEMPO par programme.
TEMPO(Registre_ToR)=n0,n1
; n0 : tempo sur front descendant (1/10e sec)
; n1 : tempo sur front montant (1/10e sec) — si omis, n1 = n0
;--- Exemples ---
TEMPO(DA0101)=10,20 ; 1s en descente, 2s en montée
TEMPO(DA0102)=10 ; 1s dans les deux sens
#DEFINE — Définition de constantes nommées
Permet de nommer une valeur ou un registre pour améliorer la lisibilité du code.
#DEFINE LED_VERTE 30 ; constante valant 30
#DEFINE $LEC_PORTE1 LA1 ; alias du lecteur 1 bus A
#DEFINE $CMD_PORTE1 XA0101 ; alias de la sortie gâche
;--- Utilisation ---
EV(LA1==AUTORISE)
XA0101=PULSE(LED_VERTE) ; impulsion de 3 sec
SET_RDR_COLOR() — Personnalisation des couleurs LED lecteur
Définit les couleurs des LED des lecteurs transparents. Compatible firmware ≥ 1.9.0 (TILLYS NG/CUBE) et ≥ 1.8.0 (modules MLD/MLP). À placer uniquement en section initialisation.
SET_RDR_COLOR(l, c1, c2, c3, c4)
; l : numéro de lecteur (1 à 24)
; c1 : couleur au repos (LED1=0, LED2=0)
; c2 : couleur quand LED1=1, LED2=0
; c3 : couleur quand LED1=0, LED2=1
; c4 : couleur quand LED1=1, LED2=1
;--- Exemple ---
SET_RDR_COLOR(1,cyan,lime,gold,magenta)
5. Section combinatoire
Boucle principale exécutée en permanence par l’UTL. Chaque ligne est une formule de la forme registre_sortie = expression. Les formules peuvent utiliser des parenthèses (profondeur max 8) et sont limitées à 75 caractères.
PULSE(), XPULSE() et les fonctions d’affichage AFyxxi sont interdites en section combinatoire, même à l’intérieur d’un bloc conditionnel SI/FINSI.Opérateurs logiques (registres ToR)
| Fonction | Opérateur | Exemple pratique |
|---|---|---|
| ET logique | && | V1=DA0101&&DA0102 — vrai si les deux contacts fermés |
| OU logique | || | V2=DA0101||P1 — gâche ouverte si bouton OU plage active |
| OU exclusif | ^ | R1=DA0101^DA0102 — vrai si l’un XOR l’autre |
| NON (complément) | ! | XA0101=!DA0102 — sortie inverse de l’entrée |
Opérateurs de test
| Fonction | Opérateur | Exemple |
|---|---|---|
| Égalité | == | XA0101=VN1==100 — sortie active si VN1 = 100 |
| Différence | != | V1=VN1!=0 — vrai si compteur non nul |
| Inférieur strict | < | V1=VN1<50 — alarme si sous seuil |
| Supérieur strict | > | XA0101=VN12>100 — sortie si température dépasse 100 |
6. Section événementielle
La section événementielle contient des blocs EV(condition) suivis d’instructions. Ces instructions ne s’exécutent que lorsque l’événement se produit.
Événements badges lecteurs (TILLYS NG / CUBE)
Syntaxe : EV(Lyx==ÉTAT) où x est l’adresse lecteur (1 à 8) et y est le bus (A, B ou C).
| Événement | Déclenchement |
|---|---|
EV(Lyx==AUTORISE) | Badge autorisé pendant la plage horaire associée |
EV(Lyx==CR_OK) | Code de contrôle renforcé saisi correctement |
EV(Lyx==INTERDIT) | Badge interdit (raison non détaillée) |
EV(Lyx==INCONNU) | Badge non présent dans la base TILLYS |
EV(Lyx==CR_KO) | Code de contrôle renforcé saisi incorrect |
EV(Lyx==PLAGE_KO) | Badge présenté hors plage horaire |
EV(Lyx==DATE_KO) | Date de fin de validité dépassée |
EV(Lyx==APB_KO) | Badge verrouillé en anti-passback |
EV(Lyx==SITE_KO) | Badge n’appartenant pas au site |
EV(Lyx==CRISE) | Badge interdit en raison du niveau de crise |
Événements système et plages horaires
| Événement | Déclenchement |
|---|---|
EV(RESET) | Reset matériel de l’UTL ou coupure secteur |
EV(INIT) | Fin d’un téléchargement de microcode |
EV(Pi==0/1) | Passage à 0 ou 1 de la plage horaire i (1 à 128) |
EV(TNi) | Fin du délai TNi (i = 1 à 32) |
EV(Dxyyzz==0/1) | Changement d’état d’une entrée déportée |
EV(VNi) | Changement de valeur du registre numérique VNi |
7. Fonctions clés de la section événementielle
PULSE() — Impulsion temporisée sur sortie ToR
Génère une impulsion à 0 ou à 1 sur un registre de sortie ou un registre virtuel ToR. Maximum 128 fonctions PULSE par programme, 48 en simultané par même événement.
Registre_sortie = PULSE(t, niveau)
; t : durée en 1/10e sec (constante ou registre VN/RN/MN)
; niveau : 1=impulsion haute (défaut), 0=impulsion basse
Détail des exemples avec leur adressage décomposé :
| Code | Cible | Effet |
|---|---|---|
XA0101=PULSE(30) | Bus A, module 01, voie 01 (relais 1 / gâche) | Ouverture gâche pendant 3 sec |
XA0202=PULSE(500,1) | Bus A, module 01, voie 02 (relais 2 / gâche) | Sortie haute pendant 50 sec |
V20=PULSE(VN12,0) | Variable virtuelle V20 (mémoire interne UTL) | Impulsion à 0, durée stockée dans VN12 |
XA0202=PULSE(MN1) | Bus A, module 02, voie 02 | Durée stockée dans MN1 (registre partagé) |
SET_RDR_MODE() — Modification dynamique du mode lecteur
Modifie en cours de fonctionnement le comportement d’un lecteur : marche/arrêt, contrôle renforcé, passage contrôlé, escorte.
SET_RDR_MODE(l, a, v)
; l : numéro de lecteur (1 à 24)
; a : action — 0=marche/arrêt, 1=contrôle renforcé, 2=passage contrôlé
; v : mode (dépend de a)
;--- Verrouillage automatique hors plage horaire ---
EV(P1==0)
SET_RDR_MODE(1,0,0) ; arrêt du lecteur 1
SET_RDR_MODE(2,1,3) ; lecteur 2 en contrôle renforcé personnalisé
SET_RDR_MODE() est réinitialisée à chaque téléchargement de microcode. Pour qu’un lecteur démarre dans un mode particulier, réappliquer la configuration dans un bloc EV(INIT).SI / SINON / FINSI — Blocs conditionnels
SI(expression_logique)
(instructions si vrai)
SINON
(instructions si faux) ; SINON est facultatif
FINSI
;--- Exemple ---
EV(LA1==AUTORISE)
XA0101=PULSE(30)
SI(DA0101==1)
V5=1
SINON
V5=0
FINSI
EXIT — Abandon du traitement en cours
EV(LA1==AUTORISE)
SI(P1==0) ; si hors plage horaire
EXIT ; ne pas continuer le traitement
FINSI
XA0101=PULSE(30) ; exécuté uniquement si P1 actif
8. Couleurs disponibles pour SET_RDR_COLOR()
Protocole SSCP — lecteurs Evolution
Disponible sur lecteurs Evolution ST, KB et TL (firmware ≥ Z01), Evolution XS (≥ Z02) et Evolution IN (≥ Z14).
| Nom | Hex | RGB |
|---|---|---|
red | #FF0000 | 255 0 0 |
orangered | #FF4500 | 255 69 0 |
darkorange | #FF8C00 | 255 140 0 |
orange | #FFA500 | 255 165 0 |
gold | #FFD700 | 255 215 0 |
yellow | #FFFF00 | 255 255 0 |
chartreuse | #7FFF00 | 127 255 0 |
lime | #00FF00 | 0 255 0 |
springgreen | #00FF7F | 0 255 127 |
blue | #0000FF | 0 0 255 |
#0073AF. Il n’est pas nommé en microcode — passer directement la valeur hex si nécessaire.Protocole OSDP — lecteurs HID
| Nom | Hex | RGB |
|---|---|---|
red | #FF0000 | 255 0 0 |
orange | #FFA500 | 255 165 0 |
green | #008000 | 0 128 0 |
blue | #0000FF | 0 0 255 |
9. Exemple complet : microcode contrôle d’une porte simple
Microcode pour une porte équipée d’un lecteur sur le bus A à l’adresse 1 (MLP2), avec gâche, LED de feedback, bouton de sortie et passage libre par plage horaire.
;==================================================
; SECTION INITIALISATION
;==================================================
#DEFINE TEMPO_GACHE 30 ; durée gâche : 3 secondes
#DEFINE TEMPO_LED 30 ; durée LED : 3 secondes
SET_RDR_COLOR(1,blue,green,red,orange)
; au repos : bleu | badge OK : vert | badge KO : rouge
;==================================================
; SECTION COMBINATOIRE
;==================================================
; Maintien gâche ouverte si V1 actif (passage libre)
XA0101=V1
;==================================================
; SECTION ÉVÉNEMENTIELLE
;==================================================
; --- Initialisation au démarrage ---
EV(INIT)
XA0103=0 ; LED1 éteinte
XA0104=0 ; LED2 éteinte
; --- Badge autorisé ---
EV(LA1==AUTORISE)
XA0101=PULSE(TEMPO_GACHE) ; impulsion gâche 3 sec
XA0103=PULSE(TEMPO_LED) ; LED verte 3 sec
; --- Badge interdit ---
EV(LA1==INTERDIT)
XA0104=PULSE(TEMPO_LED) ; LED rouge 3 sec
; --- Bouton de sortie (entrée DA0102) ---
EV(DA0102==1)
XA0101=PULSE(TEMPO_GACHE) ; déverrouillage côté sortie
XA0103=PULSE(TEMPO_LED) ; LED verte
; --- Passage libre activé par plage horaire P1 ---
EV(P1==1)
V1=1 ; maintien gâche ouverte
EV(P1==0)
V1=0 ; fermeture gâche
XA0101 = relais gâche, XA0103 = LED verte, XA0104 = LED rouge, DA0102 = entrée bouton de sortie.10. Exemple avancé : MLP2 double lecteur avec contrôle renforcé et détecteurs de porte
Cet exemple couvre une configuration réelle avec deux portes sur un même MLP2 : un lecteur badge (LA3) et un lecteur à code en contrôle renforcé (LA1), chacun conditionné par son propre détecteur d’ouverture de porte.
MLP2 @ adresse 03, bus A — LA3 : lecteur badge | LED verte XA0303 | LED rouge XA0304
Gâche unique R2 =
XA0302 pilotée par V2 | Bouton sortie = DA0306 (I6)Contact porte LA3 =
DA0301 | Contact porte LA1 = DA0302 | Convention : DA==1 porte fermée
;---------------------------------------
; SECTION INITIALISATION
;---------------------------------------
SET_TACTILLYS_LOGIN_MODE(1,1)
PCLV1=3,4,10
; Couleurs LED pour tous les lecteurs
; repos=bleu | accès OK=vert | refus=rouge | attente code=orange
SET_RDR_COLOR(1,blue,green,red,orange)
SET_RDR_COLOR(2,blue,green,red,orange)
; ... (idem pour lecteurs 3 à 16)
SET_RDR_COLOR(16,blue,green,red,orange)
;---------------------------------------
; SECTION COMBINATOIRE
;---------------------------------------
XA0302=V2 ; R2 (gâche unique) suit V2 en permanence
;---------------------------------------
; SECTION ÉVÉNEMENTIELLE
;---------------------------------------
; --- LECTEUR BADGE (LA3) ---
; Si DA0301==0 (porte 1 ouverte) → refus immédiat, LED rouge
EV(LA3==AUTORISE)
SI(DA0301==1) ; porte 1 fermée → on autorise
XA0303=PULSE(30) ; LED verte LA3 — 3 sec
V2=PULSE(30) ; gâche ouverte 3 sec
SINON ; porte déjà ouverte → refus
XA0304=PULSE(30) ; LED rouge LA3 — 3 sec
FINSI
EV(LA3==INTERDIT)
XA0304=PULSE(30) ; LED rouge LA3 — 3 sec
; --- LECTEUR À CODE (LA1) : badge lu ---
; Vérification immédiate du contact de porte
; Si porte fermée → orange pendant l'attente du code (10 sec)
; Si porte ouverte → rouge immédiat, pas d'attente du code
EV(LA1==AUTORISE)
SI(DA0302==1) ; porte fermée → attente code → orange
XA0103=PULSE(100) ; LED1=1 pendant 10 sec
XA0104=PULSE(100) ; LED2=1 pendant 10 sec → LED1+LED2 = orange
SINON ; porte ouverte → refus immédiat
XA0104=PULSE(30) ; LED rouge — 3 sec
FINSI
; --- LECTEUR À CODE (LA1) : bon code saisi ---
; Double vérification : la porte peut s'être ouverte entre le badge et le code
EV(LA1==CR_OK)
SI(DA0302==1) ; porte toujours fermée → on ouvre
XA0103=PULSE(30) ; LED verte — 3 sec
XA0104=0 ; extinction LED rouge / orange
V2=PULSE(30) ; gâche ouverte 3 sec
SINON ; porte ouverte entre-temps → refus
XA0104=PULSE(30) ; LED rouge — 3 sec
FINSI
; --- LECTEUR À CODE (LA1) : mauvais code ou timeout ---
EV(LA1==CR_KO)
XA0104=PULSE(30) ; LED rouge — 3 sec
; --- BOUTON POUSSOIR DE SORTIE (DA0306 = I6) ---
; Sortie libre, pas de condition sur le contact de porte
EV(DA0306==1)
V2=PULSE(30) ; gâche ouverte 3 sec
XA0303=PULSE(30) ; LED verte LA3 — feedback visuel
EV(LA1==AUTORISE) empêche d’afficher l’orange si la porte est déjà ouverte. La vérification dans EV(LA1==CR_OK) couvre le cas où la porte s’ouvre entre le passage du badge et la saisie du code (quelqu’un sort pendant que l’utilisateur tape). Les deux blocs sont indépendants et ne créent aucun doublon.
PULSE(100) = 10 secondes doit correspondre au timeout défini dans PCLV1=3,4,10 (3e paramètre = 10 sec). Si tu modifies le timeout, adapte la valeur du PULSE en conséquence.11. Pièges courants à éviter
PULSE et XPULSE sont strictement réservés à la section événementielle.XA011 à la place de XA0101 génère une erreur sur TILLYS NG/CUBE. Toujours utiliser la notation 4 digits.EV(INIT) se déclenche à la fin d’un téléchargement de microcode. EV(RESET) se déclenche sur coupure secteur ou reset matériel. Les deux sont nécessaires si vous initialisez des états critiques.EV(), elle sera ignorée ou générera une erreur.12. Glossaire
Définitions des sigles et termes techniques utilisés dans ce guide et dans la documentation TIL Technologies.
EV(Lyx==APB_KO).
Sommaire