From 28addaa46cb97c20ad37e13eb10535de7b75e71c Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期三, 29 十一月 2023 19:29:43 +0800
Subject: [PATCH] 首次报工开始时间为工序开始时间

---
 pkg/plccom/mitsubishi/protocol.go |  101 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 99 insertions(+), 2 deletions(-)

diff --git a/pkg/plccom/mitsubishi/protocol.go b/pkg/plccom/mitsubishi/protocol.go
index 17ba649..f6238bd 100644
--- a/pkg/plccom/mitsubishi/protocol.go
+++ b/pkg/plccom/mitsubishi/protocol.go
@@ -21,7 +21,7 @@
 		}
 	}
 	var val int
-	fmt.Sscanf(num, "%X", &val)
+	fmt.Sscanf(num, "%d", &val)
 	vaddr := 0x1000 + val*2
 	return fmt.Sprintf("%X", vaddr)
 }
@@ -33,6 +33,28 @@
 	pro := []byte{0x30}
 	pro = append(pro, []byte(addr)...)
 	pro = append(pro, []byte("02")...)
+	pro = append(pro, []byte{0x03}...)
+
+	crc := crc(pro)
+
+	proto := []byte{0x02}
+	proto = append(proto, pro...)
+	proto = append(proto, []byte(crc)...)
+
+	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)
@@ -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 {
@@ -95,7 +192,7 @@
 	}
 	if v == 0x06 {
 		// 鎴愬姛
-		return v, ok
+		return v, true
 	}
 	return v, false
 }

--
Gitblit v1.8.0