[PYTHON#31] EtherCAT(이더캣) AC SERVO MOTOR인 P100E를 파이썬으로 CSP제어하는 방법 알아보기 계속!(녹칸다의 내맘대로 파이썬)
프로그래밍/파이썬(python) 2025. 1. 7. 21:21반응형
https://youtube.com/live/gpTXA8Ov3Kc
[PYTHON#31] EtherCAT(이더캣) AC SERVO MOTOR인 P100E를 파이썬으로 CSP제어하는 방법 알아보기 계속!(녹칸다의 내맘대로 파이썬)
(주의) 이 내용은 파이썬을 완벽하게 공부해보자는 내용을 담고 있지 않음!
녹칸다의 내맘대로 파이썬(python) 시리즈이다.
자료는 구글 슬라이드로 작성되어있고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1J8y-oLiYO_Dzunb_P66GOXeE97xQx8zp83tCjW_O8BI/edit#slide=id.g322e15b1339_1_6
이번편은 이더캣 ac servo모터인 p100e 2개를 파이썬으로 제어해보도록 한다!
2개의 모터에 PDO MAPPING을 하기 위한 SDO명령
import pysoem
import ctypes
import struct
# EtherCAT 마스터 생성
master = pysoem.Master()
master.open('\\Device\\NPF_{60FC8210-8A23-4375-B5F6-31D0E27AB1ED}')
# 슬레이브 초기화
if master.config_init() > 0:
print(f'슬레이브 {len(master.slaves)}개 검색됨!')
else:
print('No slaves found')
master.close()
raise Exception("NO SLAVE")
#무조건 2개의 슬레이브가 연결되어있다고 치고~
slave1 = master.slaves[0]
slave2 = master.slaves[1]
rx_map_obj = [0x1701]
rx_map_obj_bytes = struct.pack(
"Bx" + "".join(["H" for _ in range(len(rx_map_obj))]), len(rx_map_obj), *rx_map_obj
)
tx_map_obj = [0x1B01]
tx_map_obj_bytes = struct.pack(
"Bx" + "".join(["H" for _ in range(len(tx_map_obj))]), len(tx_map_obj), *tx_map_obj
)
print("RX_MAP")
for i, byte in enumerate(rx_map_obj_bytes):
print(f"Index {i}: {byte:#04x}")
print("TX_MAP")
for i, byte in enumerate(tx_map_obj_bytes):
print(f"Index {i}: {byte:#04x}")
slave1.sdo_write(index=0x1C12, subindex=0, data=rx_map_obj_bytes, ca=True)
slave1.sdo_write(index=0x1C13, subindex=0, data=tx_map_obj_bytes, ca=True)
slave2.sdo_write(index=0x1C12, subindex=0, data=rx_map_obj_bytes, ca=True)
slave2.sdo_write(index=0x1C13, subindex=0, data=tx_map_obj_bytes, ca=True)
print("PDO 맵핑이 완료되었습니다!")
2개의 모터로부터 현재 위치를 읽어오는 SDO명령
import pysoem
import ctypes
import struct
# EtherCAT 마스터 생성
master = pysoem.Master()
master.open('\\Device\\NPF_{60FC8210-8A23-4375-B5F6-31D0E27AB1ED}')
# 슬레이브 초기화
if master.config_init() > 0:
print(f'슬레이브 {len(master.slaves)}개 검색됨!')
else:
print('No slaves found')
master.close()
raise Exception("NO SLAVE")
#무조건 2개의 슬레이브가 연결되어있다고 치고~
slave1 = master.slaves[0]
slave2 = master.slaves[1]
pdo_data = slave1.sdo_read(0x6064, 0)
current_position = int.from_bytes(pdo_data, byteorder='little', signed=True)
pdo_data2 = slave2.sdo_read(0x6064, 0)
current_position2 = int.from_bytes(pdo_data2, byteorder='little', signed=True)
print(f"슬레이브1의 현재 위치값={current_position}")
print(f"슬레이브2의 현재 위치값={current_position2}")
2개의 모터를 제어하기 위한 pysoem코드
반응형