본문 바로가기
C++ 200제/코딩 IT 정보

[PLC 프로그래밍] 멜섹PLC, MC 프로토콜 분석 C++

by vicddory 2017. 10. 15.

[PLC 프로그래밍] 멜섹PLC, MC 프로토콜 분석 C++


멜섹 PLC 프로그래밍 환경


- Q06HCPU

- QJ71E71-100

- TCP, 바이너리 통신 기준

- MC 프로토콜 3E frame 방식

- 멜섹 PLC 프로그래밍 언어 : Qt (C++)


멜섹 PLC 프로그래밍을 위해 Q 시리즈 CPU와 이더넷 모듈을 사용한 간단한 분석 결과이다.

이 포스트에서 소개하는 소스 코드는 멜섹 PLC 프로그래밍 C++ 환경에서 그대로 적용해 사용할 수 있다.


3E frame (binary)

멜섹 PLC 프로그래밍 : 보내는 패킷 형태


문서 'MELSEC Communication Protocol.pdf' 477p를 참조하여 3E frame의 바이너리 통신 시 패킷을 구성하는 방법을 알 수 있다.


MELSEC Communication Protocol.pdf 477p - Read values form devices[C++ MC Protocol] MELSEC Communication Protocol.pdf 477p - Read values form devices


Subheader와 Access route 항목은 거의 변하지 않는다.


Subheader 항목은 실제 장비가 바뀌면 값을 변경한다. 시리즈에 맞는 값들은 멜섹 PLC 프로그래밍 문서(MC 프로토콜 문서)에서 확인한다.


그 아래 다른 항목들은 사용자 정의가 필요한 부분이다.


멜섹 PLC 프로그래밍 : 받는 패킷 형태


MELSEC Communication Protocol.pdf 477p - Receive the result[C++ MC Protocol] MELSEC Communication Protocol.pdf 477p - Receive the result


보내는 패킷과 거의 유사하다.


Response data length 항목을 포함한 아래 항목들은 보내는 패킷을 정의한 유형에 따라 유동적이다.


멜섹 PLC 프로그래밍 : 패킷 분석


보내는 패킷


디바이스 영역 B200 ~ B20A을 읽는 패킷은 아래와 같이 구성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/** Subheader */
[0] (hex) 50 'P'   /** Subheader Upper */
[1] (hex) 0 '\0'   /** Lower */
 
/** Access route */
[2] (hex) 0 '\0'   /** Network No. */
[3] (hex) ffffffffffffffff / (hex) ff   /** PC No */
[4] (hex) ffffffffffffffff / (hex) ff   /** Request destination module I/O No */
[5] (hex) 3        /** Request destination module I/O No */
[6] (hex) 0'\0'    /** Request destination module station No */
 
/** Request data length */
[7] (hex) c
[8] (hex) 0'\0'    /** size = 12 */
 
/** Monitoring timer */
[9] (hex) 10
[10] (hex) 0'\0'   /** 4 seconds */
 
/** Command */
[11] (hex) 1       
[12] (hex) 4       /** 0401 (Read) */
 
/** Subcommand */
[13] (hex) 0'\0'   
[14] (hex) 0'\0'   /** = 0 */
 
/** Head device number */
[15] (hex) 0'\0'   
[16] (hex) 2       
[17] (hex) 0'\0'   /** 200번지 */
 
/** Device code */
[18] (hex) ffffffffffffffa0 / (hex) a0   /** B = a0 */
 
/** Number of device points */
[19] (hex) 2       /**  */
[20] (hex) 0'\0'   /**  */
cs


1. Access route - 미리 정의된 항목이라 사용자가 수정할 사항은 없음


2. Request data length - 아래 항목 전체의 길이


3. Monitoring timer - 응답 대기 시간(내부적으로 처리하는 부분)


4. Command - 0401 : Read, 1401 : Write


5. Subcommand - 여기선 사용 안함 (bit, word 단위를 설정할 수 있음)


6. Head device number - 메뉴얼과는 다르게 상하위 반전이 있음. 코드상에선 200번지를 의미.


7. Device code - A0은 디바이스 B를 의미.


8. Number of device points - 2byte 단위로 읽음. (16bit, 2word) 


아래는 멜섹 PLC 프로그래밍 일부로, 전송하는 코드를 QtCreator에서 확인한 그림이다.


QtCreator - mc_protocol_send[C++ MC Protocol] QtCreator - mc protocol send

멜섹 PLC 프로그래밍 : 받는 패킷


디바이스 영역 B200 ~ B20A을 읽는 패킷에 대한 응답 값.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/** Subheader */
[0] (hex) ffffffffffffffd0 / (hex) d0   /** Subheader Upper */
[1] (hex) 0 '\0'   /** Lower */
 
/** Access route */
[2] (hex) 0 '\0'   /** Network No. */
[3] (hex) ffffffffffffffff / (hex) ff   /** PC No */
[4] (hex) ffffffffffffffff / (hex) ff   /** Request destination module I/O No */
[5] (hex) 3        /** Request destination module I/O No */
[6] (hex) 0'\0'    /** Request destination module station No */
 
/** Response data length */
[7] (hex) 6
[8] (hex) 0'\0'   /** end code + response data */
 
/** End code */
[9] (hex) 0'\0'
[10] (hex) 0'\0'
 
/** Response data(read data) */
[11] (hex) a'\n'
[12] (hex) 0'\0'    /** upper 00001010 */ 
[13] (hex) 0'\0'
[14] (hex) 0'\0'    /** lower 00000000 */
cs


Response data를 제외한 나머지 항목은 "보내는 패킷" 항목과 같다.


미쓰비시 PLC 프로그램[C++ MC Protocol]


Device B 영역은 Hexadecimal로 16비트 영역을 보유하며, 16비트 영역을 모두 읽으려면 8비트(1word)씩 끊어서 읽어야 한다.

이때 상하위 비트는 반전되지 않고 값이 그대로 전달된다.


아래는 실제 전송하는 코드를 QtCreator에서 확인한 그림이다. (실제 멜섹 PLC 프로그래밍에 사용)


QtCreator - mc_protocol_recv[C++ MC Protocol] QtCreator - mc protocol recv


[PLC 프로그래밍] 멜섹PLC, MC 프로토콜 분석 C++

댓글