모노리스 캔통신 설정 질문드립니다.(kelly컨트롤러)

안녕하세요 저희가 kelly사의 컨트롤러를 사용하고 있는데 CAN 2.0B에 SAE J1939 Protocol을 지원하고 있어 별도의 캔 아이디를 설정하지 못하고 CAN ID가 0x0CF11E05처럼 지정되어있습니다.
그래서 16진수 변환기를 10진법으로 변환하여 UI 설정 창에 217128453을 can id 에 집어 넣고 바이트 부분에 0~1을 집어 넣었지만 작동하지 않았는데 저희가 잘못 입력한 건지 사용이 불가능 한지 궁금합니다.

kelly에서 제공된 can 프로토콜 관련 pdf입니다.
Sinusoidal-Wave-Controller-KLS-D-8080I-8080IPS-Broadcast-CAN-Protocol.pdf (33.6 KB)

로그 파일은 나왔는데 뷰어에서 어떻게 설정해야 볼 수 있는지를 모르겠다는 말씀이시죠?

뷰어에서 설정을 어떻게 해야 하는 모르겠습니다.


그리고 혹시 CAN 옆부분에 0이라고 뜨면 통신이 안된 건가요?

일단 CAN 트래픽 모니터링 부분 보시면 로그에 기록되는 CAN ID는 하위 8비트 뿐이라서, 0x0CF11E05 면 UI 설정 창에 0x05 인 5를 넣으셔야 제대로 보일 것 같아요.

로그를 csv 형식으로 제가 본 적이 거의 없어서 기억이 잘 안 나는데요, CAN 옆에 0이라고 나오는 3번째 열은 아마 메시지 key였던 것 같아요. 위에서 얘기한 CAN ID의 하위 8비트 부분이요. 확실하진 않아서 정확한 건 로그 파일을 보내주셔야 확인할 수 있을 것 같네요.

기억에 7번째 열부터 8개가 CAN 패킷 바이트들이라서 수신 자체는 잘 되고 있는 것 같아요.

테스트로 해본 로그파일 입니다.(로그 파일이 업로드 되지 않아 공유파일로 올렸습니다.)

업로드 가능 확장자 목록에 .log가 빠져 있었네요. 추가해 두었습니다.

확인해보니 로그에 있는 모든 CAN 메시지 키가 0이네요. 실제로 CAN 메시지 ID의 하위 1바이트가 0x00 이거나 뭔가 문제가 생긴 것 같은데요, 일단 메시지 ID 부분에 0 넣어서 데이터가 맞는지 한번 확인해 보시겠어요?

확인해 보니 바이트 값을 #0~#0으로 놓았을 때의 값은 rpm값 인 것 같습니다. 그런데 나머지 값들은 저도 뭔지 모르겠네요.

pdf에 적혀있는 걸 봤을 때 출력 된 값을 주어진 수식으로 변형해야 원하는 값이 나오는 것 같은데 이게 맞는지도 의문이네요…

올려주신 프로토콜 문서를 보니 두 메시지 다 ID의 하위 1바이트가 0x05 라서 key 값이 이걸로 섞여 나와야 할 것 같은데 이상하네요.

로그에는 메시지가 25ms 정도 간격으로 하나씩 있는데 문서에는 50ms인 것도 조금 이상하고요.

문서에는 CAN 통신 속도가 250kbps라고 적혀 있는데 혹시 모노리스에서도 맞춰서 설정해 주셨나요?

넵 그래도 혹시 몰라서 다시 설정하고 테스트 해보았습니다.
2025-01-05 17-14-32.log (105.8 KB)

확인을 좀 해봤는데요, 일단 프로토콜 문서에 있는 ID 2개 (0x0CF11E05, 0x0CF11F05) 를 모노리스가 구분할 수 없는건 맞아요. 두 메시지가 서로 25ms 간격을 두고 전송되어서 CAN 신호가 25ms 주기인 것처럼 보이는 거네요.

(0ms: 메시지 1), (25ms: 메시지 2), (50ms: 메시지 1), (75ms: 메시지 2), … 이런 식으로 전송되고 있어요.

다만 key 값이 0x05가 아니라 0x00으로 나오는 건 이유를 모르겠네요.

