Methods for reading and writing single holding registers. Unfortunately the writes don't seem to have much effect, the registers are reset after a short period or instantly. Maybe due to something with the library, but no errors are produced. Closes gh-5
This commit is contained in:
parent
bcb8d55126
commit
ce1c569564
|
@ -19,7 +19,7 @@ import (
|
||||||
var static embed.FS
|
var static embed.FS
|
||||||
|
|
||||||
var (
|
var (
|
||||||
version = "0.0.7"
|
version = "0.0.8"
|
||||||
pingvin pingvinKL.PingvinKL
|
pingvin pingvinKL.PingvinKL
|
||||||
DEBUG = false
|
DEBUG = false
|
||||||
)
|
)
|
||||||
|
@ -58,12 +58,36 @@ func coils(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func registers(w http.ResponseWriter, r *http.Request) {
|
func registers(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
if DEBUG {
|
pathparams := strings.Split(strings.TrimPrefix(r.URL.Path, "/api/v1/registers/"), "/")
|
||||||
log.Println("Received request for /registers")
|
if len(pathparams[0]) == 0 {
|
||||||
}
|
|
||||||
json.NewEncoder(w).Encode(pingvin.Registers)
|
json.NewEncoder(w).Encode(pingvin.Registers)
|
||||||
if DEBUG {
|
} else if len(pathparams[0]) > 0 && r.Method == "GET" && len(pathparams) < 2 { // && r.Method == "POST"
|
||||||
log.Println("Handled request for /registers")
|
intaddr, err := strconv.Atoi(pathparams[0])
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: Could not parse register address", pathparams[0])
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pingvin.ReadRegister(uint16(intaddr))
|
||||||
|
json.NewEncoder(w).Encode(pingvin.Registers[intaddr])
|
||||||
|
} else if len(pathparams[0]) > 0 && r.Method == "POST" && len(pathparams) == 2 {
|
||||||
|
intaddr, err := strconv.Atoi(pathparams[0])
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: Could not parse register address", pathparams[0])
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
intval, err := strconv.Atoi(pathparams[1])
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: Could not parse register value", pathparams[1])
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = pingvin.WriteRegister(uint16(intaddr), uint16(intval))
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
json.NewEncoder(w).Encode(pingvin.Registers[intaddr])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,55 @@ func (p *PingvinKL) updateCoils() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PingvinKL) ReadRegister(addr uint16) (int, error) {
|
||||||
|
handler := p.getHandler()
|
||||||
|
p.buslock.Lock()
|
||||||
|
defer p.buslock.Unlock()
|
||||||
|
err := handler.Connect()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: ReadRegister:", err)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer handler.Close()
|
||||||
|
client := modbus.NewClient(handler)
|
||||||
|
results, err := client.ReadHoldingRegisters(addr, 1)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: ReadRegister:", err)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if p.Registers[addr].Type == "uint16" {
|
||||||
|
p.Registers[addr].Value = int(uint16(results[0]) << 8)
|
||||||
|
p.Registers[addr].Value += int(uint16(results[1]))
|
||||||
|
} else if p.Registers[addr].Type == "int16" {
|
||||||
|
p.Registers[addr].Value = int(int16(results[0]) << 8)
|
||||||
|
p.Registers[addr].Value += int(int16(results[1]))
|
||||||
|
}
|
||||||
|
return p.Registers[addr].Value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PingvinKL) WriteRegister(addr uint16, value uint16) (uint16, error) {
|
||||||
|
handler := p.getHandler()
|
||||||
|
p.buslock.Lock()
|
||||||
|
defer p.buslock.Unlock()
|
||||||
|
err := handler.Connect()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: WriteRegister:", err)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer handler.Close()
|
||||||
|
client := modbus.NewClient(handler)
|
||||||
|
_, err = client.WriteSingleRegister(addr, value)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("ERROR: WriteRegister:", err)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
val, err := p.ReadRegister(addr)
|
||||||
|
if val == int(value) {
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
return 0, fmt.Errorf("Failed to write register")
|
||||||
|
}
|
||||||
|
|
||||||
func (p *PingvinKL) updateRegisters() {
|
func (p *PingvinKL) updateRegisters() {
|
||||||
handler := p.getHandler()
|
handler := p.getHandler()
|
||||||
p.buslock.Lock()
|
p.buslock.Lock()
|
||||||
|
|
Loading…
Reference in New Issue