From 7335d19846ad4f5b0a61541a992d61763c5cf35b Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 03 十一月 2023 17:17:44 +0800 Subject: [PATCH] 串口支持大数读写 --- pkg/plccom/mitsubishi/protocol.go | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 97 insertions(+), 0 deletions(-) diff --git a/pkg/plccom/mitsubishi/protocol.go b/pkg/plccom/mitsubishi/protocol.go index 3f7a12a..f6238bd 100644 --- a/pkg/plccom/mitsubishi/protocol.go +++ b/pkg/plccom/mitsubishi/protocol.go @@ -44,6 +44,28 @@ return proto } +// MakeReadProtocolBits 涓夎彵璇诲崗璁�, addr 鏄璇诲彇鐨勫瘎瀛樺櫒鍦板潃 +func (p *ProtocolMitsubishi) MakeReadProtocolBits(bits int, addr string) []byte { + // 02 琛ㄧず寮�濮� + 30 琛ㄧず璇绘暟鎹� + 4浣嶅湴鍧�浣� + 02 鏁版嵁闀垮害 + 03 鍋滄 + 鍋舵牎楠� + + pro := []byte{0x30} + pro = append(pro, []byte(addr)...) + if bits == 16 { + pro = append(pro, []byte("02")...) + } else if bits == 32 { + pro = append(pro, []byte("04")...) + } + pro = append(pro, []byte{0x03}...) + + crc := crc(pro) + + proto := []byte{0x02} + proto = append(proto, pro...) + proto = append(proto, []byte(crc)...) + + return proto +} + // MakeWriteProtocol 鍒涘缓鍐欏叆鏁版嵁鐨勫崗璁� func (p *ProtocolMitsubishi) MakeWriteProtocol(addr string, value int) []byte { valueStr := fmt.Sprintf("000%X", value) @@ -66,6 +88,46 @@ return proto } +func (p *ProtocolMitsubishi) MakeWriteProtocolBits(bits int, addr string, ival int) []byte { + + // 02 琛ㄧず寮�濮� + 31 琛ㄧず鍐欐暟鎹� + 4浣嶅湴鍧�浣� + 02 鏁版嵁闀垮害 + 03 鍋滄 + 鍋舵牎楠� + proto := []byte{0x31} + proto = append(proto, []byte(addr)...) + if bits == 16 { + proto = append(proto, []byte("02")...) + + vstr := fmt.Sprintf("000%X", ival) + val := vstr[len(vstr)-2:] + val += vstr[len(vstr)-4 : len(vstr)-2] + proto = append(proto, val...) + } else if bits == 32 { + proto = append(proto, []byte("04")...) + + vstr := fmt.Sprintf("0000000%X", ival) + // 浣�16浣� + low := vstr[len(vstr)-4:] + // 楂�16浣� + high := vstr[len(vstr)-8 : len(vstr)-4] + // 鍏堝瓨鍌ㄤ綆16浣� + val := low[2:] + val += low[0:2] + proto = append(proto, val...) + val = high[2:] + val += high[0:2] + proto = append(proto, val...) + } + + proto = append(proto, []byte{0x03}...) + + crc := crc(proto) + + pro := []byte{0x02} + pro = append(pro, proto...) + pro = append(pro, []byte(crc)...) + + return pro +} + // ParseReadValue 瑙f瀽浠庤澶囪鍙栫殑鍊� func (p *ProtocolMitsubishi) ParseReadValue(data []byte) int { if len(data) < 6 { @@ -82,6 +144,41 @@ return int(bint) } +func (p *ProtocolMitsubishi) ParseReadValueBits(data []byte) int { + if len(data) < 6 { + return -1 + } + + // 0x2 [xxxxxxxx] 0x3 crc1 crc2 + // 鍙栧嚭鏁版嵁 + + fmt.Printf("ParseReadValueBits %X\n", data) + + var num int64 + vhex := data[1 : len(data)-3] + for i := len(vhex); i > 0; i -= 4 { + tmp := vhex[i-4 : i] + v := tmp[2:] + v = append(v, tmp[0:2]...) + var bint int64 + + bint, _ = strconv.ParseInt(string(v), 16, 32) + if num == 0 { + num = 0x10000 * bint + } else { + num += bint + } + } + + // v := vhex[2:] + // v = append(v, vhex[0:2]...) + // vstr := string(v) + // var bint int64 + // bint, _ = strconv.ParseInt(vstr, 16, 32) + + return int(num) +} + // ParseWriteValue 瑙f瀽鍐欏叆璁惧鐨勭粨鏋� func (p *ProtocolMitsubishi) ParseWriteValue(data []byte) (v int, ok bool) { if len(data) == 0 { -- Gitblit v1.8.0