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+ |
예제 코드
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+ |