반응형

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코드

servo_control.py
0.01MB

반응형
Posted by 덕력킹
,