Skip to content

4.11 모드버스 기능

개요

Modbus 모듈은 Modbus 마스터 역할을 할 때 슬레이브 관리, read/write, 등록 및 직렬 포트 매개변수 구성, PLC, I/O 확장 모듈 및 기타 Modbus 장치와의 연결을 용이하게 하는 로봇의 기능을 캡슐화합니다.

핵심 기능

  • 채널 및 슬레이브 ID로 Modbus 슬레이브 인스턴스 획득 지원
  • 슬레이브에서 Modbus 코일 레지스터 읽기 및 쓰기 지원
  • 슬레이브에서 Modbus 보유 레지스터 읽기 및 쓰기 지원
  • 슬레이브에서 Modbus 개별 입력 레지스터 읽기 지원
  • 슬레이브에서 Modbus 입력 레지스터 읽기 지원
  • 직렬 통신 매개변수 설정 및 쿼리 지원

사용 사례

  • PLC 장치와의 데이터 교환
  • I/O 확장 모듈 제어
  • 로봇과 기타 Modbus 장치 간의 연계 구현
  • Modbus 직렬 통신 매개변수 구성 및 관리

메모

Modbus 기능은 로봇 소프트웨어의 버스 구성과 충돌하므로 동시에 사용할 수 없습니다.

4.11.1 Modbus 슬레이브 인스턴스 가져오기

메서드 이름modbus.get_slave( channel : ModbusChannel, slave_id : int, master_id : int = 0) -> 'Modbus.Slave'
설명지정된 채널 및 슬레이브 ID에 대한 Modbus 슬레이브 인스턴스를 가져옵니다.
요청 매개변수channel : ModbusChannel Modbus 채널
slave_id : int 슬레이브 ID
master_id : int 마스터 ID(기본값 0)
반환 값Modbus.Slave: Modbus 슬레이브 인스턴스
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.2 슬레이브에서 Modbus 코일 레지스터 읽기

