산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노로 Modbus 마스터하기: 단계별 완벽 가이드

부품 및 소모품

부품수량
아두이노 UNO1
아두이노용 전문 RS422/RS485 쉴드1
USB-RS485 컨버터1
브레드보드 (일반)1
LED (일반)1
저항 10k 옴1
저항 221 옴1
점퍼 와이어 (일반)1
스파크펀 푸시버튼 스위치 12mm1

앱 및 온라인 서비스

프로젝트 개요

Modbus는 직렬 통신 표준으로, 산업용 전자 장치 연결의 사실상 표준 프로토콜이 되었습니다. Modbus RTU와 Modbus ASCII에서 RS485는 물리 계층으로 사용됩니다. 아두이노를 Modbus 슬레이브로(일부 제한 사항이 있지만 마스터로도) 사용할 수 있지만 RS485 인터페이스가 필요합니다. 당사의 RS422/RS485 쉴드는 아두이노 UNO 및 아두이노 101, STM Nucleo 등 호환 보드와 함께 사용하도록 설계된 완전 절연형 직렬 통신 쉴드로, 이러한 애플리케이션에 완벽한 선택입니다.

이 문서의 목적은 아두이노 UNO와 함께 간단한 Modbus 슬레이브 장치를 만드는 방법을 보여주는 것입니다. PC를 Modbus 마스터로 사용합니다.

필수 도구 및 재료

선택 사항

소프트웨어

RS485 배선

배선은 매우 간단합니다. 쉴드의 A, B 단자를 Modbus 시스템의 A, B 라인과 연결하기만 하면 됩니다. Y, Z 단자는 이 용도로 사용되지 않습니다. 장거리 통신에는 A, B 라인에 꼬임선(Twisted Pair) 사용을 권장합니다.

아두이노 배선 (선택 사항)

Modbus 통신의 효과를 확인하기 위해 아두이노에 LED와 버튼을 추가하는 것을 권장합니다. 필수는 아니지만 동작 확인에 도움이 됩니다.

DIP 스위치 설정

RS422/RS485 쉴드에는 3개의 DIP 스위치 뱅크가 있습니다. Modbus용으로 아래와 같이 설정하세요.

* RS422/RS485 쉴드가 Modbus 라인에서 어느 위치에 있는지에 따라 종단 저항을 ON 또는 OFF로 설정해야 합니다. 쉴드가 버스 라인의 한쪽 끝에 있는 경우에만 종단 저항을 ON으로 설정하고, 그 외의 경우에는 OFF로 설정하세요.

점퍼 설정

쉴드에는 3개의 점퍼 영역이 있습니다. 가장 중요한 것은 전원 전압용 점퍼 JP1입니다. 아두이노 UNO는 내부적으로 5V로 동작하므로 이 점퍼를 5V 위치로 설정해야 합니다(아두이노 101 등 3.3V 보드의 경우 3.3V 위치).

좌측 상단의 통신 포트용 점퍼는 위 그림과 같이 설정하세요. 내부 UART 포트 0, 1이 쉴드의 RS485 인터페이스와 연결됩니다.

RX/TX 제어 포트용 점퍼는 자동 RX/TX 전환이 구성되어 있으므로 사용하지 않습니다.

PC에 Modbus 테스터 소프트웨어 설치

이 예제에서는 PC를 Modbus 마스터로 사용합니다. ModbusTester를 다운로드하여 하드디스크의 새 디렉토리에 압축을 풉니다. 소프트웨어를 실행하고 아래 그림과 같이 표시된 필드를 변경하세요. USB-RS485 어댑터를 연결한 후 ModbusTester에서 해당 어댑터의 올바른 COM 포트를 선택하세요.

아두이노 소프트웨어

아래 펌웨어를 아두이노 IDE에 로드하여 컴파일 및 업로드하세요.

작동 테스트

이제 작업을 테스트할 차례입니다!

