golang使用gos7读取S7200Smart数据
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
}