indy7 Python 프로그래밍 문의
-
1. Indy7 Robot 축 joint (joint-1, joint-2, joint-3, joint-4, joint-5, joint-6) , task (x, y, z, u, v, w) 값을 실시간으로 M번지에 쓰고 PLC로 전달하는 프로그래밍 가능유무 및 가능 하다면 방법을 알고 싶습니다.
Python 프로그램
print(short_float_list(indy.get_task_pos()))
cnr = short_float_list(indy.get_task_pos()) print(cnr) cnr1 = cnr[0] cnr2 = cnr[1] cnr3 = cnr[2]
DIRECT_VAR_TYPE_MODBUS_REG = 10 indy.write_direct_variable(dv_type=DIRECT_VAR_TYPE_MODBUS_REG, dv_addr=120, val= ) DIRECT_VAR_TYPE_MODBUS_REG = 10 indy.write_direct_variable(dv_type=DIRECT_VAR_TYPE_MODBUS_REG, dv_addr=121, val= )
val = indy.read_direct_variable(dv_type=DIRECT_VAR_TYPE_MODBUS_REG, dv_addr=120) val1 = indy.read_direct_variable(dv_type=DIRECT_VAR_TYPE_MODBUS_REG, dv_addr=121) print(val) print(val1)
-
안녕하세요
Modbus 메모리에 값을 읽고/쓰는 것은 Conty, IndyDCP 둘 다로 가능합니다. IndyDCP를 이용하는 방법은 질문글에서 작성하신 코드 대로 하시면 정상동작 됩니다.
다만 질문주신 내용은 PLC에서 관절각도, 툴팁위치를 읽고 싶으신 것으로 이해되며 이 경우 M변수 읽고/쓰기 기능을 쓰실 필요 없이, M변수의 예약영역을 활용하시면 됩니다.
M변수를 Conty/IndyDCP를 통해 읽고/쓸수 있는 사용자 영역 주소는 0-999이고, 1000이후 주소는 예약영역입니다. 예약영역 중 관절 각도와 task pose xyzuvw 둘 다 이미 할당되어 있기 때문에 PLC에서 값을 바로 읽으실 수 있습니다.
상세한 예약영역 매핑 주소는 http://docs.neuromeka.com/2.3.0/kr/ModbusTCP/section1/ 를 참고해주시기 바랍니다.
감사합니다
-
답변 감사드립니다.M 번지로 쓸 필요 없이 밑에 M 번지를 PLC에서 읽으면 각축 좌표값을 받을 수 있다는 말씀입니까?
1300-1305는 Joint좌표를 나타내며 각각 로봇의 1~6번축의 각도에 해당됩니다. 7축로봇의 경우 1300~1306의 1~7번축이며, 이하 Joint 관련 데이터에서 동일하게 적용됩니다. 단위는 mrad (radian의 1/1000배)이며 부호 있는 16bit 정수로 나타냅니다. 1310-1315는 각각 1~6번축의 현재 각속도이며, 1380-1385는 각각 1~6번축의 현재 힘(토크)입니다.
1600-1605는 Task좌표를 나타내며, 각각 xyzuvw값을 나타냅니다. xyz는 로봇 Base를 기준으로 xyz좌표축상에서 TCP까지의 거리이며, uvw는 툴 끝점의 회전 방향을 나타냅니다. 이는 Euler Angle로 표현되어 회전 순서는 w->v->u (rZ->rY->rX)입니다. 단위는 xyz의 경우 1/10mm (meter의 1/10000배)이며 uvw의 경우 mrad입니다. 1610-1615는 Task좌표상의 현재 이동/회전속도를 나타냅니다.
앞서 설명한 데이터들은 16bit정수로 값을 표현하기에 더 상세한 단위를 표현하지 못합니다. 상세한 단위의 값을 원하는 사용자를 위해 32bit Float 방식의 데이터도 지원합니다. 1400-1411, 1700-1711등은 각 데이터당 2개의 연속된 주소를 사용하여 (예. 1400-1401) 이를 통해 32bit Float 방식의 데이터를 표현합니다.
-
네 맞습니다
PLC로 받아보기 이전에 Python으로 테스트를 수행해보셔도 됩니다.
2번 관절 각도를 읽어본다고 했을 때, 아래와 같이 확인 가능합니다 (설치 필요: pip3 install pyModbusTCP)
## Read Modbus from pyModbusTCP.client import ModbusClient import struct c = ModbusClient(host="로봇IP주소", port=502, auto_open=True) val = c.read_holding_registers(1402, 2) print(val[0], val[1]) # conversion: two 16bit -> 32bit float j2_rad_plc = struct.unpack('f', struct.pack('HH', *[val[0], val[1]]))[0] j2_deg_plc = j2_rad_plc*180/3.141592 print("Deg: ", j2_deg_plc, "Rad: ", j2_rad_plc)
아래 코드를 통해 IndyDCP로 받은 2번 관절각도와 비교해보실 수 있습니다
from indy_utils import indydcp_client as client indy = client.IndyDCPClient("로봇IP주소", "NRMK-Indy7") indy.connect() j2_deg_dcp = indy.get_joint_pos()[1] print("Deg: ", j2_deg_dcp, "Rad: ", j2_deg_dcp*3.141592/180) indy.disconnect()
-
-
안녕하세요
혹시 indy7에 파이썬 프로그램으로 코딩 가능한 라이브러리가 따로 배포되나요?
참고할만한 자료가 있는지 궁금합니다.작년까지는 프로토콜을 보고 C++로 직접 개발했는데...
파이썬으로 바꿔보려고요
저희는 2년전에 2대를 구매했습니다.
-
@장선연 said:
안녕하세요혹시 indy7에 파이썬 프로그램으로 코딩 가능한 라이브러리가 따로 배포되나요?참고할만한 자료가 있는지 궁금합니다. 작년까지는 프로토콜을 보고 C++로 직접 개발했는데...파이썬으로 바꿔보려고요저희는 2년전에 2대를 구매했습니다.
안녕하세요.
뉴로메카입니다.
python dcp client 에 관한 정보는
http://docs.neuromeka.com/2.3.0/kr/Python/section1/
를 참조해 주시기 바랍니다.
위 링크에서 python client 파일 또한 다운로드 받을 수 있습니다.