This commit is contained in:
eson 2019-11-04 02:00:35 +08:00
parent 8194e385bb
commit e08af94eb6
10 changed files with 288 additions and 190 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
DPF
log

22
main.go
View File

@ -2,16 +2,34 @@ package main
import ( import (
"log" "log"
"os"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
func (worker *Worker) OperateHandler(cxt *gin.Context) {
log.Println(worker.Sensor())
}
func (worker *Worker) StatusHandler(cxt *gin.Context) {
}
func main() { func main() {
f, err := os.OpenFile("./log", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
panic(err)
}
log.SetOutput(f)
engine := gin.Default() engine := gin.Default()
engine.GET("/status") worker := NewWorker()
engine.POST("/operate")
engine.GET("/status", worker.StatusHandler)
engine.POST("/operate", worker.OperateHandler)
go worker.Run()
log.Fatal(engine.Run(":15678")) log.Fatal(engine.Run(":15678"))

110
operator.go Normal file
View File

@ -0,0 +1,110 @@
package main
import "time"
// OperatorFlag 操作位
type OperatorFlag uint16
const (
UltrasonicPower OperatorFlag = 0b1000000000000000 // UltrasonicPower bit15 超声波电源开关 1开0关
// CYZ-A-X
CirculatingIrrigation OperatorFlag = 0b0100000000000000 // CirculatingIrrigation bit14 循环灌洗水泵 1开0关
UFRecoil OperatorFlag = 0b0010000000000000 // bit13 UF 超滤膜反冲进水阀 1开0关
UFPositive OperatorFlag = 0b0001000000000000 // bit12 UF 超滤膜正冲进水阀 1开0关
// YM-01-X-03
UFTreatedWater OperatorFlag = 0b0000100000000000 // bit11 UF 超滤膜净水出水阀 1开0关
UFRawWater OperatorFlag = 0b0000010000000000 // bit10 UF超滤膜原水进水阀 1开0关
// YM-01-X-01
CirculatingTankWashWater OperatorFlag = 0b0000001000000000 // bit9 循环罐洗进水电动球阀 1开0关
UFPositiveFlushingWaterOutlet OperatorFlag = 0b0000000100000000 // bit8 UF超滤膜正冲浓水出口电磁阀 1开0关
// YV-02-02-1-X-06
CleaningTankExhaust OperatorFlag = 0b0000000010000000 // bit7 清洗罐排气电磁阀 1开0关
DPFCompactCylinderControlB OperatorFlag = 0b0000000001000000 // bit6 DPF压紧气缸控制电磁阀B 1开0关
DPFCompactCylinderControlA OperatorFlag = 0b0000000000100000 // bit5 DPF压紧气缸控制电磁阀A 1开0关
// YV-02-05-1-X-04
CleaningTankDrainingWater OperatorFlag = 0b0000000000010000 // bit4 清洗罐放水阀控制电磁阀 1开0关
GasExplosion OperatorFlag = 0b0000000000001000 // bit3 气爆阀控制电磁阀 1开0关
// YV-02-02-1-X-02
CleaningTankInflation OperatorFlag = 0b0000000000000100 // bit2 清洗罐充气电磁阀 1开0关
CleaningTankSealB OperatorFlag = 0b0000000000000010 // bit1 清洗罐密封圈充气电磁阀B 1开0关
CleaningTankSealA OperatorFlag = 0b0000000000000001 // bit0 清洗罐密封圈充气电磁阀A 1开0关
)
// ChaoShengBoQingXi
func ChaoShengBoQingXi(worker *Worker) {
for sensor := worker.Sensor(); (20.0/1024.0)*float64(sensor.SP02) < 10.0; sensor = worker.Sensor() { // TODO: 预设值未知
}
flag := CleaningTankExhaust |
CleaningTankDrainingWater |
CirculatingTankWashWater |
UFTreatedWater |
CirculatingIrrigation
worker.Write(OperatorOption(flag))
time.Sleep(time.Second * 10) // 10秒后
flag ^= CleaningTankDrainingWater
worker.Write(OperatorOption(flag))
// 满水位传感器LT-01 >= 4.5电压
for sensor := worker.Sensor(); ((5.0 / 1024.0) * float64(sensor.LT01)) < 4.5; sensor = worker.Sensor() {
}
flag ^= CleaningTankExhaust
flag ^= CirculatingIrrigation
flag |= UltrasonicPower
worker.Write(OperatorOption(flag))
//TODO: 设置时间
time.Sleep(time.Second * 1)
flag ^= UltrasonicPower
worker.Write(OperatorOption(flag))
// 灌洗开始
flag |= CleaningTankDrainingWater
flag |= CirculatingIrrigation
worker.Write(OperatorOption(flag))
for {
if time.Now().Unix() >= 15000230 {
break
}
time.Sleep(time.Millisecond * 100)
}
flag ^= CirculatingIrrigation
worker.Write(OperatorOption(flag))
QingXiGuanFangShui(worker)
}
// QingXiGuanFangShui 清洗灌放水
func QingXiGuanFangShui(worker *Worker) {
// 满水位传感器LT-01 >= 4.5电压
flag := CleaningTankDrainingWater |
CirculatingTankWashWater |
UFTreatedWater |
CleaningTankInflation
for sensor := worker.Sensor(); ((5.0 / 1024.0) * float64(sensor.LT02)) >= 0.5; sensor = worker.Sensor() {
worker.Write(OperatorOption(flag))
time.Sleep(time.Second)
}
flag = 0
worker.Write(OperatorOption(flag))
flag = CleaningTankExhaust
for sensor := worker.Sensor(); ((5.0 / 1024.0) * float64(sensor.SP01)) > 0.5; sensor = worker.Sensor() {
worker.Write(OperatorOption(flag))
time.Sleep(time.Second)
}
flag = 0
worker.Write(OperatorOption(flag))
}

38
sensor.go Normal file
View File

@ -0,0 +1,38 @@
package main
import (
"encoding/binary"
"log"
)
// Sensor 传感器
type Sensor struct {
SP01 uint16 // 清洗罐气压传感器 SP-01 罐体排空,值≤0.5(暂定)
SP02 uint16 // 清洗液水箱水位传感器 SP-02 模拟量传感器
LT01 uint16 // 清洗罐满水位传感器 (非接触式水位传感器) LT-01 模拟量传感器
LT02 uint16 // 清洗罐排水传感器 (非接触式水位传感器) LT-02 模拟量传感器
LT03 uint8 // 清洗液水箱满水位传感器 (浮子式水位传感器) LT-03 值为1,清洗液水箱满水位
}
func NewSensor(buf []byte) *Sensor {
if len(buf) == 14 {
sensor := &Sensor{}
if buf[0] == byte(0xaa) && buf[1] == byte(0x55) {
sensor.SP01 = binary.BigEndian.Uint16(buf[2:4])
sensor.SP02 = binary.BigEndian.Uint16(buf[4:6])
sensor.LT01 = binary.BigEndian.Uint16(buf[6:8])
sensor.LT02 = binary.BigEndian.Uint16(buf[8:10])
sensor.LT03 = uint8(buf[10])
return sensor
}
}
log.Println(buf, "非标准传感器字节流")
return nil
}

View File

@ -32,8 +32,8 @@ func NewSerialPort() *SerialPort {
sp.com = "COM1" sp.com = "COM1"
sp.port1 = "/dev/pts/11" sp.port1 = "/dev/pts/3"
sp.port2 = "/dev/pts/12" sp.port2 = "/dev/pts/4"
sp.baud = 9600 sp.baud = 9600
@ -50,23 +50,25 @@ func (sp *SerialPort) OpenPort() {
cfg1 := &serial.Config{Name: sp.port1, Baud: sp.baud, ReadTimeout: 5} cfg1 := &serial.Config{Name: sp.port1, Baud: sp.baud, ReadTimeout: 5}
port1, err := serial.OpenPort(cfg1) port1, err := serial.OpenPort(cfg1)
if err != nil { if err != nil {
sp.linuxRPort = port1 panic(err)
} }
sp.linuxRPort = port1
cfg2 := &serial.Config{Name: sp.port2, Baud: sp.baud, ReadTimeout: 5} cfg2 := &serial.Config{Name: sp.port2, Baud: sp.baud, ReadTimeout: 5}
port2, err := serial.OpenPort(cfg2) port2, err := serial.OpenPort(cfg2)
if err != nil { if err != nil {
sp.linuxWPort = port2 panic(err)
} }
sp.linuxWPort = port2
} else { } else {
cfg1 := &serial.Config{Name: sp.com, Baud: sp.baud, ReadTimeout: 5} cfg1 := &serial.Config{Name: sp.com, Baud: sp.baud, ReadTimeout: 5}
port1, err := serial.OpenPort(cfg1) port1, err := serial.OpenPort(cfg1)
if err != nil { if err != nil {
panic(err)
}
sp.windowsRWPort = port1 sp.windowsRWPort = port1
} }
} }
}

View File

@ -1,9 +1,10 @@
package test package test
import ( import (
"bytes"
"encoding/binary"
"log" "log"
"os" "os"
"sync"
"testing" "testing"
"time" "time"
@ -32,7 +33,32 @@ const (
) )
func TestBit(t *testing.T) { func TestBit(t *testing.T) {
t.Error(CleaningTankSealA) buf := &bytes.Buffer{}
binary.Write(buf, binary.BigEndian, byte(0xaa))
binary.Write(buf, binary.BigEndian, byte(0x55))
// binary.Write(buf, binary.BigEndian, 12)
t.Error(buf, buf.Bytes(), buf.Len())
}
func TestSendCommand(t *testing.T) {
var buf []byte = make([]byte, 8, 8)
buf[0] = byte(0xaa)
buf[1] = byte(0x55)
flag := CleaningTankExhaust | CleaningTankDrainingWater | CirculatingTankWashWater | UFTreatedWater | CirculatingIrrigation
binary.BigEndian.PutUint16(buf[2:], uint16(flag))
t.Errorf("%.16b", flag)
flag ^= CirculatingIrrigation
t.Errorf("%.16b", flag)
check := byte(0)
for _, b := range buf {
check += b
}
buf[7] = check
t.Error(buf)
} }
func TestLinuxSerial(t *testing.T) { func TestLinuxSerial(t *testing.T) {
@ -43,40 +69,47 @@ func TestLinuxSerial(t *testing.T) {
} }
log.SetOutput(f) log.SetOutput(f)
port1, err := serial.OpenPort(&serial.Config{Name: "/dev/pts/13", Baud: 9600, ReadTimeout: 5}) port1, err := serial.OpenPort(&serial.Config{Name: "/dev/pts/3", Baud: 9600, ReadTimeout: 5})
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
port2, err := serial.OpenPort(&serial.Config{Name: "/dev/pts/14", Baud: 9600, ReadTimeout: 5}) for i := 0; i < 20; i++ {
if err != nil {
t.Fatal(err)
}
wait := &sync.WaitGroup{}
wait.Add(1)
go func(w *sync.WaitGroup) {
defer w.Done()
for {
var buf []byte var buf []byte
port1.Read(buf) port1.Read(buf)
log.Println("read ...", buf) log.Println(buf)
time.Sleep(time.Millisecond * 500) time.Sleep(time.Second * 1)
} }
}(wait)
wait.Add(1) // port2, err := serial.OpenPort(&serial.Config{Name: "/dev/pts/4", Baud: 9600, ReadTimeout: 5})
go func(w *sync.WaitGroup) { // if err != nil {
defer w.Done() // t.Fatal(err)
for i := 0; i < 100; i++ { // }
port2.Write([]byte("write")) // wait := &sync.WaitGroup{}
log.Println("write ...", i) // wait.Add(1)
time.Sleep(time.Millisecond * 500) // go func(w *sync.WaitGroup) {
} // defer w.Done()
}(wait) // for {
wait.Wait() // var buf []byte
// port1.Read(buf)
// log.Println("read ...", buf)
// time.Sleep(time.Millisecond * 500)
// }
// }(wait)
// wait.Add(1)
// go func(w *sync.WaitGroup) {
// defer w.Done()
// for i := 0; i < 100; i++ {
// port2.Write([]byte("write"))
// log.Println("write ...", i)
// time.Sleep(time.Millisecond * 500)
// }
// }(wait)
// wait.Wait()
} }

140
test/log
View File

@ -1,120 +1,20 @@
2019/11/02 12:42:34 write ... 0 2019/11/04 01:59:43 []
2019/11/02 12:42:34 read ... [] 2019/11/04 01:59:44 []
2019/11/02 12:42:34 write ... 1 2019/11/04 01:59:45 []
2019/11/02 12:42:34 read ... [] 2019/11/04 01:59:46 []
2019/11/02 12:42:35 write ... 2 2019/11/04 01:59:47 []
2019/11/02 12:42:35 read ... [] 2019/11/04 01:59:48 []
2019/11/02 12:42:35 write ... 3 2019/11/04 01:59:49 []
2019/11/02 12:42:35 read ... [] 2019/11/04 01:59:50 []
2019/11/02 12:42:36 write ... 4 2019/11/04 01:59:51 []
2019/11/02 12:42:36 read ... [] 2019/11/04 01:59:52 []
2019/11/02 12:42:36 write ... 5 2019/11/04 01:59:53 []
2019/11/02 12:42:36 read ... [] 2019/11/04 01:59:54 []
2019/11/02 12:42:37 write ... 6 2019/11/04 01:59:55 []
2019/11/02 12:42:37 read ... [] 2019/11/04 01:59:56 []
2019/11/02 12:42:37 read ... [] 2019/11/04 01:59:57 []
2019/11/02 12:42:37 write ... 7 2019/11/04 01:59:58 []
2019/11/02 12:42:38 write ... 8 2019/11/04 01:59:59 []
2019/11/02 12:42:38 read ... [] 2019/11/04 02:00:00 []
2019/11/02 12:42:38 read ... [] 2019/11/04 02:00:01 []
2019/11/02 12:42:38 write ... 9 2019/11/04 02:00:02 []
2019/11/02 12:42:39 write ... 10
2019/11/02 12:42:39 read ... []
2019/11/02 12:42:39 write ... 11
2019/11/02 12:42:39 read ... []
2019/11/02 12:42:40 read ... []
2019/11/02 12:42:40 write ... 12
2019/11/02 12:42:40 write ... 13
2019/11/02 12:42:40 read ... []
2019/11/02 12:42:41 write ... 14
2019/11/02 12:42:41 read ... []
2019/11/02 12:42:41 read ... []
2019/11/02 12:42:41 write ... 15
2019/11/02 12:42:42 write ... 16
2019/11/02 12:42:42 read ... []
2019/11/02 12:42:42 write ... 17
2019/11/02 12:42:42 read ... []
2019/11/02 12:42:43 write ... 18
2019/11/02 12:42:43 read ... []
2019/11/02 12:42:43 write ... 19
2019/11/02 12:42:43 read ... []
2019/11/02 12:42:44 write ... 20
2019/11/02 12:42:44 read ... []
2019/11/02 12:42:44 read ... []
2019/11/02 12:42:44 write ... 21
2019/11/02 12:42:45 read ... []
2019/11/02 12:42:45 write ... 22
2019/11/02 12:42:45 write ... 23
2019/11/02 12:42:45 read ... []
2019/11/02 12:42:46 write ... 24
2019/11/02 12:42:46 read ... []
2019/11/02 12:42:46 write ... 25
2019/11/02 12:42:46 read ... []
2019/11/02 12:42:47 write ... 26
2019/11/02 12:42:47 read ... []
2019/11/02 12:42:47 read ... []
2019/11/02 12:42:47 write ... 27
2019/11/02 12:42:48 read ... []
2019/11/02 12:42:48 write ... 28
2019/11/02 12:42:48 read ... []
2019/11/02 12:42:48 write ... 29
2019/11/02 12:42:49 read ... []
2019/11/02 12:42:49 write ... 30
2019/11/02 12:42:49 read ... []
2019/11/02 12:42:49 write ... 31
2019/11/02 12:42:50 read ... []
2019/11/02 12:42:50 write ... 32
2019/11/02 12:42:50 read ... []
2019/11/02 12:42:50 write ... 33
2019/11/02 12:42:51 read ... []
2019/11/02 12:42:51 write ... 34
2019/11/02 12:42:51 read ... []
2019/11/02 12:42:51 write ... 35
2019/11/02 12:42:52 read ... []
2019/11/02 12:42:52 write ... 36
2019/11/02 12:42:52 read ... []
2019/11/02 12:42:52 write ... 37
2019/11/02 12:42:53 read ... []
2019/11/02 12:42:53 write ... 38
2019/11/02 12:42:53 write ... 39
2019/11/02 12:42:53 read ... []
2019/11/02 12:42:54 write ... 40
2019/11/02 12:42:54 read ... []
2019/11/02 12:42:54 write ... 41
2019/11/02 12:42:54 read ... []
2019/11/02 12:42:55 read ... []
2019/11/02 12:42:55 write ... 42
2019/11/02 12:42:55 read ... []
2019/11/02 12:42:55 write ... 43
2019/11/02 12:42:56 write ... 44
2019/11/02 12:42:56 read ... []
2019/11/02 12:42:56 write ... 45
2019/11/02 12:42:56 read ... []
2019/11/02 12:42:57 write ... 46
2019/11/02 12:42:57 read ... []
2019/11/02 12:42:57 read ... []
2019/11/02 12:42:57 write ... 47
2019/11/02 12:42:58 read ... []
2019/11/02 12:42:58 write ... 48
2019/11/02 12:42:46 write ... 49
2019/11/02 12:42:46 read ... []
2019/11/02 12:42:46 write ... 50
2019/11/02 12:42:46 read ... []
2019/11/02 12:42:47 write ... 51
2019/11/02 12:42:47 read ... []
2019/11/02 12:42:47 write ... 52
2019/11/02 12:42:47 read ... []
2019/11/02 12:42:48 write ... 53
2019/11/02 12:42:48 read ... []
2019/11/02 12:42:48 write ... 54
2019/11/02 12:42:48 read ... []
2019/11/02 12:42:49 write ... 55
2019/11/02 12:42:49 read ... []
2019/11/02 12:42:49 write ... 56
2019/11/02 12:42:49 read ... []
2019/11/02 12:42:50 write ... 57
2019/11/02 12:42:50 read ... []
2019/11/02 12:42:50 write ... 58
2019/11/02 12:42:50 read ... []
2019/11/02 12:42:51 write ... 59
2019/11/02 12:42:51 read ... []

View File

@ -1,7 +1,7 @@
package main package main
import ( import (
"bytes" "encoding/binary"
"log" "log"
"sync" "sync"
"time" "time"
@ -10,36 +10,13 @@ import (
// Register 操作注册表 // Register 操作注册表
var Register map[string]func(worker *Worker) var Register map[string]func(worker *Worker)
// OperatorFlag 训练
type OperatorFlag uint16
const (
// UltrasonicPower bit15 超声波电源开关 1开0关
UltrasonicPower OperatorFlag = 0b1000000000000000
// CirculatingIrrigation bit14 循环灌洗水泵 1开0关
CirculatingIrrigation OperatorFlag = 0b0100000000000000
UFRecoil OperatorFlag = 0b0010000000000000 // bit13 UF 超滤膜反冲进水阀 1开0关
UFPositive OperatorFlag = 0b0001000000000000 // bit12 UF 超滤膜正冲进水阀 1开0关
UFTreatedWater OperatorFlag = 0b0000100000000000 // bit11 UF 超滤膜净水出水阀 1开0关
UFRawWater OperatorFlag = 0b0000010000000000 // bit10 UF超滤膜原水进水阀 1开0关
CirculatingTankWashWater OperatorFlag = 0b0000001000000000 // bit9 循环罐洗进水电动球阀 1开0关
UFPositiveFlushingWaterOutlet OperatorFlag = 0b0000000100000000 // bit8 UF超滤膜正冲浓水出口电磁阀 1开0关
CleaningTankExhaust OperatorFlag = 0b0000000010000000 // bit7 清洗罐排气电磁阀 1开0关
DPFCompactCylinderControlB OperatorFlag = 0b0000000001000000 // bit6 DPF压紧气缸控制电磁阀B 1开0关
DPFCompactCylinderControlA OperatorFlag = 0b0000000000100000 // bit5 DPF压紧气缸控制电磁阀A 1开0关
CleaningTankDrainingWater OperatorFlag = 0b0000000000010000 // bit4 清洗罐放水阀控制电磁阀 1开0关
GasExplosion OperatorFlag = 0b0000000000001000 // bit3 气爆阀控制电磁阀 1开0关
CleaningTankInflation OperatorFlag = 0b0000000000000100 // bit2 清洗罐充气电磁阀 1开0关
CleaningTankSealB OperatorFlag = 0b0000000000000010 // bit1 清洗罐密封圈充气电磁阀B 1开0关
CleaningTankSealA OperatorFlag = 0b0000000000000001 // bit0 清洗罐密封圈充气电磁阀A 1开0关
)
// init 初始化 // init 初始化
func init() { func init() {
Register["干洗"] = func(worker *Worker) { Register = make(map[string]func(worker *Worker))
buf := &bytes.Buffer{}
buf.Write([]byte(0xaa)) Register["超声波清洗"] = ChaoShengBoQingXi
}
Register["清洗罐放水"] = QingXiGuanFangShui
} }
// Worker 接收命令 // Worker 接收命令
@ -60,6 +37,19 @@ type Worker struct {
waitGroup *sync.WaitGroup waitGroup *sync.WaitGroup
} }
func OperatorOption(flag OperatorFlag) []byte {
var buf []byte = make([]byte, 8, 8)
buf[0] = byte(0xaa)
buf[1] = byte(0x55)
binary.BigEndian.PutUint16(buf[2:], uint16(flag))
check := byte(0)
for _, b := range buf {
check += b
}
buf[7] = check
return buf
}
// Log 日志 // Log 日志
type Log struct { type Log struct {
Data []byte Data []byte
@ -86,7 +76,12 @@ func NewWorker() *Worker {
return w return w
} }
func (worker *Worker) write(data []byte) { // Sensor 当前传感器状态
func (worker *Worker) Sensor() *Sensor {
return NewSensor(worker.Read())
}
func (worker *Worker) Write(data []byte) {
worker.writelogsLock.Lock() worker.writelogsLock.Lock()
worker.isOperating = true worker.isOperating = true
@ -98,8 +93,8 @@ func (worker *Worker) write(data []byte) {
} }
// read 如果没有读到数据为nil // Read 如果没有读到数据为nil
func (worker *Worker) read() (result []byte) { func (worker *Worker) Read() (result []byte) {
worker.readlogsLock.Lock() worker.readlogsLock.Lock()
if len(worker.readlogs) > 0 { if len(worker.readlogs) > 0 {
@ -120,7 +115,6 @@ func (worker *Worker) operator(wait *sync.WaitGroup) {
if worker.isStop > 0 { if worker.isStop > 0 {
break break
} }
now := time.Now() now := time.Now()
worker.commandLock.Lock() worker.commandLock.Lock()
@ -160,9 +154,8 @@ func (worker *Worker) status(wait *sync.WaitGroup) {
if err != nil { if err != nil {
log.Println(err) log.Println(err)
} else { } else {
log.Println(n)
if n > 0 { if n > 0 {
worker.readlogsLock.Lock() worker.readlogsLock.Lock()
worker.readlogs = append(worker.readlogs, Log{buf, time.Now()}) worker.readlogs = append(worker.readlogs, Log{buf, time.Now()})
if len(worker.readlogs) >= 1000 { if len(worker.readlogs) >= 1000 {
@ -225,7 +218,9 @@ func (worker *Worker) Run() {
worker.port = sp worker.port = sp
worker.waitGroup.Add(1) worker.waitGroup.Add(1)
go worker.status(worker.waitGroup) go worker.status(worker.waitGroup)
go worker.operator(worker.waitGroup)
worker.waitGroup.Wait() worker.waitGroup.Wait()
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
超声波.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB