-> Hier kostenlos registrieren
Ich habe einen Sensor bestellt, der drei Parameter an bestimmten Registeradressen misst. Der Sensor verwendet ein Modbus-Protokoll für die Kommunikation (RS 485). Ich verwende den Arduino als Master und den Sensor als Slave. Da ich den Sensor noch nicht habe, gibt es eine Software (Modsim32), die auf meinem Windows 10 Computer läuft und es mir ermöglicht, einen Slave zu simulieren. Ich möchte meinen Arduino mit der Simulationssoftware über die RS485 mit dem Modbus RTU-Protokoll kommunizieren lassen. Wenn ich das auf der ModbusMaster-Bibliothek basierende Programm ausführe, finde ich an der seriellen Schnittstelle eine 226, was nach dem, was ich gelesen hatte, eine Fehlermeldung ist. Aber warum?
Ich verwende einen Arduino Uno.
Die Kommunikation erfolgt über RS485 und einen USB-Anschluss.
mein RS485 : DollaTek 5PCS 5V MAX485 / RS485 Modul TTL zu RS-485 MCU Entwicklungsboard
mein USB: WINGONEER CH340E USB zu TTL USB zu RS485 Konverter Adapter Windows 7/8 XP Linux Vista
Anhang finden Sie bilder von mein Schaltplan und vom Modsim32 oberfläche
Hier ist mein code:
Ich verwende einen Arduino Uno.
Die Kommunikation erfolgt über RS485 und einen USB-Anschluss.
mein RS485 : DollaTek 5PCS 5V MAX485 / RS485 Modul TTL zu RS-485 MCU Entwicklungsboard
mein USB: WINGONEER CH340E USB zu TTL USB zu RS485 Konverter Adapter Windows 7/8 XP Linux Vista
Anhang finden Sie bilder von mein Schaltplan und vom Modsim32 oberfläche
Hier ist mein code:
C++:
#include <ModbusMaster.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/*!
We're using a MAX485-compatible RS485 Transceiver.
Rx/Tx is hooked up to the hardware serial port at 'Serial'.
The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE 3
#define MAX485_RE_NEG 2
LiquidCrystal_I2C lcd(0x27, 20, 4);
// instantiate ModbusMaster object
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
// Modbus communication runs at 115200 baud
Serial.begin(9600);
// Modbus slave ID 10
node.begin(10, Serial);
lcd.init();
lcd.backlight();
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
uint8_t result;
// Read 1 registers starting at 0x3100)
result = node.readInputRegisters(0x3100, 1); // I am getting 226 here
lcd.setCursor(0, 0);
lcd.print(result);
/* if (result == node.ku8MBSuccess)
{
Serial.print("Vbatt: ");
Serial.println(node.getResponseBuffer(0x04)/100.0f);
Serial.print("Vload: ");
Serial.println(node.getResponseBuffer(0xC0)/100.0f);
Serial.print("Pload: ");
Serial.println((node.getResponseBuffer(0x0D) +
node.getResponseBuffer(0x0E) << 16)/100.0f);
}*/
delay(1000);
}