modbus.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package utils
  2. import (
  3. "bigdata_archives/configs"
  4. "bigdata_archives/global"
  5. "bigdata_archives/simple_zap"
  6. "context"
  7. "fmt"
  8. "github.com/simonvetter/modbus"
  9. "time"
  10. )
  11. type Temperature struct {
  12. BaseModel
  13. SlaveID int `gorm:"type:int(11)" json:"slave_id"` //设备ID
  14. Temperature float64 `gorm:"type:float(10,2)" json:"temperature"` //温度
  15. Humidity float64 `gorm:"type:float(10,2)" json:"humidity"` //湿度
  16. UploadTime Time `gorm:"type:datetime" json:"upload_time"` //上传时间
  17. TemperatureAlarm int `gorm:"type:int(11)" json:"temperature_alarm"` //温度报警 1报警
  18. HumidityAlarm int `gorm:"type:int(11)" json:"humidity_alarm"` //湿度报警 1报警
  19. }
  20. func ModBus() error {
  21. var client *modbus.ModbusClient
  22. var err error
  23. // for an RTU over TCP device/bus (remote serial port or
  24. // simple TCP-to-serial bridge)
  25. client, err = modbus.NewClient(&modbus.ClientConfiguration{
  26. URL: configs.Config.GetString("Modbus.url"),
  27. //Speed: 19200, // serial link speed
  28. Timeout: 3 * time.Second,
  29. })
  30. // note: use rtuoverudp:// for modbus RTU over UDP
  31. if err != nil {
  32. // error out if client creation failed
  33. simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接失败")
  34. return err
  35. }
  36. defer client.Close()
  37. // now that the client is created and configured, attempt to connect
  38. err = client.Open()
  39. if err != nil {
  40. simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接打开失败")
  41. return err
  42. }
  43. // read a single 16-bit holding register at address 100
  44. for {
  45. var temperature uint16
  46. var humidity uint16
  47. for i := 1; i <= 6; i++ {
  48. client.SetUnitId(uint8(i))
  49. temperature, err = client.ReadRegister(0, modbus.INPUT_REGISTER)
  50. humidity, err = client.ReadRegister(1, modbus.INPUT_REGISTER)
  51. if err != nil {
  52. simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取失败")
  53. break
  54. } else {
  55. fmt.Printf("设备:%v 温度: %v", i, int16(temperature))
  56. fmt.Printf("设备:%v 湿度: %v", i, int16(humidity))
  57. temperatures := Temperature{
  58. SlaveID: i,
  59. Temperature: float64(int16(temperature) / 10),
  60. Humidity: float64(int16(humidity) / 10),
  61. UploadTime: Time(time.Now()),
  62. TemperatureAlarm: 0,
  63. HumidityAlarm: 0,
  64. }
  65. if err := global.DBLink.Create(&temperatures).Error; err != nil {
  66. simple_zap.WithCtx(context.Background()).Sugar().Error(err, "写入失败")
  67. break
  68. }
  69. }
  70. time.Sleep(1 * time.Second)
  71. }
  72. }
  73. }
  74. // Gettemperature 获取最近一周的数据
  75. func Gettemperature() []Temperature {
  76. var temperatureHumidity []Temperature
  77. // 获取当前时间
  78. now := time.Now()
  79. // 计算一周前的时间
  80. oneWeekAgo := now.AddDate(0, 0, -7)
  81. // 格式化时间
  82. formattedTime := oneWeekAgo.Format("2006-01-02 15:04:05")
  83. // 查询最近一周的数据
  84. tx := global.DBLink.Where("upload_time >= ?", formattedTime).Find(&temperatureHumidity)
  85. if tx.Error == nil && tx.RowsAffected >= 0 {
  86. return temperatureHumidity
  87. }
  88. return nil
  89. }