Skip to content

Commit 7bb1e8b

Browse files
committed
docs: Readmd 이미지 추가 및 Usage 문서 작성
- 사용 방법 및 Function Code 별 패킷 크기 작성 - ModbusSimulator V1.0.0.0 릴리즈
1 parent a752d36 commit 7bb1e8b

File tree

10 files changed

+250
-4
lines changed

10 files changed

+250
-4
lines changed

Docs/Img/COMPort.png

47.3 KB
Loading

Docs/Img/ModBusSSConnect.png

35.3 KB
Loading

Docs/Img/ModbusSMConnect.png

17.9 KB
Loading
21.8 KB
Loading
26.1 KB
Loading

Docs/Img/RS232.jpg

459 KB
Loading

Docs/USAGE.md

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
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+
![RS-232 Port](./Img/RS232.jpg)
18+
RS-232 포트를 크로스 케이블로 서로 연결하고 각 포트에 COM 포트를 할당합니다.
19+
20+
![COM Port](./Img/COMPort.png)
21+
RS-232 포트에 할당된 COM 포트를 확인합니다.
22+
23+
- **소프트웨어**: 이 애플리케이션은 .NET 8이상이 필요합니다.
24+
25+
## 1. Master & Slave 애플리케이션 실행
26+
27+
- **Slave 애플리케이션**(콘솔 앱)을 실행하고 특정 COM 포트에서 수신하도록 설정합니다.
28+
29+
![Slave](./Img/ModBusSSConnect.png)
30+
31+
- **Master 애플리케이션**(WinForms 앱)을 실행하고 Slave와의 통신을 위한 서로 다른 COM 포트를 선택합니다.
32+
- EX) Master Port : COM3, Slave Port : COM4
33+
34+
![Master](./Img/ModbusSMConnect.png)
35+
36+
## 2. Modbus 통신
37+
38+
0. 슬레이브에서 포트 연결 시 주소가 1인 가상장치가 미리 생성되어 있습니다.(주소: 1, 코일 개수: 10, 레지스터: 10)
39+
1. 마스터에서 원하는 슬레이브 주소와 기능 코드를 선택합니다.
40+
2. 마스터에서 요청할 데이터의 시작 주소와 데이터 개수(혹은 데이터 혹은 데이터 개수와 데이터 둘다)를 입력합니다.
41+
3. 마스터에서 보내기 버튼을 클릭하면 슬레이브로 요청 패킷이 전송됩니다.
42+
4. 슬레이브는 요청 패킷을 받아 처리하고 응답 패킷을 마스터로 전송합니다.
43+
5. 마스터는 응답 패킷을 받아 화면에 출력합니다.
44+
45+
![Master](./Img/ModbusSimulatorMasterMain.png)
46+
47+
48+
## 3. Slave 가상 장치 설정
49+
50+
- 슬레이브 어플리케이션에서는 콘솔를 이용하여 가상 장치를 설정할 수 있습니다.
51+
- 콘솔에서 다음과 같은 기능을 사용할 수 있습니다.
52+
1. 가상 장치 추가
53+
2. 가상 장치 제거
54+
3. 가상 장치 보기
55+
4. 로그 보기
56+
5. 로그 데이터 비우기
57+
- 그외 `Clear` 명령어를 입력하면 콘솔 화면이 초기화되고 `Q` 나 `q`를 입력하면 어플리케이션이 종료됩니다.
58+
59+
![Slave](./Img/ModbusSimulatorSlaveMain.png)
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

MainForm.Designer.cs

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ModBusSimMaster.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,4 @@
1818
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
1919
</ItemGroup>
2020

21-
<ItemGroup>
22-
<Folder Include="Doc\Img\" />
23-
</ItemGroup>
24-
2521
</Project>

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
# ModBus Simulator
22

3+
![C#](https://img.shields.io/badge/language-C%23-239120.svg?logo=c-sharp&logoColor=white)
4+
![WinForms](https://img.shields.io/badge/framework-WinForms-0078D6.svg?logo=windows&logoColor=white)
5+
![Console](https://img.shields.io/badge/application-console-lightgrey.svg?logo=windows-terminal&logoColor=white)
6+
37
ModBus 통신을 체험해 볼 수 있는 간단한 시뮬레이터입니다. ModBus 프로토콜을 학습하기 위한 목적에서 개발된 이 프로젝트는 **ModBusSim Master****ModBusSim Slave** 애플리케이션으로 구성되어 있으며, C#을 사용해 각각 구현되어 ModBus 요청 및 응답의 순환 과정을 관찰할 수 있습니다.
48

9+
10+
#### Modbus Master
11+
![ModBusSimMaster](/Docs/Img/ModbusSimulatorMasterMain.png)
12+
13+
#### Modbus Slave
14+
![ModBusSimSlave](./Docs/Img/ModbusSimulatorSlaveMain.png)
15+
16+
517
## 목차
618

719
- [주요 기능](#주요-기능)
@@ -31,12 +43,18 @@ ModBus
3143
```
3244
2. Visual Studio에서 솔루션을 열고 두 프로젝트를 빌드한 후 각각의 애플리케이션에 해당 COM 포트를 설정합니다.
3345

46+
또는
47+
48+
[Releases](https://github.com/KwonYH-sky/ModBusSimulator/releases/tag/V1.0.0.0)에서 설치 파일을 다운로드 후 실행합니다.
49+
3450
## 사용 방법
3551

3652
1. **Slave 애플리케이션**(콘솔 앱)을 실행하고 특정 COM 포트에서 수신하도록 설정합니다.
3753
2. **Master 애플리케이션**(WinForms 앱)을 실행하고 Slave와의 통신을 위한 대응되는 COM 포트를 선택합니다.
3854
3. Master 애플리케이션이 ModBus 패킷을 Slave로 전송하면 Slave는 이에 맞는 응답을 반환합니다. 두 애플리케이션 모두에 패킷 정보가 출력되어 ModBus 데이터 교환 과정을 쉽게 파악할 수 있습니다.
3955

56+
자세한 사용 방법은 [여기](./Docs/USAGE.md)를 참조하세요.
57+
4058
## 목적
4159

4260
이 시뮬레이터는 ModBus를 처음 접하는 학습자에게 프로토콜의 작동 방식을 간단히 체험할 수 있게 합니다. 패킷 처리와 데이터 교환의 기본 과정을 확인할 수 있어 ModBus 통신을 이해하기 위한 좋은 입문 도구입니다.

0 commit comments

Comments
 (0)