9.00wrapper_modbus 功能包介绍

1. 总体介绍

此功能包提供一个基于ROS的Modbus通信基于ROS的Modbus通信的介绍解决方案,用于控制多轴运动系统。

包含以下核心组件:

  • BaseModbusClient:封装基础Modbus通信操作(无ROS依赖),包括初始化、连接、关闭、读写等基本方法。
  • D12_modbus_client:定义与控制器控制器的介绍交互的具体方法,实现了包括急停、停止、多轴移动等控制器功能。
  • ROS_Modbus:实现了ROS消息的接收、处理和命令转换逻辑,允许通过ROS进行Modbus控制。
  • d12_controller_mapping:定义了整个通讯过程中,使用的相应设备的参数;

2. 组件详述

  1. BaseModbusClient

    • 文件base_modbus_client.py

    • 功能:使用 BaseModbusClient类 提供与Modbus协议Modbus协议的介绍基本交互的方法,独立于ROS。

    • 特色:支持多数字I/O从机多数字I/O从机的介绍的控制(通过slave参数)slave参数的介绍

    • 方法

      • 初始化

        def __init__(self, host, port=502, rate=50, reset_registers=True)
        

        参数

        • host (str): Modbus服务器的IP地址。
        • port (int, 默认502): Modbus服务器的端口号。
        • rate (float, 默认50): 每秒读取寄存器的频率。
        • reset_registers (bool, 默认True): 定义是否在读取后将保持寄存器重置为0。仅当寄存器可写时有效。

        • 功能:尝试与指定的Modbus服务器建立连接。若连接失败,将记录警告并抛出异常。
      • 断开连接

        def _closeConnection(self)
        
        • 功能:关闭与Modbus服务器的连接。通常在ROS节点关闭时调用。
      • 写入寄存器

        def _writeRegisters(self, Address_start, Values, slave=0)
        
        • 参数
          • Address_start (int): 要写入的第一个寄存器的地址。
          • Values (int): 要写入的值。
          • slave (int, 默认0): 从机地址,默认不带从机。
        • 功能:向指定地址的Modbus寄存器写入值。使用互斥锁互斥锁的介绍以防止同时写入时的数据竞争数据竞争的介绍
      • 读取寄存器(内部方法)

        def _readRegisters(self, Address_start, num_registers)
        
        • 参数
          • Address_start (int): 要读取的第一个寄存器的地址。
          • num_registers (int): 要读取的寄存器数量。
        • 功能:从指定地址开始读取指定数量的Modbus保持寄存器Modbus保持寄存器的介绍。使用互斥锁以防止同时读取时的数据竞争。
      • 读取寄存器(公共方法)

        def readRegisters(self, Address_start, num_registers)
        
        • 参数
          • Address_start (int): 要读取的第一个寄存器的地址。
          • num_registers (int): 要读取的寄存器数量。
        • 功能:公共接口,用于读取Modbus保持寄存器。首先通过内部方法读取寄存器,然后记录日志并返回读取的值。
      • 辅助

        • _is_None(self, x):检查给定参数x是否为None,如果是,则打印消息并将x设置为0。这个方法用于读取寄存器过程中判断,是否有相应参数;
    • 使用示例

      # 初始化Modbus客户端
      modbus_client = BaseModbusClient(host="192.168.0.10")
           
      # 读取寄存器
      registers = modbus_client.readRegisters(10000, 2)
           
      # 写入寄存器
      modbus_client._writeRegisters(10000, 100)
           
      # 断开连接
      modbus_client._closeConnection()
      
    • 注意事项

  2. D12_modbus_client

    • 文件d12_modbus_client.py

      D12ModbusClient 类继承自 BaseModbusClient,提供了一系列用于控制D12系列Modbus设备的高级接口。这包括读取设备状态、执行紧急停止、执行多轴停止、多轴相对移动、多轴绝对移动、带速度的相对移动、带速度的绝对移动以及回原点操作。

    • 功能:根据控制器手册,实现了控制器的操作方法,包括多轴移动等。

    • 方法

      • 初始化:

        def __init__(self, host)
        
        • 参数:
          • host:(str),Modbus服务器的IP地址。
        • 说明: 初始化与Modbus服务器的连接。
      • 多轴状态读取:

        def multiAxis_StateRead(self, address_read_start, num_registers)
        
        • 参数:
          • address_read_start:(int),读取起始地址。
          • num_registers: (int),要读取的寄存器数量。
        • 返回: 无。
        • 说明: 读取并显示多轴的状态,如通道、状态位、当前位置和速度。
      • 所有轴急停:

        def multiAxis_EMERGENCYSTOP(self, address_write_start, EMERGENCYSTOP_value)
        
        • 参数:
          • address_write_start: (int),写入的起始地址。
          • EMERGENCYSTOP_value: (int),紧急停止值,固定值,已在映射表中固定。
        • 返回: 无。
        • 说明: 执行紧急停止操作,设置内部 _STOP 标志。
      • 指定多轴停止运动

        def multiAxis_Stop(self, address, value)
        
        • 参数:

          • address: 整数,写入的地址。
          • value: 列表,表示需要停止的轴。
        • 返回: 无。

        • 说明: 停止指定的轴。

      • 多轴相对运动控制

        def multiAxis_RelativeMove(self, address, value, i, tmpo)
        
        • 参数:

          • address: 整数,写入的地址。
          • value: 列表,相对移动的值。
          • i: 整数,指定操作的索引。
          • tmpo: 列表
        • 返回: 无。

        • 说明: 执行多轴的相对移动操作。

      • 多轴绝对运动控制

        def multiAxis_AbsoluteMove(self, address, value, i, tmpo)
        
        • 参数:
          • multiAxis_RelativeMove()
          • value:
        • 返回: 无。
        • 说明: 执行多轴的绝对移动操作。
      • 多轴相对指定速度运动控制

        def multiAxis_RelMoveSpeed(self, address, value, i, tmpo)
        
        • 参数:
          • multiAxis_RelativeMove()
          • value:
        • 返回: 无。
        • 说明: 以指定速度执行多轴的相对移动。
      • 多轴绝对指定速度运动控制

        def multiAxis_AbsMoveSpeed(self, address, value, i, tmpo)
        
        • 参数:
          • multiAxis_RelativeMove()
          • value:
        • 返回: 无。
        • 说明: 以指定速度执行多轴的绝对移动。
      • 多轴指定速度回原点

        def multiAxis_Origin(self, address, value, i, tmpo)
        
        • 参数:
          • multiAxis_RelativeMove()
          • value:
        • 返回: 无。
        • 说明: 将指定轴以当前或指定速度回到原点。
      • 所有轴回原点

        multiAxis_OriginAll(self, address, value)
        
        • 参数:
          • address: 整数,写入的地址。
          • value: 列表,所有轴回原点的速度值。
        • 返回: 无。
        • 说明: 执行所有轴回原点操作。注意,当前设备可能不支持此功能。
    • 私有方法:

      • def _Num_Axis(result)
        
        • 参数:

          • result: 列表,从Modbus寄存器读取的结果。
        • 返回: 整数,表示操作的轴数量。

        • 说明: 根据读取结果计算操作的轴数量。

      • 状态信息标准输出

        def multiAxis_StateRead_Show(result)
        
        • 参数:

          • result: 列表,从Modbus寄存器读取的状态数据。
        • 返回: 无。

        • 说明: 根据读取的结果,格式化并显示多轴的状态信息,包括轴名、状态位、当前位置和当前速度。

      • 指令完成检查

        def check_complete(self, i, value, tmpo)
        
        • 参数:
          • i: 整数,指定操作的索引。
          • value: 列表,操作结束时期望的寄存器值。
          • tmpo: 列表
        • 返回: 无。
        • 说明: 检查指定操作是否完成。持续读取指定寄存器,直到其值与期望值匹配或紧急停止被触发。
  3. ROS_Modbus

    • 文件ros_modbus.py

    • 功能:处理ROS消息和命令转换,将高层指令转换为Modbus控制器命令。

    • Split_command

      • 功能:提供工具方法,将复杂的多轴运动命令拆分成单轴命令,支持标准移动和带速度的移动。

        • 命令转换(无速度)

          def _norm_xyz_move(self, value: list) -> list:
          
          • 参数:
            • value: 包含x, y, z轴移动值的列表。
          • 返回: 根据移动值分别生成的包含移动指令的列表。
          • 说明: 将单个移动指令转换为可供每个轴识别的格式。
        • 命令转换(有速度)

          def _norm_xyz_speed(self, value: list) -> list:
          
          • 参数
            • value: 包含x, y, z轴移动值及其速度的列表。
          • 返回: 根据移动值及速度分别生成的包含移动指令的列表。
          • 说明: 将带速度的移动指令转换为可供每个轴识别的格式。
        • X轴判定

          def _is_X(self, i: int, oper: int, value: list) -> (int, int, list):
          
          • 参数
            • i: 整数,表示轴索引(0对应X轴,1对应Y轴,2对应Z轴)。
            • oper: 整数,表示操作类型。
            • value: 列表,包含移动值或移动值及速度。
          • 返回: 元组,包含地址、寄存器数量及值。
          • 说明: 根据轴索引、操作类型及值,生成对应的Modbus地址、寄存器数量和指令值。
    • OperCommand

      • 功能:该类提供了多轴操作的ROS接口,支持状态读取、停止、绝对移动等操作。

      • 方法

        • 初始化

          def __init__(self, client):
          
          • 参数
            • client: D12ModbusClient实例,用于执行Modbus操作。
          • 说明: 初始化操作命令对象。
        • 指定轴状态读取

          def ROS_multiAxis_StateRead(self, oper, value):
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,表示需要读取状态的轴。
          • 说明: 对指定轴执行状态读取操作。
        • 指定轴停止

          def ROS_multiAxis_Stop(self, oper, value):
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,表示需要停止的轴。
          • 说明: 对指定轴执行停止操作。
        • 指定轴控制操作

          def _perform_operation(self, i, oper, value, operation_func)
          
          • 参数
            • i: 整数,轴索引。
            • oper: 整数,操作类型。
            • value: 列表,包含操作值。
            • operation_func: 函数,指定的操作函数。
          • 说明: 执行指定的操作函数,直到操作完成或遇到中断。
        • 绝对移动操作

          def ROS_multiAxis_AbsoluteMove(self, oper, value)
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,包含移动值。
          • 说明: 对指定轴执行绝对移动操作。
        • 指定速度绝对速度操作

          def ROS_multiAxis_AbsMoveSpeed(self, oper, value)
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,包含移动值及速度。
          • 说明: 以指定速度对指定轴执行绝对移动操作。
        • 指定轴回原点

          def ROS_multiAxis_Origin(self, oper, value)
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,包含回原点速度值 说明: 将指定轴以当前或指定速度回到原点。
        • 相对移动操作

          def ROS_multiAxis_RelativeMove(self, oper, value)
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,包含相对移动值。
          • 说明: 对指定轴执行相对移动操作。
        • 指定速度相对速度操作

          def ROS_multiAxis_RelMoveSpeed(self, oper, value)
          
          • 参数
            • oper: 整数,表示操作类型。
            • value: 列表,包含相对移动值及速度。
          • 说明: 以指定速度对指定轴执行相对移动操作。
    • 特色:考虑电源功耗问题,实现了轴间的顺序操作而非同步移动。

  4. d12_controller_mapping

    • 文件d12_controller_mapping.py

    • 功能:该模块定义了与D12系列Modbus设备进行交互所需的地址映射地址映射的介绍和计算逻辑。它包括设备操作的基本参数配置、地址计算公式以及操作的映射表。

    • 核心变量—参数字典:

      • controller_axis_mapping:
        • 说明:控制器每个输出通道的功能起始地址参数映射字典;会通过formula_result函数计算并填充的。
      • date_map:
        • 说明:各功能的起始地址参数映射字典。定义了操作的名称、每轴所需寄存器数量、读取和写入的基地址、单双字标记以及读写权限。
      • oper_map:
        • 说明:操作映射表,将操作编号映射到对应的功能名称。
      • check_complete_map:
        • 说明:在写入数据后,用于检查操作完成状态的起始地址和寄存器数量映射。
      • ch_mapping:
        • 说明:各通道的速度和微步细分地址映射,每个通道包括轴名称、速度地址、速度寄存器数量和微步细分地址。
    • 核心变量—设备参数

      • host:
        • 描述: 这是D12 Modbus设备的IP地址。
        • 用途: 用于建立与Modbus服务器的连接。
      • ch0, ch1:
        • 描述: 这些变量定义了特定通道的配置参数。每个数组包含:
          • 轴的标识符(例如 'x_1')。
          • 该轴速度参数的Modbus地址。
          • 速度寄存器的数量。
          • 该轴微步细分参数的Modbus地址。
        • 用途: 这些配置用于指定每个通道(如X轴、Y轴等)的速度和微步细分微步细分的介绍参数的具体地址,使得在进行速度控制和微步设置时可以直接引用。
      • multiAxis_EMERGENCYSTOP_data, multiAxis_OriginAll_data:
        • 描述: 这些数组定义了紧急停止和所有轴回原点操作的参数。
          • multiAxis_EMERGENCYSTOP_data包含紧急停止操作的地址和要写入的值。
          • multiAxis_OriginAll_data包含所有轴回原点操作的地址和要写入的值。
        • 用途: 这些数据用于在需要时执行紧急停止和所有轴回原点的操作,提供了执行这些操作所需的Modbus地址和值。
      • num_ch:
        • 描述: 这是一个整数,表示设备的通道数。
        • 用途: 用于初始化时计算每个通道的每种功能的起始地址,确保controller_axis_mapping正确填充。
      • formula_result(num_ch):
        • 描述: 这是一个函数调用,使用上面定义的通道数num_ch作为参数。
        • 用途: 调用此函数会触发根据当前的通道数计算并更新controller_axis_mapping,为每个通道的每种功能设置正确的Modbus地址。
    • 必要函数

      • def address_calculate_formula(key: str, num_ch: int) -> int
        

        该函数用于计算指定功能在指定通道上的起始Modbus地址。

        • 参数
          • key: 字符串,代表date_map中定义的一个操作的键。
          • num_ch: 整数,指定的通道号。
        • 返回: 整数,计算出的Modbus地址。
        • 工作原理: 根据提供的key,此函数从date_map中获取相应操作的配置参数,包括基地址和寄存器数量。然后根据操作的读写类型(只读、只写或读写)和通道号来计算出具体的Modbus起始地址。如果操作是读取类型,则使用读取的基地址进行计算;如果操作是写入类型,则使用写入的基地址;如果操作既可读又可写,则基于情境选择适当的基地址进行计算。
      • def formula_result(num_ch: int)
        

        该函数用于初始化controller_axis_mapping字典,计算并填充每个通道的所有功能的Modbus起始地址。

        • 参数
          • num_ch: 整数,设备的通道数。
        • 返回: 无返回值,但会更新全局变量controller_axis_mapping
        • 工作原理: 对于给定的通道数,此函数遍历date_map中定义的每种操作,使用address_calculate_formula函数为每种操作计算Modbus起始地址。然后,为每个通道的每种操作更新controller_axis_mapping,确保它反映了每种操作的正确地址。这个过程确保了对于特定的设备配置,控制命令能够被正确地发送到预期的Modbus地址。
      • def StateRead_OperationTable(num_elements: int) -> list
        

        该函数生成读状态结果的索引表,用于确定从读取的数据中提取特定通道的状态、位置和速度信息。

        • 参数:
          • num_elements: 整数,需要生成索引表的元素(通道)数量。
        • 返回: 列表,包含每个通道状态读取操作的索引信息。
        • 工作原理: 此函数根据提供的通道数(或元素数量),为每个通道创建一个包含操作名称和状态、位置、速度索引的字典。这些字典随后被添加到一个列表中并返回。列表中的每个元素对应一个通道,包含了读取该通道状态时需要使用的索引信息,如状态位的索引、位置的索引和速度的索引。这使得在处理设备返回的状态数据时,可以准确地解析出每个通道的相关信息。