Ubuntu Mate Python, использующий PySerial через полудуплексную передачу RS485 проблемы - PullRequest
0 голосов
/ 03 октября 2018

Проблемы со связью с устройствами Modbus через USB по rs485.

, поэтому я использую Python 3.5 и использую PyModbus, PySerial

, и мой код основан на последовательном примере PyModbus ипод windows он работает нормально и правильно связывается с устройством Modbus

, когда я запускаю свой код на Raspberry Pi3 под управлением Ubuntu mate 16.04.5 LTS, устройство не отвечает на мой код.Сначала я подумал, что адаптер не был установлен правильно, но после двойной проверки всего я установил gtkterm и настроил порт на / dev / ttyUSB0 9600 8-n-2 и попытался отправить шестнадцатеричные данные на Modbus, но ответа до сих пор не было.управление потоком имеет настройку RS485-HalfDuplex (RTS) и в дополнительных параметрах, если я устанавливаю задержку отправки на 20 миллисекунд и 10 мс RTS выключается

теперь, когда я пытаюсь отправить пакет шестнадцатеричного режима, устройство отвечаеткак и ожидалось.

Я подключил свой осциллограф, и из кода Python он передает некоторый небольшой пакет данных, случайным образом похожий после истечения времени ожидания при отправке данных.после небольшого разбора кажется, что некоторым устройствам USB to rs485 требуется RTS, чтобы переключить устройство в режим передачи, а затем отключить RTS, чтобы перевести его в режим приема.

Я также обнаружил, что pySerial имеет настройку RS485и попробовал их, а затем передаваемые пакеты были более регулярными и большими, но все же намного короче, чем gtkterm, и много помогло с синхронизацией времени, я немного вернулся к использованию исходного кода, но вставил

socket.setRTS(1)  
time.sleep(0.02)
socket.write(request)
time,sleep(0.1)
socket.setRTS(0)

, кажется, дает мне самый длинный пакет, собранный на осциллографе, но длина пакета составляет 8,42 мс, тогда как длина пакета от gtkterm составляет 9,36 мс, и при взгляде между трассировкой обоих сообщений кажется, чтоконец пакета отсутствует.но даже если я увеличу время ожидания перед выключением сигнала RTS, это не имеет значения.

1 Ответ

0 голосов
/ 03 октября 2018

нормально, после установки interceptty и получения gtkterm для использования виртуального порта, он перебил тональный сигнал об ошибках, потому что interceptty не поддерживает RTS и DTR, но по какой-то причине ему все еще удалось связаться с устройством Modbus,

Затем я направил свой код Python на виртуальный порт перехвата и передавал ту же информацию, что и gtkterm, но не получил ответа, но заметил, что записал данные намного быстрее

, поэтому я изменил код так, чтобы он только отправлял1 байт за раз и задержка 10 мс между ними, и затем он внезапно начал работать.

так с примером кода из pyModbus https://pymodbus.readthedocs.io/en/latest/ Я отредактировал client / sync.py

добавил 2 дополнительных импорта

import time
import struct

и немного изменил функцию _send ModbusSerialClient

с

size = self.socket.write(request)

на

        size=0
        for item in request:
            size = self.socket.write(struct.pack(">B",item))
            time.sleep(0.01)
        size=len(request)
...