Dynamic Modbus Master
A dynamic wrapper for the modbus master part of esp-modbus written in C++.
 
Loading...
Searching...
No Matches
SlaveDevice.h
Go to the documentation of this file.
1//Copyright (c) 2024 Dominik M. Glogowski
2//
3//Permission is hereby granted, free of charge, to any person obtaining a copy
4//of this software and associated documentation files (the "Software"), to deal
5//in the Software without restriction, including without limitation the rights
6//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7//copies of the Software, and to permit persons to whom the Software is
8//furnished to do so, subject to the following conditions:
9//
10//The above copyright notice and this permission notice shall be included in all
11//copies or substantial portions of the Software.
12//
13//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19//SOFTWARE.
20
21#ifndef DYNAMIC_MODBUS_MASTER_SLAVEDEVICE_H
22#define DYNAMIC_MODBUS_MASTER_SLAVEDEVICE_H
23#include "ModbusData.hpp"
24#include <ModbusError.h>
25#include <esp_modbus_master.h>
26#include <SlaveDeviceIfc.h>
27
39class SlaveDevice: public SlaveDeviceIfc<SlaveDevice>{
40public:
46 SlaveDevice(uint8_t address, uint8_t retries);
47
48 ~SlaveDevice() override = default;
49
66 template<ModbusData T>
67 ModbusError writeHolding(uint16_t reg, T data) const {
68 mb_param_request_t request {
69 .slave_addr = m_address,
70 .command = 0x06,
71 .reg_start = reg,
72 .reg_size = (std::is_same_v<bool, T>? 1 : sizeof(T) / 2)
73 };
74 if (request.reg_size > 1) {
75 request.command = 0x10;
76 }
77 return sendRequest(request, &data);
78 }
79
90 template<ModbusData T>
91 SlaveReturn<T> readHolding(uint16_t reg) const {
92 mb_param_request_t request {
93 .slave_addr = m_address,
94 .command = 0x03,
95 .reg_start = reg,
96 .reg_size = sizeof(T) / sizeof(uint16_t)
97 };
98
99 T data = 0;
100 ModbusError error = sendRequest(request, &data);
101
102 return SlaveReturn{error, data};
103 }
104
105
122 template<ModbusData T>
123 ModbusError writeCoils(uint16_t reg, const T data, uint16_t coilNum) const {
124 if (std::is_same_v<T, bool> && coilNum == 1) {
125 mb_param_request_t request {
126 .slave_addr = m_address,
127 .command = 0x05,
128 .reg_start = reg,
129 .reg_size = coilNum
130 };
131
132 uint16_t sendData = (data == true ? 0xFF00 : 0x0000);
133
134 return sendRequest(request, &sendData);
135 } else if (!(std::is_same_v<T, bool>) && (coilNum > 1)){
136 T sendData = data;
137 mb_param_request_t request {
138 .slave_addr = m_address,
139 .command = 0x0F,
140 .reg_start = reg,
141 .reg_size = coilNum
142 };
143
144 return sendRequest(request, &sendData);
145 } else {
147 }
148 }
149
163 template<ModbusData T>
164 SlaveReturn<T> readCoils(uint16_t reg, uint16_t coilNum) {
165 mb_param_request_t request {
166 .slave_addr = m_address,
167 .command = 0x01,
168 .reg_start = reg,
169 .reg_size = coilNum
170 };
171 if (std::is_same_v<T, bool> && coilNum == 1) {
172 uint8_t data = 0;
173 ModbusError error = sendRequest(request, &data);
174 return {error, (data != 0)};
175 } else if (!(std::is_same_v<T, bool> && coilNum > 1)) {
176 T data;
177 ModbusError error = sendRequest(request, &data);
178 return {error, data};
179 } else {
180 return {ModbusError::INVALID_ARG, 0};
181 }
182 }
183
194 template<ModbusData T>
196 mb_param_request_t request {
197 .slave_addr = m_address,
198 .command = 0x04,
199 .reg_start = reg,
200 .reg_size = (std::is_same_v<bool, T>? 1 : sizeof(T) / 2)
201 };
202
203 T data = 0;
204 ModbusError error;
205 error = sendRequest(request, &data);
206
207 return {error, data};
208 }
209
217 template<ModbusData T>
219 mb_param_request_t request {
220 .slave_addr = m_address,
221 .command = 0x02,
222 .reg_start = reg,
223 .reg_size = (std::is_same_v<bool, T>? 1 : sizeof(T) * 8)
224 };
225
226 if (std::is_same_v<bool, T>) {
227 uint8_t data = 0;
228 ModbusError error;
229 error = sendRequest(request, &data);
230
231 return {error, (data != 0)};
232 } else {
233 T data = 0;
234 ModbusError error;
235 error = sendRequest(request, &data);
236
237 return {error, data};
238 }
239 }
240
241private:
242 uint8_t m_address;
243 uint8_t m_retries;
244
265 ModbusError sendRequest(mb_param_request_t request, void* data) const;
266};
267}
268#endif //DYNAMIC_MODBUS_MASTER_SLAVEDEVICE_H
Interface class for slave devices in a Modbus network.
Definition SlaveDeviceIfc.h:47
A class representing a slave device in a Modbus network.
Definition SlaveDevice.h:39
ModbusError sendRequest(mb_param_request_t request, void *data) const
Helper function to send a modbus request.
Definition SlaveDevice.cpp:25
uint8_t m_retries
Definition SlaveDevice.h:243
uint8_t m_address
Definition SlaveDevice.h:242
SlaveReturn< T > readInputs(uint16_t reg)
Reads data from the input registers of a Modbus slave device.
Definition SlaveDevice.h:195
ModbusError writeHolding(uint16_t reg, T data) const
Writes data to the holding registers of a Modbus slave device.
Definition SlaveDevice.h:67
ModbusError writeCoils(uint16_t reg, const T data, uint16_t coilNum) const
Writes data to the coils of a Modbus slave device.
Definition SlaveDevice.h:123
SlaveReturn< T > readHolding(uint16_t reg) const
Reads data from the holding registers of a Modbus slave device.
Definition SlaveDevice.h:91
SlaveReturn< T > readDiscreteInputs(uint16_t reg)
Reads data from the discrete inputs of a Modbus slave device.
Definition SlaveDevice.h:218
SlaveReturn< T > readCoils(uint16_t reg, uint16_t coilNum)
Reads data from the coils of a Modbus slave device.
Definition SlaveDevice.h:164
Definition ModbusData.hpp:45
ModbusError
Modbus Error Type Enum.
Definition ModbusError.h:30
@ INVALID_ARG
A given Argument was invalid.
Represents the return value from a Modbus slave device.
Definition ModbusData.hpp:58