#include #include #include #include #include #define MODBUS_PORT 1502 #define MODBUS_ADDRESS 1 #define REGISTER_COUNT 10 int main() { modbus_t *ctx; modbus_mapping_t *mb_mapping; int socket; // Create Modbus TCP context ctx = modbus_new_tcp("0.0.0.0", MODBUS_PORT); if (ctx == NULL) { fprintf(stderr, "Unable to allocate libmodbus context\n"); return -1; } // Allocate Modbus mapping mb_mapping = modbus_mapping_new(REGISTER_COUNT, 0, REGISTER_COUNT, 0); if (mb_mapping == NULL) { fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; } // Initialize registers with sample data for (int i = 0; i < REGISTER_COUNT; i++) { mb_mapping->tab_registers[i] = i * 10; } // Listen for incoming connections socket = modbus_tcp_listen(ctx, 1); if (socket == -1) { fprintf(stderr, "Unable to listen for connections: %s\n", modbus_strerror(errno)); modbus_mapping_free(mb_mapping); modbus_free(ctx); return -1; } printf("Modbus server is running on port %d...\n", MODBUS_PORT); // Accept and handle connections while (1) { int client_socket = modbus_tcp_accept(ctx, &socket); if (client_socket == -1) { fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); continue; } while (1) { uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH]; int rc = modbus_receive(ctx, query); if (rc > 0) { modbus_reply(ctx, query, rc, mb_mapping); } else if (rc == -1) { break; } } close(client_socket); } // Cleanup close(socket); modbus_mapping_free(mb_mapping); modbus_free(ctx); return 0; } #include #include #include #include #include #define MODBUS_SERVER_IP "127.0.0.1" #define MODBUS_PORT 1502 #define REGISTER_START 0 #define REGISTER_COUNT 10 int main() { modbus_t *ctx; uint16_t tab_reg[REGISTER_COUNT]; // Create Modbus TCP context ctx = modbus_new_tcp(MODBUS_SERVER_IP, MODBUS_PORT); if (ctx == NULL) { fprintf(stderr, "Unable to allocate libmodbus context\n"); return -1; } // Connect to the Modbus server if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; } printf("Connected to Modbus server.\n"); // Read registers if (modbus_read_registers(ctx, REGISTER_START, REGISTER_COUNT, tab_reg) == -1) { fprintf(stderr, "Failed to read registers: %s\n", modbus_strerror(errno)); modbus_close(ctx); modbus_free(ctx); return -1; } printf("Registers read from server:\n"); for (int i = 0; i < REGISTER_COUNT; i++) { printf("Register %d: %d\n", i, tab_reg[i]); } // Cleanup modbus_close(ctx); modbus_free(ctx); return 0; }