ModbusTester의 Read 버튼을 누르세요. 이 명령은 새로운 슬레이브 장치의 메모리에서 8바이트를 읽습니다. 주소 400008에서 버튼 상태를, 주소 400001~400006에서 ADC 포트 값을 확인할 수 있습니다.

Write 버튼으로는 슬레이브의 레지스터를 조작할 수 있습니다. 주소 400007에 0 또는 1을 입력하여 LED를 켜거나 끌 수 있습니다.

소스 코드

아두이노 UNO용 샘플 코드

/* 
 * 아두이노 RS422/RS485 쉴드 테스트 프로그램
 * Version 1.0
 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de
 * (https://github.com/angeloc/simplemodbusng 기반)
 * 
 * 이 프로그램은 자유 소프트웨어입니다: GNU General Public License v3 또는 이후 버전의 조건에 따라 재배포 및 수정할 수 있습니다.
 * 이 프로그램은 유용하게 사용되기를 바라지만, 어떠한 보증도 없이 제공됩니다.
 * GNU General Public License 사본을 받지 못한 경우 https://www.gnu.org/licenses/ 를 참조하세요.
 */
#include <SimpleModbusSlave.h>

#define ledPin 12   // 온보드 LED
#define buttonPin 7 // 푸시 버튼

/* 이 예제 코드는 9개의 홀딩 레지스터를 가집니다.
 * 6개 아날로그 입력, 1개 버튼, 1개 디지털 출력, 1개 에러 카운터
 * 함수 5(단일 코일 쓰기)는 구현되지 않아 함수 16으로 온보드 LED 제어
 */
enum {
  ADC0, ADC1, ADC2, ADC3, ADC4, ADC5,
  LED_STATE, BUTTON_STATE, TOTAL_ERRORS,
  TOTAL_REGS_SIZE // 함수 3, 16이 공유하는 레지스터 배열 총 크기
};

unsigned int holdingRegs[TOTAL_REGS_SIZE];

void setup() {
  /* 매개변수: (보드레이트, 슬레이브 ID, 송신 인에이블 핀, 홀딩 레지스터 크기, 저레이턴시)
   * 송신 인에이블 핀은 반이중 통신에서 MAX485 등을 활성화하는 데 사용
   * 이 모드를 비활성화하려면 2 미만의 값 사용 (0, 1은 Rx/Tx 예약)
   * 저레이턴시 지연은 비표준이지만 주요 Modbus 마스터 구현과 호환됨
   */
  modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // modbus_update()는 홀딩 레지스터 배열을 업데이트하고 통신 확인
  // 슬레이브 시작 이후 총 에러 수 반환
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
  
  for (byte i = 0; i < 6; i++) {
    holdingRegs[i] = analogRead(i);
    delayMicroseconds(50);
  }
  
  byte buttonState = digitalRead(buttonPin);
  holdingRegs[BUTTON_STATE] = buttonState;
  
  byte ledState = holdingRegs[LED_STATE];
  if (ledState) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
    holdingRegs[LED_STATE] = 0;
  }
}

제조공정

  1. C# Queue 마스터하기: Enqueue, Dequeue, 선입선출(FIFO) 연산 완전 정복
  2. 아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기
  3. 아두이노 나노와 MPU-6050으로 실시간 자이로스코프 게임 만들기
  4. Unopad: 아두이노 우노로 만드는 에이블턴 라이브용 MIDI 컨트롤러
  5. 아두이노로 간단한 장애물 센서 만들기 - IR LED & 포토다이오드 튜토리얼
  6. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  7. 게이밍용 커스텀 아두이노 조이스틱 스티어링 휠 만들기
  8. 서미스터(NTC) 온도 센서 아두이노 활용 완전 정복 - 수식부터 구현까지
  9. 아두이노로 음악 톤 만들기: 88키 피아노 음계 구현 가이드
  10. 아두이노를 NMEA-0183에 연결하기: 단계별 가이드