如何使用 Controllino Maxi 读取风向传感器的 RS485 输出

问题描述 投票:0回答:1

我需要学位输出才能在 Arduino IDE 中读取

产品: 风向传感器 (SEN0482) 和 Controllino Maxi。

Wiring

我尝试使用不同的代码从风向传感器获取任何形式的输出,但我唯一能得到的是“Fail 226”。这表明连接或读取传感器的代码可能存在问题。

这是我的代码:

#include <Controllino.h>
#include "ModbusMaster.h"

// Definer pins for RE og DE kontrol af RS485
const int rs485_re = 68; // Receiver Enable
const int rs485_de = 69; // Driver Enable

// Opret en instans af ModbusMaster klasse
ModbusMaster modbus;

void preTransmission() {
  digitalWrite(rs485_re, LOW);
  digitalWrite(rs485_de, HIGH);
}

void postTransmission() {
  digitalWrite(rs485_re, HIGH);
  digitalWrite(rs485_de, LOW);
}

void setup() {
  // Initialiser pins for RS485 kontrol
  pinMode(rs485_re, OUTPUT);
  pinMode(rs485_de, OUTPUT);

  // Sæt RE og DE til inaktiv tilstand (RE=HIGH, DE=LOW)
  digitalWrite(rs485_re, HIGH);
  digitalWrite(rs485_de, LOW);

  // Start RS485 kommunikation på Serial1
  Serial1.begin(9600); // Erstat med den korrekte baudrate for din enhed
  modbus.begin(2, Serial1); // Angiv slave ID og brug Serial1 porten

  // Definer preTransmission og postTransmission funktioner
  modbus.preTransmission(preTransmission);
  modbus.postTransmission(postTransmission);

  // Start serielle kommunikation til debugging
  Serial.begin(9600);
}

void loop() {
  uint8_t result;
  uint16_t windDirectionData[1]; // Array til at opbevare læste data

  // Læs vindretningen fra Modbus enheden
  result = modbus.readHoldingRegisters(0x0000, 1);

  if (result == modbus.ku8MBSuccess) {
    // Gem data fra responsbufferen
    windDirectionData[0] = modbus.getResponseBuffer(0);

    // Konverter data fra registret til en læsbar format
    int windDirection = windDirectionData[0];
    Serial.print("Vindretning (rå værdi): ");
    Serial.print(windDirection);
    Serial.print(". Dette svarer til ");

    // Fortolkning af vindretningen
    switch(windDirection) {
      case 0: Serial.print("Nord"); break;
      case 1: Serial.print("Nordøst-ved-Nord"); break;
      case 2: Serial.print("Nordøst"); break;
      case 3: Serial.print("Nordøst-ved-Øst"); break;
      case 4: Serial.print("Øst"); break;
      case 5: Serial.print("Sydøst-ved-Øst"); break;
      case 6: Serial.print("Sydøst"); break;
      case 7: Serial.print("Sydøst-ved-Syd"); break;
      case 8: Serial.print("Syd"); break;
      case 9: Serial.print("Sydvest-ved-Syd"); break;
      case 10: Serial.print("Sydvest"); break;
      case 11: Serial.print("Sydvest-ved-Vest"); break;
      case 12: Serial.print("Vest"); break;
      case 13: Serial.print("Nordvest-ved-Vest"); break;
      case 14: Serial.print("Nordvest"); break;
      case 15: Serial.print("Nordvest-ved-Nord"); break;
      default: Serial.print("Ukendt retning"); break;
    }
    Serial.println(".");
  } else {
    Serial.print("Fejl ved læsning af Modbus data: ");
    Serial.println(result);
  }

  delay(1000); // Vent 1 sekund før næste læsning
}
arduino arduino-ide rs485
1个回答
0
投票

据我所知,您的大部分代码和配置似乎都是正确的。 尽管如此,你还是遇到了226(0xE2)错误,这个错误的含义是:从机响应超时。

一般来说,问题的根源有两种可能:

  1. 接线错误:更换A、B线再试。 Modbus RS485 因 A-B 接线错误而闻名(这是历史性的事情)。
  2. 第二种可能性是有点坏消息:许多用户报告了与此库相同的问题:https://github.com/4-20ma/ModbusMaster/issues/93#issuecomment-357524040
    控制器似乎过早地从发送模式切换到接收模式,导致最后一个字节永远无法到达线路。使用数字示波器或逻辑分析仪或类似的东西可以帮助您查看电线上的实际数据。
    这个问题最简单的解决方案是:尝试使用不同的库?
© www.soinside.com 2019 - 2024. All rights reserved.