1、使用测试工具

其中的含义是

str:类型
db200:表示数据块号 db200。
10:表示起始字节偏移量为第 10 个字节。
10:表示数据长度为 10 字节。
2、根据测试工具的数据进行读取得到的结果

3、完整代码示例:
// 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数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论