package collector
|
|
import (
|
"fmt"
|
|
plc4go "github.com/apache/plc4x/plc4go/pkg/api"
|
"github.com/apache/plc4x/plc4go/pkg/api/drivers"
|
apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
|
"github.com/apache/plc4x/plc4go/pkg/api/transports"
|
)
|
|
func NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
|
// 创建驱动管理器
|
driverManager := plc4go.NewPlcDriverManager()
|
|
// 注册TCP传输
|
transports.RegisterTcpTransport(driverManager)
|
|
// 注册驱动
|
//drivers.RegisterKnxDriver(driverManager)
|
drivers.RegisterModbusTcpDriver(driverManager)
|
|
// 通过TCP连接PLC设备
|
connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr)
|
connectionRequestChanel := driverManager.GetConnection(connectionString)
|
|
// 等待连接响应
|
connectionResult := <-connectionRequestChanel
|
|
// 判断是否连接成功
|
if err := connectionResult.GetErr(); err != nil {
|
return nil, err
|
}
|
|
return connectionResult.GetConnection(), nil
|
}
|
|
func ReadHoldingRegister(connection plc4go.PlcConnection, address int) ([]byte, error) {
|
tagAddress := fmt.Sprintf("holding-register:%d:DINT", address)
|
|
// 读模式
|
readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build()
|
if err != nil {
|
fmt.Printf("preparing read-request:%s\n", err.Error())
|
return nil, err
|
}
|
|
// 执行
|
readResult := <-readRequest.Execute()
|
if err := readResult.GetErr(); err != nil {
|
fmt.Printf("execting read-request:%s\n", err.Error())
|
return nil, err
|
}
|
|
// 判断响应码是否正确
|
if readResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK {
|
fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName())
|
return nil, nil
|
}
|
|
value := readResult.GetResponse().GetValue("tag")
|
|
return value.GetRaw(), err
|
|
}
|