/* * This example application uses the win32 API to read a single modbus * register from a server. */ #include #include #include #include #define NMBS_LITTLE_ENDIAN 1 #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); }