使用gos7库采集西门子S7-200SMART数据

西门子S7分为许多系列,如:S7-200、S7-300、S7-400、S7-1200、S7-1500等
本篇文章选用S7-200SMART,其它系列基本上是一样的

环境安装

Go1.20.*

安装gos7库

go get github.com/robinson/gos7

连接PLC

通信协议: 工业以太网协议(PROFINET)

plc rack slot
s7-200smart 0 1
import (
    "log"
    "time"
    "github.com/robinson/gos7"
)

func main() {
    // 创建一个新的连接
    handler := gos7.NewTCPClientHandler("192.168.1.100", 0, 1)
    handler.Timeout = 5 * time.Second
    handler.IdleTimeout = 5 * time.Second
    //handler.ConnectionType = 3
    handler.Logger = log.New(os.Stdout, "tcp: ", log.LstdFlags)
    err := handler.Connect()
    if err != nil {
        log.Println(err)
        return
    }
    defer handler.Close()

    // 建立连接
    client := gos7.NewClient(handler)
}

读取数据

存储区

I Q M DB/V CT TM
0x81 0x82 0x83 0x84 0x1C 0x1D

对于S7-200SMART,DB/V区dbnumber为1,其它区为0

代码

// 省略以上代码
// ....

func main() {
    // ...

    dbNumber := 1
    register := "v" // 寄存器
    address := 10 // 地址
    length := 1 // 长度
    buffer := make([]byte, length)
    switch register {
    case "i":
        err = client.AGReadEB(address, length, buffer)
        break
    case "q":
        err = client.AGReadAB(address, length, buffer)
        break
    case "m":
        err = client.AGReadMB(address, length, buffer)
        break
    case "v":
        err = client.AGReadDB(dbNumber, address, length, buffer)
        break
    case "ct":
        err = client.AGReadCT(address, length, buffer)
        break
    case "tm":
        err = client.AGReadTM(address, length, buffer)
        break
    }

    if err != nil {
        log.Println(err)
        return
    }

    // 解析返回数据
    log.Println(buffer)
    var s7 gos7.Helper
    var ret uint8
    s7.GetValueAt(buffer, 0, &ret)
    log.Println(ret)
}

参考

1.使用Snap7读写西门子S7系列PLC

本作品采用《CC 协议》,转载必须注明作者和本文链接
PHP/Go/Python/Vue,什么都会一点,接外包、兼职|全职Job。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!