31人参与 • 2025-02-14 • Golang
其中的含义是
str:类型
db200:表示数据块号 db200。
10:表示起始字节偏移量为第 10 个字节。
10:表示数据长度为 10 字节。
2、根据测试工具的数据进行读取得到的结果
// package utility // @author 铁憨憨[cory] 2024/11/28 17:17:00 package utility import ( "encoding/binary" "fmt" "github.com/robinson/gos7" "math" "time" ) // @title pclmain // @description 连接到plc并读取不同类型的数据 // @author 铁憨憨[cory] 2024-11-29 11:16:41 func pclmain() { // 设置和连接plc const ( tcpdevice = "127.0.0.1" //ip地址 rack = 0 //机架号 slot = 1 //插槽号 ) handler := gos7.newtcpclienthandler(tcpdevice, rack, slot) handler.timeout = 200 * time.second handler.idletimeout = 200 * time.second //handler.logger = log.new(os.stdout, "tcp: ", log.lstdflags) err := handler.connect() if err != nil { fmt.println("连接plc失败:", err) return } defer func(handler *gos7.tcpclienthandler) { err := handler.close() if err != nil { fmt.println("关闭plc失败:", err) } }(handler) // 创建客户端 client := gos7.newclient(handler) // 定义测试数据 testcases := []struct { param1, param2, param3 int datatype string }{ {200, 10, 10, "str"}, {200, 30, 10, "str"}, {200, 1, 1, "bool"}, {200, 4, 2, "short"}, {200, 60, 4, "float"}, {1, 1, 0, "bool"}, {709, 0, 0, "bool"}, {709, 0, 1, "bool"}, {818, 2210, 1, "byte"}, {292, 200, 2, "short"}, {292, 202, 2, "short"}, {818, 204, 2, "short"}, {818, 236, 28, "str"}, } for { for _, testcase := range testcases { data, dataerr := readdata(client, testcase.param1, testcase.param2, testcase.param3, testcase.datatype) if dataerr == nil { fmt.print(data, " ") } } fmt.println(" ") fmt.println(" ") fmt.println(" ") // 休眠1秒 time.sleep(1 * time.second) } } // @title readdata // @description 根据数据类型从plc读取数据 // @author 铁憨憨[cory] 2024-11-29 11:15:39 // @param client plc客户端 // @param address 数据地址 // @param start 数据起始位置 // @param size 数据大小 // @param datatype 数据类型 // @return result 读取的数据 // @return err 可能的错误 func readdata(client gos7.client, address, start, size int, datatype string) (result interface{}, err error) { switch datatype { case "str": buf := make([]byte, size) err = client.agreaddb(address, start, size, buf) if err == nil { result = string(buf) } case "bool": buffer := make([]byte, 1) err = client.agreaddb(address, start, size, buffer) if err == nil { boolvalue := (buffer[0] & (1 << 0)) != 0 // 第 0 位 result = boolvalue } case "short": buffer := make([]byte, size) err = client.agreaddb(address, start, size, buffer) if err == nil { // 将字节数据转换为 short(有符号 16 位整数) shortvalue := int16(binary.bigendian.uint16(buffer)) result = shortvalue } case "float": buffer := make([]byte, size) err = client.agreaddb(address, start, size, buffer) if err == nil { floatvalue := math.float32frombits(binary.bigendian.uint32(buffer)) result = floatvalue } case "byte": buf := make([]byte, size) err = client.agreaddb(address, start, size, buf) if err == nil { result = buf[0] } default: fmt.printf("不支持的数据类型: %s\n", datatype) return } return }
到此这篇关于golang使用gos7读取s7200smart数据的文章就介绍到这了,更多相关golang读取s7200smart数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论