zhangqian
2023-11-03 7335d19846ad4f5b0a61541a992d61763c5cf35b
pkg/plccom/plccom.go
@@ -19,11 +19,18 @@
   // MakeReadProtocol 创建读取数据的协议
   MakeReadProtocol(addr string) []byte
   // MakeReadProtocolBits 创建读取数据的协议
   MakeReadProtocolBits(bits int, addr string) []byte
   // MakeWriteProtocol 创建写入数据的协议
   MakeWriteProtocol(addr string, value int) []byte
   MakeWriteProtocolBits(bits int, addr string, ival int) []byte
   // ParseReadValue 解析从设备读取的值
   ParseReadValue(data []byte) int
   ParseReadValueBits(data []byte) int
   // ParseWriteValue 解析写入设备的结果,并返回结果和是否成功
   ParseWriteValue(data []byte) (int, bool)
@@ -49,13 +56,19 @@
   return protocol, nil
}
func ReadPLC(deviceType, url, label string) (val int, err error) {
func ReadPLC(deviceType, url, label string, length int) (val int, err error) {
   protocol, err := LoadProtocol(deviceType)
   if err != nil {
      return 0, err
   }
   addr := protocol.ConvertLabelToAddress(label)
   proto := protocol.MakeReadProtocol(addr)
   var proto []byte
   if length == 1 {
      proto = protocol.MakeReadProtocol(addr)
   } else {
      proto = protocol.MakeReadProtocolBits(length*16, addr)
   }
   bp := base64.StdEncoding.EncodeToString(proto)
   fullUrl := fmt.Sprintf("%v?proto=%v", url, bp)
   resp, err := http.Get(fullUrl)
@@ -69,7 +82,12 @@
      logx.Errorf("ReadPLC base64.StdEncoding.DecodeString failed: %v, data: %v", err, string(body))
      return 0, err
   }
   val = protocol.ParseReadValue(data)
   if length == 1 {
      val = protocol.ParseReadValue(data)
   } else {
      val = protocol.ParseReadValueBits(data)
   }
   fmt.Println("read PLC:", val)
   return val, nil
@@ -91,7 +109,13 @@
      return err
   }
   addr := protocol.ConvertLabelToAddress(label)
   proto := protocol.MakeWriteProtocol(addr, val)
   var proto []byte
   if val < 65536 {
      proto = protocol.MakeWriteProtocol(addr, val)
   } else {
      proto = protocol.MakeWriteProtocolBits(32, addr, val)
   }
   bp := base64.StdEncoding.EncodeToString(proto)
   resp, err := http.Post(url, "text/plain", strings.NewReader(bp))
   if err != nil {