MODBUS TCP Gateway 사용 후기

2019.11.06 06:05 컴퓨터/주변 장치·부속품

MODBUS RTU 망과 이더넷을 연결

MODBUS 통신 프로토콜을 자세히 보면 뭔가 좀 이상하고 이해 안 되는 부분이 있지만, 표준처럼 많은 곳에서 사용하다 보니 장치 간의 통신은 MODBUS가 편합니다. 특히, 처음 보는 장치라도 그 장치가 MODBUS 통신을 제공하고 기능별로 잘 작성된 MODBUS Table을 갖추었다면 개발 시간을 많이 줄일 수 있습니다. 일단, 개발자끼리 싸울 일이 없어서 좋습니다. 코딩 대로 작동이 안 될 때, 서로 잘잘못을 따질 필요 없이 인증된 MODBUS 테스터로 확인하면 됩니다. 상대방이 고집 피우면 MODBUS 테스터 확인하라고 하면 끝입니다. 하드웨어 잘못이 아닌 이상 MODBUS 테스터 프로그램으로 기능이 확인되면 할 말이 없죠.

▲ 제어해야 될 장치가 서로 다른 회사에서 만들어진 전혀 다른 제품이라고 하더라도 모두 MODBUS 통신을 제공하면 시리얼 또는 이더넷으로 하나의 망에 묶을 수 있습니다. 각 장치별로 MODBUS 테이블에 따라 데이터를 구하고 제어 명령을 전달하면 됩니다.

▲ 이렇게 rs485 uart로 연결했다면 MODBUS-RTU를 사용합니다.

▲ rs485가 아니라 이더넷으로 연결했다면 MODBUS-TCP를 사용하게 됩니다.

 

Serial to Ethernet Converter

▲ 문제는 rs485 시리얼 통신일 경우입니다. rs485 망과 제어하는 마스터까지의 거리가 멀어서 연결하기 어려운 경우가 있는데요, 이럴 때 rs485망을 Serial to Ethernet 컨버터로 이더넷 망에 연결하고 마스터도 이더넷 망에 연결합니다. 문제는 연결은 되어도 MODBUS 통신을 바로 할 수 없습니다. 위 그림을 보아도 사용하는 MODBUS 프로토콜이 다르기 때문입니다. 이더넷에 연결된 마스터는 MODBUS-TCP를 사용하지만, rs485 망에 연결된 장치는 MODBUS-RTU로 통신하기 때문이지요.

▲ 통신이 안 되는 이유는 안타깝게도 MODBUS-RTU와 MODBUS-TCP 패킷이 다릅니다. 이런 이유로 RTU와 TCP를 혼합해서 사용할 수 없습니다. 마스터와 rs485에 연결된 모든 장치가 MODBUS-RTU로 통일하거나 MODBUS-TCP로 맞추어야 합니다.

이런 경우 숫자가 많은 클라이언트 쪽보다는 한 개뿐인 마스터가 맞추어 주는 것이 수월하지요. 그래서 이더넷으로 연결되어 있더라도 마스터는 MODBUS-RTU로 변경해서 통신해야 합니다. 이렇게 되면 마스터 쪽 코딩은 libmodbus 같은 공개된 MODBUS 라이브러리를 사용할 수 없습니다. 방법이 전혀 없는 것은 아니지만, libmodbus 정규 방식이 아닌 변칙으로 코딩해야 합니다.

그래서 TCP/IP를 사용하지만, 패킷은 MODBUS-RTU 패킷에 따라 전송하고 수신해야 하는데, 이를 위해 MODBUS-RTU over TCP를 구현한 라이브러리가 있다고는 합니다만, 찾지를 못 했습니다. 그리고 안타깝게도 libmodbus 라이브러리에서는 MODBUS-RTU over TCP를 제공하지 않습니다. 어쩔 수 없이 TCP/IP로 소켓 통신하면서 MODBUS-RTU 프로토콜을 직접 구현해야 합니다.

 

MODBUS TCP Gateway

직접 MODBUS를 구현하려면 못할 것은 아니지만, 귀찮지요. 개발 기간도 넉넉치 않은데 일은 줄이지 못하고 늘게 되었으니 반갑지 않습니다. 만들더라도 검증 기간이 짧다면 버그도 숨어 있을 수 있습니다. 잘 만들어진 MODBUS-RTU over TCP 라이브러리가 있으면 참 좋겠는데...

프로토콜을 직접 구현하기 귀찮고 부담된다면 Serial to Ethernet 컨버터 대신에 MODBUS TCP Gateway를 사용하면 한 번에 해결할 수 있습니다.

