| | |
| | | "time" |
| | | ) |
| | | |
| | | var driverManager plc4go.PlcDriverManager |
| | | |
| | | func init() { |
| | | // 创建驱动管理器 |
| | | driverManager = plc4go.NewPlcDriverManager() |
| | | // 注册TCP传输 |
| | | transports.RegisterTcpTransport(driverManager) |
| | | // 注册串口传输 |
| | | transports.RegisterSerialTransport(driverManager) |
| | | // 注册驱动 |
| | | drivers.RegisterModbusTcpDriver(driverManager) |
| | | drivers.RegisterModbusRtuDriver(driverManager) |
| | | } |
| | | |
| | | func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { |
| | | // 创建一个上下文,并设置 3 秒超时 |
| | | ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) |
| | | defer cancel() |
| | | conn, err := newModbusConnection(ctx, ipAddr) |
| | | conn, err := newModbusTCPConnection(ctx, ipAddr) |
| | | if err != nil { |
| | | logx.Errorf("new modbus connection err: %v", err.Error()) |
| | | return nil, err |
| | | } |
| | | return conn, nil |
| | | } |
| | | |
| | | func newModbusConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) { |
| | | // 创建驱动管理器 |
| | | driverManager := plc4go.NewPlcDriverManager() |
| | | // 注册TCP传输 |
| | | transports.RegisterTcpTransport(driverManager) |
| | | // 注册驱动 |
| | | //drivers.RegisterKnxDriver(driverManager) |
| | | drivers.RegisterModbusTcpDriver(driverManager) |
| | | |
| | | func newModbusTCPConnection(ctx context.Context, ipAddr string) (plc4go.PlcConnection, error) { |
| | | // 通过TCP连接PLC设备 |
| | | connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr) |
| | | connectionRequestChanel := driverManager.GetConnection(connectionString) |
| | | |
| | | // 等待连接响应,同时考虑上下文的超时 |
| | | select { |
| | | case connectionResult := <-connectionRequestChanel: |