zhangqian
2023-10-27 d91a802e7aa2ad4075ed803b8ddc7536a91a0ef0
pkg/plc/apacheplc4x/modbus.go
@@ -15,31 +15,35 @@
   "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: