From 2b26f0cc7405674102169cdf813c75d4441d3fea Mon Sep 17 00:00:00 2001 From: jan iversen Date: Thu, 29 Oct 2026 11:56:55 +0100 Subject: [PATCH] Partial solve ext. cancel sideeffects. --- pymodbus/transaction/transaction.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pymodbus/transaction/transaction.py b/pymodbus/transaction/transaction.py index b1f5ebfcd..765fccf70 100644 --- a/pymodbus/transaction/transaction.py +++ b/pymodbus/transaction/transaction.py @@ -209,9 +209,11 @@ async def execute( self.response_future, timeout=self.comm_params.timeout_connect ) self.count_until_disconnect = self.max_until_disconnect - if request.dev_id and response.dev_id != request.dev_id: + if (request.dev_id and response.dev_id != request.dev_id) or ( + response.function_code & 0x7F + ) != request.function_code: raise self._io_exception_from_request( - f"ERROR: request uses device id={request.dev_id} but received {response.dev_id}.", + "ERROR: Unsolicited response received.", request, ) if ( @@ -273,7 +275,11 @@ def callback_data(self, data: bytes, addr: tuple | None = None) -> int: self.last_pdu = self.trace_pdu(False, pdu) self.last_addr = addr if not self.is_server: - if self.response_future.done(): + if ( + not self.response_future + or self.response_future.done() + or self.response_future.cancelled() + ): Log.warning( "ERROR: received pdu without a corresponding request, IGNORING" )