[PYTHON#30] EtherCAT(이더캣) AC SERVO MOTOR인 P100E를 파이썬으로 CSP제어하는 방법 알아보기!(녹칸다의 내맘대로 파이썬)
프로그래밍/파이썬(python) 2025. 1. 6. 23:12반응형

https://youtube.com/live/wwqtks3FYko
[PYTHON#30] EtherCAT(이더캣) AC SERVO MOTOR인 P100E를 파이썬으로 CSP제어하는 방법 알아보기!(녹칸다의 내맘대로 파이썬)
(주의) 이 내용은 파이썬을 완벽하게 공부해보자는 내용을 담고 있지 않음!
녹칸다의 내맘대로 파이썬(python) 시리즈이다.
자료는 구글 슬라이드로 작성되어있고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1J8y-oLiYO_Dzunb_P66GOXeE97xQx8zp83tCjW_O8BI/edit#slide=id.g322e15b1339_1_0
이번편은 이더캣 ac servo모터인 p100e를 파이썬으로 제어해보도록 한다!
그냥 한번 해보자! 해서 할 수 있는 난이도는 아니고 절차가 꽤나 복잡하다!
제어를 위한 주요용어와 파이썬에서의 전략을 이론적으로 학습하고 모터를 돌려보도록 한다!
이론부분이 길어진다면 30편에서는 모터를 못돌릴수도 있음!
그러나 바로 이어서 31편이 이어지기 때문에 문제 없음!
이더캣 슬레이드 PDO MAPPING정보 출력 프로그램
slaveinfo.zip
0.47MB
파이썬으로 OD에 대해서 간단히 이해해보기
memory = {
"6060":0, #컨트롤워드
"607A":0, #타겟포지션
"6041":0, #스테이트워드
"6064":0, #포지션피드백
"1701":["6060","607A"], #RXPDO ENTRY1
"1702":["1234","5678"], #RXPDO ENTRY2
"1B01":["6041","6064"], #TXPDO ENTRY1
"1C12":0, # RX 싱크매니저
"1C13":0 #TX 싱크매니저
}
#RXPDO ENTRY1을 1C12의 PDO MAPPING을 한다!
#0x1C12에 SDO명령으로 0x1701이라는 값을 쓰기작업할수있음!
memory["1C12"] = "1701"
#내가 0x607A에 1234라는 값을 쓰기작업하겠다!
memory[memory[memory["1C12"]][1]] = 1234
#TXPDO ENTRY1을 1C13의 PDO MAPPING을 한다!
memory["1C13"] = "1B01"
#내가 0x6064에 5678라는 값을 쓰기작업하겠다!
memory[memory[memory["1C13"]][1]] = 5678
print(memory)
PDO MAPPING을 하기 위한 기본코드
pdo_mapping.py
0.00MB
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")
#무조건 1개의 슬레이브가 연결되어있다고 치고~
slave = master.slaves[0]
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}")
slave.sdo_write(index=0x1C12, subindex=0, data=rx_map_obj_bytes, ca=True)
slave.sdo_write(index=0x1C13, subindex=0, data=tx_map_obj_bytes, ca=True)
print("PDO 맵핑이 완료되었습니다!")
이더캣 AC서보 1개 돌리기 예제
servo_control.py
0.00MB
반응형