This is an automated email from the ASF dual-hosted git repository. hutcheb pushed a commit to branch feat/plc4py/modbus_write in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feat/plc4py/modbus_write by this push: new 2690b57933 feat(plc4py): clean up comparisons of PlcValues 2690b57933 is described below commit 2690b579330b6bb1f8aadcc9d7e848c31c6acae8 Author: hutcheb <ben.hut...@gmail.com> AuthorDate: Fri Aug 30 18:37:21 2024 +0800 feat(plc4py): clean up comparisons of PlcValues --- plc4py/plc4py/api/value/PlcValue.py | 3 ++ plc4py/plc4py/drivers/modbus/ModbusConnection.py | 8 +++- plc4py/plc4py/drivers/modbus/ModbusDevice.py | 49 ++++++++++++++++-------- plc4py/plc4py/spi/values/PlcValues.py | 34 +--------------- 4 files changed, 43 insertions(+), 51 deletions(-) diff --git a/plc4py/plc4py/api/value/PlcValue.py b/plc4py/plc4py/api/value/PlcValue.py index 972e689632..cd0082be3a 100644 --- a/plc4py/plc4py/api/value/PlcValue.py +++ b/plc4py/plc4py/api/value/PlcValue.py @@ -51,6 +51,9 @@ class PlcValue(Generic[T], ABC): return len(self.value) return 1 + def __eq__(self, other): + return other == self.value + class PlcResponseCode(Enum): OK = auto() diff --git a/plc4py/plc4py/drivers/modbus/ModbusConnection.py b/plc4py/plc4py/drivers/modbus/ModbusConnection.py index ac964974b7..d12b437f6a 100644 --- a/plc4py/plc4py/drivers/modbus/ModbusConnection.py +++ b/plc4py/plc4py/drivers/modbus/ModbusConnection.py @@ -25,7 +25,8 @@ from plc4py.api.messages.PlcRequest import ( PlcReadRequest, PlcRequest, PlcWriteRequest, - ReadRequestBuilder, WriteRequestBuilder, + ReadRequestBuilder, + WriteRequestBuilder, ) from plc4py.api.messages.PlcResponse import ( PlcResponse, @@ -39,7 +40,10 @@ from plc4py.drivers.modbus.ModbusProtocol import ModbusProtocol from plc4py.drivers.modbus.ModbusTag import ModbusTagBuilder from plc4py.drivers.PlcDriverLoader import PlcDriverLoader from plc4py.spi.messages.PlcReader import DefaultPlcReader -from plc4py.spi.messages.PlcRequest import DefaultReadRequestBuilder, DefaultWriteRequestBuilder +from plc4py.spi.messages.PlcRequest import ( + DefaultReadRequestBuilder, + DefaultWriteRequestBuilder, +) from plc4py.spi.messages.PlcWriter import DefaultPlcWriter from plc4py.spi.transport.Plc4xBaseTransport import Plc4xBaseTransport from plc4py.spi.transport.TCPTransport import TCPTransport diff --git a/plc4py/plc4py/drivers/modbus/ModbusDevice.py b/plc4py/plc4py/drivers/modbus/ModbusDevice.py index 8cc11ee7f4..5263168585 100644 --- a/plc4py/plc4py/drivers/modbus/ModbusDevice.py +++ b/plc4py/plc4py/drivers/modbus/ModbusDevice.py @@ -53,13 +53,15 @@ from plc4py.protocols.modbus.readwrite.ModbusTcpADU import ModbusTcpADU from plc4py.spi.generation.ReadBuffer import ReadBuffer, ReadBufferByteBased from plc4py.spi.generation.WriteBuffer import WriteBufferByteBased from plc4py.spi.messages.utils.ResponseItem import ResponseItem -from plc4py.spi.values.PlcValues import PlcList, PlcNull +from plc4py.spi.values.PlcValues import PlcList, PlcNull, PlcBOOL from plc4py.utils.GenericTypes import AtomicInteger, ByteOrder -from protocols.modbus.readwrite.ModbusPDUWriteMultipleCoilsRequest import ModbusPDUWriteMultipleCoilsRequest -from protocols.modbus.readwrite.ModbusPDUWriteMultipleHoldingRegistersRequest import \ - ModbusPDUWriteMultipleHoldingRegistersRequest, ModbusPDUWriteMultipleHoldingRegistersRequestBuilder -from protocols.modbus.readwrite.ModbusPDUWriteSingleCoilRequest import ModbusPDUWriteSingleCoilRequest +from plc4py.protocols.modbus.readwrite.ModbusPDUWriteMultipleCoilsRequest import ( + ModbusPDUWriteMultipleCoilsRequest, +) +from plc4py.protocols.modbus.readwrite.ModbusPDUWriteMultipleHoldingRegistersRequest import ( + ModbusPDUWriteMultipleHoldingRegistersRequestBuilder, +) @dataclass @@ -137,16 +139,23 @@ class ModbusDevice: a.frombytes(bytearray(result.value)) a.bytereverse() read_buffer = ReadBufferByteBased(bytearray(a), ByteOrder.BIG_ENDIAN) + quantity = request.tags[request.tag_names[0]].quantity + if quantity == 1: + returned_value = PlcBOOL(read_buffer.read_bit("")) + else: + returned_value = [] + for _ in range(quantity): + returned_value.append(PlcBOOL(read_buffer.read_bit(""))) else: read_buffer = ReadBufferByteBased( bytearray(result.value), ByteOrder.BIG_ENDIAN ) - returned_value = DataItem.static_parse( - read_buffer, - request.tags[request.tag_names[0]].data_type, - request.tags[request.tag_names[0]].quantity, - True, - ) + returned_value = DataItem.static_parse( + read_buffer, + request.tags[request.tag_names[0]].data_type, + request.tags[request.tag_names[0]].quantity, + True, + ) response_item = ResponseItem(PlcResponseCode.OK, returned_value) @@ -175,13 +184,21 @@ class ModbusDevice: message_future = loop.create_future() if isinstance(tag, ModbusTagCoil): - pdu = ModbusPDUWriteMultipleCoilsRequest(tag.address, tag.quantity, [v for k, v in request.values]) + pdu = ModbusPDUWriteMultipleCoilsRequest( + tag.address, tag.quantity, [v for k, v in request.values] + ) elif isinstance(tag, ModbusTagDiscreteInput): - raise PlcRuntimeException("Modbus doesn't support writing to discrete inputs") + raise PlcRuntimeException( + "Modbus doesn't support writing to discrete inputs" + ) elif isinstance(tag, ModbusTagInputRegister): - raise PlcRuntimeException("Modbus doesn't support writing to input registers") + raise PlcRuntimeException( + "Modbus doesn't support writing to input registers" + ) elif isinstance(tag, ModbusTagHoldingRegister): - pdu = ModbusPDUWriteMultipleHoldingRegistersRequestBuilder(tag.address, tag.quantity, request.values).build() + pdu = ModbusPDUWriteMultipleHoldingRegistersRequestBuilder( + tag.address, tag.quantity, request.values + ).build() else: raise NotImplementedError( "Modbus tag type not implemented " + str(tag.__class__) @@ -206,4 +223,4 @@ class ModbusDevice: await message_future result = message_future.result() - pass \ No newline at end of file + pass diff --git a/plc4py/plc4py/spi/values/PlcValues.py b/plc4py/plc4py/spi/values/PlcValues.py index d2c44e78c2..437c6a795f 100644 --- a/plc4py/plc4py/spi/values/PlcValues.py +++ b/plc4py/plc4py/spi/values/PlcValues.py @@ -19,164 +19,132 @@ from dataclasses import dataclass from typing import Any, Dict, List -from plc4py.api.value.PlcValue import PlcValue +from ...api.value.PlcValue import PlcValue -@dataclass class PlcINT(PlcValue[int]): pass -@dataclass class PlcBYTE(PlcValue[int]): pass -@dataclass class PlcCHAR(PlcValue[str]): pass -@dataclass class PlcDATE(PlcValue[int]): pass -@dataclass class PlcDATE_AND_TIME(PlcValue[int]): pass -@dataclass class PlcDINT(PlcValue[int]): pass -@dataclass class PlcDWORD(PlcValue[int]): pass -@dataclass class PlcLDATE(PlcValue[int]): pass -@dataclass class PlcLDATE_AND_TIME(PlcValue[int]): pass -@dataclass class PlcLINT(PlcValue[int]): pass -@dataclass class PlcList(PlcValue[List[Any]]): pass -@dataclass class PlcLREAL(PlcValue[float]): pass -@dataclass class PlcLTIME(PlcValue[int]): pass -@dataclass class PlcLTIME_OF_DAY(PlcValue[int]): pass -@dataclass class PlcLWORD(PlcValue[int]): pass -@dataclass class PlcNull(PlcValue[None]): pass -@dataclass class PlcRawByteArray(List[PlcValue[Any]]): pass -@dataclass class PlcREAL(PlcValue[float]): pass -@dataclass class PlcSINT(PlcValue[int]): pass -@dataclass class PlcSTRING(PlcValue[str]): pass -@dataclass class PlcStruct(PlcValue[Dict[str, PlcValue[str]]]): pass -@dataclass class PlcTIME(PlcValue[int]): pass -@dataclass class PlcTIME_OF_DAY(PlcValue[int]): pass -@dataclass class PlcUBINT(PlcValue[int]): pass -@dataclass class PlcUDINT(PlcValue[int]): pass -@dataclass class PlcUINT(PlcValue[int]): pass -@dataclass class PlcULINT(PlcValue[int]): pass -@dataclass class PlcUSINT(PlcValue[int]): pass -@dataclass class PlcWCHAR(PlcValue[str]): pass -@dataclass class PlcWORD(PlcValue[int]): pass -@dataclass class PlcWSTRING(PlcValue[str]): pass -@dataclass class PlcBOOL(PlcValue[bool]): pass