modbus.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package utils
  2. import (
  3. //"bigdata_archives/app/model"
  4. "bigdata_archives/configs"
  5. "bigdata_archives/global"
  6. "bigdata_archives/simple_zap"
  7. "context"
  8. "fmt"
  9. "github.com/goburrow/serial"
  10. modbus "github.com/thinkgos/gomodbus/v2"
  11. "log"
  12. "time"
  13. )
  14. type Temperature struct {
  15. BaseModel
  16. SlaveID int `gorm:"type:int(11)" json:"slave_id"` //设备ID
  17. Temperature float64 `gorm:"type:float(10,2)" json:"temperature"` //温度
  18. Humidity float64 `gorm:"type:float(10,2)" json:"humidity"` //湿度
  19. UploadTime Time `gorm:"type:datetime" json:"upload_time"` //上传时间
  20. TemperatureAlarm int `gorm:"type:int(11)" json:"temperature_alarm"` //温度报警 1报警
  21. HumidityAlarm int `gorm:"type:int(11)" json:"humidity_alarm"` //湿度报警 1报警
  22. }
  23. func ModBus() {
  24. provider := modbus.NewRTUClientProvider(
  25. modbus.WithEnableLogger(),
  26. modbus.WithSerialConfig(serial.Config{
  27. Address: configs.Config.GetString("modbus.address"),
  28. BaudRate: configs.Config.GetInt("modbus.baudrate"),
  29. DataBits: configs.Config.GetInt("modbus.databits"),
  30. Parity: configs.Config.GetString("modbus.parity"),
  31. Timeout: 5 * time.Second, //连接超时时间
  32. }),
  33. )
  34. client := modbus.NewClient(provider)
  35. err := client.Connect()
  36. if err != nil {
  37. simple_zap.WithCtx(context.Background()).Sugar().Error("modbus连接失败", err)
  38. }
  39. defer func() {
  40. if err := client.Close(); err != nil {
  41. simple_zap.WithCtx(context.Background()).Sugar().Error("modbus关闭失败", err)
  42. }
  43. }()
  44. for {
  45. for i := 1; i < 4; i++ {
  46. results, err := client.ReadInputRegisters(byte(i), 0, 2)
  47. if err != nil {
  48. log.Printf("modbus读取失败:%v", err)
  49. continue
  50. }
  51. temperature := Temperature{
  52. SlaveID: i,
  53. Humidity: float64(results[1] / 10.0),
  54. Temperature: float64(results[0] / 10.0),
  55. UploadTime: Time(time.Now()),
  56. HumidityAlarm: 0,
  57. TemperatureAlarm: 0,
  58. }
  59. //保存温湿度到数据库
  60. global.DBLink.Create(&temperature)
  61. fmt.Println("温湿度:", temperature)
  62. log.Printf("设备%v,温度: %v", i, results[0]/10.0)
  63. log.Printf("设备%v 湿度度: %v", i, results[1]/10.0)
  64. log.Printf("客户端状态: %v\n", &client)
  65. }
  66. time.Sleep(60 * time.Second)
  67. }
  68. }