nanoMODBUS/examples/win32/modbus_cli.c
2023-03-13 12:30:32 +01:00

85 lines
2.1 KiB
C

/*
* This example application uses the win32 API to read a single modbus
* register from a server.
*/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <windows.h>
#include "..\..\nanomodbus.h"
#include "comm.h"
#define NMBS_DEBUG 1
#define RTU_SERVER_ADDRESS 1
HANDLE hComm;
int reg_to_read;
int commPort_In;
void parseCmdLine(int argc, char** argv) {
if (argc > 1) {
commPort_In = atoi(argv[1]);
reg_to_read = atoi(argv[2]);
}
if (reg_to_read == 0 || commPort_In == 0) {
printf("please specify both a comm port and a register to read\n");
exit(0);
}
}
int32_t read_serial(uint8_t* buf, uint16_t count, int32_t byte_timeout_ms, void* arg) {
return ReadCommPort(hComm, buf, count, byte_timeout_ms);
}
int32_t write_serial(const uint8_t* buf, uint16_t count, int32_t byte_timeout_ms, void* arg) {
return WriteToCommPort(hComm, buf, count);
}
void onError(nmbs_error err) {
printf("error: %d\n", err);
exit(0);
}
void ReadRegister(uint16_t reg) {
nmbs_platform_conf platform_conf;
platform_conf.transport = NMBS_TRANSPORT_RTU;
platform_conf.read = read_serial;
platform_conf.write = write_serial;
nmbs_t nmbs;
nmbs_error err = nmbs_client_create(&nmbs, &platform_conf);
if (err != NMBS_ERROR_NONE)
onError(err);
nmbs_set_read_timeout(&nmbs, 1000);
nmbs_set_byte_timeout(&nmbs, 100);
nmbs_set_destination_rtu_address(&nmbs, RTU_SERVER_ADDRESS);
uint16_t r_regs[2];
err = nmbs_read_holding_registers(&nmbs, reg, 1, r_regs);
if (err != NMBS_ERROR_NONE)
onError(err);
printf("register %d is set to: %d\n", reg, r_regs[0]);
}
int main(int argc, char** argv) {
printf("modbus_cli - CLI to read modbus registers\n");
printf("Usage: modbus_cli comport register\n\n");
parseCmdLine(argc, argv);
if (!InitCommPort(&hComm, commPort_In)) {
printf("error opening output comm port %d\n", commPort_In);
exit(0);
}
ReadRegister(reg_to_read);
}