欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang如何使用gos7讀取S7200Smart數(shù)據(jù)

 更新時(shí)間:2024年12月04日 09:10:59   作者:攬?jiān)码S風(fēng)醉  
文章介紹了如何使用Golang語言的Gos7工具庫(kù)讀取西門子S7200Smart系列PLC的數(shù)據(jù),通過指定數(shù)據(jù)塊號(hào)、起始字節(jié)偏移量和數(shù)據(jù)長(zhǎng)度,可以精確讀取所需的數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧

1、使用測(cè)試工具

其中的含義是

str:類型
DB200:表示數(shù)據(jù)塊號(hào) DB200。
10:表示起始字節(jié)偏移量為第 10 個(gè)字節(jié)。
10:表示數(shù)據(jù)長(zhǎng)度為 10 字節(jié)。

2、根據(jù)測(cè)試工具的數(shù)據(jù)進(jìn)行讀取得到的結(jié)果

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并讀取不同類型的數(shù)據(jù)
// @Author 鐵憨憨[cory] 2024-11-29 11:16:41
func PclMain() {
	// 設(shè)置和連接PLC
	const (
		tcpDevice = "127.0.0.1" //IP地址
		rack      = 0           //機(jī)架號(hào)
		slot      = 1           //插槽號(hào)
	)
	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("關(guān)閉PLC失敗:", err)
		}
	}(handler)
	// 創(chuàng)建客戶端
	client := gos7.NewClient(handler)
	// 定義測(cè)試數(shù)據(jù)
	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  根據(jù)數(shù)據(jù)類型從PLC讀取數(shù)據(jù)
// @Author 鐵憨憨[cory] 2024-11-29 11:15:39
// @Param client PLC客戶端
// @Param address 數(shù)據(jù)地址
// @Param start 數(shù)據(jù)起始位置
// @Param size 數(shù)據(jù)大小
// @Param dataType 數(shù)據(jù)類型
// @Return result 讀取的數(shù)據(jù)
// @Return err 可能的錯(cuò)誤
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 {
			// 將字節(jié)數(shù)據(jù)轉(zhuǎn)換為 SHORT(有符號(hào) 16 位整數(shù))
			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("不支持的數(shù)據(jù)類型: %s\n", dataType)
		return
	}
	return
}

到此這篇關(guān)于golang使用gos7讀取S7200Smart數(shù)據(jù)的文章就介紹到這了,更多相關(guān)golang讀取S7200Smart數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang日志庫(kù)logrus的介紹與使用示例代碼

    Golang日志庫(kù)logrus的介紹與使用示例代碼

    Logrus是Go語言的一個(gè)功能豐富的日志庫(kù),支持結(jié)構(gòu)化日志和多級(jí)別日志記錄,它兼容標(biāo)準(zhǔn)log庫(kù),并可通過自定義Hooks和Formatter進(jìn)行高度定制化,支持集成如syslog等系統(tǒng),便于管理和分析,Logrus還支持自定義日志顏色和格式,以及根據(jù)日志級(jí)別進(jìn)行不同處理,如panic和exit
    2024-10-10
  • Golang并發(fā)編程重點(diǎn)講解

    Golang并發(fā)編程重點(diǎn)講解

    這篇文章主要介紹了Golang并發(fā)編程,在許多環(huán)境中,實(shí)現(xiàn)對(duì)共享變量的正確訪問所需要的微妙之處使并發(fā)編程變得困難。Go鼓勵(lì)一種不同的方法,在這種方法中,共享值在通道中傳遞,實(shí)際上,從不由單獨(dú)的執(zhí)行線程主動(dòng)共享
    2023-04-04
  • 關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng)總結(jié)(強(qiáng)烈推薦!)

    關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng)總結(jié)(強(qiáng)烈推薦!)

    map是一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng),需要的朋友可以參考下
    2023-01-01
  • Go語言學(xué)習(xí)筆記之反射用法詳解

    Go語言學(xué)習(xí)筆記之反射用法詳解

    這篇文章主要介紹了Go語言學(xué)習(xí)筆記之反射用法,詳細(xì)分析了Go語言中反射的概念、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • GoLang context包的使用方法介紹

    GoLang context包的使用方法介紹

    日常Go開發(fā)中,Context包是用的最多的一個(gè)了,幾乎所有函數(shù)的第一個(gè)參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實(shí)現(xiàn)是如何呢?相信你也一定會(huì)有探索的欲望,那么就跟著本篇文章,一起來學(xué)習(xí)吧
    2023-03-03
  • 使用golang生成prometheus格式數(shù)據(jù)

    使用golang生成prometheus格式數(shù)據(jù)

    Prometheus是一個(gè)開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對(duì)大家有所幫助
    2025-02-02
  • Golang如何讀取單行超長(zhǎng)的文本詳解

    Golang如何讀取單行超長(zhǎng)的文本詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何讀取單行超長(zhǎng)文本的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 解讀unsafe.Pointer和uintptr的區(qū)別

    解讀unsafe.Pointer和uintptr的區(qū)別

    這篇文章主要介紹了解讀unsafe.Pointer和uintptr的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 3個(gè)Go語言中實(shí)用重構(gòu)技術(shù)分享

    3個(gè)Go語言中實(shí)用重構(gòu)技術(shù)分享

    代碼重構(gòu)是在不改變外部功能的情況下對(duì)現(xiàn)有代碼進(jìn)行改進(jìn),是編程的核心部分之一,本文為大家介紹了Go語言中3個(gè)實(shí)用重構(gòu)技術(shù),需要的可以參考一下
    2023-06-06
  • goland使用go mod模式的步驟詳解

    goland使用go mod模式的步驟詳解

    這篇文章主要介紹了goland使用go mod模式的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論