ARDUINO и нестандартный контроллер по RS485

dm55
Offline
Зарегистрирован: 24.10.2015

Здравствуйте. 

Требуется связать панель оператора (MODBUS ASCII, 38400,8,none,1,MASTER) и контроллер TRILOGI (свой протокол, 38400,8,none,1,SLAVE 01) по RS485, через ARDUINO(как конвертер).

Протокол обмена TRLOGI выглядит так:

Как передать и принять данные с контроллера? 

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Не в обиду, но осмелюсь предположить, что сначала придется выучить как протокол Modbus, так и протокол контроллера. Причем формат посылки, систему команд, ... И еще придется освоить мануалы к обоим устройствам, чтобы понимать какие именно команды в каких случаях посылает панель оператора (она же мастер) и на какие (уже свои) команды и как будет отвечать контроллер. А в контроллере кроме системного ПО еще и пользовательское, и отвечать на запросы панели должно, как я полагаю, именно оно.
Существуют покупные преобразователи протоколов, например Modbus - Profibus. Насколько они хорошо работают ни скажу, а стоят в районе штуки евро. Но и они автоматом вашу задачу не решат, поскольку общаться с панелью должна прикладная программа "по понятиям".

dm55
Offline
Зарегистрирован: 24.10.2015

Нечто наваял. Жду контроллер с Китая. Извините за каламбур, первая проба на ARDUINO. Работал на PIС , замучился платы травить! Программу дошел до проверки кода ASCII.

 

int val = 0 ;
char ascI[20];
char ascO[20];
char omrI[10];
char omrO[10];
int CRC = 0;
int f1 = 0;
int f2 = 0;
int d1 = 0;
int d2 = 0;
int com1 = 0;

void setup() {
Serial1.begin(38400);
Serial2.begin(38400);
pinMode(2, OUTPUT); // передача на панель
pinMode(3, OUTPUT); // передача на контроллер
digitalWrite(2, LOW);
digitalWrite(3, LOW);
Serial2.setTimeout(500);
delay(1000);
}

void loop() {
if (Serial1.available() > 0) {
val = Serial1.read();
if (val == 58) { //двоеточие, начало посылки с панели
Serial1.readBytes(ascI, 17);
}
if (ascI[2] == 49) { //только для слейва 01
konvASC();
digitalWrite(3, HIGH);
delay(10);
telOMR();
digitalWrite(3, LOW);
delay(10);
if (Serial2.available() > 0) {
Serial.readBytes(omrO, 6);
}
telASC();

}
}
}

void konvASC () {
if (ascI[2] == 31) {
comanda();
omrI[0] = 82;
omrI[1] = com1;
dataomron();
omrI[2] = d1;
omrI[3] = d2;

}

}
void comanda() { //вычисление функции
if ((ascI[7] == 38) & (ascI[6] = 0)) { // RT
com1 = 84; // T
}
if (ascI[6] == 31) { //RO
com1 = 79; // O
}
if ((ascI[7] < 37) & (ascI[6] = 0)) { // RI
com1 = 73; // I
}
if (ascI[6] == 34) { // RR
com1 = 82; // R
}
}

void dataomron() {
if (com1 == 73) { // RI
d1 = ascI[7];
d2 = ascI[8];
}
if (com1 == 84) { // RT
d1 = 30;
d2 = ascI[8];
}
if (com1 == 82) { // RR
d1 = ascI[7];
d2 = ascI[8];
}
if (com1 == 79) { // RO
d1 = ascI[7];
d2 = ascI[8];
}
}

void telASC() {
for (int i = 0; i < 5; i++) {
ascO[i] = ascI[i];
}
ascO[5] = 30;
ascO[6] = 32;
ascO[7] = 30;
ascO[8] = 30;
ascO[9] = omrI[2];
ascO[10] = omrI[3];

ascO[13] = 13; // 0D
ascO[14] = 10; // 0A
}

void telOMR() {
Serial2.write(omrI[0]);
Serial2.write(omrI[1]);
Serial2.write(omrI[2]);
Serial2.write(omrI[3]);
Serial2.write(42);
Serial2.write(13);
}

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
dm55
Offline
Зарегистрирован: 24.10.2015
[code]
int val = 0 ;
char ascI[20];
char ascO[20];
char omrI[10];
char omrO[10];
int CRC = 0;
int f1 = 0;
int f2 = 0;
int d1 = 0;
int d2 = 0;
int com1 = 0;


void setup() {
  Serial1.begin(38400);
  Serial2.begin(38400);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  Serial2.setTimeout(500);
  delay(1000);
}

void loop() {
  if (Serial1.available() > 0) {
    val = Serial1.read();
    if (val == 58) {
      Serial1.readBytes(ascI, 17);
    }
    if (ascI[2] == 49) {
      konvASC();
      digitalWrite(3, HIGH);
      delay(10);
      telOMR();
      digitalWrite(3, LOW);
      delay(10);
      if (Serial2.available() > 0) {
        Serial.readBytes(omrO, 6);
      }
      telASC();

    }
  }
}

void konvASC () {
  if (ascI[2] == 31) {
    comanda();
    omrI[0] = 82;
    omrI[1] = com1;
    dataomron();
    omrI[2] = d1;
    omrI[3] = d2;



  }

}
void comanda() { //вычисление функции
  if ((ascI[7] == 38) & (ascI[6] = 0)) { // RT
    com1 = 84; // T
  }
  if (ascI[6] == 31) { //RO
    com1 = 79; // O
  }
  if ((ascI[7] < 37) & (ascI[6] = 0)) { // RI
    com1 = 73; // I
  }
  if (ascI[6] == 34) { // RR
    com1 = 82; // R
  }
}

void dataomron() {
  if (com1 == 73) { // RI
    d1 = ascI[7];
    d2 = ascI[8];
  }
  if (com1 == 84) { // RT
    d1 = 30;
    d2 = ascI[8];
  }
  if (com1 == 82) { // RR
    d1 = ascI[7];
    d2 = ascI[8];
  }
  if (com1 == 79) { // RO
    d1 = ascI[7];
    d2 = ascI[8];
  }
}

void telASC() {
  for (int i = 0; i < 6; i++) {
    ascO[i] = ascI[i];
  }
  ascO[6] = 30;
  ascO[7] = 32;
  ascO[8] = 30;
  ascO[9] = 30;
  ascO[10] = omrI[2];
  ascO[11] = omrI[3];

  ascO[13] = 13; // 0D
  ascO[14] = 10; // 0A
}

void telOMR() {
  Serial2.write(omrI[0]);
  Serial2.write(omrI[1]);
  Serial2.write(omrI[2]);
  Serial2.write(omrI[3]);
  Serial2.write(42);
  Serial2.write(13);
}

[/code]