J'ai un dispositif d'essai avec un générateur de signaux Agilent E4426B RF connecté à un PC via un pont Ethernet National Instrument à GPIB. Mon logiciel tente de désinfecter l'instrument en le préréglant, puis en sauvegardant l'état actuel sur tous les emplacements de mémoire accessibles via la commande SCPI standard "* SAV x, y".générateur de signaux Agilent E4426B se bloque pendant plusieurs opérations VAS GPIB de *
La boucle fonctionne à un point, mais finalement l'instrument répond avec une erreur et affiche en continu l'icône « L » sur l'écran avant et un message de « présélection à distance » en bas. À ce moment-là, il ne répondra plus aux commandes à distance et je dois soit allumer l'alimentation soit appuyer sur LOCAL, puis PRESET à quel point il faut environ 3 minutes pour terminer le préréglage. À ce stade, l'icône «L» est toujours présente et la prochaine commande GPIB envoyée à l'instrument l'amène à signaler une erreur -113 (en-tête non défini) dans la file d'attente des erreurs de l'instrument.
Je Fired Up espion NI pour voir ce qui se passait, et a constaté que l'erreur se produisait au même point dans la boucle - « * 6,2 SAV » dans ce cas. De NI Spy:
Envoyer (0, 0x0017, "* 6,2 SAV", 8 (0x8), nlend (0,0x01))
ID du processus: 0x00000520 ID de thread: 0x00000518
ibsta: 0xc168 iberr: 6 ibcntl: 2 (0x2)
Et voici le code du pilote de l'appareil:
int CHP_E4426b::Erase()
{
if ((m_StatusCode = Initialize()) != GPIB_SUCCESS) // basically just sends "*RST"
return m_StatusCode;
m_SaveState = "*SAV %d, %d";
for (int i=0; i < 10; i++)
for (int j=0; j < 100; j++) {
sprintf(m_CmdString, m_SaveState, j, i);
if ((m_StatusCode = Send(m_CmdString, strlen(m_CmdString))) != GPIB_SUCCESS)
return m_StatusCode;
}
return GPIB_SUCCESS;
}
J'ai essayé de mettre un retard petit sommeil() (10-20 ms) à la fin de la boucle intérieure, et à ma grande surprise, il a causé l'erreur à apparaître plus tôt plutôt que plus tard. 10 ms ont provoqué l'erreur de la boucle à 44,1 et 20 ms était encore plus tôt. J'ai déjà éliminé le câblage défectueux ou l'instrument en tant que coupable. Ce même type de séquence fonctionne sans aucune erreur sur un générateur de signal haut de gamme, donc je suis tenté de craindre un bug dans le firmware de l'instrument.
Avez-vous essayé d'exécuter le pas de ligne 'Send()' en mode débogage? Si oui, vous pouvez voir l'erreur se produisant au tout premier 'Send()', à chaque 'Send()', à certains d'entre eux ou quoi d'autre? – j4x
Cela ne se produirait pas avant le 150e ordre 'Send()'. J'ai mis un compteur pour me dire lequel causait le blocage, puis j'ai mis un retard dans la boucle parce que je pensais que je frappais l'instrument plus vite qu'il ne pouvait le faire. Cela l'a fait bloquer sur un _earlier_ 'Send()' que de n'avoir aucun retard. À ce moment-là, nous avons simplement enlevé l'appel à 'Effacer()' de notre séquence d'arrêt et effacé l'instrument à la main dans les rares occasions où cela est vraiment nécessaire. – Andrew
Si votre but est simplement de "désinfecter" l'instrument, alors Agilent a probablement une procédure pour cela. Je sais qu'ils le font pour les analyseurs de réseau. – Mike