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/ 를 참고해주시기 바랍니다. 

    감사합니다



  • @Young-Jin-Heo


    답변 감사드립니다.

    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()



  • @Young-Jin-Heo

    코드를 통해 테스트 결과 IndyDCP로 받은 2번 관절각도와 일치 합니다. 

    답변 감사드립니다.



  • 안녕하세요

    혹시 indy7에 파이썬 프로그램으로 코딩 가능한 라이브러리가 따로 배포되나요?


    참고할만한 자료가 있는지 궁금합니다. 

    작년까지는 프로토콜을 보고 C++로 직접 개발했는데...

    파이썬으로 바꿔보려고요

    저희는 2년전에 2대를 구매했습니다.



  • @장선연 said:

    안녕하세요혹시 indy7에 파이썬 프로그램으로 코딩 가능한 라이브러리가 따로 배포되나요?참고할만한 자료가 있는지 궁금합니다. 작년까지는 프로토콜을 보고 C++로 직접 개발했는데...파이썬으로 바꿔보려고요저희는 2년전에 2대를 구매했습니다.

     @장선연 

    안녕하세요.

    뉴로메카입니다. 

    python dcp client 에 관한 정보는 

    http://docs.neuromeka.com/2.3.0/kr/Python/section1/

    를 참조해 주시기 바랍니다. 

    위 링크에서 python client 파일 또한 다운로드 받을 수 있습니다. 


Log in to reply