2바이트에 걸쳐서 표현되는 데이터 값(0x0CF11E05의 RPM, 전류, 전압 등)은 프로토콜 문서 보시면 바이트 1이 LSB고 바이트 2가 MSB라서 아래처럼 Little Endian으로 해석하셔야 해요.

ID는 0, Endian은 Little, Byte는 0~1 로 설정하시면 RPM이 되고, 2~3으로 설정하시면 전류, 4~5 로 설정하시면 전압이 됩니다. 전류와 전압은 단위가 0.1/bit 이니까 데이터 배율을 10으로 설정하시고요.

이렇게 설정하면 그래프가 아래처럼 되는데요.

모노리스가 두 메시지를 구분하지 못해서 섞여서 나오기 때문에 이런 모양인 거고, 제 추측으로는 RPM이 낮은 주기 (사진의 커서) 가 메시지 1 부분이고 높은 주기는 메시지 2의 바이트 1인 스로틀 시그널과 바이트 2인 컨트롤러 온도가 합쳐진 쓰레기 값인 것 같아요.

그래서 ID는 0, Byte를 1~1로 설정한 temperature 축과, Byte를 2~2로 설정한 motor_temp 축을 추가하면 (1바이트짜리 데이터라 엔디언은 무관) 아래처럼 되는데요

여기서는 RPM이 높은 쪽에서 각각 57, 46이 찍히네요. 이 값은 프로토콜 문서에

오프셋 40, 30으로 나와 있어서 실제 온도는 컨트롤러 17도, 모터 16도가 될 거고요.

아 감사합니다! 덕분에 이제 확인이 가능해졌네요.
그런데 rpm이나 전류, 전압 값에서 쓰레기 값을 제거하는 건 불가능 하겠죠?

메시지 ID가 0x05가 아니라 0x00 으로 나오는 이유도 알겠네요 ㅋㅋㅋ

C:\monolith\device\TMA-1\Core\Src 경로에 가시면 can.c 파일이 있을 텐데요. 여기서 51번 라인 즈음에

SYS_LOG(LOG_INFO, CAN, can_rx_header.StdId);

라는 코드가 있는데 이걸

SYS_LOG(LOG_INFO, CAN, (can_rx_header.ExtId & 0xff00) >> 8);

로 바꾸고 새로 펌웨어를 빌드해서 업로드하시면 key 값이 0x1E, 0x1F 로 구분될 거에요.

STM32 CAN HAL 드라이버가 11비트짜리 CAN 2.0A ID인 StdId 와 29비트짜리 2.0B ExtId 를 따로 저장해서 구분을 못했던 거네요. (코드)

두 메시지 ID의 PS 부분이 다르니 하위 1바이트 대신 하위 2번째의 1바이트를 사용하도록 바꾼 거고요.


혹시 반영이 안 되는 것 같으면 Clean 버튼 누르고 Flash TMA-1 버튼 눌러서 클린 빌드로 플래싱해보시고요, 잘 된다면 알려주세요~

펌웨어는 수정했는데 설정 값은 똑같이 하면 될까요?


출력 되는 값이 아까랑 동일한 것 같아서요

펌웨어 수정한 로그파일 입니다
2025-01-05 19-32-06.log (146.8 KB)

아직 key가 0으로만 나오네요. StdId 대신 ExtId로 바꾸신게 맞나요? 그런 거라면 Clean 하고 다시 Flash 해보세요.

다시 펌웨어 업데이트 해보니 정상적으로 작동합니다.
엑셀로 확인해보니 key가 각각 128하고 192로 나와서 ID를 넣어 보니 제대로 나오네요 (128은 0x1E, 192는 0x1F의 값이 네요)

주말 동안 귀찮게 질문 했는데 매번 친절하게 답변해주셔서 감사합니다.

1개의 좋아요

아 제가 실수했네요. 0x1E, 0x1F가 나오려면 >> 2 가 아니라 >> 8 이어야 해요. 위 답변은 수정해 놓았는데, 어쨌든 구분이 가능하니 중요한 게 아니면 그대로 쓰셔도 될 것 같습니다. 해결되었으니 solved 처리하겠습니다~

1개의 좋아요