Erfolg!
Es funktioniert jetzt.
Ich kann jetzt den SLPO48-200 mittels RS485 auslesen.
Eigentlich hätte schon gestern alles funktionieren können, aber naja. Am Ende hatte ich die falschen Adern des RJ45-Steckers mit dem RS485-Adapter verbunden. *autsch*
Also, mein Ethernet-Kabel entspricht der Standard EIA/TIA-T568B-Belegung. Unter
http://www.netzmafia.de/skripten/netze/twisted.html wird gut erklärt, was das genau ist. Wichtig ist nur, dass man weiß, dass der Akku die Pins wie folgt belegt hat:
Pin 4: 485-A
Pin 5: 485-B
Pin 7: GND
Pin 8: GND
Für T568B gilt:
Pin 4: blau
Pin 5: blau-weiß
Pin 7: braun-weiß
Pin 8: braun
Ich habe das ganze mit diesem Adapter:
"USB to RS485":
https://www.amazon.de/gp/product/B016IG6X7I (Farbe: #1)
und auch diesem Adapter:
"UART to RS485":
https://www.amazon.de/gp/product/B083943T9J
ans Laufen bekommen.
Der "USB to RS485"-Stick ist in der Handhabung natürlich etwas einfacher.
Beide Adapter haben aber an einem Ende die Anschlüsse "A", "B" und "GND"
Im Falle von T568B verbindet man die Anschlüsse "A", "B" und "GND" des entsprechenden Adapters wie folgt:
"A" -> (Pin 4) blau
"B" -> (Pin 5) blau-weiß
"GND" -> (Pin 7) braun-weiß
und/oder
"GND" -> (Pin 8) braun
Gerade bei der blau-weiß-Ader sowie der braun-weißen Ader aufpassen, die nicht anderen Adern vertauscht werden. (Hier lag gestern mein Fehler: Ich hatte "B" -> mit (Pin 3) grün-weiß verbunden anstatt "B" -> (Pin 5) blau-weiß.
)
Wenn man den "USB to RS485"-Adapter hat, muss man diesen dann nur noch in einen Raspberry-Pi oder anderen Linux-Rechner stecken. Der "UART to RS485"-Adapter hat folgende Anschlüsse:
- GND
- RxD
- TxD
- Vcc
Das Pinout des RaspberryPis kann man hier einsehen:
https://de.pinout.xyz/
Verkabelt wird der "UART to RS485"-Adapter wie folgt:
GND auf GND des Pis
RxD auf RxD des Pis (Ja, auf RxD, GPIO 15, NICHT auf TxD)
TxD auf TxD des Pis (Ja, auf TxD, GPIO 14, NICHT auf RxD)
Vcc auf 3,3V des Pis
Dann ist alles richtig verkabelt und es kann mit der Software losgehen.
Ich verwende Raspberry Pi OS Lite, Kernel version: 5.15, Debian version: 11 (bullseye) - also die aktuelle Version (ohne Desktop).
Wenn der "UART to RS485"-Adapter verwendet wird, muss man die Serielle Schnittstelle des Pis noch wie folgt aktivieren:
Das ist hier sehr gut beschrieben:
https://www.abelectronics.co.uk/kb/arti ... erry-pi-os
Wie gestern schon beschrieben muss man dann noch Pip3 sowie zwei Python-Module über Pip3 installieren. Einfach die folgenden Befehle im Terminal bzw. auf der Konsole auf dem Pi ausführen:
Code: Alles auswählen
sudo pip3 install -U pyserial
sudo pip3 install -U minimalmodbus
Dann kann man einfach folgendes Skript verwenden:
Code: Alles auswählen
#!/usr/bin/env python3
import minimalmodbus
import serial
import json
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 170) # port name, slave address (in decimal)
instrument.serial.baudrate = 9600 # Baud
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout = 0.5 # seconds
instrument.mode = minimalmodbus.MODE_RTU
instrument.debug = False
instrument.clear_buffers_before_each_transaction = True
try:
total_voltage = instrument.read_register(3, 2, 3, True)
current = instrument.read_register(4, 1, 3, True)
soc = instrument.read_register(5, 0, 3, True)
soh = instrument.read_register(6, 0, 3, True)
cycles = instrument.read_register(7, 0, 3, True)
heatsink_temperature = instrument.read_register(25, 1, 3, True)
temperature_1 = instrument.read_register(26, 1, 3, True)
temperature_2 = instrument.read_register(27, 1, 3, True)
temperature_3 = instrument.read_register(28, 1, 3, True)
warnings = instrument.read_register(1000, 0, 3, False)
except minimalmodbus.NoResponseError:
data = {
"SLPO48-200":{
"is_communication_error": 1,
"communication_error": "NoResponseError"
}
}
print (json.dumps(data))
instrument.serial.close()
quit()
instrument.serial.close()
data = {
"SLPO48-200":{
"total_voltage": total_voltage,
"current": current,
"soc": soc,
"soh": soh,
"cycles": cycles,
"heatsink_temperature": temperature_1,
"temperature_1": temperature_1,
"temperature_2": temperature_2,
"temperature_3": temperature_3,
"warnings": warnings,
"is_communication_error": 0
}
}
print (json.dumps(data))
Das gezeigte Beispiel nutzt den "USB to RS485"-Adapter. Für den "UART to RS485"-Adapter muss folgende Zeile geändert werden:
Code: Alles auswählen
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 170) # port name, slave address (in decimal)
zu
Code: Alles auswählen
instrument = minimalmodbus.Instrument('/dev/serial0', 170) # port name, slave address (in decimal)
Solltet ihr einen anderen Port nutzen, dann einfach den Port-Namen ändern.
Ausführen kann man das Skript dann wie folgt:
"akku_USB.py" muss natürlich mit Dateinamen ersetzt werden, den ihr gewählt habt.
Die Ausgabe sollte wie folgt aussehen:
Code: Alles auswählen
{
"SLPO48-200":{
"total_voltage":48.13,
"current":-0.6,
"soc":9,
"soh":100,
"cycles":10,
"heatsink_temperature":15.9,
"temperature_1":15.9,
"temperature_2":15.5,
"temperature_3":15.3,
"warnings":0,
"is_communication_error":0
}
}
Natürlich kann man das Array bzw. das JSON auch noch mit weiteren Werten füllen.
Edit:
Diese Adapter funktionieren auch:
https://www.amazon.de/gp/product/B08XLT21S6
Quasi genauso, wie die anderen "UART to RS485"-Module.