CuteHMI - Modbus (CuteHMI.Modbus.2)
AbstractDevice.hpp
1 #ifndef H_EXTENSIONS_CUTEHMI_MODBUS_2_INCLUDE_CUTEHMI_MODBUS_ABSTRACTDEVICE_HPP
2 #define H_EXTENSIONS_CUTEHMI_MODBUS_2_INCLUDE_CUTEHMI_MODBUS_ABSTRACTDEVICE_HPP
3 
4 #include "internal/common.hpp"
5 #include "internal/RegisterTraits.hpp"
6 #include "InputRegister.hpp"
7 #include "internal/HoldingRegister.hpp"
8 #include "internal/InputRegister.hpp"
9 #include "DiscreteInput.hpp"
10 #include "Coil.hpp"
11 
12 #include <cutehmi/services/Serviceable.hpp>
13 
14 #include <QObject>
15 #include <QUuid>
16 #include <QJsonObject>
17 #include <QJsonArray>
18 #include <QQmlListProperty>
19 #include <QModbusPdu>
20 #include <QLinkedList>
21 
22 namespace cutehmi {
23 namespace modbus {
24 
25 namespace internal {
26 class IterableTasks;
27 }
28 
32 class CUTEHMI_MODBUS_API AbstractDevice:
33  public QObject,
35 {
36  Q_OBJECT
37 
38  friend class test_AbstractDevice;
39  friend class test_AbstractServer;
41 
42  public:
43  enum State {
47  CLOSED
48  };
49  Q_ENUM(State)
50 
51  enum Function {
52  FUNCTION_INVALID = QModbusPdu::Invalid,
53  FUNCTION_READ_COILS = QModbusPdu::ReadCoils,
54  FUNCTION_READ_DISCRETE_INPUTS = QModbusPdu::ReadDiscreteInputs,
55  FUNCTION_READ_HOLDING_REGISTERS = QModbusPdu::ReadHoldingRegisters,
56  FUNCTION_READ_INPUT_REGISTERS = QModbusPdu::ReadInputRegisters,
57  FUNCTION_WRITE_COIL = QModbusPdu::WriteSingleCoil,
58  FUNCTION_WRITE_HOLDING_REGISTER = QModbusPdu::WriteSingleRegister,
59  FUNCTION_READ_EXCEPTION_STATUS = QModbusPdu::ReadExceptionStatus,
60  FUNCTION_DIAGNOSTICS = QModbusPdu::Diagnostics,
61  FUNCTION_FETCH_COMM_EVENT_COUNTER = QModbusPdu::GetCommEventCounter,
62  FUNCTION_FETCH_COMM_EVENT_LOG = QModbusPdu::GetCommEventLog,
63  FUNCTION_WRITE_MULTIPLE_COILS = QModbusPdu::WriteMultipleCoils,
64  FUNCTION_WRITE_MULTIPLE_HOLDING_REGISTERS = QModbusPdu::WriteMultipleRegisters,
65  FUNCTION_REPORT_SLAVE_ID = QModbusPdu::ReportServerId,
66  FUNCTION_READ_FILE_RECORD = QModbusPdu::ReadFileRecord,
67  FUNCTION_WRITE_FILE_RECORD = QModbusPdu::WriteFileRecord,
68  FUNCTION_MASK_WRITE_HOLDING_REGISTER = QModbusPdu::MaskWriteRegister,
69  FUNCTION_READ_WRITE_MULTIPLE_HOLDING_REGISTERS = QModbusPdu::ReadWriteMultipleRegisters,
70  FUNCTION_READ_FIFO_QUEUE = QModbusPdu::ReadFifoQueue,
71  // FUNCTION_ENCAPSULATED_INTERFACE_TRANSPORT = QModbusPdu::EncapsulatedInterfaceTransport, // Currently not implemented.
72  FUNCTION_UNDEFINED = QModbusPdu::UndefinedFunctionCode,
77  FUNCTION_RAW
78  };
79  Q_ENUM(Function)
80 
81  enum DiagnosticsSubfunction : quint16 {
82  DIAGNOSTICS_RETURN_QUERY_DATA = 0x00,
83  DIAGNOSTICS_RESTART_COMM_OPTION = 0x01,
84  DIAGNOSTICS_RETURN_DIAGNOSTICS_REGISTER = 0x02,
85  DIAGNOSTICS_CHANGE_ASCII_INPUT_DELIMITER = 0x03,
86  DIAGNOSTICS_FORCE_LISTEN_ONLY_MODE = 0x04,
87  DIAGNOSTICS_CLEAR_COUNTERS_AND_DIAGNOSTICS_REGISTER = 0x0A,
88  DIAGNOSTICS_RETURN_BUS_MESSAGE_COUNT = 0x0B,
89  DIAGNOSTICS_RETURN_BUS_COMM_ERROR_COUNT = 0x0C,
90  DIAGNOSTICS_RETURN_BUS_EXCEPTION_ERROR_COUNT = 0x0D,
91  DIAGNOSTICS_RETURN_SLAVE_MESSAGE_COUNT = 0x0E,
92  DIAGNOSTICS_RETURN_SLAVE_NO_RESPONSE_COUNT = 0x0F,
93  DIAGNOSTICS_RETURN_SLAVE_NAK_COUNT = 0x10,
94  DIAGNOSTICS_RETURN_SLAVE_BUSY_COUNT = 0x11,
95  DIAGNOSTICS_RETURN_BUS_CHARACTER_OVERRUN_COUNT = 0x12,
96  DIAGNOSTICS_RETURN_IOP_OVERRUN_COUNT = 0x13,
97  DIAGNOSTICS_CLEAR_OVERRUN_COUNTER_AND_FLAG = 0x14,
98  DIAGNOSTICS_GET_CLEAR_MODBUS_PLUS_STATISTICS = 0x15
99  };
100  Q_ENUM(DiagnosticsSubfunction)
101 
102 
117 
121  static constexpr int MAX_READ_TCP_COILS = 1976;
122 
126  static constexpr int MAX_READ_RTU_COILS = 2008;
127 
131  static constexpr int MAX_WRITE_TCP_COILS = 1944;
132 
136  static constexpr int MAX_WRITE_RTU_COILS = 1976;
137 
141  static constexpr int MAX_READ_TCP_DISCRETE_INPUTS = 1976;
142 
146  static constexpr int MAX_READ_RTU_DISCRETE_INPUTS = 2008;
147 
151  static constexpr int MAX_READ_TCP_HOLDING_REGISTERS = 123;
152 
156  static constexpr int MAX_READ_RTU_HOLDING_REGISTERS = 125;
157 
161  static constexpr int MAX_WRITE_TCP_HOLDING_REGISTERS = 123;
162 
166  static constexpr int MAX_WRITE_RTU_HOLDING_REGISTERS = 125;
167 
171  static constexpr int MAX_READ_TCP_INPUT_REGISTERS = 123;
172 
176  static constexpr int MAX_READ_RTU_INPUT_REGISTERS = 125;
178 
179  static constexpr quint16 MIN_ADDRESS = 0;
180  static constexpr quint16 MAX_ADDRESS = 65535;
181 
182  static constexpr int INITIAL_MAX_READ_COILS = 16; // Max RTU: 2008, Max TCP: 1976
183  static constexpr int INITIAL_MAX_WRITE_COILS = 16; // Max RTU: 1976, Max TCP: 1944
184  static constexpr int INITIAL_MAX_READ_DISCRETE_INPUTS = 16; // Max RTU: 2008, Max TCP: 1976
185  static constexpr int INITIAL_MAX_WRITE_DISCRETE_INPUTS = 16; // Max RTU: N/A, Max TCP: N/A
186  static constexpr int INITIAL_MAX_READ_HOLDING_REGISTERS = 16; // Max RTU: 125, Max TCP: 123
187  static constexpr int INITIAL_MAX_WRITE_HOLDING_REGISTERS = 16; // Max RTU: 123, Max TCP: 121
188  static constexpr int INITIAL_MAX_READ_INPUT_REGISTERS = 16; // Max RTU: 125, Max TCP: 123
189  static constexpr int INITIAL_MAX_WRITE_INPUT_REGISTERS = 16; // Max RTU: N/A, Max TCP: N/A
190  static constexpr State INITIAL_STATE = CLOSED;
191  static constexpr bool INITIAL_READY = false;
192 
193  Q_PROPERTY(State state READ state NOTIFY stateChanged)
194  Q_PROPERTY(bool ready READ ready NOTIFY readyChanged)
195  Q_PROPERTY(int maxReadCoils READ maxReadCoils WRITE setMaxReadCoils NOTIFY maxReadCoilsChanged)
196  Q_PROPERTY(int maxWriteCoils READ maxWriteCoils WRITE setMaxWriteCoils NOTIFY maxWriteCoilsChanged)
197  Q_PROPERTY(int maxReadDiscreteInputs READ maxReadDiscreteInputs WRITE setMaxReadDiscreteInputs NOTIFY maxReadDiscreteInputsChanged)
198  Q_PROPERTY(int maxWriteDiscreteInputs READ maxWriteDiscreteInputs WRITE setMaxWriteDiscreteInputs NOTIFY maxWriteDiscreteInputsChanged)
199  Q_PROPERTY(int maxReadHoldingRegisters READ maxReadHoldingRegisters WRITE setMaxReadHoldingRegisters NOTIFY maxReadHoldingRegistersChanged)
200  Q_PROPERTY(int maxWriteHoldingRegisters READ maxWriteHoldingRegisters WRITE setMaxWriteHoldingRegisters NOTIFY maxWriteHoldingRegistersChanged)
201  Q_PROPERTY(int maxReadInputRegisters READ maxReadInputRegisters WRITE setMaxReadInputRegisters NOTIFY maxReadInputRegistersChanged)
202  Q_PROPERTY(int maxWriteInputRegisters READ maxWriteInputRegisters WRITE setMaxWriteInputRegisters NOTIFY maxWriteInputRegistersChanged)
203 
204  State state() const;
205 
210  bool ready() const;
211 
212  int maxReadCoils() const;
213 
214  void setMaxReadCoils(int maxReadCoils);
215 
216  int maxWriteCoils() const;
217 
218  void setMaxWriteCoils(int maxWriteCoils);
219 
220  int maxReadDiscreteInputs() const;
221 
222  void setMaxReadDiscreteInputs(int maxReadDiscreteInputs);
223 
224  int maxWriteDiscreteInputs() const;
225 
226  void setMaxWriteDiscreteInputs(int maxWriteDiscreteInputs);
227 
228  int maxReadHoldingRegisters() const;
229 
230  void setMaxReadHoldingRegisters(int maxReadHoldingRegisters);
231 
232  int maxWriteHoldingRegisters() const;
233 
234  void setMaxWriteHoldingRegisters(int maxWriteHoldingRegisters);
235 
236  int maxReadInputRegisters() const;
237 
238  void setMaxReadInputRegisters(int maxReadInputRegisters);
239 
240  int maxWriteInputRegisters() const;
241 
242  void setMaxWriteInputRegisters(int maxWriteInputRegisters);
243 
244  Coil * coilAt(quint16 address);
245 
246  DiscreteInput * discreteInputAt(quint16 address);
247 
248  HoldingRegister * holdingRegisterAt(quint16 address);
249 
250  InputRegister * inputRegisterAt(quint16 address);
251 
262  Q_INVOKABLE void requestReadCoils(quint16 address, quint16 amount = 1, QUuid * requestId = nullptr);
263 
271  Q_INVOKABLE void requestWriteCoil(quint16 address, bool value, QUuid * requestId = nullptr);
272 
281  Q_INVOKABLE void requestWriteMultipleCoils(quint16 address, QJsonArray values, QUuid * requestId = nullptr);
282 
293  Q_INVOKABLE void requestReadDiscreteInputs(quint16 address, quint16 amount = 1, QUuid * requestId = nullptr);
294 
303  Q_INVOKABLE void requestWriteDiscreteInput(quint16 address, bool value, QUuid * requestId = nullptr);
304 
313  Q_INVOKABLE void requestWriteMultipleDiscreteInputs(quint16 address, QJsonArray values, QUuid * requestId = nullptr);
314 
326  Q_INVOKABLE void requestReadHoldingRegisters(quint16 address, quint16 amount = 1, QUuid * requestId = nullptr);
327 
336  Q_INVOKABLE void requestWriteHoldingRegister(quint16 address, quint16 value, QUuid * requestId = nullptr);
337 
346  Q_INVOKABLE void requestWriteMultipleHoldingRegisters(quint16 address, QJsonArray values, QUuid * requestId = nullptr);
347 
359  Q_INVOKABLE void requestReadInputRegisters(quint16 address, quint16 amount = 1, QUuid * requestId = nullptr);
360 
369  Q_INVOKABLE void requestWriteInputRegister(quint16 address, quint16 value, QUuid * requestId = nullptr);
370 
379  Q_INVOKABLE void requestWriteMultipleInputRegisters(quint16 address, QJsonArray values, QUuid * requestId = nullptr);
380 
389  Q_INVOKABLE void requestDiagnostics(DiagnosticsSubfunction subfunction, quint16 data, QUuid * requestId = nullptr);
390 
396  Q_INVOKABLE void requestReadExceptionStatus(QUuid * requestId = nullptr);
397 
403  Q_INVOKABLE void requestFetchCommEventCounter(QUuid * requestId = nullptr);
404 
410  Q_INVOKABLE void requestFetchCommEventLog(QUuid * requestId = nullptr);
411 
417  Q_INVOKABLE void requestReportSlaveId(QUuid * requestId = nullptr);
418 
429  Q_INVOKABLE void requestMaskWriteHoldingRegister(quint16 address, quint16 andMask, quint16 orMask, QUuid * requestId = nullptr);
430 
441  Q_INVOKABLE void requestReadWriteMultipleHoldingRegisters(quint16 readAddress, quint16 amount, quint16 writeAddress, QJsonArray values, QUuid * requestId = nullptr);
442 
450  Q_INVOKABLE void requestReadFIFOQueue(quint16 address, QUuid * requestId = nullptr);
451 
461  Q_INVOKABLE QJsonObject readFileRecordSubrequest(quint16 file, quint16 address, quint16 amount);
462 
473  Q_INVOKABLE void requestReadFileRecord(QJsonArray subrequests, QUuid * requestId = nullptr);
474 
484  Q_INVOKABLE QJsonObject writeFileRecordSubrequest(quint16 file, quint16 address, QJsonArray values);
485 
496  Q_INVOKABLE void requestWriteFileRecord(QJsonArray subrequests, QUuid * requestId = nullptr);
497 
512  Q_INVOKABLE void request(Function function, QJsonObject payload, QUuid * requestId = nullptr);
513 
514  public slots:
515  virtual void open() = 0;
516 
517  virtual void close() = 0;
518 
519  signals:
520  void stateChanged();
521 
522  void readyChanged();
523 
524  void maxReadCoilsChanged();
525 
526  void maxWriteCoilsChanged();
527 
528  void maxReadDiscreteInputsChanged();
529 
530  void maxWriteDiscreteInputsChanged();
531 
532  void maxReadHoldingRegistersChanged();
533 
534  void maxWriteHoldingRegistersChanged();
535 
536  void maxReadInputRegistersChanged();
537 
538  void maxWriteInputRegistersChanged();
539 
540  void requestCompleted(QJsonObject request, QJsonObject reply);
541 
542  protected:
543  typedef typename internal::RegisterTraits<internal::Coil>::Container CoilDataContainer;
544  typedef typename internal::RegisterTraits<internal::DiscreteInput>::Container DiscreteInputDataContainer;
545  typedef typename internal::RegisterTraits<internal::HoldingRegister>::Container HoldingRegisterDataContainer;
546  typedef typename internal::RegisterTraits<internal::InputRegister>::Container InputRegisterDataContainer;
547 
548  AbstractDevice(QObject * parent = nullptr);
549 
556  ~AbstractDevice() override;
557 
568  virtual void handleRequest(const QJsonObject & request) = 0;
569 
570  const CoilDataContainer & coilData() const;
571 
572  CoilDataContainer & coilData();
573 
574  const DiscreteInputDataContainer & discreteInputData() const;
575 
576  DiscreteInputDataContainer & discreteInputData();
577 
578  const HoldingRegisterDataContainer & holdingRegisterData() const;
579 
580  HoldingRegisterDataContainer & holdingRegisterData();
581 
582  const InputRegisterDataContainer & inputRegisterData() const;
583 
584  InputRegisterDataContainer & inputRegisterData();
585 
586  QJsonObject pendingRequest(QUuid requestId) const;
587 
588  QJsonObject takePendingRequest(QUuid requestId);
589 
590  protected slots:
596  virtual void handleReply(QUuid requestId, QJsonObject reply);
597 
598  void setState(State state);
599 
600  void setReady(bool ready);
601 
602  private:
604 
605  static void ValidatePayloadAddressKey(const QJsonObject & json, const QString & key = "address");
606 
607  static void ValidatePayloadAmountKey(const QJsonObject & json, int max);
608 
609  static void ValidatePayloadValueKeyInt(const QJsonObject & json);
610 
611  static void ValidatetPayloadValueKeyBool(const QJsonObject & json);
612 
613  static void ValidatePayloadReadFileRecordSubrequestsKey(const QJsonObject & json);
614 
615  static void ValidatePayloadWriteFileRecordSubrequestsKey(const QJsonObject & json);
616 
617  static void ValidateBoolKey(const QJsonObject & json, const QString & key, const QString & path = "");
618 
619  static void ValidateNumberKey(const QJsonObject & json, const QString & key, const QString & path = "");
620 
621  static void ValidateArrayKey(const QJsonObject & json, const QString & key, const QString & path = "");
622 
623  static void ValidateNumberArrayKey(const QJsonObject & json, const QString & key, const QString & path = "");
624 
625  static void ValidateBoolArrayKey(const QJsonObject & json, const QString & key, const QString & path = "");
626 
627  static void ValidateObjectArrayKey(const QJsonObject & json, const QString & key, const QString & path = "", std::function<void(const QJsonObject & json, const QString & path)> filter = nullptr);
628 
629  static void ValidateReadFileRecordSubresponsesKey(const QJsonObject & json, const QString & path = "");
630 
631  static void ValidateWriteFileRecordSubresponsesKey(const QJsonObject & json, const QString & path = "");
632 
633  bool validateRequest(const QJsonObject & request);
634 
635  bool validateReply(const QJsonObject & request, const QJsonObject & reply);
636 
637  struct Members
638  {
639  State state;
640  bool ready;
641  int maxReadCoils;
642  int maxWriteCoils;
643  int maxReadDiscreteInputs;
644  int maxWriteDiscreteInputs;
645  int maxReadHoldingRegisters;
646  int maxWriteHoldingRegisters;
647  int maxReadInputRegisters;
648  int maxWriteInputRegisters;
649  InputRegisterDataContainer inputRegisters;
650  HoldingRegisterDataContainer holdingRegisters;
651  DiscreteInputDataContainer discreteInputs;
652  CoilDataContainer coils;
653  PendingRequestsContainer pendingRequests;
654 
655  Members():
663  maxWriteHoldingRegisters(AbstractDevice::INITIAL_MAX_WRITE_HOLDING_REGISTERS),
666  {
667  }
668  };
669 
670  MPtr<Members> m;
671 };
672 
673 }
674 }
675 
676 Q_DECLARE_METATYPE(cutehmi::modbus::AbstractDevice::State) // Must use this macro despite using Q_ENUM to register metatype inside Init.
677 
678 #endif
679 
680 //(c)C: Copyright © 2019-2020, Michał Policht <michal@policht.pl>. All rights reserved.
681 //(c)C: This file is a part of CuteHMI.
682 //(c)C: CuteHMI is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
683 //(c)C: CuteHMI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
684 //(c)C: You should have received a copy of the GNU Lesser General Public License along with CuteHMI. If not, see <https://www.gnu.org/licenses/>.
cutehmi::modbus::AbstractDevice::OPENING
@ OPENING
Definition: AbstractDevice.hpp:44
cutehmi::modbus::AbstractDevice::INITIAL_MAX_READ_COILS
static constexpr int INITIAL_MAX_READ_COILS
Definition: AbstractDevice.hpp:182
cutehmi::modbus::AbstractDevice::CoilDataContainer
internal::RegisterTraits< internal::Coil >::Container CoilDataContainer
Definition: AbstractDevice.hpp:543
cutehmi::modbus::AbstractDevice::FUNCTION_WRITE_DISCRETE_INPUT
@ FUNCTION_WRITE_DISCRETE_INPUT
Definition: AbstractDevice.hpp:73
cutehmi::modbus::AbstractDevice::INITIAL_STATE
static constexpr State INITIAL_STATE
Definition: AbstractDevice.hpp:190
QUuid
cutehmi::modbus::AbstractDevice
Abstract Modbus device.
Definition: AbstractDevice.hpp:32
cutehmi::modbus::AbstractDevice::INITIAL_MAX_WRITE_HOLDING_REGISTERS
static constexpr int INITIAL_MAX_WRITE_HOLDING_REGISTERS
Definition: AbstractDevice.hpp:187
cutehmi::modbus::AbstractDevice::INITIAL_READY
static constexpr bool INITIAL_READY
Definition: AbstractDevice.hpp:191
cutehmi::modbus::Register1
Cached properties of 1 bit register.
Definition: Register1.hpp:14
cutehmi::modbus::AbstractDevice::CLOSING
@ CLOSING
Definition: AbstractDevice.hpp:46
cutehmi::modbus::AbstractDevice::FUNCTION_WRITE_INPUT_REGISTER
@ FUNCTION_WRITE_INPUT_REGISTER
Definition: AbstractDevice.hpp:75
cutehmi::modbus::AbstractDevice::INITIAL_MAX_READ_DISCRETE_INPUTS
static constexpr int INITIAL_MAX_READ_DISCRETE_INPUTS
Definition: AbstractDevice.hpp:184
cutehmi::modbus::AbstractDevice::INITIAL_MAX_READ_HOLDING_REGISTERS
static constexpr int INITIAL_MAX_READ_HOLDING_REGISTERS
Definition: AbstractDevice.hpp:186
cutehmi::modbus::internal::IterableTasks
Definition: IterableTasks.hpp:16
cutehmi::MPtr< Members >
QObject
QLinkedList
cutehmi::modbus::AbstractDevice::FUNCTION_WRITE_MULTIPLE_INPUT_REGISTERS
@ FUNCTION_WRITE_MULTIPLE_INPUT_REGISTERS
Definition: AbstractDevice.hpp:76
cutehmi
QJsonArray
QString
cutehmi::services::Serviceable
cutehmi::modbus::AbstractDevice::OPENED
@ OPENED
Definition: AbstractDevice.hpp:45
cutehmi::modbus::AbstractDevice::HoldingRegisterDataContainer
internal::RegisterTraits< internal::HoldingRegister >::Container HoldingRegisterDataContainer
Definition: AbstractDevice.hpp:545
cutehmi::modbus::AbstractDevice::State
State
Definition: AbstractDevice.hpp:43
QJsonObject
cutehmi::modbus::AbstractDevice::FUNCTION_WRITE_MULTIPLE_DISCRETE_INPUTS
@ FUNCTION_WRITE_MULTIPLE_DISCRETE_INPUTS
Definition: AbstractDevice.hpp:74
cutehmi::modbus::AbstractDevice::INITIAL_MAX_READ_INPUT_REGISTERS
static constexpr int INITIAL_MAX_READ_INPUT_REGISTERS
Definition: AbstractDevice.hpp:188
cutehmi::modbus::AbstractDevice::DiscreteInputDataContainer
internal::RegisterTraits< internal::DiscreteInput >::Container DiscreteInputDataContainer
Definition: AbstractDevice.hpp:544
std
cutehmi::modbus::AbstractDevice::INITIAL_MAX_WRITE_INPUT_REGISTERS
static constexpr int INITIAL_MAX_WRITE_INPUT_REGISTERS
Definition: AbstractDevice.hpp:189
cutehmi::modbus::AbstractDevice::INITIAL_MAX_WRITE_COILS
static constexpr int INITIAL_MAX_WRITE_COILS
Definition: AbstractDevice.hpp:183
cutehmi::modbus::AbstractDevice::INITIAL_MAX_WRITE_DISCRETE_INPUTS
static constexpr int INITIAL_MAX_WRITE_DISCRETE_INPUTS
Definition: AbstractDevice.hpp:185
cutehmi::modbus::AbstractDevice::Function
Function
Definition: AbstractDevice.hpp:51
cutehmi::modbus::AbstractDevice::DiagnosticsSubfunction
DiagnosticsSubfunction
Definition: AbstractDevice.hpp:81
cutehmi::modbus::Register16
Cached properties of 16 bit register.
Definition: Register16.hpp:14
cutehmi::modbus::AbstractDevice::InputRegisterDataContainer
internal::RegisterTraits< internal::InputRegister >::Container InputRegisterDataContainer
Definition: AbstractDevice.hpp:546