簡體   English   中英

僅在 Linux 中與 TDK-Lambda ZUP 的串行 RS485 / RS232 通信非常慢

[英]Serial RS485 / RS232 communication with TDK-Lambda ZUP very slow only in Linux

在我們的實驗中,我們使用許多 ZUP 電源為電子設備供電。 確切的型號是 TDK-Lambda ZUP80-2.5 和 ZUP6-33。 它們由運行 Linux 的服務器遠程控制和監視。

問題是串行通信非常慢。 慢是指 ZUP 波特率可以設置在 300 到 9600 之間。為了(幾乎)可靠地與 PSU 通信,我必須將波特率設置為最低 300 bps。

起初,我懷疑是硬件或接線問題,但似乎沒有任何改善。 然后我用 官方專有的 Windows 應用程序(使用完全相同的硬件設置)測試了 PSU,我可以毫無問題地以 9600 波特率進行通信。 所以問題無疑出在 Linux 驅動程序或我的代碼中。

ZUP 可以使用 RS232 或 RS485 與 PC 通信。 我對它們都進行了嘗試,結果相同。 我嘗試使用便宜的 RS485-USB 適配器、台式 PC 的 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 bps 但不適用於 9600 bps(隨着我提高波特率,情況逐漸惡化)。 即使使用 300 bps,有時在發送或接收長命令時也會出現超時或數據損壞錯誤。

PS 我們的 DAQ 僅在 Linux 中運行,因此不能使用 Windows。

正如用戶 Marcos G. 所指出的那樣,事實證明 Python 本身存在問題。正如我在評論中所寫,我嘗試使用pyserialarduino-serial編寫驅動程序。 盡管最初取得了一些部分成功,但事實證明他們倆都或多或少存在相同的問題。 所以我使用libserialport C library完全重寫了 C++ 中的驅動程序。 現在我幾乎可以全速與 ZUP 進行通信了。

在我從TDK-Lambda 的 Zup 用戶手冊中發現第 5.6.1 段之前,我在 9600 波特上遇到了類似的問題。

https://github.com/Amphenol-Borisch-Technologies/Zup-Python-Library 有一個 Python 庫用於 Zup 控制。

查看 class Zup 的 _write_command() 方法。

根據 Zup 手冊,第 5.6.1 段:

  • 發送 ADR 命令前需要 10 毫秒的最小延遲。
  • Zup 系列的平均命令處理時間為 15 毫秒。
  • 發送 ADR 命令后需要 30 毫秒的延遲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM