-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimpleModbus.go
More file actions
110 lines (91 loc) · 2.72 KB
/
simpleModbus.go
File metadata and controls
110 lines (91 loc) · 2.72 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package main
import (
"flag"
"fmt"
"github.com/mcuadros/go-defaults"
"log"
"net/http"
"os"
"simpleModbus/controller"
)
const APP = "simpleModbus"
const VERSION = "0.0.2"
var (
httpListenAddr = flag.String("httpListenAddr", ":3000", "TCP address to listen for http connections.")
modbusTcpAddr = flag.String("modbusTcpAddr", "rtuovertcp://192.168.1.200:8899", "TCP address to modbus device with RTU over TCP.")
config = flag.String("config", "./config.yaml", "Modbus controller configuration")
ControllerConfig *Config
)
// Инициализация модбас контроллера
func initController() (ctrl *controller.Controller, err error) {
log.Println("Configuring modbus controller " + *modbusTcpAddr)
ctrl, err = controller.New(&controller.Configuration{
Url: ControllerConfig.DeviceUrl,
DeviceId: ControllerConfig.DeviceId,
Speed: ControllerConfig.Speed,
Timeout: ControllerConfig.Timeout,
PollingTime: ControllerConfig.PollingTime,
ReadPeriod: ControllerConfig.ReadPeriod,
})
if err != nil {
log.Println(err.Error())
os.Exit(1)
}
for _, tag := range ControllerConfig.Tags {
ctrl.AddTag(&controller.Tag{Name: tag.Name, DisplayName: tag.Desc, Address: tag.Address, Method: controller.ParseOperation(tag.Operation)})
}
return
}
// Инициализация сервера http для выдачи состояния и метрик
func initHttpServer(ctrl *controller.Controller) *http.ServeMux {
mux := http.NewServeMux()
mux.Handle("/tags", TagsHahdler(ctrl))
mux.Handle("/metrics", MetricsHandler())
return mux
}
func ParseFlags() {
flag.CommandLine.SetOutput(os.Stdout)
flag.Usage = func() {
fmt.Fprintf(os.Stderr, `%s %s
Usage: %s [options]
`, APP, VERSION, APP)
flag.PrintDefaults()
}
flag.Parse()
err := ValidateConfigPath(*config)
if err != nil {
log.Println("Cannot find config: " + err.Error())
os.Exit(1)
}
ControllerConfig, err = NewConfig(*config)
if err != nil {
log.Println("Cannot parse config" + err.Error())
os.Exit(1)
}
defaults.SetDefaults(ControllerConfig)
if len(ControllerConfig.DeviceUrl) == 0 {
ControllerConfig.DeviceUrl = *modbusTcpAddr
}
}
func main() {
ParseFlags()
log.Println("Starting...")
// Инициализация модбас конроллера
ctrl, err := initController()
if err != nil {
log.Println("Can not init modbus device: " + err.Error())
os.Exit(1)
}
// Запуск полера
go ctrl.Poll()
defer ctrl.Close()
// Инициализация сервера
mux := initHttpServer(ctrl)
log.Println("Listening " + *httpListenAddr + " ...")
err = http.ListenAndServe(*httpListenAddr, mux)
if err != nil {
log.Println("Can not listen http: " + err.Error())
os.Exit(1)
}
os.Exit(0)
}