Управление понижающим преобразователем XY6020L по протоколу modbus с помощью Arduino

Создано:

Изменено:

Понижающий преобразователь XY6020l поддерживает управление по протоколу modbus. На просторах интернета можно найти инструкцию по командам для управления.

Вот пример из инструкции. В первой таблице описана команда для считывания двух байт со значениями напряжения и тока, выставленными на преобразователе. Вторая таблица показывает пример ответа от преобразователя, в котором преобразователь отвечает, что напряжение 5В и ток 1.5А.

Arduino
uint32_t tmr;
//
byte modRtuArray[8] = {0}; // буфер для команды modbus rtu
byte buf[40] = {0};
void setup() {
  // put your setup code here, to run once:
Serial.begin( 115200);

// записываем команду на установку напряжения 500 (5 вольт)
set_cv(modRtuArray, 500);
Serial.write(modRtuArray,8);
tmr = millis(); // сброс таймера


}

void loop() {

  if (millis() - tmr >= 1000) {
    // этот код начинает вызываться
    // через 1000 мс после старта
    //записываем в буфер modRtuArray команду считывания тока и напряжения
    read_cv_cc(modRtuArray);

    // отправляем команду
    Serial.write(modRtuArray,8);
    tmr = millis();
  }

  if (Serial.available()) {
        // есть входящие данные
        Serial.readBytes(buf,39);
        int cv = (buf[3]<<8)|buf[4];
        int cc = (buf[5]<<8)|buf[6];
        
        Serial.print("\n");
        Serial.print("Напряжение: ");
        Serial.println(float(cv)/100, 2);
         Serial.print("Ток: ");
        Serial.println(float(cc)/100, 2);
    }

}

void read_cv_cc(byte *buf) {
  buf[0] = 0x01; // адрес ведомого устройства 01
  buf[1] = 0x03; // код функции 03 - чтение регистров
  buf[2] = 0x00;
  buf[3] = 0x02; // адрес первого регистра 0002
  buf[4] = 0x00;
  buf[5] = 0x02; // количество считываемых байт 0002 - 2 байта

  //вычислим контрольную сумму 2 байта, запишем в конец буффера: младший байт, старший байт
  uint16_t crc = ModRTU_CRC(buf,6);
  buf[6] = crc; // младший байт
  buf[7] = crc>>8; // старший байт

}

void set_cv(byte *buf, uint16_t cv_value){
  buf[0] = 0x01; // адрес ведомого устройства 01
  buf[1] = 0x06; // код функции 06 - запись одного регистра
  buf[2] = 0x00;
  buf[3] = 0x00; // адрес регистра 0000
  buf[4] = cv_value>>8; // старший байт
  buf[5] = cv_value; // младший байт 

  //вычислим контрольную сумму 2 байта, запишем в конец буффера: младший байт, старший байт
  uint16_t crc = ModRTU_CRC(buf,6);
  buf[6] = crc; // младший байт
  buf[7] = crc>>8; // старший байт

}

uint16_t ModRTU_CRC(byte *buf, int len)
{
  uint16_t crc = 0xFFFF;

  for (int pos = 0; pos < len; pos++) {
    crc ^= (uint16_t)buf[pos];

    for (int i = 8; i != 0; i--) {
      if ((crc & 0x0001) != 0) {
        crc >>= 1;
        crc ^= 0xA001;
      }
      else
        crc >>= 1;
    }
  }
  // Помните, что младший и старший байты поменяны местами, используйте соответственно (или переворачивайте)
  return crc;
}

Файлы для скачивания:

xy6020l-modbus-interface (скачать)
Количество скачиваний: 32. Размер: 96.7 KB. Дата: 05 Янв. 2026

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *