Die vollständige Antwort, die über RS-485 von einem Modbus-Gerät übernimmt, kann nicht gelesen werdenPython

Python-Programme
Anonymous
 Die vollständige Antwort, die über RS-485 von einem Modbus-Gerät übernimmt, kann nicht gelesen werden

Post by Anonymous »

Ich habe versucht, mit einem I-7000 IO-Modulgerät zu kommunizieren, das Modbus unterstützt. Im Allgemeinen kann ich erfolgreich Befehle wie das Schreiben an eine Spule oder das Lesen einer Spule senden, aber ich muss mit einem Problem konfrontiert werden - ich kann die Antwort aus dem IO -Modulgerät nicht lesen, zumindest nicht jedes Mal. Ich verwende pyserial und erwarte 6 Bytes, die mit einer bestimmten Bestellung zurückgegeben wurden, aber die Nachricht nicht richtig lese. Jede Meldung verfügt am Ende über eine Geräte -ID, einen Funktionscode, eine Spulenadresse, einen Wert und eine CRC -Nachricht. Meistens kann ich die CRC -Nachricht am Ende nur lesen und manchmal kann ich einige der anderen Bytes vorher lesen. Selten kann ich die gesamte Nachricht lesen. p>

Code: Select all

import serial
import time
import crcmod.predefined

# Function to calculate Modbus RTU CRC
def calculate_rs_485_crc(message):
crc16 = crcmod.predefined.mkCrcFun("modbus")
return crc16(message)

port = "/dev/ttyS0"
baudrate = 115200
timeout = 1

ser = serial.Serial(
port,
baudrate,
timeout=timeout,
parity=serial.PARITY_NONE,
)

# Construct Modbus RTU command
message = "020100060001"
command = bytes.fromhex(message)
crc = calculate_rs_485_crc(command)
command_with_crc = command + crc.to_bytes(2, "little")

print(f"Sent: {command_with_crc.hex()}")
ser.write(command_with_crc)

byteData = ser.read_until(b"\xcc")

print(f"byteData: {byteData}")

ser.close()
< /code>
Ich habe Baudrate und den Port überprüft, sie sind in Ordnung. Was auch immer ich mir vorstellen, das Ergebnis ist das gleiche. Ich habe versucht, eine Zeit zu setzen. Wenn ich zumindest keine Schlafzeit habe, erhalten Sie einige Teile der Nachricht. < /P>
Dies ist mein Terminal, an dem ich sehe, was gedruckt wird. Manchmal empfangen Sie das Ende der Nachricht (CRC -Bytes):

Sent: 0201000600011df8< /code>

byteData: b'Q\xcc'

Und manchmal kann ich die tatsächlich erwartete Nachricht sehen. Oder manchmal auch etwas dazwischen.

Code: Select all

Sent: 0201000600011df8< /code>

byteData: b'\x02\x01\x01\x00Q\xcc'

Außerdem können Sie mich im Code verwenden Anzahl der Bytes, die ich zu lesen erwarte, aber nichts davon hat geholfen. Gleiches Ergebnis. Ich bin mir nicht sicher, warum diese Inkonsistenz geschieht. Die meisten meiner Online -Lese -Online -Probleme zeigen Zeitprobleme oder Hardwareprobleme, aber es sind definitiv keine Hardwareprobleme, da ich einige andere Tools verwendet habe, die vom Hersteller bereitgestellt werden, um mit diesem Gerät zu sprechen, und es hat gut funktioniert. Wenn es sich um ein Timing -Problem handelt, verstehe ich nicht, wie es so ist, denn wenn ich etwas Zeit in den Schlafen stelle, um sicherzustellen, dass jedes Stück der Nachricht angekommen ist, bekomme ich nichts. < /P>
Ich hoffe, Sie können mir helfen.

Code: Select all

user@localhost:~$ sudo mbpoll -m rtu -b 115200 -d 8 -s 1 -p none /dev/ttyS0 -a 2 -r 1 -1 -t 0
mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.

Protocol configuration: Modbus RTU
Slave configuration...: address = [2]
start reference = 1, count = 1
Communication.........: /dev/ttyS0,     115200-8E1
t/o 1.00 s, poll rate 1000 ms
Data type.............: discrete output (coil)

-- Polling slave 2...
Read discrete output (coil) failed: Connection timed out

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post