使用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)
}
参考
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: