Example work

This commit is contained in:
Warky 2024-09-23 23:02:10 +02:00
parent 89de6652ab
commit 65e1307645
2 changed files with 150 additions and 0 deletions

View File

@ -0,0 +1,14 @@
github.com/goburrow/modbus v0.1.0 h1:DejRZY73nEM6+bt5JSP6IsFolJ9dVcqxsYbpLbeW/ro=
github.com/goburrow/modbus v0.1.0/go.mod h1:Kx552D5rLIS8E7TyUwQ/UdHEqvX5T8tyiGBTlzMcZBg=
github.com/goburrow/serial v0.1.0 h1:v2T1SQa/dlUqQiYIT8+Cu7YolfqAi3K96UmhwYyuSrA=
github.com/goburrow/serial v0.1.0/go.mod h1:sAiqG0nRVswsm1C97xsttiYCzSLBmUZ/VSlVLZJ8haA=
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
periph.io/x/conn/v3 v3.7.1 h1:tMjNv3WO8jEz/ePuXl7y++2zYi8LsQ5otbmqGKy3Myg=
periph.io/x/conn/v3 v3.7.1/go.mod h1:c+HCVjkzbf09XzcqZu/t+U8Ss/2QuJj0jgRF6Nye838=
periph.io/x/host/v3 v3.8.2 h1:ayKUDzgUCN0g8+/xM9GTkWaOBhSLVcVHGTfjAOi8OsQ=
periph.io/x/host/v3 v3.8.2/go.mod h1:yFL76AesNHR68PboofSWYaQTKmvPXsQH2Apvp/ls/K4=

View File

@ -0,0 +1,136 @@
package main
import (
"encoding/binary"
"fmt"
"log"
"math"
"os"
"path/filepath"
"time"
"github.com/goburrow/modbus"
"github.com/tarm/serial"
"periph.io/x/conn/v3/gpio"
"periph.io/x/conn/v3/gpio/gpioreg"
"periph.io/x/host/v3"
)
const (
serialPort = "/dev/ttyAMA0"
baudRate = 9600
dataBits = 8
stopBits = 1
parity = "N"
slaveID = 101
deRePin = "GPIO4"
)
var registers = []struct {
regaddr uint16
regtype uint8
}{
{1, 2},
{3, 1},
{5, 0},
// Add more registers as needed
}
func main() {
// Initialize GPIO
if _, err := host.Init(); err != nil {
log.Fatal(err)
}
// Set up DE/RE pin
deRe := gpioreg.ByName(deRePin)
if deRe == nil {
log.Fatal("Failed to find DE/RE pin")
}
// Configure serial port
config := &serial.Config{
Name: serialPort,
Baud: baudRate,
//DataBits: dataBits,
StopBits: stopBits,
//Parity: parity,
}
// Create Modbus RTU client
handler := modbus.NewRTUClientHandler(config.Name)
handler.BaudRate = config.Baud
//handler.DataBits = config.DataBits
//handler.StopBits = config.StopBits
//handler.Parity = config.Parity
handler.SlaveId = slaveID
handler.Timeout = 5 * time.Second
err := handler.Connect()
if err != nil {
log.Fatal("Failed to connect:", err)
}
defer handler.Close()
client := modbus.NewClient(handler)
for {
filename := getFilename()
file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Println("Error opening file:", err)
continue
}
// Write CSV header if file is empty
fileInfo, _ := file.Stat()
if fileInfo.Size() == 0 {
header := "Date Time"
for _, reg := range registers {
header += fmt.Sprintf(",@%d", reg.regaddr)
}
file.WriteString(header + "\n")
}
// Log current date and time
timestamp := time.Now().Format("2006-01-02 15:04:05")
line := timestamp
for _, reg := range registers {
deRe.Out(gpio.High)
results, err := client.ReadHoldingRegisters(reg.regaddr-1, 2)
deRe.Out(gpio.Low)
if err != nil {
log.Printf("Error reading register %d: %v", reg.regaddr, err)
line += ",ERROR"
continue
}
switch reg.regtype {
case 2: // Float
value := math.Float32frombits(binary.BigEndian.Uint32(results))
line += fmt.Sprintf(",%.2f", value)
case 1: // Uint16
value := binary.BigEndian.Uint16(results)
line += fmt.Sprintf(",%d", value)
case 0: // Int32
value := int32(binary.BigEndian.Uint32(results))
line += fmt.Sprintf(",%d", value)
default:
line += ",UNKNOWN"
}
}
file.WriteString(line + "\n")
file.Close()
log.Printf("Data written to %s", filename)
time.Sleep(1 * time.Second)
}
}
func getFilename() string {
now := time.Now()
return filepath.Join("data", fmt.Sprintf("pm8k_%s.csv", now.Format("20060102")))
}