이번 포스팅에서는 카이로스 2기 프로젝트에서 사용한 PLC-PC간 통신과 해결 방법을 다루고자 한다.
2차 프로젝트에서 가장 날 괴롭혔던.. PLC-PC간 통신.. 웹 개발과 비교하자면 정말이지 관련된 자료도 적었기 때문에 시행착오만 가득했기 때문에.. 혹시 궁금하신 분들이 있을까 싶어 이 내용을 좀 적어보기로 했다.
우선 환경(사용모델)은 이렇게이다:
- PLC : LS산전 PLC XBCH
- HMI : TOP-RW Series
내가 2차/통합 프로젝트에서 하고자 했던 목표는 :
- Touch에 입력된 값을 PC의 python으로 받아보고 싶다. (받아서 DB에 저장)
라는 단순한 목표였는데, 이를 달성하기 위한 과정이 꽤나 빙 돌아갔기 때문에.. 관련 과정을 적어보겠다.
- 구상 :
1) Touch > PC 직접 통신
1-1) Touch > DB 연결
- m2i 터치에서 외부 데이터베이스 통신이 가능한 것을 발견했다.
- Django로 SQLite DB를 만들고, 해당 DB를 외부 데이터베이스 연동을 해서 접속 성공이 되는 것까지 확인하였다.
- 그러나 교환 서버?가 연결이 안된다는 에러가 계속 발생하여 강사님 통해 업체에 직접 문의했는데 RW 모델은 외부 데이터베이스가 안된다는 답변을 해주셨다.. 다만 TopView를 켜놓고 같이 켜면 된다고 했다.
- 그러나 이더넷 연결을 해야하는데 이더넷이 안되는 PLC 모델이라 Fail...
1-2) Touch > PC Serial 485통신
- touch 기기에 시리얼 포트가 COM1, COM2가 두개나 있어서 해당 방법을 도전했으나, 애초에 목적이 PLC와 Touch 간 통신인 것 같다.
- PC와 Touch 간 통신에 대한 내용이 FAQ에 있었는데, XTOP만 된다는 듯.. RW로는 무리일듯
그래서 Touch에서 바로 PC 전송은 보류..
PLC 거쳐서 PC로 와도 무방하긴 해서 일단 그쪽으로 선회하여 완료하게 되었다.
2) PLC > PC 통신
여기서 먼저 구분해야할것은 232/485는 채널이고 modbus는 통신규약이라는 점
2-1) 232C 통신
- 232C 케이블의 RX, TX, GND 선만 PLC의 TX, RX, SG 포트로 연결
- PLC의 채널1(232)를 '모드버스 서버'로 설정
- pymodbus 사용하여 ModbusSerialClient로 값 전송
- PLC 프레임 모니터에 값이 들어오고, D100~107에 값이 잘 써지는 것은 봤지만, Python 터미널 쪽에서는 쓰기도 읽기도 안된다는 오류가 뜸, 여기서 일반 serial로 Modbus 프로토콜에 맞춘 형식으로 주고받는것도 해봤지만 같은 현상
- 이 문제의 결론은 허무하게도 232 배선의 Male/Female 을 반대로 연결해서였다.. 연결을 바꾸니 해결
- 그러나 가장 문제가 되는 것은 Touch가 232 통신을 쓰고 있기 때문에 어차피 두개를 동시에 연결할 수가 없었다.
사용중인 PLC의 채널이 2개 뿐이기 때문에 232로 touch와, 485로 pc와 통신하는 수밖에..
2-2) 485 통신
- 채널2(485)에 '모드버스 서버' 설정
- 232C 케이블로 트라이 시 '모름' 상태로 이상한 값 전송하기 때문에 별도 usb 485 케이블을 사용해야한다.
- slave id(=국번) 설정을 잘 해주어야 한다.
다만 해당 모델은 채널이 2개라서 채널1 232C / 채널2 485 하나씩 쓰니까 485가 다대다 통신인데도 활용이 불가했음
2차 프로젝트에서는 인버터도 같이 써야했기 때문에 인버터 연결도 기존 LS inverter에서 485로 변경해주었다.
한 PLC로 인버터 2대를 돌리기 위해서는 우선 배선
- 485 + > 485 + / 485 - > 485 - (교차 X)
- 각 인버터 와의 기존 485선 유지
그리고 설정은 CM1 국번, CM2 1 (LS BUS), CM3 3(9600), DRV 3, FRQ 9
중간에 모드버스로 해보기도 했는데 그러면 CM2 0 (Modbus) FRQ 7 로 변경해줘야함
두 인버터 설정은 국번 외에는 모두 동일하게 맞춰줘야 함
그렇게 해서 PC > PLC 전송 후 인버터쪽 PLC 전원을 켜서 PLC > Inverter 통신으로 연결하도록 구현하였다.
- 결론 :
1. Touch > PC 직접 통신은 사실상 불가능. 232 통신으로 PLC의 레지스터에 저장한 후, 485 통신으로 pc와 통신하도록
2. PLC > PC 통신은 pymodbus 라이브러리를 사용하면 쉽게 구현가능하다. 국번 설정과 usb케이블 연결에 주의
3. 인버터 역시 한 채널을 사용하기 때문에 채널이 2개인 PLC 모델을 사용하시면 어떤 기능을 사용할지 선택필요
관련하여 혹시 문의사항 있으면 댓글 달아주시면 아는 범위까지 답변드리겠습니다 :D
'KAIROS 2기' 카테고리의 다른 글
[카이로스2기] 통합 프로젝트2 : 한국 번호판 숫자 인식하기(딥러닝/OCR) (0) | 2024.12.01 |
---|---|
[카이로스2기] 통합 프로젝트1 : 타이어 마모도 측정 로봇 Mamot (0) | 2024.11.24 |
[카이로스2기] 2차 프로젝트 : myCobot 블록 Pick & Place (0) | 2024.11.17 |
[카이로스2기] 1차 프로젝트 : myAGV 주행하기 (0) | 2024.11.10 |
[카이로스2기] ROS1 기초 : myAGV 자율주행 (SLAM) (4) | 2024.11.03 |