当前位置: 首页 > article >正文

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
}


http://www.kler.cn/a/417865.html

相关文章:

  • 简单web项目自定义部署Dockerfile
  • Python小白语法基础18(文件操作)
  • 1180 - 【入门】数字出现次数
  • 视觉语言动作模型VLA的持续升级:从π0之参考基线Octo到OpenVLA、TinyVLA、DeeR-VLA、3D-VLA
  • 牛客-尼科彻斯定理、整型数组合并
  • 【软件工程】期末练习题(1){持续更新中}
  • 关于使用天地图、leaflet、ENVI、Vue工具实现 前端地图上覆盖上处理的农业地块图层任务
  • Java 泛型详细解析
  • YOLO-学习笔记
  • 算法笔记:力扣148. 排序链表
  • 大模型学习方法之——大模型技术学习路线
  • Hutool 秒速实现 2FA 两步验证
  • How to install mac application by homebrew
  • Oracle12.2 RAC集群管理之增加删除节点(DNS解析)
  • 区块链技术如何改变我们的日常生活?
  • 生产环境中:Flume 与 Prometheus 集成
  • C# 字节流 与 StreamReader 读取 Json 格式文件内容并处理的函数
  • Redis主从架构
  • 远离网上的广告和无用信息,自己动手搭建Tipask问答网站
  • 6、将机器人移动到指定关节角度或位置
  • IDEA:配置Serializable class without ‘serialVersionUID’ 找不到
  • Rust编程语言代码详细运行、编译方法
  • 日程公布 | 西部地区生活物资保供与城郊大仓基地高质量建设运营论坛(12月5日·西安)
  • 一文了解TensorFlow是什么
  • Docker:清理Docker占用的磁盘空间
  • PostgreSQL详细安装教程