기린정 2022. 12. 7. 14:05

Modbus-tcp

MODBUS-TCP 통신규격에는 마스터(Client)와 슬레이브(Server)의 역할이 나누어져 있습니다. 슬레이브(Server)는 마스터(Client)가 요청하는 데이터에 대해 응답을 해줍니다. 주로 마스터(Client)에는 산업용터치 HMI 기기, 또는 PC 와 같은 상위 기기가 위치합니다. 그리고 슬레이브(Server)에는 TCPPORT 나 PLC 등이 위치합니다.

슬레이브(Server)는 상위기기에서 요청하는 동작만을 하는 수동적인 위치에 있습니다. 반면 마스터(Client)쪽에서는 원하는 데이터를 읽어오거나, 원하는 데이터를 기입하는 등 적극적으로 슬레이브(Server) 기기를 다루어 주어야 합니다.

 

프로토콜

 MBAP Header

MODBUS-TCP는 MBAP(Modbus Application Protocol)를 선두로 Function code, Data로 순으로 이루어져 있습니다. MBAP는 총 7 Byte이고 아래와 같은 내용의 Byte값을 나타냅니다.

Transaction ID [2 Bytes] :

마스터(Client)가 최초 0x0000값 부터 통신시작 시 1씩 증가시키며 슬래이브(Server)는 그 값을 그대로 복사해서 사용합니다. 쿼리 및 응답에 대해 한쌍으로 작업이 이루어 졌는지를 확인하는 부분입니다.

Protocol ID [2 Bytes] :

프로토콜의 ID를 나타내며 MODBUS-TCP는 0x0000 의 고정값을 사용합니다.

Length [2 Bytes] :

Length 필드위치에서 프레임 마지막까지의 길이를 나타냅니다. 즉 Unit ID ~ Data끝까지의 Byte의 수를 나타냅니다.

Unit ID [1 Byte] :

TPC/IP가 아닌 다른 통신선로의 연결되어있는 Slave를 구분하는 정보입니다. Tcpport는 0x01로 고정입니다.

 

 Function Code

Function Code는 Modbus 프로토콜에서 제공하는 명령어 집합코드 입니다. Function Code를 이용하여 슬레이브 Memory(Coil, Register )에 값을 읽어오거나 쓸수있는 서비스입니다. TCPPORT에서 1, 2, 4, 5, 6, 15, 16 값을 지원합니다.

 

메모리
데이터모델
접근형태
읽기/쓰기
설명
Coil
Discrete Input
비트
읽기
상위장치에서 메모리 읽기 가능
Coil
Coils
비트
읽기/ 쓰기
상위장치에서 메모리 읽고, 쓰기 가능
Register
Input Registers
16비트 워드
읽기
상위장치에서 메모리 읽기 가능
Register
Holding Resisters
16비트 워드
읽기/ 쓰기
상위장치에서 메모리 읽고, 쓰기 가능

CPPORT는 16비트 워드영역(Resisters)과 비트영역(Coils)으로 두 개의 데이터 메모리로 나누어져 있습니다.

여기서 말하는 메모리는 Slave(server) 장비의 메모리를 말하며

Master(Client)는 위의 평션코드를 이용하여 Slave(server) 장비의 메모리를 읽거나 원하는 값으로 변경할 수 있습니다.

 

· TCPPORT의 MODBUS 데이터 메모리 구조

- Data

Data는 Function Code에 따라 그 구조가 조금식 달라집니다.

Data는 기본적으로 Start Address / Length / Byte Count / Data의 형태를 가지고 있습니다.

Start Address [2 Bytes] :

접근하려는 메모리의 시작번지를 나타냅니다. 2 Byte로 표현되면 상위 Byte 우선순입니다.

(예 0x4001번지 접근 시 0x40 0x01)

Length [2 Bytes] :

시작번지부터 값을 읽거나 쓸 길이를 나타냅니다.

Byte Count [1 Bytes] :

Request, Response에 따른 메모리 Data의 byte 수를 나타냅니다.

즉, 읽어거나 쓸려는 메모리 데이터의 Byte의 개수를 말합니다.

DATA [N Byte] :

Request, Response에 따른 메모리 Data의 값 나타냅니다. 즉, 읽어오거나 쓸려는 메모리 값입니다.

각 Function Code에 따른 Data 구조는 다음 링크에서 확인하실 수 있습니다.

 

 

Funtion Code별 DATA 구조 및 디바이스 제어

MODBUS-TCP는 Function Code별 프로토콜 Data구조가 조금식 달라집니다.

Function Code별로 요청·응답에 대한 프로토콜의 데이터 구조를 알아보고 TCPPORT의 디바이스를 제어하는 방법을 살펴 보겠습니다.

MODBUS-TCP는 서버로 사용되며 IP는 기본적으로 192.168.201.2xx로 구성되어있습니다. 2xx의 주소는 기본적으로 200으로 설정되어있고 사용자가 딥스위치를 설정하여 200~215까지의 IP주소를 설정하여 사용하실 수 있습니다. PORT번호는 502으로 고정입니다.

Read Coil

Bit Read(읽기), Coil메모리의 비트의 값을 읽어오는 명령입니다.

- Function Code : 0x01 OR 0x02

- 디바이스 Input, Output Port의 상태를 읽는데 사용합니다.

- Input Port 0~15번 읽기

TCPPORT의 Input Port(16점)은 Coil 메모리의 0 ~ 15번지의 값으로 매칭되어 있습니다. 아래의 데이터 포멧은 Input Port의 0~15포트의 값을 읽어오는 데이터 포멧입니다.

