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

Как передать и принять данные с контроллера?
Не в обиду, но осмелюсь предположить, что сначала придется выучить как протокол Modbus, так и протокол контроллера. Причем формат посылки, систему команд, ... И еще придется освоить мануалы к обоим устройствам, чтобы понимать какие именно команды в каких случаях посылает панель оператора (она же мастер) и на какие (уже свои) команды и как будет отвечать контроллер. А в контроллере кроме системного ПО еще и пользовательское, и отвечать на запросы панели должно, как я полагаю, именно оно.
Существуют покупные преобразователи протоколов, например Modbus - Profibus. Насколько они хорошо работают ни скажу, а стоят в районе штуки евро. Но и они автоматом вашу задачу не решат, поскольку общаться с панелью должна прикладная программа "по понятиям".
Нечто наваял. Жду контроллер с Китая. Извините за каламбур, первая проба на 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);
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
[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]