it编程 > 前端脚本 > Golang

golang如何使用gos7读取S7200Smart数据

31人参与 2025-02-14 Golang

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数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Gin+Gorm实现增删改查的示例代码

02-14

Go语言跨平台时字符串中的换行符如何统一?

02-14

golang debug调试的实现

02-14

Go语言利用正则表达式处理多行文本

02-14

Go语言中的map扩容机制

02-14

使用Go语言中的Context取消协程执行的操作代码

02-14

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论