func main() {
//1、与服务端建立连接
conn, err := net.Dial("tcp", "127.0.0.1:502")
if err != nil {
fmt.Printf("dial failed, err:%v\n", err)
return
}
//2、利用该连接进行数据的发送和接收
//input := bufio.NewReader(os.Stdin)
for {
//s, _ := input.ReadString('\n')
//s = strings.TrimSpace(s)
//if strings.ToUpper(s) == "Q" {
// return
//}
//给服务端发消息
//_, err := conn.Write([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x01, 0x00, 0x01})
// 该指令06指的是后面有六个字节数据,往后数01是设备地址,03是功能码,
// 00 01是起始地址为01地址开始读取数据,00 01指只读取一个寄存器(地址为01)
str := "000000000006010300010001"
// 把16进制字符串转字节数组
buff,_ := hex.DecodeString(str)
_, err := conn.Write(buff)
if err != nil {
fmt.Printf("send failed,err:%v\n", err)
return
}
//从服务端接收回复的消息
buf := make([]byte, 2048)
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("read failed,err:%v\n", err)
return
}
hex := fmt.Sprintf("%x", buf[:n])
fmt.Printf("收到服务端回复:%v\n", hex)
data := hex[18:22]
fmt.Println(data)
num1, _ := strconv.ParseUint(data, 16, 32)
fmt.Printf("%v 16进制转字符串:%v\n", data, num1)
num := 0.00
num = float64(float32(num1) / float32(100))
num, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", num), 64)
fmt.Printf("数字解析为:%v\n", num)
}
}
该代码相当于用TCP连接服务端,然后往服务端发送modbus-tcp的指令,采用mthing工业软件进行接收客户端发送的数据,再进行回复指令。把回复的指令从字节转16进制的hex字符串。