2015-06-09 10 views
1

Я использую pyvisa программировать источник питания, который соответствует протоколу ИМТП, как это:Можно ли ожидать некоторое время между операциями по протоколу VISA?

power = get_power() 
power.write('VOLTage 24.000') 
time.sleep(1)  # **Must delay** 
power.query(u'VOLTage?') 
disconnect_power(power) 

Все было в порядке, но если бы я не стал ждать, между «записи» и «запрос», то там была ошибкой таймаута:

raise errors.VisaIOError(ret_value) pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.

Нормально ли задержка между операциями при программировании такого инструмента в соответствии с протоколом VISA? Если нет, то как обычно? Или есть какой-то механизм вроде Event? Если да, как мне решить время ожидания?

+0

Похож на инструмент SCPI. Тайм-ауты являются общими, когда отправленные данные не поняты. Попробуйте запросить очередь ошибок после таймаута. Также смотрите сообщения, отображаемые на передней панели, если прибор имеет один. –

+0

Как я понял, должен быть интервал между операциями для ответа на инструмент, интервал времени зависит от скорости передачи. – lengxuehx

+0

Настройка таймаута сеанса должна быть достаточно длинной, чтобы инструмент мог прочитать ввод, выполнить несколько команд и ответить на запрос. Тайм-аут должен возникать только из-за серьезных проблем связи, скажем, 10 или 20 секунд. Конструкция стимула-ответа SCPI не позволяет прибору реагировать, когда он не понимает, что он получает. Вот почему вы можете получить тайм-аут из запроса, где на самом деле не проблема связи на уровне шины. –

ответ

1

На самом деле, это распространенная проблема при программировании прибора SCPI. На самом деле, SCPI предоставляет множество методов синхронизации, см. Раздел IEEE-488.2.87, раздел 12: Методы синхронизации устройств/контроллеров. И here является сводкой для хороших практик программирования SCPI, хотя для проприетарного инструмента некоторые рекомендации применимы ко всем устройствам SCPI.

Таким образом, ключевой вопрос: источник питания не может обработать следующее «сообщение программы» (см. Подробности IEEE-488.2.87) до того, как предыдущий («VOLTage 24.000») будет завершен. Если вы сделаете это без надлежащей задержки, обработка будет прервана.

SCPI предоставляет команду синхронизации «OPC?». дождаться завершения всех команд до его завершения. Когда каждая команда завершается, она помещает 1 в выходной буфер. Поэтому мы можем просто добавить «OPC»? к предыдущей программе сообщение, а затем просто ждать завершения путем чтения, после этого мы делаем запрос, как это:

power = get_power() 
power.write('VOLTage 24.000;*OPC?') 
power.read() 
power.query(u'VOLTage?') 
disconnect_power(power) 

Так вот это.