1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
// gcc weatherstation_test.c -o weatherstation_test `pkg-config --libs --cflags libmodbus`
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>
#define SLAVE_ID 1
#define START_ADDRESS 0
#define NUMBER_REGISTERS 17
#define DEBUG_MODE 1
int main(int argc, char *argv[])
{
modbus_t *ctx;
int16_t mbregister[64];
int rc;
ctx = modbus_new_rtu("/dev/ttyUSB0", 19200, 'E', 8, 1);
modbus_set_slave(ctx, SLAVE_ID);
modbus_set_debug(ctx, DEBUG_MODE);
printf("Verteco Elsner Weatherstation\n\n");
if (ctx == NULL) {
fprintf(stderr, "Unable to create the libmodbus context\n");
return -1;
}
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
rc = modbus_read_input_registers(ctx, START_ADDRESS, NUMBER_REGISTERS, mbregister);
if (rc == -1) {
fprintf(stderr, "ERROR: %s\n", modbus_strerror(errno));
return -1;
}
printf("Read %i mbregisters\n\n", rc);
printf("temperature=%d\n", mbregister[0]);
printf("sun_south=%d\n", mbregister[1]);
printf("sun_east=%d\n", mbregister[2]);
printf("sun_west=%d\n", mbregister[3]);
printf("light=%d\n", mbregister[4]);
printf("wind=%d\n", mbregister[5]);
printf("rain=%d\n", mbregister[6]&1);
printf("GPS/RTC=%d\n", mbregister[6]>>8);
printf("day=%d\n", mbregister[7]);
printf("month=%d\n", mbregister[8]);
printf("year=%d\n", mbregister[9]);
printf("hour=%d\n", mbregister[10]);
printf("min=%d\n", mbregister[11]);
printf("second=%d\n", mbregister[12]);
printf("azimuth=%d\n", mbregister[13]);
printf("elevation=%d\n", mbregister[14]);
printf("long=%d\n", mbregister[15]);
printf("lat=%d\n", mbregister[16]);
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
|