Последовательная связь RS485 / RS232 с TDK-Lambda ZUP очень медленная только в Linux - PullRequest
1 голос
/ 25 октября 2019

В нашем эксперименте мы используем много источников питания ZUP для питания электроники. Точные модели: TDK-Lambda ZUP80-2.5 и ZUP6-33. Они управляются удаленно и контролируются сервером под управлением Linux.

Проблема в том, что последовательная связь очень медленная. Под медленным я подразумеваю, что скорость передачи данных ZUP может быть установлена ​​между 300 и 9600. Для надежной связи (почти) с блоком питания мне нужно установить скорость передачи как минимум на 300 бит / с.

Сначала я былподозревал проблему с оборудованием или проводкой, но, похоже, ничто не улучшило ситуацию. Затем я протестировал блок питания с помощью официального проприетарного приложения Windows (используя ту же аппаратную настройку) и смог без проблем общаться на скорости 9600 бод. Так что проблема, несомненно, заключается в драйвере Linux или в моем коде.

ZUP может связываться с ПК через RS232 или RS485. Я попробовал их обоих с одинаковыми результатами. Я попытался использовать дешевый адаптер RS485-USB, последовательный порт RS232 настольного ПК и карту PCIe RS485 профессионального уровня, но все безуспешно.

В качестве языка программирования я использую Python. Я попытался использовать pyvisapy и научное программное обеспечение под названием Pyrame , которое, по сути, предоставляет оболочку для serial модуля Python. Стоит ли использовать другой язык?

Вот минимальный пример, показывающий, как я получаю доступ к устройству в pyvisapy:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import visa
from visa import constants
rm = visa.ResourceManager('@py')
inst = rm.open_resource('ASRL/dev/ttyUSB0::INSTR')
inst.baud_rate = 9600 # 300
inst.write_termination = ''
inst.read_termination = '\r\n'
inst.set_visa_attribute(constants.VI_ATTR_ASRL_FLOW_CNTRL, constants.VI_ASRL_FLOW_XON_XOFF)
inst.stop_bits = constants.StopBits.one
inst.parity = constants.Parity.none
inst.data_bits = 8

print(inst.write(":ADR01;"))
print(inst.write(":REV?;"))
print(inst.read())

В Linux приведенный выше код работает со скоростью 300 бит / с, ноне с 9600 бит / с (ситуация постепенно ухудшается по мере увеличения скорости передачи). Даже при скорости 300 бит / с иногда возникают ошибки тайм-аута или порчи данных при отправке или получении длинных команд.

PS наш DAQ работает только в Linux, поэтому использование Windows не вариант.

...