|
@@ -18,60 +18,70 @@ type Temperature struct {
|
|
|
UploadTime Time `gorm:"type:datetime" json:"upload_time"` //上传时间
|
|
|
TemperatureAlarm int `gorm:"type:int(11)" json:"temperature_alarm"` //温度报警 1报警
|
|
|
HumidityAlarm int `gorm:"type:int(11)" json:"humidity_alarm"` //湿度报警 1报警
|
|
|
-
|
|
|
}
|
|
|
|
|
|
+var LatestData map[int]Temperature
|
|
|
+
|
|
|
func ModBus() error {
|
|
|
var client *modbus.ModbusClient
|
|
|
var err error
|
|
|
- // for an RTU over TCP device/bus (remote serial port or
|
|
|
- // simple TCP-to-serial bridge)
|
|
|
+
|
|
|
+ // 创建并配置Modbus客户端
|
|
|
client, err = modbus.NewClient(&modbus.ClientConfiguration{
|
|
|
- URL: configs.Config.GetString("Modbus.url"),
|
|
|
- //Speed: 19200, // serial link speed
|
|
|
+ URL: configs.Config.GetString("Modbus.url"),
|
|
|
Timeout: 3 * time.Second,
|
|
|
})
|
|
|
- // note: use rtuoverudp:// for modbus RTU over UDP
|
|
|
+
|
|
|
if err != nil {
|
|
|
- // error out if client creation failed
|
|
|
simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接失败")
|
|
|
return err
|
|
|
}
|
|
|
+
|
|
|
defer client.Close()
|
|
|
- // now that the client is created and configured, attempt to connect
|
|
|
+
|
|
|
err = client.Open()
|
|
|
if err != nil {
|
|
|
simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接打开失败")
|
|
|
return err
|
|
|
}
|
|
|
- // read a single 16-bit holding register at address 100
|
|
|
+
|
|
|
+ ticker := time.NewTicker(1 * time.Second) // 每秒获取一次数据
|
|
|
+ hourlyTicker := time.NewTicker(1 * time.Hour) // 每小时记录一次数据
|
|
|
+
|
|
|
+ LatestData = make(map[int]Temperature)
|
|
|
+
|
|
|
for {
|
|
|
- var temperature uint16
|
|
|
- var humidity uint16
|
|
|
- for i := 1; i <= 6; i++ {
|
|
|
- client.SetUnitId(uint8(i))
|
|
|
- temperature, err = client.ReadRegister(0, modbus.INPUT_REGISTER)
|
|
|
- humidity, err = client.ReadRegister(1, modbus.INPUT_REGISTER)
|
|
|
- if err != nil {
|
|
|
- simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取失败")
|
|
|
- break
|
|
|
- } else {
|
|
|
- fmt.Printf("设备:%v 温度: %v", i, int16(temperature))
|
|
|
- fmt.Printf("设备:%v 湿度: %v", i, int16(humidity))
|
|
|
- temperatures := Temperature{
|
|
|
- SlaveID: i,
|
|
|
- Temperature: float64(int16(temperature) / 10),
|
|
|
- Humidity: float64(int16(humidity) / 10),
|
|
|
- UploadTime: Time(time.Now()),
|
|
|
- TemperatureAlarm: 0,
|
|
|
- HumidityAlarm: 0,
|
|
|
+ select {
|
|
|
+ case <-ticker.C:
|
|
|
+ for i := 1; i <= 6; i++ {
|
|
|
+ client.SetUnitId(uint8(i))
|
|
|
+ temperature, err := client.ReadRegister(0, modbus.INPUT_REGISTER)
|
|
|
+ humidity, err := client.ReadRegister(1, modbus.INPUT_REGISTER)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取失败")
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Printf("设备:%v 温度: %v\n", i, int16(temperature))
|
|
|
+ fmt.Printf("设备:%v 湿度: %v\n", i, int16(humidity))
|
|
|
+
|
|
|
+ // 存储最新的数据
|
|
|
+ LatestData[i] = Temperature{
|
|
|
+ SlaveID: i,
|
|
|
+ Temperature: float64(temperature) / 10,
|
|
|
+ Humidity: float64(humidity) / 10,
|
|
|
+ UploadTime: Time(time.Now()),
|
|
|
}
|
|
|
- if err := global.DBLink.Create(&temperatures).Error; err != nil {
|
|
|
+ }
|
|
|
+ case <-hourlyTicker.C:
|
|
|
+ // 每小时保存最新数据
|
|
|
+ for _, data := range LatestData {
|
|
|
+ if err := global.DBLink.Create(&data).Error; err != nil {
|
|
|
simple_zap.WithCtx(context.Background()).Sugar().Error(err, "写入失败")
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -79,13 +89,10 @@ func ModBus() error {
|
|
|
// Gettemperature 获取最近一周的数据
|
|
|
func Gettemperature() []Temperature {
|
|
|
var temperatureHumidity []Temperature
|
|
|
- // 获取当前时间
|
|
|
now := time.Now()
|
|
|
- // 计算一周前的时间
|
|
|
oneWeekAgo := now.AddDate(0, 0, -7)
|
|
|
- // 格式化时间
|
|
|
formattedTime := oneWeekAgo.Format("2006-01-02 15:04:05")
|
|
|
- // 查询最近一周的数据
|
|
|
+
|
|
|
tx := global.DBLink.Where("upload_time >= ?", formattedTime).Find(&temperatureHumidity)
|
|
|
if tx.Error == nil && tx.RowsAffected >= 0 {
|
|
|
return temperatureHumidity
|