Référence des commandes série RS-232 des objectifs zoom motorisés POMEAS

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'essentiel en un coup d'œil

ÉlémentValeur
Commandes5 (XH, XG, XZ, XM, XN)
Fin de trame0x0D (CR) — sur les commandes comme sur les réponses
Configuration série9600 bauds, 8 bits de données, sans parité
Port Ethernet4196
Indicateur d'arrêt0x55 — toute autre valeur, ou un dépassement de délai de lecture, signifie « en cours de déplacement »
Formule de coursemaxLength = (readData − 750) × 1.3
Formule de positionpos = (readData − 500) × 1.3
Recommandation de pollingAttendre au moins 50 ms entre les requêtes d'état ; utiliser un délai d'attente global de 10 s ou plus

Paramètres de port et prérequis de câblage

ParamètreValeurNotes
Couche physiqueRS-232 (direct ou via USB-vers-RS-232) ou EthernetLe contrôleur prend l'un ou l'autre — pas les deux simultanément
Débit (baud rate)9600Le document de protocole et la documentation de l'API de la carte de commande s'accordent sur cette valeur
Bits de données8—
ParitéAucune—
Port TCP4196Utilisé lors de la connexion via l'interface réseau
Terminaison0x0DDans 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.

Les cinq commandes

Chaque commande a la forme 'X' + <lettre de commande> + 0x0D.

N°FonctionASCIIHEXRéponse
1Retour à l'origine (homing)X H CR0x58 0x48 0x0DAucune
2Déplacement vers une position cible en impulsionsX G + 6 chiffres HEX + CR0x58 0x47 … 0x0DAucune
3Interrogation de l'état du mouvementX Z CR0x58 0x5A 0x0D1 octet
4Lecture de la course totale (impulsion max)X M CR0x58 0x4D 0x0D9 octets
5Lecture de la position couranteX N CR0x58 0x4E 0x0D9 octets

1. Retour à l'origine — XH

TX:  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.

2. Déplacement vers une position cible — XG

La 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 cibleCaractères ASCIISéquence d'octets
100X G ␠␠␠␠ 6 4 CR0x58 0x47 0x20 0x20 0x20 0x20 0x36 0x34 0x0D
1000X G ␠␠␠ 3 E 8 CR0x58 0x47 0x20 0x20 0x20 0x33 0x45 0x38 0x0D
5000X G ␠␠ 1 3 8 8 CR0x58 0x47 0x20 0x20 0x31 0x33 0x38 0x38 0x0D
10000X G ␠␠ 2 7 1 0 CR0x58 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;
}

3. Interrogation de l'état du mouvement — XZ

TX:  0x58 0x5A 0x0D
wait 20 ms
RX:  1 byte
RéponseSignification
0x55Mouvement terminé — l'objectif est arrêté
Toute autre valeurEncore 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 :

  1. Envoyer XZ.
  2. Attendre au moins 20 ms.
  3. Lire un octet.
  4. Si la lecture expire, ou si l'octet n'est pas 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
}

4. Lecture de la course totale — XM

TX:  0x58 0x4D 0x0D
wait 20 ms
RX:  9 bytes
OctetContenu
10x58 (fixe)
2vide
3–7Données de course — cinq octets, analysés comme un entier avec "%5X" dans readData
80x0D
9vide
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.

5. Lecture de la position courante — XN

TX:  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.

Séquence d'interaction de référence

(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'étape 2 est la seule sonde de liaison fiable. L'étape 3 ne peut servir à cette fin, car une requête de déplacement égale à la position courante ne produit ni mouvement ni erreur.
  • L'étape 4 ferme la boucle. Ce n'est que lorsque la valeur lue en retour correspond à la valeur demandée que l'hôte peut être certain que le changement de grossissement a réellement pris effet.

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.

Idées reçues courantes

« Un objectif zoom motorisé RS-232 » ne veut pas dire une seule chose

Cela désigne deux choses très différentes, et choisir le mauvais modèle est une erreur fréquente et coûteuse.

FormeRepère de modèleCapacité réelle
Retour de grossissement passifSuffixe DS9 ou DS6, par ex. PMS-LZ-63100DS9Le 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 activeCode de type de zoom 04, 05, 09 ou 10, par ex. PMS-LZ-650104Les 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é.

« La communication est tombée pendant le zoom — la liaison est cassée »

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.

« Envoyer une commande produit toujours un mouvement »

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.

« N'importe quelle valeur de position peut être commandée »

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.

Commandes série brutes ou SDK ?

Commande protocoleAPI SDK héritéeSDK V4.4.7
XH retour à l'origineMoveHome(Motor)GoHome
XG déplacementMoveGoto(Motor, long dest)MoveTo(pulse)
XZ étatMoveStatus(Motor) → 0 en mouvement / 1 au repos / 2 erreurGetStatus
XM courseMoveMaxLength(Motor)GetMaxPos
XN positionMovePos(Motor)GetPos
  • Intégration avec un PLC, un contrôleur de mouvement ou un microcontrôleur — utilisez les commandes brutes ci-dessus. Aucune DLL n'est requise, et le protocole est en ASCII pur sans dépendance de plateforme, il fonctionne donc aussi sur Linux et macOS.
  • Développement sous Windows en C++ ou C# — utilisez le SDK, qui gère pour vous l'assemblage des trames, les nouvelles tentatives et le cas du double moteur.

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.

Questions fréquentes

Quel débit (baud rate) les objectifs zoom motorisés POMEAS utilisent-ils ?

9600 bauds, 8 bits de données, sans parité. L'option Ethernet utilise le port TCP 4196.

Pourquoi ne puis-je rien lire de l'objectif pendant qu'il zoome ?

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.

Comment savoir si un objectif prend en charge la commande RS-232 active ?

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.

Puis-je connecter l'objectif directement à un PLC ?

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.

Ai-je besoin de la DLL pour commander l'objectif ?

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.

À lire également

Produits associés

Zurück nach oben
VK Message
WhatsApp

QR-Code scannen

WhatsApp QR-Code
Wechat

QR-Code scannen

Wechat
Telefonnummer
8618598102007
Kopiert!
Online-Nachricht

Online-Nachricht

Click to refresh