메서드 이름slave.read_coils( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
설명슬레이브에서 Modbus 코일 레지스터를 읽습니다.
요청 매개변수address : int 레지스터 주소
number : int 레지스터 개수(최대 120)
반환 값list[int]: 레지스터 값
StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.3 슬레이브의 Modbus 코일 레지스터에 쓰기

메서드 이름slave.write_coils( address : int, value : list[int]) -> StatusCodeEnum
설명슬레이브의 Modbus 코일 레지스터에 씁니다.
요청 매개변수address : int 레지스터 주소
value : list[int] 레지스터 값
반환 값StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.4 슬레이브에서 Modbus 보유 레지스터 읽기

메서드 이름slave.read_holding_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
설명슬레이브에서 Modbus 보유 레지스터를 읽습니다.
요청 매개변수address : int 레지스터 주소
number : int 레지스터 개수(최대 120)
반환 값list[int]: 레지스터 값
StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.5 슬레이브의 Modbus 보유 레지스터에 쓰기

메서드 이름slave.write_holding_regs( address : int, value : list[int]) -> StatusCodeEnum
설명슬레이브의 Modbus 보유 레지스터에 씁니다.
요청 매개변수address : int 레지스터 주소
value : list[int] 레지스터 값
반환 값StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.6 슬레이브에서 Modbus 개별 입력 레지스터 읽기

메서드 이름slave.read_discrete_inputs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
설명슬레이브에서 Modbus 개별 입력 레지스터를 읽습니다.
요청 매개변수address : int 레지스터 주소
number : int 레지스터 개수(최대 120)
반환 값list[int]: 레지스터 값
StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.7 슬레이브에서 Modbus 입력 레지스터 읽기

메서드 이름slave.read_input_regs( address : int, number : int ) -> tuple[list[int], StatusCodeEnum]
설명슬레이브에서 Modbus 입력 레지스터를 읽습니다.
요청 매개변수address : int 레지스터 주소
number : int 레지스터 개수(최대 120)
반환 값list[int]: 레지스터 값
StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

예제 코드

modbus.py
py
#!python
"""
Copyright © 2016 Agilebot Robotics Ltd. All rights reserved.
Instruction: modbus使用示例 / Example of modbus usage
"""

from Agilebot import Arm, ModbusChannel, SerialParams, StatusCodeEnum

# [ZH] 初始化Arm类
# [EN] Initialize the robot
arm = Arm()
# [ZH] 连接控制器
# [EN] Connect to the robot
ret = arm.connect("10.27.1.254")
if ret == StatusCodeEnum.OK:
    print("机器人连接成功 / Robot connected successfully")
else:
    print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 设置modbus参数
# [EN] Set Modbus parameters
params = SerialParams(channel=ModbusChannel.CONTROLLER_TCP_TO_485, ip="10.27.1.80", port=502)
id, ret_code = arm.modbus.set_parameter(params)
if ret_code == StatusCodeEnum.OK:
    print("设置Modbus参数成功 / Set Modbus parameters successfully")
else:
    print(f"设置Modbus参数失败,错误代码 / Set Modbus parameters failed, error code: {ret_code.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 创建从站
# [EN] Create a slave
slave = arm.modbus.get_slave(ModbusChannel.CONTROLLER_TCP_TO_485, 1, 1)

# [ZH] 写入
# [EN] Write to registers
value = [1, 2, 3, 4]
ret = slave.write_coils(0, value)
if ret == StatusCodeEnum.OK:
    print("写入线圈成功 / Write coils successfully")
else:
    print(f"写入线圈失败,错误代码 / Write coils failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

ret = slave.write_holding_regs(0, value)
if ret == StatusCodeEnum.OK:
    print("写入保持寄存器成功 / Write holding registers successfully")
else:
    print(f"写入保持寄存器失败,错误代码 / Write holding registers failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 读取
# [EN] Read registers
res, ret = slave.read_coils(0, 4)
if ret == StatusCodeEnum.OK:
    print("读取线圈成功 / Read coils successfully")
    print(f"读取的线圈值 / Read coil values:{res}")
else:
    print(f"读取线圈失败,错误代码 / Read coils failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

res, ret = slave.read_holding_regs(0, 4)
if ret == StatusCodeEnum.OK:
    print("读取保持寄存器成功 / Read holding registers successfully")
    print(f"读取的寄存器值 / Read register values:{res}")
else:
    print(f"读取保持寄存器失败,错误代码 / Read holding registers failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

res, ret = slave.read_input_regs(0, 4)
if ret == StatusCodeEnum.OK:
    print("读取输入寄存器成功 / Read input registers successfully")
    print(f"读取的输入寄存器值 / Read input register values:{res}")
else:
    print(f"读取输入寄存器失败,错误代码 / Read input registers failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

res, ret = slave.read_discrete_inputs(0, 4)
if ret == StatusCodeEnum.OK:
    print("读取离散输入成功 / Read discrete inputs successfully")
    print(f"读取的离散输入值 / Read discrete input values:{res}")
else:
    print(f"读取离散输入失败,错误代码 / Read discrete inputs failed, error code: {ret.errmsg}")
    arm.disconnect()
    exit(1)

# [ZH] 结束后断开机器人连接
# [EN] Disconnect from the robot
arm.disconnect()
print("机器人断开连接成功 / Robot disconnected successfully")

4.11.8 직렬 통신 매개변수 설정

메서드 이름modbus.set_parameter( param : SerialParams) -> tuple[int, StatusCodeEnum]
설명직렬 통신 매개변수를 설정합니다.
요청 매개변수param : SerialParams 직렬 통신 매개변수
반환 값int: 채널 ID
StatusCodeEnum: 함수 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+

4.11.9 직렬 통신 매개변수 가져오기

메서드 이름modbus.get_parameter( channel : ModbusChannel, master_id : int = 1) -> tuple[SerialParams, StatusCodeEnum]
설명직렬 통신 매개변수를 가져옵니다.
요청 매개변수channel : ModbusChannel Modbus 채널
master_id : int 마스터 ID(기본값 1)
반환 값SerialParams: 직렬 통신 매개변수
StatusCodeEnum: 기능 실행 결과
호환 로봇 소프트웨어 버전협업(Copper): v7.6.0.0+
산업용(Bronze): v7.6.0.0+