12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package utils
- import (
- "bigdata_archives/configs"
- "bigdata_archives/global"
- "bigdata_archives/simple_zap"
- "context"
- "fmt"
- "github.com/simonvetter/modbus"
- "time"
- )
- type Temperature struct {
- BaseModel
- SlaveID int `gorm:"type:int(11)" json:"slave_id"` //设备ID
- Temperature float64 `gorm:"type:float(10,2)" json:"temperature"` //温度
- Humidity float64 `gorm:"type:float(10,2)" json:"humidity"` //湿度
- 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报警
- }
- 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)
- client, err = modbus.NewClient(&modbus.ClientConfiguration{
- URL: configs.Config.GetString("Modbus.url"),
- //Speed: 19200, // serial link speed
- 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
- 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,
- }
- if err := global.DBLink.Create(&temperatures).Error; err != nil {
- simple_zap.WithCtx(context.Background()).Sugar().Error(err, "写入失败")
- break
- }
- }
- time.Sleep(1 * time.Second)
- }
- }
- }
- // 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
- }
- return nil
- }
|