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

Arduino에서 Modbus를 사용하는 방법

구성품 및 소모품

Arduino UNO
× 1
Arduino용 전문 RS422 / RS485 실드
× 1
USB-RS485 변환기
× 1
브레드보드(일반)
× 1
LED(일반)
× 1
저항 10k 옴
× 1
저항 221옴
× 1
점퍼 와이어(일반)
× 1
SparkFun 푸시버튼 스위치 12mm
× 1

앱 및 온라인 서비스

Arduino IDE
모드 버스 테스터

이 프로젝트 정보

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

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

도구 및 자료

<울>
  • 아두이노 UNO
  • <울>
  • Arduino용 RS485 실드
  • <울>
  • PC 연결용 RS485-USB 어댑터(또는 더 저렴한 어댑터)
  • 선택 사항:

    <울>
  • 브레드보드
  • <울>
  • 푸시 버튼
  • <울>
  • 빨간색 LED
  • <울>
  • 220옴 저항기
  • <울>
  • 10k 저항기
  • <울>
  • 점퍼 와이어
  • 소프트웨어

    <울>
  • 아두이노 IDE
  • <울>
  • 모드 버스터
  • RS485 배선:

    배선은 매우 간단합니다. Modbus 시스템의 A, B 라인에 실드의 A, B 단자만 연결하면 됩니다. Y 및 Z 터미널은 이러한 종류의 애플리케이션에 사용되지 않습니다. 장거리의 경우 A와 B에 트위스트 페어를 사용하는 것이 좋습니다.

    Arduino 배선(선택 사항):

    Modbus 통신의 일부 효과를 보려면 Arduino에 LED와 버튼을 추가하는 것이 좋습니다. 선택 사항이며 필요하지 않습니다.

    DIP 스위치 설정:

    RS422/RS485 Shield는 3개의 DIP 스위치 뱅크와 함께 제공됩니다. 아래 그림과 같이 Modbus용 DIP 스위치를 설정해야 합니다.

    스위치 1:1-OFF 2-ON 3-ON 4-OFF

    스위치 2:1-OFF 2-OFF 3-ON 4-ON

    스위치 3:1-OFF 또는 ON* 2-OFF 3-OFF 4-OFF

    * Modbus 라인에서 RS422/RS485 Shield의 위치에 따라 종단 저항을 ON 또는 OFF로 전환해야 합니다. Shield가 버스 라인의 한쪽 끝에 있는 경우에만 저항을 ON 위치로 전환하십시오. 다른 모든 경우에는 종단 저항을 OFF로 전환하십시오.

    점퍼 설정:

    방패에서 3개의 다른 점퍼 영역을 찾을 수 있습니다. 매우 중요한 것은 전원 전압용 점퍼 JP1입니다. Arduino UNO는 내부적으로 5V로 작동합니다. 이 점퍼를 5V 위치로 설정해야 합니다(예:Arduino 101과 같은 3.3V 보드의 경우 3.3V 위치).

    또한 위의 그림과 같이 왼쪽 상단 모서리에 통신 포트에 대한 점퍼를 설정합니다. 포트 0과 1의 내부 UART는 이 경우 실드의 RS485 인터페이스에 연결됩니다.

    마지막으로 RX/TX 제어 포트에 대해 점퍼를 설정해야 합니다. 자동 RX/TX 전환이 구성되어 있으므로 이 점퍼를 사용하지 않습니다.

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

    이 예에서는 PC를 Modbus 마스터로 사용합니다. Modbustester를 다운로드해야 합니다. zip 아카이브의 압축을 하드 디스크의 새 디렉토리에 푸십시오. 소프트웨어를 열고 아래 그림과 같이 표시된 필드를 변경합니다. USB-RS485-어댑터를 먼저 연결해야 합니다. Modbustester에서 이 어댑터에 적합한 COM 포트를 선택하십시오.

    아두이노 소프트웨어:

    컴파일 및 프로그래밍을 위해 펌웨어를 Arduino IDE에 로드하십시오.

    작업 테스트:

    이제 작업을 테스트할 시간입니다!

    Modbustester에서 읽기 버튼을 누를 수 있습니다. 이 명령은 새 슬레이브 장치의 메모리 8바이트를 읽습니다. 주소 400008에서 버튼의 상태를 찾을 수 있습니다. 주소 400001 - 400006에는 ADC 포트 값이 포함됩니다.

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

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Arduino UNO용 샘플 코드
  • Arduino UNOArduino용 샘플 코드
    /* * Arduino RS422/RS485 Shield용 테스트 프로그램 * Version 1.0 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de * * (https://github.com/angeloc/simplemodbusng 소스 기반) * * * 이 프로그램은 자유 소프트웨어입니다. * 자유 소프트웨어 재단이 발행한 GNU 일반 공중 사용 허가서의 조건에 따라 재배포 및/또는 수정할 수 있습니다. * 라이선스 버전 3 또는 * (귀하의 선택에 따라) 모든 이후 버전. * * 이 프로그램은 유용할 것이라는 희망으로 배포되지만 * 그러나 어떠한 보증도 하지 않습니다. * 상업성 또는 특정 목적에의 적합성에 대한 묵시적 보증도 없이. 자세한 내용은 * GNU 일반 공중 사용 허가서를 참조하십시오. * * 이 프로그램과 함께 GNU General Public License * 사본을 받았어야 합니다. 그렇지 않은 경우 .*/를 참조하십시오. #include #define ledPin 12 // 온보드 led #define buttonPin 7 // 푸시 버튼/* 이 예제 코드는 9개의 홀딩 레지스터. 6개의 아날로그 입력, 1개의 버튼, 1개의 디지털 출력 및 1개의 레지스터가 시작 이후 발생한 오류를 나타냅니다. 기능 5(단일 코일 쓰기)는 구현되지 않으므로 전체 레지스터와 기능 16을 사용하여 Atmega328P의 온보드 Led를 설정합니다. modbus_update() 메서드는 HoldingRegs 레지스터 배열을 업데이트하고 통신을 확인합니다. 참고:Arduino 직렬 링 버퍼는 128바이트 또는 64개 레지스터입니다. 대부분의 경우 MAX485 또는 이와 유사한 것을 사용하여 직렬을 통해 arduino를 마스터에 연결합니다. 기능 3 요청에서 마스터는 슬레이브에서 읽기를 시도하고 ID, FUNCTION, NO OF BYTES 및 2개의 BYTES CRC에 이미 5바이트가 사용되었기 때문에 마스터는 122바이트 또는 61 레지스터만 요청할 수 있습니다. 기능 16 요청에서 마스터는 슬레이브에 쓰기를 시도하고 9바이트는 이미 ID, FUNCTION, ADDRESS, NO OF REGISTERS, NO OF BYTES 및 2바이트 CRC에 사용되었기 때문에 마스터는 118바이트 또는 59개 레지스터만 쓸 수 있습니다. . FTDI USB-직렬 변환기를 사용하면 보낼 수 있는 최대 바이트가 내부 버퍼인 60바이트 또는 30개의 부호 없는 int 레지스터로 제한됩니다. 따라서 기능 3 요청에서 마스터는 슬레이브에서 읽기를 시도하고 ID, FUNCTION, NO OF BYTES 및 2 BYTES CRC에 이미 5바이트가 사용되기 때문에 마스터는 54바이트 또는 27 레지스터만 요청할 수 있습니다. 기능 16 요청에서 마스터는 슬레이브에 쓰기를 시도하고 9바이트는 이미 ID, FUNCTION, ADDRESS, NO OF REGISTERS, NO OF BYTES 및 2바이트 CRC에 사용되었기 때문에 마스터는 50바이트 또는 25개 레지스터만 쓸 수 있습니다. . USB to Serial 변환기를 사용하지 않고 주로 Arduino를 사용하여 마스터에 연결한다고 가정하기 때문에 내부 버퍼는 Arduino 직렬 링 버퍼와 동일하게 128바이트로 설정됩니다.*/ // enum 명령어를 사용하면 레지스터를 추가하고 // 제거하는 쉬운 방법. 이렇게 하면 더 많은 레지스터를 추가할 때마다 // 슬레이브 레지스터 배열의 크기를 정의하는 것을 절약할 수 있습니다. // 슬레이브 레지스터 레이아웃을 알 수 있습니다./////////// ///// 슬레이브의 레지스터 ///////////////////enum { // 레지스터를 추가하거나 제거하기만 하면 됩니다. // 첫 번째 레지스터 주소 0에서 시작 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // 하나만 남겨둡니다 TOTAL_REGS_SIZE // 함수 3과 16이 동일한 레지스터 배열을 공유하는 총 레지스터 수};unsigned int HoldingRegs[ TOTAL_REGS_SIZE]; // 함수 3 및 16 레지스터 배열//////////////////////////////////////////// /////////////////void setup(){ /* parameters(긴 전송 속도, unsigned char ID, unsigned char 전송 활성화 핀, unsigned int 홀딩 레지스터 크기, unsigned char 낮은 대기 시간 ) 전송 활성화 핀은 MAX485를 활성화하기 위해 반이중 통신에서 사용되거나 이 모드를 비활성화하기 위해 유사하게 사용됩니다. 0 &1은 Rx 및 Tx용으로 예약되어 있기 때문에 2 미만의 값을 사용합니다. 낮은 지연 지연은 구현을 비표준으로 만들지만 실질적으로 모든 주요 모드버스 마스터 구현에서 작동합니다. */ modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0); 핀모드(LED핀, 출력); 핀모드(버튼핀, 입력); }void loop(){ // modbus_update()는 loop()에서 사용되는 유일한 메서드입니다. // 슬레이브가 시작된 이후의 총 오류 수를 반환합니다. 사용할 필요는 없지만 // modbus 마스터가 오류를 찾는 데 유용합니다. HoldingRegs[TOTAL_ERRORS] =modbus_update(holdingRegs); for (byte i =0, i <6, i++) { HoldingRegs[i] =analogRead(i); 지연마이크로초(50); } 바이트 버튼 상태 =디지털 읽기(버튼핀); // 버튼 상태 읽기 // 버튼 상태 값을 홀딩 레지스터에 할당 HoldingRegs[BUTTON_STATE] =buttonState; // LED_STATE 레지스터 값을 읽고 기능 16바이트로 온보드 LED를 높음 또는 낮음으로 설정합니다. ledState =HoldingRegs[LED_STATE]; if (ledState) // led 설정 { digitalWrite(ledPin, HIGH); } else if (ledState ==0) // led 리셋 { //digitalWrite(ledPin, LOW); HoldingRegs[LED_STATE] =0; } }

    회로도

    Arduino에 일부 테스트 구성 요소 배선

    제조공정

    1. 예제가 있는 C# 대기열:C# 대기열이란 무엇이며 어떻게 사용합니까?
    2. 푸시 버튼을 사용하여 PWM으로 조명 디밍
    3. MPU-6050을 사용한 Arduino 자이로스코프 게임
    4. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    5. Arduino를 사용한 간단한 장애물 센서
    6. 나를 찾기
    7. Arduino 조이스틱
    8. 서미스터를 사용하는 것이 얼마나 쉬운가요?!
    9. Arduino로 음악을 만드는 방법
    10. Arduino와 함께 NMEA-0183을 사용하는 방법