7#ifndef MODBUSPP_MODBUS_H
8#define MODBUSPP_MODBUS_H
13#include <sys/socket.h>
14#include <netinet/in.h>
19#define MAX_MSG_LENGTH 260
65 void modbus_read(
int address,
int amount,
int func );
66 void modbus_write(
int address,
int amount,
int func, uint16_t *value );
68 ssize_t
modbus_send( uint8_t *to_send,
int length );
74 modbus(
const std::string &host, uint16_t port );
75 explicit modbus(
const std::string &host );
107 ) : PORT {port}, HOST{host} {}
151 _socket = socket(AF_INET, SOCK_STREAM, 0);
192 to_send[0] = (uint8_t)
_msg_id >> 8;
193 to_send[1] = (uint8_t) (
_msg_id & 0x00FF);
198 to_send[7] = (uint8_t) func;
199 to_send[8] = (uint8_t) (address >> 8);
200 to_send[9] = (uint8_t) (address & 0x00FF);
217 to_send[10] = (uint8_t) (value[0] >> 8);
218 to_send[11] = (uint8_t) (value[0] & 0x00FF);
221 uint8_t to_send[13 + 2 * amount];
223 to_send[5] = (uint8_t) (5 + 2 * amount);
224 to_send[10] = (uint8_t) (amount >> 8);
225 to_send[11] = (uint8_t) (amount & 0x00FF);
226 to_send[12] = (uint8_t) (2 * amount);
227 for(
int i = 0; i < amount; i++) {
228 to_send[13 + 2 * i] = (uint8_t) (value[i] >> 8);
229 to_send[14 + 2 * i] = (uint8_t) (value[i] & 0x00FF);
233 uint8_t to_send[14 + (amount -1) / 8 ];
235 to_send[5] = (uint8_t) (7 + (amount -1) / 8);
236 to_send[10] = (uint8_t) (amount >> 8);
237 to_send[11] = (uint8_t) (amount >> 8);
238 to_send[12] = (uint8_t) ((amount + 7) / 8);
239 for(
int i = 0; i < amount; i++) {
240 to_send[13 + (i - 1) / 8] += (uint8_t) (value[i] << (i % 8));
258 to_send[10] = (uint8_t) (amount >> 8);
259 to_send[11] = (uint8_t) (amount & 0x00FF);
274 if(amount > 65535 || address > 65535) {
282 for(
int i = 0; i < amount; i++) {
283 buffer[i] = ((uint16_t)to_rec[9 + 2 * i]) << 8;
284 buffer[i] += (uint16_t) to_rec[10 + 2 * i];
286 }
catch (std::exception &e) {
305 if(amount > 65535 || address > 65535) {
313 for(
int i = 0; i < amount; i++) {
314 buffer[i] = ((uint16_t)to_rec[9 + 2 * i]) << 8;
315 buffer[i] += (uint16_t) to_rec[10 + 2 * i];
317 }
catch (std::exception &e) {
336 if(amount > 2040 || address > 65535) {
344 for(
int i = 0; i < amount; i++) {
345 buffer[i] = (bool) ((to_rec[9 + i / 8] >> (i % 8)) & 1);
347 }
catch (std::exception &e) {
366 if(amount > 2040 || address > 65535) {
374 for(
int i = 0; i < amount; i++) {
375 buffer[i] = (bool) ((to_rec[9 + i / 8] >> (i % 8)) & 1);
377 }
catch (std::exception &e) {
395 if(address > 65535) {
398 int value = to_write * 0xFF00;
404 }
catch (std::exception &e) {
422 if(address > 65535) {
430 }
catch (std::exception &e) {
449 if(address > 65535 || amount > 65535) {
452 uint16_t temp[amount];
453 for(
int i = 0; i < 4; i++) {
454 temp[i] = (uint16_t)value[i];
461 }
catch (std::exception &e) {
480 if(address > 65535 || amount > 65535) {
488 }
catch (std::exception &e) {
506 return send(
_socket, to_send, (
size_t)length, 0);
528 if(msg[7] == func + 0x80) {
Modbus Acknowledge Exception.
Modbus Connect Exception.
Modbus Gate Way Problem Exception.
Modbus Illegal Address Exception.
Modbus Illegal Data Value Exception.
Modbus Illgal Function Exception.
Modbus Server Busy Exception.
Modbus Server Failure Exception.
void modbus_read(int address, int amount, int func)
void modbus_read_input_registers(int address, int amount, uint16_t *buffer)
void modbus_read_input_bits(int address, int amount, bool *buffer)
void modbus_write_coils(int address, int amount, bool *value)
void modbus_read_holding_registers(int address, int amount, uint16_t *buffer)
ssize_t modbus_send(uint8_t *to_send, int length)
void modbus_build_request(uint8_t *to_send, int address, int func)
modbus(const std::string &host, uint16_t port)
void modbus_set_slave_id(int id)
bool modbus_set_timeouts(int seconds, int microseconds=0)
ssize_t modbus_receive(uint8_t *buffer)
void modbus_write_coil(int address, bool to_write)
struct sockaddr_in _server
void modbus_write_register(int address, uint16_t value)
void modbus_error_handle(uint8_t *msg, int func)
void modbus_write(int address, int amount, int func, uint16_t *value)
void modbus_write_registers(int address, int amount, uint16_t *value)
void modbus_read_coils(int address, int amount, bool *buffer)
Exception types for the MagAO-X Modbus client.