package plc
|
|
//
|
//import (
|
// "encoding/hex"
|
// "errors"
|
// "fmt"
|
// "io"
|
// "strings"
|
// "time"
|
//
|
// "github.com/jacobsa/go-serial/serial"
|
//)
|
//
|
///*
|
//定义串口客户端
|
//*/
|
//
|
//type SerialClient struct {
|
// readWriter io.ReadWriteCloser
|
// OutBuffer chan string
|
// PortName string
|
// baudRate uint
|
//}
|
//
|
//func NewSerialClient(portName string, baudRate uint) (*SerialClient, error) {
|
// c := &SerialClient{
|
// readWriter: nil,
|
// OutBuffer: make(chan string, 1024),
|
// PortName: portName,
|
// baudRate: baudRate,
|
// }
|
// r, err := c.open(portName, baudRate)
|
// if err != nil {
|
// return nil, err
|
// }
|
//
|
// c.readWriter = r
|
// return c, nil
|
//}
|
//
|
//func (c *SerialClient) Start() {
|
// for {
|
// buf := make([]byte, 1024)
|
// n, err := c.readWriter.Read(buf)
|
// if err != nil {
|
// if err != io.EOF {
|
// //尝试重新打开
|
// r, err := c.open(c.PortName, c.baudRate)
|
// if err != nil {
|
// time.Sleep(2 * time.Second)
|
// continue
|
// }
|
// c.readWriter = r
|
// }
|
// continue
|
// }
|
//
|
// buf = buf[:n]
|
// res := hex.EncodeToString(buf)
|
// if strings.TrimSpace(res) == "" {
|
// continue
|
// }
|
// fmt.Printf("Rx: %s\n", res)
|
// c.OutBuffer <- res
|
// }
|
//}
|
//
|
//func (c *SerialClient) open(portName string, baudRate uint) (io.ReadWriteCloser, error) {
|
// options := serial.OpenOptions{
|
// PortName: portName,
|
// BaudRate: baudRate,
|
// DataBits: 7,
|
// StopBits: 1,
|
// MinimumReadSize: 4,
|
// ParityMode: serial.PARITY_EVEN,
|
// }
|
//
|
// r, err := serial.Open(options)
|
// if err != nil {
|
// return nil, err
|
// }
|
//
|
// c.readWriter = r
|
//
|
// return r, err
|
//}
|
//
|
//func (c *SerialClient) Close() {
|
// if c.readWriter != nil {
|
// c.readWriter.Close()
|
// }
|
//}
|
//
|
//func (c *SerialClient) SendMsg(data string) (int, error) {
|
// if c.readWriter == nil {
|
// return 0, errors.New("serial port is closed")
|
// }
|
//
|
// bytes, err := hex.DecodeString(data)
|
// if err != nil {
|
// return 0, err
|
// }
|
//
|
// return c.readWriter.Write(bytes)
|
//}
|
//
|
//func (c *SerialClient) ReadHoldRegister(addr string) (int, error) {
|
// if c.readWriter == nil {
|
// return 0, errors.New("serial port is closed")
|
// }
|
//
|
// // 三菱fn系列串口协议
|
// // 02 表示开始 + 30 表示读数据 + 4位地址位 + 02 数据长度 + 03 停止 + 偶校验
|
//
|
// // 先组装数据
|
// // 读取的地址
|
// dataBytes := append([]byte{0x30}, []byte(addr)...)
|
//
|
// // 读取的长度
|
// dataBytes = append(dataBytes, []byte("02")...)
|
//
|
// // 停止
|
// dataBytes = append(dataBytes, []byte{0x03}...)
|
//
|
// // 计算校验码, 30 + 地址编码 + 数据长度 + 03 , 十六进制结果取后两位.
|
// var sum uint8
|
// for _, d := range dataBytes {
|
// sum += d
|
// }
|
//
|
// sumStr := fmt.Sprintf("%x", sum)
|
//
|
// fmt.Printf("sumStr: %s\n", sumStr)
|
//
|
// var checkCode string
|
// if len(sumStr) < 2 {
|
// checkCode = "0" + sumStr
|
// } else {
|
// checkCode = sumStr[len(sumStr)-2:]
|
// }
|
//
|
// var bytes = []byte{0x02}
|
// // 添加数据
|
// bytes = append(bytes, dataBytes...)
|
// // 添加校验
|
// bytes = append(bytes, []byte(checkCode)...)
|
//
|
// fmt.Printf("Tx: %X \n", bytes)
|
//
|
// // 写
|
// if n, err := c.readWriter.Write(bytes); err != nil {
|
// return n, err
|
// } else {
|
// fmt.Printf("Tx:len:%d\n", n)
|
// }
|
//
|
// // 读
|
// buf := make([]byte, 1024)
|
// n, err := c.readWriter.Read(buf)
|
// if err != nil {
|
// return n, err
|
// }
|
//
|
// buf = buf[:n]
|
//
|
// fmt.Printf("Rx: %X\nRx len:%d", buf, n)
|
// fmt.Printf("value: %d\n", buf[2:6])
|
//
|
// return n, nil
|
//}
|
//
|
//func (c *SerialClient) WriteHoldRegister(addr string) (int, error) {
|
// if c.readWriter == nil {
|
// return 0, errors.New("serial port is closed")
|
// }
|
//
|
// // 三菱fn系列串口协议
|
// // 02 表示开始 + 31 表示写数据 + 4位地址位 + 02 数据长度 + 03 停止 + 偶校验
|
//
|
// // 先组装数据
|
// // 读取的地址
|
// dataBytes := append([]byte{0x31}, []byte(addr)...)
|
//
|
// // 读取的长度
|
// dataBytes = append(dataBytes, []byte("02")...)
|
//
|
// // 停止
|
// dataBytes = append(dataBytes, []byte{0x03}...)
|
//
|
// // 计算校验码, 30 + 地址编码 + 数据长度 + 03 , 十六进制结果取后两位.
|
// var sum uint8
|
// for _, d := range dataBytes {
|
// sum += d
|
// }
|
//
|
// sumStr := fmt.Sprintf("%x", sum)
|
//
|
// fmt.Printf("sumStr: %s\n", sumStr)
|
//
|
// var checkCode string
|
// if len(sumStr) < 2 {
|
// checkCode = "0" + sumStr
|
// } else {
|
// checkCode = sumStr[len(sumStr)-2:]
|
// }
|
//
|
// var bytes = []byte{0x02}
|
// // 添加数据
|
// bytes = append(bytes, dataBytes...)
|
// // 添加校验
|
// bytes = append(bytes, []byte(checkCode)...)
|
//
|
// fmt.Printf("Tx: %X \n", bytes)
|
//
|
// // 写
|
// if n, err := c.readWriter.Write(bytes); err != nil {
|
// return n, err
|
// } else {
|
// fmt.Printf("Tx:len:%d\n", n)
|
// }
|
//
|
// // 读
|
// buf := make([]byte, 1024)
|
// n, err := c.readWriter.Read(buf)
|
// if err != nil {
|
// return n, err
|
// }
|
//
|
// buf = buf[:n]
|
//
|
// fmt.Printf("Rx: %X\nRx len:%d", buf, n)
|
// fmt.Printf("value: %d\n", buf[2:6])
|
//
|
// return n, nil
|
//}
|