▲ 위 그림처럼 MODBUS TCP Gateway로 연결하면 마스터가 전송한 MODBUS-TCP 패킷을 Gateway가 MODBUS-RTU 패킷으로 변환하여 rs485에 물린 장치로 전달합니다. 반대로 rs485에 물린 장치가 마스터로 MODBUS-RTU 패킷으로 응답하면 Gateway가 다시 MODBUS-TCP 패킷으로 변환해서 마스터에 전달하지요.

Serial to Ethernet 컨버터와는 달리 Gateway가 알아서 패킷 변환해서 전달해 주니 각 장치는 자기에게 연결된 방식에 충실하여 MODBUS 통신하면 됩니다. rs485에 연결되면 MODBUS-RTU로, 이더넷과 연결하면 MODBUS-TCP로 통신하면 됩니다. 당연히 공개된 훌륭한 MODBUS 라이브러리를 사용할 수 있습니다. libmodbus 라이브러리를 애용하는데, Gateway로 통신했을 때 매우 잘 작동합니다.

 

기산 KG30X MODBUS TCP 게이트웨이 설정 방법

웹으로 검색한 제품으로 "MOXAMOXA MGate MB3180 게이트웨이"가 있네요. MOXA 제품은 사용해 본 적이 없는데, 제 직장 동료는 적극 추천하더군요. 게이트웨이는 아니고 Serial to Ethernet MOXA 제품을 여러 번 설치해서 사용했는데 한 번도 속을 썩인 적이 없다면서 이왕이면 MOXA를 사라고 하더라고요. 좋은 만큼 가격이 높군요.

직접 사용해 본것은 기산 "KG30X MODBUS TCP 게이트웨이" 제품입니다. 며칠 전에 처음 사용했는데, MODBUS TCP Gateway에 대한 경험이 없기도 했지만, 안타깝게도 첫 제품이 불량품이어서 몇 시간을 고생했습니다. 전화로 여러 번 문의하고 했지만, 결국 헛수고였고 다행히(?) 3개를 구매했던지라 다른 것으로 바꾸니 바로 되더군요. 이런~.

전화 문의했을 때 저의 사정을 매우 자세히 설명했는데, 설정이나 처리 방법이 이상이 없다면 차라리 rs485 포트에 출력이 이상하니 제품 불량이 의심된다는 얘기만 해 주었더라면 그 아까운 몇 시간을 버리지 않았을 것입니다. 처음 접하는 제품이라 저의 잘못으로만 생각했습니다.

문제를 해결하지 못 했기 때문에 다시 전화해야 해서 통화자 분의 이름을 여쭈었지만, 말은 하지 않고 피하는 모습에 적잖이 실망했습니다. 다시 전화하게 되면 처음부터 사정 얘기를 다시 해야 하는데, 그래서 이름을 알려 달라는데 다른 분이 받아도 자세히 설명해 준다면서 피하는 모습은 자기들의 제품에 대해 전혀 자신이 없거나, 아니면 얇은 지식으로 진상을 부리는 손님들이 많아서 질리는 바람에 피하고 싶었는지 모르지만, 시간도 없고 답답하더군요. 뭐 대단한 일도 아니고 고작 MODBUS 통신을 연결하는 것인데...

결국 몇 번 통화해도 해결 못하고 한심하게도 제품을 바꾸고 연결하니 바로 통신이 되었을 때 허탈함이란... 개발 일을 하다 보면 이런 일이 적지 않은데, 그런 일이 늘 있다는 것이 힘들기도 하고 한심하기도 하고.... 넋두리였습니다.

▲ MODBUS TCP Gateway는 ethernet와 rs485 uart를 이용하므로 이더넷 네트워크 환경과 uart 쪽의 통신 환경을 설정해 주어야 하는데요, 기산 KG30X는 윈도우용 설정 프로그램을 제공해 줍니다. Gateway와 PC를 rs232 케이블로 연결하고 설정하면 됩니다.

설정 방법은 간단해서 (1) 이더넷 네트워크 환경과 (2) rs485 시리얼 통신을 설정 항목이 있습니다. 저 같은 경우 마스터가 이더넷에 연결되었고 rs485에 여러 개의 장치가 클라이언트로 연결되어 있어서 제어 방식을 "0. 서버 - RS485에 슬레이브 연결"을 선택했습니다. 이렇게 설정을 변경하고 "쓰기" 버튼을 클릭 후 잠시 후에 "읽기" 버튼으로 읽어서 설정한 값을 유지하는 지를 확인하면 됩니다.

MODBUS-RTU를 사용하는 rs485 망을 이더넷으로 제어하고 싶다면 직접 MODBUS 코드를 작성하는 것보다는 MODBUS TCP Gateway를 사용하는 것이 몸 건강, 정신 건강에도 좋겠습니다. 단, MODBUS TCP Gateway 제품이 똑똑해야겠지만요.

이 댓글을 비밀 댓글로