===== 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 목차로 돌아가기]]