golang如何使用gos7讀取S7200Smart數(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)文章
關(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使用golang生成prometheus格式數(shù)據(jù)
Prometheus是一個(gè)開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對(duì)大家有所幫助2025-02-02解讀unsafe.Pointer和uintptr的區(qū)別
這篇文章主要介紹了解讀unsafe.Pointer和uintptr的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-023個(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