Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 2 additions & 41 deletions pymodbus/client/mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import pymodbus.other_message as pdu_other_msg
import pymodbus.register_read_message as pdu_reg_read
import pymodbus.register_write_message as pdu_req_write
from pymodbus.exceptions import ModbusException
from pymodbus.pdu import ModbusRequest, ModbusResponse


Expand Down Expand Up @@ -45,19 +46,14 @@ def execute(self, request: ModbusRequest) -> ModbusResponse:
"""Execute request (code ???).

:param request: Request to send
:returns: A deferred response handle
:raises ModbusException:

Call with custom function codes.

.. tip::
Response is not interpreted.
"""

# The implementation of this method is only used in test, to secure that
# the methods uses the correct PDU.
# execute() will be overwritten in the transport class.
return request
raise ModbusException("Pymodbus internal ERROR")

def read_coils(
self, address: int, count: int = 1, slave: int = 0, **kwargs: Any
Expand All @@ -68,7 +64,6 @@ def read_coils(
:param count: (optional) Number of coils to read
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -84,7 +79,6 @@ def read_discrete_inputs(
:param count: (optional) Number of coils to read
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -100,7 +94,6 @@ def read_holding_registers(
:param count: (optional) Number of coils to read
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -116,7 +109,6 @@ def read_input_registers(
:param count: (optional) Number of coils to read
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -132,7 +124,6 @@ def write_coil(
:param value: Boolean to write
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -148,7 +139,6 @@ def write_register(
:param value: Value to write
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -162,7 +152,6 @@ def read_exception_status(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_other_msg.ReadExceptionStatusRequest(slave, **kwargs))
Expand All @@ -175,7 +164,6 @@ def diag_query_data(
:param msg: Message to be returned
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnQueryDataRequest(msg, slave, **kwargs))
Expand All @@ -188,7 +176,6 @@ def diag_restart_communication(
:param toggle: True if toogled.
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -202,7 +189,6 @@ def diag_read_diagnostic_register(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnDiagnosticRegisterRequest(slave, **kwargs))
Expand All @@ -214,7 +200,6 @@ def diag_change_ascii_input_delimeter(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ChangeAsciiInputDelimiterRequest(slave, **kwargs))
Expand All @@ -226,7 +211,6 @@ def diag_force_listen_only(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ForceListenOnlyModeRequest(slave, **kwargs))
Expand All @@ -238,7 +222,6 @@ def diag_clear_counters(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ClearCountersRequest(slave, **kwargs))
Expand All @@ -250,7 +233,6 @@ def diag_read_bus_message_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnBusMessageCountRequest(slave, **kwargs))
Expand All @@ -262,7 +244,6 @@ def diag_read_bus_comm_error_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -276,7 +257,6 @@ def diag_read_bus_exception_error_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -290,7 +270,6 @@ def diag_read_slave_message_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnSlaveMessageCountRequest(slave, **kwargs))
Expand All @@ -302,7 +281,6 @@ def diag_read_slave_no_response_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnSlaveNoResponseCountRequest(slave, **kwargs))
Expand All @@ -314,7 +292,6 @@ def diag_read_slave_nak_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnSlaveNAKCountRequest(slave, **kwargs))
Expand All @@ -326,7 +303,6 @@ def diag_read_slave_busy_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnSlaveBusyCountRequest(slave, **kwargs))
Expand All @@ -338,7 +314,6 @@ def diag_read_bus_char_overrun_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -352,7 +327,6 @@ def diag_read_iop_overrun_count(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ReturnIopOverrunCountRequest(slave, **kwargs))
Expand All @@ -364,7 +338,6 @@ def diag_clear_overrun_counter(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.ClearOverrunCountRequest(slave, **kwargs))
Expand All @@ -376,7 +349,6 @@ def diag_getclear_modbus_response(

:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_diag.GetClearModbusPlusRequest(slave, **kwargs))
Expand All @@ -387,7 +359,6 @@ def diag_get_comm_event_counter(
"""Diagnose get event counter (code 0x0B).

:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_other_msg.GetCommEventCounterRequest(**kwargs))
Expand All @@ -398,7 +369,6 @@ def diag_get_comm_event_log(
"""Diagnose get event counter (code 0x0C).

:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_other_msg.GetCommEventLogRequest(**kwargs))
Expand All @@ -412,7 +382,6 @@ def write_coils(
:param values: List of booleans to write
:param slave: (optional) Modbus slave ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -432,7 +401,6 @@ def write_registers(
:param values: List of booleans to write
:param slave: (optional) Modbus slave unit ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -448,7 +416,6 @@ def report_slave_id(

:param slave: (optional) Modbus slave unit ID
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_other_msg.ReportSlaveIdRequest(slave, **kwargs))
Expand All @@ -460,7 +427,6 @@ def read_file_record(

:param records: List of (Reference type, File number, Record Number, Record Length)
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_file_msg.ReadFileRecordRequest(records, **kwargs))
Expand All @@ -472,7 +438,6 @@ def write_file_record(

:param records: List of (Reference type, File number, Record Number, Record Length)
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_file_msg.WriteFileRecordRequest(records, **kwargs))
Expand All @@ -490,7 +455,6 @@ def mask_write_register(
:param and_mask: The and bitmask to apply to the register address
:param or_mask: The or bitmask to apply to the register address
:param kwargs: (optional) Experimental parameters.
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -514,7 +478,6 @@ def readwrite_registers(
:param values: The registers to write to the specified address
:param slave: (optional) Modbus slave unit ID
:param kwargs:
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand All @@ -535,7 +498,6 @@ def read_fifo_queue(

:param address: The address to start reading from
:param kwargs:
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(pdu_file_msg.ReadFifoQueueRequest(address, **kwargs))
Expand All @@ -550,7 +512,6 @@ def read_device_information(
:param read_code: The device information read code
:param object_id: The object to read from
:param kwargs:
:returns: A deferred response handle
:raises ModbusException:
"""
return self.execute(
Expand Down
16 changes: 12 additions & 4 deletions test/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
],
)
@pytest.mark.parametrize(
"method, arg, response",
"method, arg, pdu_request",
[
("read_coils", 1, pdu_bit_read.ReadCoilsRequest),
("read_discrete_inputs", 1, pdu_bit_read.ReadDiscreteInputsRequest),
Expand Down Expand Up @@ -90,10 +90,18 @@
("mask_write_register", 1, pdu_req_write.MaskWriteRegisterRequest),
],
)
def test_client_mixin(arglist, method, arg, response):
def test_client_mixin(arglist, method, arg, pdu_request):
"""Test mixin responses."""
rr = getattr(ModbusClientMixin(), method)(**arglist[arg])
assert isinstance(rr, response)
pdu_to_call = None

def fake_execute(_self, request):
"""Set PDU request."""
nonlocal pdu_to_call
pdu_to_call = request

with mock.patch.object(ModbusClientMixin, "execute", fake_execute):
getattr(ModbusClientMixin(), method)(**arglist[arg])
assert isinstance(pdu_to_call, pdu_request)


@pytest.mark.xdist_group(name="client")
Expand Down