- 요청 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x01 0x00 0x00 0x00 0x10

- 응답 : 0x00 0x00 0x00 0x00 0x00 0x05 0x01 0x01 0x02 0x00 0x00

*각 Function Code의 MBAP의 byte 값은 동일한 값을 가집니다. 단, MBAP의 Length는 Length뒤의 전체 데이터의 Byte 개수로 각 평션 별로 달라 질수 있습니다.

Write Single Coil

Bit Write(쓰기), Coil메모리의 한개의 비트의 값을 쓰는 명령입니다.

- Function Code : 0x05

- 디바이스 Output Port의 출력을 ON/OFF 할때 사용합니다.

- Function Code 0x05의 요청/응답의 데이터 포멧은 동일합니다.

- Output Port 0번 ON 시키기

TCPPORT의 Output Port(8점)은 Coil 메모리의 16 ~ 24번지의 값으로 매칭되어 있습니다. 아래의 데이터 포멧은 Output Port의 0포트를 ON 시키는 포멧입니다. ON의 DATA 값은 0xFF00, OFF는 0x0000 입니다.

- 요청 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x05 0x00 0x10 0xFF 0x00

- 응답 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x05 0x00 0x10 0xFF 0x00

Read Registers

Word(16bit) Read(읽기), Registers 메모리의 값을 읽는 명령입니다.

- Function Code : 0x03 OR 0x04

- 디바이스 ADC의 아날로그 값을 읽는데 사용합니다.

- ADC PORT의 AIN0~1 채널의 아날로그 데이터값 읽기

TCPPORT의 ADC PORT(4점)은 Registers 메모리의 0~3 번지로 매칭되어 있습니다. 아래의 데이터 포멧은 AIN0~1 PORT의 아날로그 데이터값을 읽어오는 데이터 포멧입니다. ADC PORT는 0~5V의 입력받을 수 있고 0~4095값을 반환 합니다.

- 요청 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x04 0x00 0x00 0x00 0x02

- 응답 : 0x00 0x00 0x00 0x00 0x00 0x07 0x01 0x04 0x04 0x0F 0xFF 0x08 0x2F

Write Single Registers

Word(16bit) Write(쓰기), Registers메모리의 한개의 워드(2Byte)의 값을 쓰는 명령입니다.

- Function Code : 0x06

- 디바이스 PWM PORT의 듀티비를 조절하는데 사용합니다.

- Function Code 0x06의 요청/응답의 데이터 포멧은 동일합니다.

- PWM 0채널의 듀티비를 40%로 출력

TCPPORT의 PWM PORT(2점)은 Registers 메모리의 4 ~ 5번지의 값으로 매칭되어 있습니다. 아래의 데이터 포멧은 PWM의 듀티비를 40%로 만드는 데이터 포멧입니다. TCPPORT의 PWM주기(Period)는 100mS 이고 듀디비(Duty Cycle)은 0~100% 까지 1%단위로 조절할 수 있습니다.

- 요청 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x06 0x00 0x04 0x00 0x28

- 응답 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x06 0x00 0x04 0x00 0x28

Write Multiple Coils

- 연속적으로 여러개의 Coils 메모리값(Output 포트)을 ON/OFF 제어를 할수 있습니다.

- Function Code : 0x0F(15)

- 연석적으로 다수의 OUTPUT 포트의 ON/OFF 합니다.

- OUTPUT PORT 7,4,3,2,0번 ON 시키기

Function Code 0x0F(15)은 하나의 데이터 프래임으로 여러개의 출력포트를 on/off 시킬 수 있습니다. Start Address 부터 Length의 길이만큼 Data값으로 on/off를 설정합니다. 즉, Output Port 7,4,3,2,0번 ON 시키려면 0번 포트의 Start Address(0x0010), 0~7번 포트까지의 비트길이 Lenght(0x0008), ON시키려는 포트의 값 Data(0x9D: 10011101) ON시키려는 Port 7,4,3,2,0은 1값이고 OFF는 0값으로 설정 합니다.

- 요청 : 0x00 0x00 0x00 0x00 0x00 0x08 0x01 0x0F 0x00 0x10 0x00 0x08 0x01 0x9D

- 응답 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x0F 0x00 0x10 0x00 0x08

Write Multiple Registers

- 연속적으로 여러개의 Registers 메모리에 Data값을 쓸수 있습니다.

- Function Code : 0x10(16)

- Pwm 체널의 듀티값을 조절하는데 사용합니다.

- PWM 0, 1에 각각 듀티비를 20%, 60%로 PWM 출력하기

Function Code 0x10(16)은 하나의 데이터 프래임으로 여러개의 Registers 메모리에 Data값을 쓸수 있습니다. Start Address 부터 Length의 길이만큼 Word(2byte)값으로 pwm 체널의 듀티비를 조절 할 수 있습니다. 즉, PWM0의 Start Address(0x0004)에서 PWM1번 포트까지의 비트길이 Lenght(0x0002)에 각각 Data(2Byte)값을 20%, 60%으로 설정합니다.

- 요청 : 0x00 0x00 0x00 0x00 0x00 0x0B 0x01 0x10 0x00 0x04 0x00 0x02 0x04 0x00 0x14 0x00 0x3c

- 응답 : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x10 0x00 0x04 0x00 0x02

 

 

 

Linux 

1. 포트 번호 열어줘야 접속이 됌

    sudo vi /etc/ssh/sshd_config   (Port 502)

    sudo systemctl restart sshd

728x90