|
| 1 | +# Modbus Simulator 사용 방법 |
| 2 | + |
| 3 | +이 문서는 Modbus Simulator 프로젝트의 사용 방법을 설명합니다. 프로젝트는 **ModBusSim Master**와 **ModBusSim Slave** 애플리케이션으로 구성되어 있으며, C#을 사용해 각각 구현되어 ModBus 요청 및 응답의 순환 과정을 관찰할 수 있습니다. |
| 4 | + |
| 5 | +## 목차 |
| 6 | + |
| 7 | +- [0. 준비 사항](#0-준비-사항) |
| 8 | +- [1. Master & Slave 애플리케이션 실행](#1-master--slave-애플리케이션-실행) |
| 9 | +- [2. Modbus 통신](#2-modbus-통신) |
| 10 | +- [3. Slave 가상 장치 설정](#3-slave-가상-장치-설정) |
| 11 | +- [4. Function Code](#4-function-code) |
| 12 | + |
| 13 | +## 0. 준비 사항 |
| 14 | + |
| 15 | +- **하드웨어**: 두 개의 RS-232 포트를 컴퓨터에 연결하고 각 포트에 서로 다른 COM 포트를 할당합니다. |
| 16 | + |
| 17 | + |
| 18 | +RS-232 포트를 크로스 케이블로 서로 연결하고 각 포트에 COM 포트를 할당합니다. |
| 19 | + |
| 20 | + |
| 21 | +RS-232 포트에 할당된 COM 포트를 확인합니다. |
| 22 | + |
| 23 | +- **소프트웨어**: 이 애플리케이션은 .NET 8이상이 필요합니다. |
| 24 | + |
| 25 | +## 1. Master & Slave 애플리케이션 실행 |
| 26 | + |
| 27 | + - **Slave 애플리케이션**(콘솔 앱)을 실행하고 특정 COM 포트에서 수신하도록 설정합니다. |
| 28 | + |
| 29 | +  |
| 30 | + |
| 31 | + - **Master 애플리케이션**(WinForms 앱)을 실행하고 Slave와의 통신을 위한 서로 다른 COM 포트를 선택합니다. |
| 32 | + - EX) Master Port : COM3, Slave Port : COM4 |
| 33 | + |
| 34 | +  |
| 35 | + |
| 36 | +## 2. Modbus 통신 |
| 37 | + |
| 38 | +0. 슬레이브에서 포트 연결 시 주소가 1인 가상장치가 미리 생성되어 있습니다.(주소: 1, 코일 개수: 10, 레지스터: 10) |
| 39 | +1. 마스터에서 원하는 슬레이브 주소와 기능 코드를 선택합니다. |
| 40 | +2. 마스터에서 요청할 데이터의 시작 주소와 데이터 개수(혹은 데이터 혹은 데이터 개수와 데이터 둘다)를 입력합니다. |
| 41 | +3. 마스터에서 보내기 버튼을 클릭하면 슬레이브로 요청 패킷이 전송됩니다. |
| 42 | +4. 슬레이브는 요청 패킷을 받아 처리하고 응답 패킷을 마스터로 전송합니다. |
| 43 | +5. 마스터는 응답 패킷을 받아 화면에 출력합니다. |
| 44 | + |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | +## 3. Slave 가상 장치 설정 |
| 49 | + |
| 50 | +- 슬레이브 어플리케이션에서는 콘솔를 이용하여 가상 장치를 설정할 수 있습니다. |
| 51 | +- 콘솔에서 다음과 같은 기능을 사용할 수 있습니다. |
| 52 | + 1. 가상 장치 추가 |
| 53 | + 2. 가상 장치 제거 |
| 54 | + 3. 가상 장치 보기 |
| 55 | + 4. 로그 보기 |
| 56 | + 5. 로그 데이터 비우기 |
| 57 | + - 그외 `Clear` 명령어를 입력하면 콘솔 화면이 초기화되고 `Q` 나 `q`를 입력하면 어플리케이션이 종료됩니다. |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | + - 가상 장치 추가 |
| 62 | + - 가상 장치 추가를 선택하면 가상 장치의 주소, 코일 개수, 레지스터 개수를 입력받습니다. |
| 63 | + - EX) 2, 10, 10 - 입력한 정보로 가상 장치가 생성됩니다. |
| 64 | + - 코일 개수와 레지스터 개수의 최소 개수는 10개입니다. |
| 65 | + - 입력한 정보로 가상 장치가 생성됩니다. |
| 66 | + - 가상장치는 입력 레지스터 0번 부터 5번까지 가상장치가 생성된 년도부터 초까지 순차적으로 저장되어 생성됩니다. |
| 67 | + - 입력 상태 코일은 코일 개수 만큼 ON/OFF가 랜덤으로 설정됩니다. |
| 68 | + - 각 가상장치는 입력 레지스터 |
| 69 | + - etc) 주소가 1인 가상 장치는 미리 생성되어 있습니다. |
| 70 | + |
| 71 | + |
| 72 | +- 가상 장치 제거 |
| 73 | + - 가상 장치 제거를 선택하면 가상 장치의 주소를 입력받습니다. |
| 74 | + - EX) 2 - 입력한 주소의 가상 장치가 제거됩니다. |
| 75 | + |
| 76 | +- 가상 장치 보기 |
| 77 | + - 가상 장치 보기를 선택하면 현재 생성된 가상 장치의 정보를 출력합니다. |
| 78 | + |
| 79 | +- 로그 보기 |
| 80 | + - 로그 보기를 선택하면 현재까지의 로그를 출력합니다. |
| 81 | + - 로그는 요청 패킷과 응답 패킷이 출력됩니다. |
| 82 | + |
| 83 | +- 로그 데이터 비우기 |
| 84 | + - 로그 삭제를 선택하면 현재까지의 모든 로그를 삭제합니다. |
| 85 | + |
| 86 | +## 4. Function Code |
| 87 | + |
| 88 | +- Master는 다음 명령을 전송할 수 있습니다: |
| 89 | + - Coil 상태 읽기 (기능 코드: 0x01) |
| 90 | + - Discrete Inputs 상태 읽기 (기능 코드: 0x02) |
| 91 | + - Holding 레지스터 읽기 (기능 코드: 0x03) |
| 92 | + - Input 레지스터 읽기 (기능 코드: 0x04) |
| 93 | + - Coil 상태 쓰기 (기능 코드: 0x05) |
| 94 | + - Holding 레지스터 쓰기 (기능 코드: 0x06) |
| 95 | + - 멀티 Coil 쓰기 (기능 코드: 0x15) |
| 96 | + - 멀티 레지스터 쓰기 (기능 코드: 0x16) |
| 97 | + |
| 98 | +#### Coil 상태 읽기 (기능 코드: 0x01) |
| 99 | +- 시작 주소와 읽을 개수를 입력하면 해당하는 코일의 상태를 읽어옵니다. |
| 100 | +- Requsets Packet은 다른과 같은 데이터가 들어가 있습니다: |
| 101 | + - Slave Address : 1byte |
| 102 | + - Function Code : 1byte |
| 103 | + - Starting Address : 2byte |
| 104 | + - Quantity of Coils : 2byte |
| 105 | + - CRC : 2byte |
| 106 | + |
| 107 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 108 | + - Slave Address : 1byte |
| 109 | + - Function Code : 1byte |
| 110 | + - Byte Count : 1byte |
| 111 | + - Coil Status : nbyte (n = Quantity of Coils / 8 + Quantity of Coils % 8) |
| 112 | + - CRC : 2byte |
| 113 | + |
| 114 | +#### Discrete Inputs 상태 읽기 (기능 코드: 0x02) |
| 115 | +- 시작 주소와 읽을 개수를 입력하면 해당하는 디지털 입력의 상태를 읽어옵니다. |
| 116 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 117 | + - Slave Address : 1byte |
| 118 | + - Function Code : 1byte |
| 119 | + - Starting Address : 2byte |
| 120 | + - Quantity of Inputs : 2byte |
| 121 | + - CRC : 2byte |
| 122 | + |
| 123 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 124 | + - Slave Address : 1byte |
| 125 | + - Function Code : 1byte |
| 126 | + - Byte Count : 1byte |
| 127 | + - Input Status : nbyte (n = Quantity of Inputs / 8 + Quantity of Inputs % 8) |
| 128 | + - CRC : 2byte |
| 129 | + |
| 130 | +#### Holding 레지스터 읽기 (기능 코드: 0x03) |
| 131 | +- 시작 주소와 읽을 개수를 입력하면 해당하는 레지스터의 값을 읽어옵니다. |
| 132 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 133 | + - Slave Address : 1byte |
| 134 | + - Function Code : 1byte |
| 135 | + - Starting Address : 2byte |
| 136 | + - Quantity of Registers : 2byte |
| 137 | + - CRC : 2byte |
| 138 | + |
| 139 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 140 | + - Slave Address : 1byte |
| 141 | + - Function Code : 1byte |
| 142 | + - Byte Count : 1byte |
| 143 | + - Register Value : nbyte (n = Quantity of Registers * 2) |
| 144 | + - CRC : 2byte |
| 145 | + |
| 146 | +#### Input 레지스터 읽기 (기능 코드: 0x04) |
| 147 | +- 시작 주소와 읽을 개수를 입력하면 해당하는 입력 레지스터의 값을 읽어옵니다. |
| 148 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 149 | + - Slave Address : 1byte |
| 150 | + - Function Code : 1byte |
| 151 | + - Starting Address : 2byte |
| 152 | + - Quantity of Registers : 2byte |
| 153 | + - CRC : 2byte |
| 154 | + |
| 155 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 156 | + - Slave Address : 1byte |
| 157 | + - Function Code : 1byte |
| 158 | + - Byte Count : 1byte |
| 159 | + - Register Value : nbyte (n = Quantity of Registers * 2) |
| 160 | + - CRC : 2byte |
| 161 | + |
| 162 | +#### Coil 상태 쓰기 (기능 코드: 0x05) |
| 163 | +- 시작 주소와 쓸 데이터를 입력하면 해당하는 코일의 상태를 설정합니다. |
| 164 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 165 | + - Slave Address : 1byte |
| 166 | + - Function Code : 1byte |
| 167 | + - Starting Address : 2byte |
| 168 | + - Output Value : 2byte (0x0000 or 0xFF00) |
| 169 | + - CRC : 2byte |
| 170 | + |
| 171 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 172 | + - Slave Address : 1byte |
| 173 | + - Function Code : 1byte |
| 174 | + - Starting Address : 2byte |
| 175 | + - Output Value : 2byte (0x0000 or 0xFF00) |
| 176 | + - CRC : 2byte |
| 177 | + |
| 178 | +#### Holding 레지스터 쓰기 (기능 코드: 0x06) |
| 179 | +- 시작 주소와 쓸 데이터를 입력하면 해당하는 레지스터의 값을 씁니다. |
| 180 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 181 | + - Slave Address : 1byte |
| 182 | + - Function Code : 1byte |
| 183 | + - Starting Address : 2byte |
| 184 | + - Output Value : 2byte |
| 185 | + - CRC : 2byte |
| 186 | + |
| 187 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 188 | + - Slave Address : 1byte |
| 189 | + - Function Code : 1byte |
| 190 | + - Starting Address : 2byte |
| 191 | + - Output Value : 2byte |
| 192 | + - CRC : 2byte |
| 193 | + |
| 194 | +#### 멀티 Coil 쓰기 (기능 코드: 0x15) |
| 195 | +- 시작 주소와 쓸 개수, 쓸 데이터를 입력하면 해당하는 코일들의 상태를 설정합니다. |
| 196 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 197 | + - Slave Address : 1byte |
| 198 | + - Function Code : 1byte |
| 199 | + - Starting Address : 2byte |
| 200 | + - Quantity of Outputs : 2byte |
| 201 | + - Byte Count : 1byte |
| 202 | + - Output Value : nbyte (n = Quantity of Outputs / 8 + Quantity of Outputs % 8) |
| 203 | + - 각 비트는 시작 주소부터 순서대로 코일 상태를 나타냅니다. |
| 204 | + - EX) 시작 주소가 0일 때 0x0003 - 0번째 코일은 ON, 1번째 코일은 OFF |
| 205 | + - CRC : 2byte |
| 206 | + |
| 207 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 208 | + - Slave Address : 1byte |
| 209 | + - Function Code : 1byte |
| 210 | + - Starting Address : 2byte |
| 211 | + - Quantity of Outputs : 2byte |
| 212 | + - CRC : 2byte |
| 213 | + |
| 214 | +#### 멀티 레지스터 쓰기 (기능 코드: 0x16) |
| 215 | +- 시작 주소와 쓸 개수, 쓸 데이터를 입력하면 해당하는 레지스터들의 값을 씁니다. |
| 216 | +- Requsets Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 217 | + - Slave Address : 1byte |
| 218 | + - Function Code : 1byte |
| 219 | + - Starting Address : 2byte |
| 220 | + - Quantity of Outputs : 2byte |
| 221 | + - Byte Count : 1byte |
| 222 | + - Output Value : nbyte (n = Quantity of Outputs * 2) |
| 223 | + - CRC : 2byte |
| 224 | + |
| 225 | +- Response Packet은 다음과 같은 데이터가 들어가 있습니다: |
| 226 | + - Slave Address : 1byte |
| 227 | + - Function Code : 1byte |
| 228 | + - Starting Address : 2byte |
| 229 | + - Quantity of Outputs : 2byte |
| 230 | + - CRC : 2byte |
0 commit comments