===== Modbus RTU Master =====
CUBLOC2의 Modbus RTU Master는 Block 방식으로 동작합니다.
* Block방식 : 명령 실행 후 응답 수신 또는 타임아웃까지 대기함.
===== 파라미터 규칙 =====
^ 항목 ^ 설명 ^
| channel | 0 또는 1 |
| slaveId | 1..247 |
| address | 0-base 주소 사용 |
| timeout | ms 단위 |
| buf() | Integer 배열 사용 |
| Register 데이터 | 하위 16비트 사용 |
address는 0-base 기준입니다.
예:
* address=0 → 첫 번째 Coil/Register
* address=1 → 두 번째 Coil/Register
* address=9 → 열 번째 Coil/Register
즉 주소는 0부터 시작합니다.
주의:
* 40001, 00001 같은 1-base 주소는 사용하지 않습니다.
* 실제 데이터 주소만 입력하세요.
===== 지원 Function Code =====
^ Function Code ^ 설명 ^ count 의미 ^ buf 규칙 ^
| FC1 | Read Coils | 읽을 Coil 개수 (1..2000) | buf(i)에 0 또는 1 저장 |
| FC3 | Read Holding Registers | 읽을 Register 개수 (1..125) | buf(i)에 Register 값 저장 |
| FC5 | Write Single Coil | 항상 1 | 0=OFF, 그 외=ON |
| FC6 | Write Single Register | 항상 1 | buf(0)의 하위 16비트 전송 |
| FC15 | Write Multiple Coils | 쓸 Coil 개수 (1..1968) | 0=OFF, 그 외=ON |
| FC16 | Write Multiple Registers | 쓸 Register 개수 (1..123) | 각 buf(i)의 하위 16비트 전송 |
===== 초기화 =====
==== Modbusmaster ====
모드버스 RTU 마스터 모드를 시작합니다.
''Modbusmaster channel, timeout''
* timeout 단위는 ms입니다.
* 지정 시간 안에 응답이 없으면 타임아웃 에러 처리 후 다음 코드로 진행합니다.
Opencom 0, 115200, PROTO_8N1
Modbusmaster 0, 100
위 예제는 응답이 100ms 안에 오지 않으면 에러로 처리합니다.
===== 데이터 읽기 =====
==== Modbusread ====
데이터를 읽어옵니다.
''Modbusread channel, slaveId, funcCode, address, count, buf()''
Dim Buf(10) As Integer
Modbusread 0, 1, 3, 0, 10, Buf()
===== 데이터 쓰기 =====
==== Modbuswrite ====
데이터를 전송합니다.
''Modbuswrite channel, slaveId, funcCode, address, count, buf()''
Dim Buf(10) As Integer
Buf(0) = 123
Buf(1) = 456
Modbuswrite 0, 1, 16, 0, 2, Buf()
===== 4. 에러 확인 =====
==== Modbuserror ====
''variable = Modbuserror()''
마지막 실행된 Modbus 명령의 결과를 반환합니다.
^ 값 ^ 설명 ^
| 0 | 성공 |
| 1 | 잘못된 채널 |
| 2 | 파라미터 오류 |
| 3 | Master 미시작 또는 통신 미준비 |
| 4 | 예약 코드 (향후 확장용) |
| 5 | 타임아웃 |
| 6 | 송신 실패 |
| 7 | 응답 형식 오류 또는 에코 불일치 |
| 8 | CRC 오류 |
| 0x100 + 예외코드 | 슬레이브 예외 응답 |
Dim Err As Integer
Modbusread 0, 1, 3, 0, 10, Buf()
Err = Modbuserror()
If Err = 0 Then
Debug "Read OK", Cr
Else
Debug "Error = ", Dec Err, Cr
End If
===== 사용 예제 =====
* [[.:FC1example|FC1 Read Coils]]
* [[.:FC3example|FC3 Read Holding Registers]]
* [[.:FC5example|FC5 Write Single Coil]]
* [[.:FC6example|FC6 Write Single Register]]
* [[.:FC15example|FC15 Write Multiple Coils]]
* [[.:FC16example|FC16 Write Multiple Registers]]
[[..:index|← CUBLOC2 목차로 돌아가기]]