Tento príspevok je súčasťou série o probléme s ModbusRTU autoflow na TouchBerry a o tom, ako som ho vyriešil. Ostatné príspevky série nájdete pod tagom touchberry. Upozorňujeme, že novšie príspevky môžu obsahovať aktuálnejšie informácie.

S prístupom k modelu TouchBerry 10” vrátane RS485 som sa dal do ovládania niektorých ModbusRTU zariadení pomocou neho. Má konektor M8, 3-pinový. Stredný pin je pripojený na zem napájacieho napätia, takže som predpokladal, že zostávajúce dva sú A a B pre RS485. Ukázalo sa, že na túto tému nie je verejne dostupná absolútne žiadna dokumentácia.

Pinout RS485 #

Našťastie som dostal e-mail od podpory pomerne rýchlo. E-mail potvrdil pinout.

#Pozícia M8RS485
1vpravoB-
2vľavoA+
3horeGND

Ale keď je GND vyriešené, dostať sa k A a B nie je problém. Ak to nefunguje, jednoducho ich vymeňte a skúste znova. Pri ostatnom správnom nastavení je tento postup dostatočný.

Pinout UPS shieldu #

Následne e-mail obsahoval informácie o pinoute UPS shieldu, ktorý hostí čip RS-485. Čip je Unisonic Technologies UTRS485G, ale o nich som predtým nikdy nepočul. UPS shield tiež obsahuje elektroniku neprerušiteľného napájania (odtiaľ názov) a hodinový čip DS3231 pre možnosti RTC.

Shield využíva celý 40-pinový header pre Raspberry Pi 4, ktorý tvorí jadro TouchBerry 10”, detaily z e-mailu sú nasledujúce:

FnPopis.##Popis.Fn
NC12Vin
SDAGPIO234Vin
SCLGPIO356GND
NC78GPIO14TXD
NC910GPIO15RXD
REGPIO171112NC
DEGPIO271314GND
NC1516GPIO23UPS IN
NC1718GPIO24UPS OUT
NC1920GND
NC2122NC
NC2324NC
GND2526NC
NC2728NC
NC2930GND
NC3132NC
NC3334GND
NC3536NC
NC3738NC
GND3940NC

Toto bolo dosť nápomocné, pretože čip zodpovedný za RS485 komunikáciu musí vedieť, akým smerom dáta prúdia. Je to pokročilá funkcia navrhnúť celkový systém tak, aby táto zodpovednosť bola od používateľa abstrahovaná — tzv. autoflow alebo automatické riadenie toku.

Používanie rozhrania RS485 na TouchBerry 10 #

Dôležitosť autoflow je zrejmá z Python skriptu poskytnutého ako tretia časť e-mailu od podpory IndustrialShields:

#!/usr/bin/env python3

# IMPORTANT: remember to add "enable_uart=1" line to /boot/config.txt

from gpiozero import OutputDevice
from time import sleep
from serial import Serial

# RO  <-> GPIO15/RXD
# RE  <-> GPIO17
# DE  <-> GPIO27
# DI  <-> GPIO14/TXD
#
# VCC <-> 3.3V
# B   <-> RS-485 B
# A   <-> RS-485 A
# GND <-> GND

# enable reception mode
re = OutputDevice(17)
de = OutputDevice(27)

de.off()
re.off()

with Serial('/dev/ttyS0', 19200) as s:
  while True:
    # waits for a single character
    rx = s.read(1)

    # print the received character
    print("RX: {0}".format(rx))

    # wait some time before echoing
    sleep(0.1)

    # enable transmission mode
    de.on()
    re.on()

    # echo the received character
    s.write(rx)
    s.flush()

    # disable transmission mode
    de.off()
    re.off()

Na odoslanie dát cez rozhranie RS485 musia byť piny RE a DE čipu vytiahnuté na HIGH, dáta musia byť prenesené, a potom by mali byť oba piny RE a DE okamžite stiahnuté na LOW, aby prijali odpoveď. Je to veľmi nepríjemné, keďže väčšina Modbus implementácií predpokladá autoflow, čo je aj prípad pri používaní mbpoll.

Chýbajúci autoflow? #

Je to v podstate veľa nepríjemností nemať funkcionalitu autoflow, čo robí väčšinu štandardných Modbus implementácií nepoužiteľnými. Hľadal som dosť usilovne spôsob, ako to urobiť nejakým príjemným automatizovaným spôsobom na RPi softvéri na nejakej aplikačnej alebo jadrovej úrovni, navštevujúc výsledky vyhľadávaní ako alternatívne GPIO funkcie, dtoverlay, RTS0, uart-ctsrts a sériové sniffre, ale riešenie som zatiaľ nenašiel. Niektoré z najsľubnejších sú referencované nižšie medzi inými relevantnými odkazmi.

GPIO17 má alternatívnu funkciu RTS0 na ALT3, ktorá je pripojená na pin RE — dúfajme, že to je zámerné. Pre GPIO27 pripojený na pin RE však žiadna taká funkcia nie je dostupná. V skutočnosti by mali byť DE aj RE spojené dokopy, ovládané jediným pinom RTS0, ktorý je zase riadený GPIO14 ako TXD0. Nemám tušenia, prečo je pin RE samostatný. Musím ho pripojiť k osciloskopu, aby som sa dozvedel viac. Pred dotykom spájkovačky musím tiež počkať na ďalšiu odpoveď e-mailu od podpory — možno poskytnú nejaké užitočné informácie. Nakoniec, ich RPi PLC má /dev/ttySC0 a /dev/ttySC1 pre oba RS485 kanály.

Toto je 92. príspevok série #100daystooffload.

Odkazy #