Ciao ragazzi,
ho ancora bisogno di voi....
Ho un dispositivo che trasmette via seriale alcuni dati (stringhe) ad arduino.
Ora vorrei che questi dati vengano recapitati ad un plc collegato ad arduino tramite protocollo modbus.
Potete darmi una mano per trasformare arduino in un passacarte per il plc?
Di seguito il codice che mi permette di leggere i dati da un arduino:
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 4
SoftwareSerial softSerial = SoftwareSerial(rxPin, txPin);
//
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
softSerial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
Serial.begin(9600);
while (!softSerial) {
; // wait for serial port to connect. Needed for native USB
}
}
//--------------------------------
int CalcChannel(unsigned char ui8type, unsigned char ui8Msb, unsigned char ui8Lsb) {
int ui8Temp;
if (ui8type==0){
ui8Temp=ui8Msb*256+ui8Lsb;
}
if (ui8type==1) {
ui8Temp=ui8Msb*256+ui8Lsb;
ui8Temp=ui8Temp-2048;
}
return (ui8Temp);
}
//--------------------------------
int ui8Buffer[8][2];
int ui16Idx=0;
int ui8CheckSum=0;
//--------------------------------
void loop() {
// send data only when you receive data:
if (softSerial.available() > 0) {
if (softSerial.read()==0x55) {
ui8Buffer[0][0]=0x55;
ui8Buffer[0][1]=0;
do {
if (softSerial.available() > 0) {
ui16Idx++;
ui8Buffer[ui16Idx][0] = softSerial.read();
ui8Buffer[ui16Idx][1] = ui16Idx;
}
}while (ui16Idx<=8);
ui16Idx=0;
ui8CheckSum=0;
//Calcolo del check sum per vedere
for (ui16Idx=0;ui16Idx<7;ui16Idx++){
ui8CheckSum = ui8CheckSum + ui8Buffer[ui16Idx][0];
}
ui16Idx=0;
if (((unsigned char)ui8CheckSum)==ui8Buffer[7][0]){
// Serial.println("checksum calcolato:");
// Serial.println((unsigned char)ui8CheckSum);
// Serial.println("Pacchetto ricevuto:");
//
// for (ui16Idx=0;ui16Idx<8;ui16Idx++){ //stampa il pacchetto ricevuto in maniera ricorsiva
// Serial.println(ui8Buffer[ui16Idx][0]);
// }
Serial.println("Lettura del primo canale:");
if (ui8Buffer[1][0]==0) Serial.println("ph:");
if (ui8Buffer[1][0]==1) Serial.println("rx:");
Serial.println(CalcChannel((unsigned char) ui8Buffer[1][0], (unsigned char) ui8Buffer[2][0], (unsigned char) ui8Buffer[3][0])); //calcola il valore
//
Serial.println("Lettura del secondo canale:");
if (ui8Buffer[4][0]==0) Serial.println("ph:");
if (ui8Buffer[4][0]==1)Serial.println("rx:");
Serial.println(CalcChannel((unsigned char) ui8Buffer[4][0], (unsigned char) ui8Buffer[5][0], (unsigned char) ui8Buffer[6][0])); //calcola il valore
//
}
else {
Serial.println("checksum error:");
}
ui16Idx=0;
}
}
//delay(1000);
}
//display values read
// read the incoming byte:
//digitalWrite(LED_BUILTIN, HIGH);
//Serial.println("dato ricevuto");
Grazie per l'aiuto.
Saluti Fabio