Les objectifs zoom motorisés POMEAS sont commandés via RS-232 (ou Ethernet) au moyen d'un protocole ASCII compact de cinq commandes. Chaque commande occupe trois octets : la lettre X, une lettre de commande, et un retour chariot 0x0D. Le contrôleur répond aux requêtes de position et de course par une trame de neuf octets, et signale la fin du mouvement par le seul octet d'état 0x55. Cette référence documente le protocole exactement tel qu'implémenté, y compris les deux formules de conversion et le comportement qui surprend le plus souvent les intégrateurs : le contrôleur cesse de répondre tant que le moteur est en mouvement.
Elle s'adresse aux ingénieurs qui raccordent un objectif zoom motorisé à un PLC, un contrôleur de mouvement, un microcontrôleur ou un hôte Linux — des situations où le SDK Windows n'est pas disponible et où le flux d'octets brut est la seule option.
| Élément | Valeur |
|---|---|
| Commandes | 5 (XH, XG, XZ, XM, XN) |
| Fin de trame | 0x0D (CR) — sur les commandes comme sur les réponses |
| Configuration série | 9600 bauds, 8 bits de données, sans parité |
| Port Ethernet | 4196 |
| Indicateur d'arrêt | 0x55 — toute autre valeur, ou un dépassement de délai de lecture, signifie « en cours de déplacement » |
| Formule de course | maxLength = (readData − 750) × 1.3 |
| Formule de position | pos = (readData − 500) × 1.3 |
| Recommandation de polling | Attendre au moins 50 ms entre les requêtes d'état ; utiliser un délai d'attente global de 10 s ou plus |
| Paramètre | Valeur | Notes |
|---|---|---|
| Couche physique | RS-232 (direct ou via USB-vers-RS-232) ou Ethernet | Le contrôleur prend l'un ou l'autre — pas les deux simultanément |
| Débit (baud rate) | 9600 | Le document de protocole et la documentation de l'API de la carte de commande s'accordent sur cette valeur |
| Bits de données | 8 | — |
| Parité | Aucune | — |
| Port TCP | 4196 | Utilisé lors de la connexion via l'interface réseau |
| Terminaison | 0x0D | Dans les deux sens |
Avant que tout cela n'ait de l'importance, le câblage doit être correct : connectez et verrouillez le câble moteur et le câble RS-232 avant d'appliquer la tension. Brancher le câble moteur à chaud alors que le contrôleur est sous tension est l'action la plus destructrice sur le terrain — elle peut endommager le moteur de façon permanente. Si votre câble moteur doit dépasser 5 m, commandez le câble long d'usine plutôt que de concaténer plusieurs câbles courts, car les câbles soudés ou fabriqués maison ne respectent pas les exigences d'impédance et de blindage.
Chaque commande a la forme 'X' + <lettre de commande> + 0x0D.
| N° | Fonction | ASCII | HEX | Réponse |
|---|---|---|---|---|
| 1 | Retour à l'origine (homing) | X H CR | 0x58 0x48 0x0D | Aucune |
| 2 | Déplacement vers une position cible en impulsions | X G + 6 chiffres HEX + CR | 0x58 0x47 … 0x0D | Aucune |
| 3 | Interrogation de l'état du mouvement | X Z CR | 0x58 0x5A 0x0D | 1 octet |
| 4 | Lecture de la course totale (impulsion max) | X M CR | 0x58 0x4D 0x0D | 9 octets |
| 5 | Lecture de la position courante | X N CR | 0x58 0x4E 0x0D | 9 octets |
XHTX: 0x58 0x48 0x0D # 'X' 'H' CR
L'objectif revient à son origine mécanique. Notez que l'objectif effectue également cette réinitialisation automatiquement à chaque mise sous tension, et que l'initialisation prend 25–35 secondes, pendant lesquelles l'objectif n'accepte aucune commande. Une application hôte doit donc attendre au moins 35 secondes après la mise sous tension avant d'ouvrir le port.
XGLa charge utile est formatée avec la chaîne de format C "%C%C%6X%C" : la lettre X, la lettre G, un nombre hexadécimal à six chiffres complété à gauche par des espaces (0x20) lorsqu'il compte moins de six chiffres, et un 0x0D terminal.
| Impulsion cible | Caractères ASCII | Séquence d'octets |
|---|---|---|
| 100 | X G ␠␠␠␠ 6 4 CR | 0x58 0x47 0x20 0x20 0x20 0x20 0x36 0x34 0x0D |
| 1000 | X G ␠␠␠ 3 E 8 CR | 0x58 0x47 0x20 0x20 0x20 0x33 0x45 0x38 0x0D |
| 5000 | X G ␠␠ 1 3 8 8 CR | 0x58 0x47 0x20 0x20 0x31 0x33 0x38 0x38 0x0D |
| 10000 | X G ␠␠ 2 7 1 0 CR | 0x58 0x47 0x20 0x20 0x32 0x37 0x31 0x30 0x0D |
Comportement important : si la position demandée est égale à la position courante, l'objectif ne bouge pas et ne signale aucune erreur. Une application hôte ne doit donc jamais considérer « commande envoyée » comme la preuve que la liaison fonctionne. La lecture en retour de la position est la sonde de liaison fiable.
// Move to an absolute pulse position
int moveTo(int fd, long pulse) {
char buf[16];
// "%C%C%6X%C" - six hex digits, space-padded, CR-terminated
int n = snprintf(buf, sizeof(buf), "%c%c%6lX%c", 'X', 'G', pulse, '\r');
return write(fd, buf, n) == n ? 0 : -1;
}
XZTX: 0x58 0x5A 0x0D
wait 20 ms
RX: 1 byte
| Réponse | Signification |
|---|---|
0x55 | Mouvement terminé — l'objectif est arrêté |
| Toute autre valeur | Encore en mouvement |
| Aucune donnée du tout | Également traité comme « en cours de mouvement » |
C'est le détail comportemental le plus important de tout le protocole, et il est documenté par le fabricant : pendant que la carte de commande entraîne le moteur, les communications sont suspendues. La liaison série ou réseau peut ne renvoyer aucune donnée pendant un mouvement de zoom.
La conséquence pratique est que la boucle de polling doit être construite autour des nouvelles tentatives plutôt que de la détection de panne. L'implémentation de référence est :
XZ.0x55, attendre puis réessayer — ne pas déclarer de panne.Le propre organigramme d'API du fabricant utilise une attente de 50 ms avant chaque requête d'état et un délai d'attente global de 10 secondes ou plus. Ce n'est qu'une fois ce délai global expiré sans réponse valide que l'hôte doit conclure à une défaillance de la connexion de l'objectif.
// Wait for motion to complete: 50 ms per poll, 10 s overall timeout
int waitStop(int fd, int timeout_ms) {
int waited = 0;
char c;
while (waited < timeout_ms) {
usleep(50 * 1000); // reference flow chart: wait 50 ms or more
write(fd, "XZ\r", 3); // 0x58 0x5A 0x0D
usleep(20 * 1000); // protocol: wait 20 ms before reading
if (read(fd, &c, 1) == 1 && (unsigned char)c == 0x55)
return 0; // stopped
waited += 70;
}
return -1; // connection or motion fault
}
XMTX: 0x58 0x4D 0x0D
wait 20 ms
RX: 9 bytes
| Octet | Contenu |
|---|---|
| 1 | 0x58 (fixe) |
| 2 | vide |
| 3–7 | Données de course — cinq octets, analysés comme un entier avec "%5X" dans readData |
| 8 | 0x0D |
| 9 | vide |
sscanf(tbuffer + 2, "%5X", &readData);
maxLength = (readData - 750) * 1.3;
Exemple travaillé issu de la documentation du fabricant : une réponse de 0x58 -- -- -- '2' '7' '1' '0' 0x0D -- donne readData = 10000, donc maxLength = (10000 − 750) × 1.3 = 12025.
XNTX: 0x58 0x4E 0x0D
wait 20 ms
RX: 9 bytes (identical structure to XM)
sscanf(tbuffer + 2, "%5X", &readData);
pos = (readData - 500) * 1.3;
Exemple : readData = 10000 donne pos = (10000 − 500) × 1.3 = 12350.
(1) XH return to origin -> poll XZ until stopped
(2) XM read total travel -> validates the link, yields maxLength
(3) XG <6 HEX> move to target position -> poll XZ until stopped
(4) XN read current position -> compare with the target (closed loop)
Deux points rendent cette séquence fiable :
L'ensemble du protocole est strictement séquentiel en sémantique — commande → mouvement → lecture en retour de l'état → commande suivante. Il ne prend pas en charge l'émission concurrente de commandes vers le même objectif.
Ce protocole ne fournit que la lecture en retour de la position. Il ne définit ni ne garantit de valeur de répétabilité. La méthodologie de test est abordée dans l'article compagnon sur le grossissement et le mappage d'impulsions ; toute affirmation de précision numérique doit provenir de vos propres mesures dans vos propres conditions.
Cela désigne deux choses très différentes, et choisir le mauvais modèle est une erreur fréquente et coûteuse.
| Forme | Repère de modèle | Capacité réelle |
|---|---|---|
| Retour de grossissement passif | Suffixe DS9 ou DS6, par ex. PMS-LZ-63100DS9 | Le zoom reste manuel. Le RS-232 ne fait qu'émettre le grossissement courant ou la position de détente. Il ne peut pas accepter de commandes. |
| Commande motorisée active | Code de type de zoom 04, 05, 09 ou 10, par ex. PMS-LZ-650104 | Les cinq commandes sont acceptées. Le RS-232 entraîne activement le grossissement. |
Vérifiez le suffixe du modèle avant de commander. Un objectif DS9 peut être lu mais pas commandé.
Ce n'est pas une panne. La carte de commande suspend les communications pendant qu'elle entraîne le moteur. C'est un comportement prévu. Traitez-le par expiration de délai et nouvelle tentative, non par une alarme de panne ou un redémarrage.
Si la cible est égale à la position courante, l'objectif reste immobile et réussit silencieusement. Soit suivez la position courante dans l'application hôte, soit lisez-la en retour avec XN avant chaque déplacement.
Les positions en impulsions sont propres à l'objectif. Elles proviennent de la table d'impulsions par modèle fournie avec le SDK, et le même grossissement se mappe sur des nombres d'impulsions différents selon les modèles et les types de moteur. Lisez d'abord la course totale avec XM et confirmez que la cible se situe dans la plage valide.
| Commande protocole | API SDK héritée | SDK V4.4.7 |
|---|---|---|
XH retour à l'origine | MoveHome(Motor) | GoHome |
XG déplacement | MoveGoto(Motor, long dest) | MoveTo(pulse) |
XZ état | MoveStatus(Motor) → 0 en mouvement / 1 au repos / 2 erreur | GetStatus |
XM course | MoveMaxLength(Motor) | GetMaxPos |
XN position | MovePos(Motor) | GetPos |
Ne mélangez pas les deux approches sur la même liaison. Elles adressent les mêmes registres matériels, et les mélanger — particulièrement autour de la référence de retour à l'origine — produit un état incohérent.
9600 bauds, 8 bits de données, sans parité. L'option Ethernet utilise le port TCP 4196.
Parce que la carte de commande suspend délibérément les communications pendant qu'elle entraîne le moteur. Réessayez votre requête d'état avec un délai d'attente plutôt que de traiter le silence comme un échec.
Vérifiez le code de type de zoom dans la référence du modèle. Les codes 04, 05, 09 et 10 désignent les types motorisés. Un suffixe DS9 ou DS6 indique un retour passif uniquement, où le zoom reste manuel.
Oui. L'ensemble de commandes est constitué de cinq chaînes ASCII, donc un PLC disposant d'un port série libre peut les formater et les envoyer directement. Le programme côté PLC est à votre charge ; POMEAS fournit la définition du protocole, pas un bloc-fonction PLC.
Non. La DLL est une couche de commodité Windows au-dessus du même protocole au niveau octet. Toute plateforme capable d'ouvrir un port série ou une socket TCP peut commander l'objectif.
XG
Saisissez simplement votre adresse e-mail pour recevoir les dernières actualités et informations de Pomeas. Restez connecté à Pomeas et soyez le premier à découvrir les innovations en matière d'excellence optique.