Ethernet2CAN 소켓통신 프로그래밍 문의
페이지 정보
본문
구매한 Sensor: Ethernet2CAN
사용 환경: ubuntu 22.04, window10
개발 언어: python, c, c++, matlab, ROS2, Gazebo
안녕하세요
https://www.devicemart.co.kr/goods/view?no=1149072
위 링크에 기재된 Ethernet2CAN 제품을 구매하여 공식 제공되는 UI룰 다운받아 제가 사용하고자 하는 컨트롤러와 정상적으로 통신이 되는 것을 확인하였습니다.
외부 디바이스 확장을 위하여 현재 기본 UI로 제공되는 통신 기능을 파이썬의 소켓 통신 모듈을 활용하여 구현하고 싶은데 파이썬 내에서 해당 패킷 부분을 어떻게 구현해야 할지 알고 싶어서 문의 드립니다.
제가 보내고자 하는 패킷은 기본제공 UI기준으로 아래와 같습니다
ID(Hexa):302
Data(Hexa) : 62 60 00 02 00 00 80 3F
위와 같이 구성된 패킷이 정상적으로 송수신되는 것을 확인하였고 해당 기능을 파이썬으로 동일하게 구현하고 싶습니다
현재 제가 예제를 참고하여 파이썬으로 구현한 상황은 아래와 같습니다.
import socket
TCP_IP = '192.168.0.100' # PLC의 ip
TCP_PORT = 3000 # PLC의 포트번호 TCP는 2004 UDP는 2005
BUFFER_SIZE = 1024
#message = (b'0x301\0x63\0x60\0x00\0x03\0x01\0x00\0x00\0x00')
#message = (b'LSIS-XGT\n\n\n\n\xA0\x33\x00\x00\x12\x00\x02\x00\x54\x00\x02\x00\00\00\x01\x00\x08\x00%DW00000')
#message = (b'x02\x00\x08\x20\x301\x63\x60\x00\x03\x01\x00\x00\x00\x3F0\x03')
#message = (b'x02x00x08x00x301x63x60x00x03x01x00x00x00x3D0x03')
message = (b'0x02\0x00\0x08\0x00\0x301\0x63\0x60\0x00\0x03\0x01\0x00\0x00\0x00\0x3D0\0x03')
# 소켓 오픈
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT)) # 소켓 연결
s.send(message) # 메세지를 보낸다.
data = s.recv(BUFFER_SIZE) # 메세지를 받는다
s.close() # 소켓 닫기
print("received data: ", data.hex()) # 받은 메세지를 hex형태로 출력
위 코드에서 message에 해당하는 부분만 수정하면 구현이 가능할 것 같습니다.
어떤식으로 수정을 진행하면 되는지 알려주시면 감사하겠습니다
혹 예제 코드 같은 것이 있으면 함께 제공해주시면 감사하겠습니다
혹여나 하여 위 코드파일을 따로 첨부합니다
사용 환경: ubuntu 22.04, window10
개발 언어: python, c, c++, matlab, ROS2, Gazebo
안녕하세요
https://www.devicemart.co.kr/goods/view?no=1149072
위 링크에 기재된 Ethernet2CAN 제품을 구매하여 공식 제공되는 UI룰 다운받아 제가 사용하고자 하는 컨트롤러와 정상적으로 통신이 되는 것을 확인하였습니다.
외부 디바이스 확장을 위하여 현재 기본 UI로 제공되는 통신 기능을 파이썬의 소켓 통신 모듈을 활용하여 구현하고 싶은데 파이썬 내에서 해당 패킷 부분을 어떻게 구현해야 할지 알고 싶어서 문의 드립니다.
제가 보내고자 하는 패킷은 기본제공 UI기준으로 아래와 같습니다
ID(Hexa):302
Data(Hexa) : 62 60 00 02 00 00 80 3F
위와 같이 구성된 패킷이 정상적으로 송수신되는 것을 확인하였고 해당 기능을 파이썬으로 동일하게 구현하고 싶습니다
현재 제가 예제를 참고하여 파이썬으로 구현한 상황은 아래와 같습니다.
import socket
TCP_IP = '192.168.0.100' # PLC의 ip
TCP_PORT = 3000 # PLC의 포트번호 TCP는 2004 UDP는 2005
BUFFER_SIZE = 1024
#message = (b'0x301\0x63\0x60\0x00\0x03\0x01\0x00\0x00\0x00')
#message = (b'LSIS-XGT\n\n\n\n\xA0\x33\x00\x00\x12\x00\x02\x00\x54\x00\x02\x00\00\00\x01\x00\x08\x00%DW00000')
#message = (b'x02\x00\x08\x20\x301\x63\x60\x00\x03\x01\x00\x00\x00\x3F0\x03')
#message = (b'x02x00x08x00x301x63x60x00x03x01x00x00x00x3D0x03')
message = (b'0x02\0x00\0x08\0x00\0x301\0x63\0x60\0x00\0x03\0x01\0x00\0x00\0x00\0x3D0\0x03')
# 소켓 오픈
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT)) # 소켓 연결
s.send(message) # 메세지를 보낸다.
data = s.recv(BUFFER_SIZE) # 메세지를 받는다
s.close() # 소켓 닫기
print("received data: ", data.hex()) # 받은 메세지를 hex형태로 출력
위 코드에서 message에 해당하는 부분만 수정하면 구현이 가능할 것 같습니다.
어떤식으로 수정을 진행하면 되는지 알려주시면 감사하겠습니다
혹 예제 코드 같은 것이 있으면 함께 제공해주시면 감사하겠습니다
혹여나 하여 위 코드파일을 따로 첨부합니다
첨부파일
-
socket_com_test.py (878byte)
2회 다운로드 | DATE : 2024-08-09 11:16:27
- 이전글MW-AHRSv2 수신데이터 파싱, 회전방향 등 24.08.09
- 다음글MW-AHRSv2U 동시 사용 가능 여부 24.07.23
댓글목록
최고관리자님의 댓글
최고관리자 작성일
안녕하세요, 아이디어로봇입니다.
관련답변하여 금일 출장이 있어서 저녁 쯤에 남겨드리겠습니다.
최고관리자님의 댓글
최고관리자 작성일
방금 출장을 마치고 답변을 드립니다.
ROS2 에서 사용할 수 있게 만든 c++ 예제 참고해보시면 좋으실 거 같습니다.
https://github.com/ntrexlab/Eth2CAN_ROS2/blob/main/eth2can/src/main.cpp
과정은 이렇습니다.
1. 혹시 모르니 사용하는 can 비트레이트 설정
2. P 명령을 보내서 설정 적용
3. T=1 명령을 보내서 바이너리로 통신되게 설정
4. 그리고 이제 RecvPacket 이랑 SendPacket 함수를 사용해서 CAN 통신 자유롭게 사용
이렇게 사용 하시면 될 거 같습니다.