#python #tcp #pyvisa
Вопрос:
Я использую функцию peaktech 4046 : 160 МГц/генератор произвольной формы сигнала. Я разрабатываю pyton и использую pyvisa librairy. Соединение хорошо установлено, и генератор применяет запрос. Но он генерирует следующую ошибку и останавливает программу (она ничего не делает после ошибки).
Вот код :
import pyvisa
rm = pyvisa.ResourceManager()
inst = rm.open_resource('TCPIP0::130.79.192.123::5025::SOCKET')
print(inst.session)
print(inst.io_protocol)
inst.query("source1:function squ")
И вот что у меня есть в моем терминале :
2
IOProtocol.normal
Traceback (most recent call last):
File "c:UsersLabo précliniqueDesktopProjetPythonimportation de librairiesForum.py", line 7, in <module>
inst.query("source1:function squ ")
File "C:UsersLabo précliniqueAppDataLocalProgramsPythonPython39libsite-packagespyvisaresourcesmessagebased.py", line 644, in query
return self.read()
File "C:UsersLabo précliniqueAppDataLocalProgramsPythonPython39libsite-packagespyvisaresourcesmessagebased.py", line 486, in read
message = self._read_raw().decode(enco)
File "C:UsersLabo précliniqueAppDataLocalProgramsPythonPython39libsite-packagespyvisaresourcesmessagebased.py", line 442, in _read_raw
chunk, status = self.visalib.read(self.session, size)
File "C:UsersLabo précliniqueAppDataLocalProgramsPythonPython39libsite-packagespyvisactwrapperfunctions.py", line 2337, in read
ret = library.viRead(session, buffer, count, byref(return_count))
File "C:UsersLabo précliniqueAppDataLocalProgramsPythonPython39libsite-packagespyvisactwrapperhighlevel.py", line 222, in _return_handler
return self.handle_return_value(session, ret_value) # type: ignore
File "C:UsersLabo précliniqueAppDataLocalProgramsPythonPython39libsite-packagespyvisahighlevel.py", line 251, in handle_return_value
raise errors.VisaIOError(rv)
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
Я пытался (безрезультатно) :
-замена СОКЕТА на INSTR
-использование таймаута намного дольше ( первый тайм-аут = 10000)
-добавление конечного термина (попробовал n и r) с : inst.read_termination = ‘n’
Так что я больше не знаю, что делать… Мне нужно дать более одной команды, поэтому программа не должна останавливаться так быстро. Я подозреваю, что мой генератор функций ничего не отправляет обратно, но я не знаю, как убедиться, что это так.
Я хотел бы знать следующее : почему у меня возникает ошибка тайм-аута, если соединение установлено правильно и запрос выполнен на устройстве ? Как правильно выполнить запрос ?
Заранее благодарю вас !!
PS : Я знаю, как поймать ошибку (за исключением попытки), но я бы предпочел получить ответ «Ок», а не «КО».
Ответ №1:
Попробуйте получить список ресурсов с помощью
rm.list_resources()
и проверьте, TCPIP0::130.79.192.123::5025::SOCKET
есть ли в нем ваш ресурс.
Затем проверьте стандартный запрос к ресурсу из учебника:
inst.query("*IDN?")
query
это краткая форма для операции записи для отправки сообщения, за которой следует чтение. Таким образом, вы можете сделать это в двух действиях, чтобы указать ошибку(ошибка чтения или записи?):
inst.write('"source1:function squ"')
print(inst.read())
Пожалуйста, проверьте название запроса source1:function squ
, потому что я не вижу его в документации. Может быть, вам следует использовать "source1:am:interanal:function square
(стр. 57 документации) или изменить квадрат — > квадрат?
В соответствии с документацией вы можете попытаться установить бесконечный тайм-аут для вашего запроса,
del inst.timeout
Кроме того, вы можете добавить read_termination
/ write_termination
опцию, чтобы указать, когда вы закончите чтение/запись,
inst = rm.open_resource('TCPIP0::130.79.192.123::5025::SOCKET', read_termination='r')
И последний шанс-изменить параметры query_delay и send_end.
Комментарии:
1. Здравствуйте, спасибо, что ответили. В rm.list_resources не отображаются устройства, которые уже открыты, поэтому я не вижу свой генератор функций.