How can I drive the ni daq by golang
Opened this issue · 2 comments
Deleted user commented
Hi, would you like to write an example of how to drive a ni daq by golang via this package?
5k3105 commented
Hi,
This is what I have:
package main
import (
"fmt"
"errors"
"github.com/influxdata/influxdb/client/v2"
"local/nidaqmx"
"strconv"
"time"
)
/// influxd -config influxdb.conf
/// influx -port 8087
func Nidaq_StartMonitor() {
task = task + 1
for {
err := nidaqmx.SelfTestDevice(safeString(DAQMX_DEVICE_NAME))
if err == 0 {
break
}
SystemError("Nidaq_StartMonitor", fmt.Sprint(err))
time.Sleep(10 * time.Second)
}
var th nidaqmx.TaskHandle
nidaqmx.CreateTask(safeString("task"+strconv.Itoa(task)), &th)
Nidaq_NewDbClient()
for i, h := range handleNames {
nidaqmx.CreateAIThrmcplChan(th, safeString(DAQMX_DEVICE_NAME+"Mod1/ai"+strconv.Itoa(i)), safeString(h), -60.0, 100.0, nidaqmx.ValDegC, nidaqmx.ValTTypeTC, nidaqmx.ValBuiltIn, 25.0, safeString(" "))
}
for {
start := nidaqmx.StartTask(th)
if start < 0 {
break
}
readarray := make([]float64, 16)
var samplesperchanread int32
f64 := nidaqmx.ReadAnalogF64(th, 1, 100.0, nidaqmx.ValGroupByScanNumber, readarray, 16, &samplesperchanread, nil)
if f64 < 0 {
break
}
stop := nidaqmx.StopTask(th)
if stop < 0 {
break
}
data, err := Nidaq_Parse(readarray)
if err != nil {
break
}
Nidaq_Send(data)
Alert_CheckAlerts(data, "[nidaq.thresholds]")
time.Sleep(2 * time.Second)
}
SystemError("Nidaq_StartMonitor", "Nidaq: Attempting Restart in 5 seconds")
time.Sleep(5 * time.Second)
Nidaq_StartMonitor()
}
func Nidaq_Parse(readarray []float64) (map[string]interface{}, error) {
// check for errors: all zero values in readarray
var err error
var acc float64
fields := map[string]interface{}{}
for i, h := range handleNames {
fields[h] = readarray[i]
acc = acc + readarray[i]
}
if acc == 0 {
err = errors.New("nidaq read array empty")
}
return fields, err
}
func Nidaq_Send(fields map[string]interface{}) {
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: nidaq_db,
Precision: "s",
})
if err != nil {
SystemError("Nidaq_Send", err.Error())
}
tags := map[string]string{"nidaq": "temp"}
pt, err := client.NewPoint("nidaq", tags, fields, time.Now())
if err != nil {
SystemError("Nidaq_Send", err.Error())
}
bp.AddPoint(pt)
nidaq_dbc.Write(bp)
}
func Nidaq_NewDbClient() {
var err error
nidaq_dbc, err = client.NewHTTPClient(client.HTTPConfig{
Addr: dbaddress,
Username: "admin",
Password: "admin",
})
if err != nil {
SystemError("Nidaq_NewDbClient", err.Error())
}
}
Deleted user commented
Thanks a lot, I'll give it a try.