РЕКЛАМА НА ФОРУМХАУС А с разными портами потому что при соединении опенхаба со слейвом открывается сокет на ip: port. На каждый слейв - свой сокет. Поэтому у сокетов должны быть разные порты, если они на одном айпишнике. Это как пытаться двумя прогами открыть один и тот же ком-порт. Первая его откроет, а вторая скажет что порт занят. А вообще поздравляю, нетривиальная конфигурация, но все равно работает
vores8, а как правильно составить cfg чтобы и coil и holding работали? У меня тоже не работает когда один slave в ПЛК.
kosmas, это понятно, я так же сделал, просто в wiki все к одному слейву цепляется, а у нас какой то извращенный вариант. У меня кстати id одинаковые и работает)
Мне кажется надо делать два (да хоть 102) слейва в плк на одном айпишнике, но на разных портах. ID тоже может быть один и тот же. В примерах в вики - это немцы дописывали на основе своего личного опыта. Я честно говоря так и не понял что они хотели этим сказать, у них какие-то свои контроллеры
Два дня (вернее вечера) вязал я систему с Ардуино и внешними устройствами. Результат! мобильные приложения прекрасно работают 2 планшета, и 3 телефона, все командуют сервером (ОпенНаб) как надо. Кнопочки прыгают и лампочки мигают..(картинки) а вот, как, теперь Ардуину...заставить? Скетч! вроде собрал но показывает ошибки? Попробую сегодня повозиться что как? Железную часть связь Ардуино и ключевые элементы собрать легко потому как присутствуют как сами реле (уже в установлено. и "ключи" тоже) так и промежуточная плата с опторазвязкой уже ждет Ардуино. Еще вопрос обработки данных по температуре? Там есть микрокод (скрипт) он указывает на внешний адрес..? Что нужно поменять для получения данных от Ардуино. (температура). Датчики уже присутствуют. На макетке могу прицепить как датчики так и любые другие элементы. Заранее Спасибо!
Вечером. Я сейчас не дома. Он собран из Ваших рекомендаций..но наверное что то там не хватает поскольку AVR (программулина) ругается и отказываеться писать скетч в Ардуино Кстати вот..на флехе он ..есть #define GATE1CONTACT 5 #define GATE2CONTACT 6 #define GATE1CONTACTNAME "gate1contact" #define GATE2CONTACTNAME "gate2contact" void setup (void) { Serial. begin (9600); Serial. println("server started"); } String content = "; char character; while (Serial.available() { character = Serial. read(); content. concat (character); delay (10); } if (content.length() > 0) { ... } Serial. print (GATE1CONTACTNAME); Serial. print(":"); Serial. println (digitalRead (GATE1CONTACT) = LOW ? "CLOSED": "OPEN"); delay (500); Serial. print("myrelay1:"); Serial. println (digitalRead (4) = LOW ? "OFF": "ON"); delay (500); #include <OneWire.h> ... OneWire ds1 (7); /arduino pin 7 = data loop() { ... float data; if (process(&ds1, &data) = 1) { Serial. print("mytemperature:"); Serial. println (data,DEC); } ... } int process (OneWire* ds, float* value) { byte i; byte present = 0; byte data[12]; byte addr[8]; if (!ds->search (addr) { ds->reset_search(); Serial. println("error searching"); return 0; } if (OneWire: crc8 (addr, 7) != addr[7]) { Serial. println("error crc"); return 0; } if (addr[0] = 0x10) { } else if (addr[0] = 0x28) { } else { Serial. println("error unknown sensor type"); return 0; } ds->reset(); ds->select (addr); ds->write (0x44,1); / запускаем конвертацию delay (750); / скорее всего достаточно 750ms / we might do a ds. depower() here, but the reset will take care of it. present = ds->reset(); ds->select (addr); ds->write (0xBE); / считываем ОЗУ датчика for (i = 0; i < 9; i+) { / обрабатываем 9 байт data = ds->read(); } int HighByte, LowByte, TReading, SignBit; float Tc_100; LowByte = data[0]; /Serial.print("LB= ");Serial.print (LowByte,HEX); HighByte = data[1]; /Serial.print(" HB= ");Serial.print (HighByte,HEX); TReading = (HighByte < 8) + LowByte; / Tc_100 = TReading * 0.05; SignBit = TReading & 0x8000; / test most sig bit if (SignBit) / negative { TReading = (TReading ^ 0xffff) + 1; / 2's comp } Tc_100 = (6 * TReading) + TReading / 4; / multiply by (100 * 0.0625) or 6.25 *value = Tc_100 * 0.01; ds->reset_search(); return 1; } if (content.equals("status") { ... } else if (content.startsWith("myrelay1:") { if (content.endsWith("OFF") { digitalWrite (4, LOW); } else if (content.endsWith("ON") { digitalWrite (4, HIGH); } } int mybuttonstate = LOW; ... setup() ... loop() int mybuttonnewstate = digitalRead (8); if (mybuttonstate != mybuttonnewstate) { mybuttonstate = mybuttonnewstate; Serial. print("mybutton:"); Serial. println (mybuttonstate = LOW ? "OPEN": "CLOSED"); }
Эээээ... Я вобщем-то не имел ввиду что нужно просто скопипастить весь код в один файл. Я приведу ЭТО к компилируемому состоянию, но все же нужно будет самому немного попрограммировать
Вот компилябельный код, дальше плиз сами Код: #include <OneWire.h> #define GATE1CONTACT 5 #define GATE2CONTACT 6 #define GATE1CONTACTNAME "gate1contact" #define GATE2CONTACTNAME "gate2contact" int process(OneWire* ds, float* value) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds->search(addr)) { ds->reset_search(); Serial.println("error searching"); return 0; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("error crc"); return 0; } if ( addr[0] == 0x10) { } else if ( addr[0] == 0x28) { } else { Serial.println("error unknown sensor type"); return 0; } ds->reset(); ds->select(addr); ds->write(0x44,1); // запускаем конвертацию delay(750); // скорее всего достаточно 750ms // we might do a ds.depower() here, but the reset will take care of it. present = ds->reset(); ds->select(addr); ds->write(0xBE); // считываем ОЗУ датчика for ( i = 0; i < 9; i++) { // обрабатываем 9 байт data[i] = ds->read(); } int HighByte, LowByte, TReading, SignBit; float Tc_100; LowByte = data[0]; //Serial.print("LB= ");Serial.print(LowByte,HEX); HighByte = data[1]; //Serial.print(" HB= ");Serial.print(HighByte,HEX); TReading = (HighByte << 8) + LowByte; // Tc_100 = TReading * 0.05; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 *value = Tc_100 * 0.01; ds->reset_search(); return 1; } void setup (void) { Serial. begin (9600); Serial. println("server started"); } OneWire ds1 (7); //arduino pin 7 = data int mybuttonstate = LOW; void loop() { String content = ""; char character; while (Serial.available()) { character = Serial. read(); content. concat (character); delay (10); } if (content.length() > 0) { if (content.equals("status")) { Serial. print (GATE1CONTACTNAME); Serial. print(":"); Serial. println (digitalRead(GATE1CONTACT) == LOW ? "CLOSED": "OPEN"); delay (500); Serial. print("myrelay1:"); Serial. println (digitalRead(4) == LOW ? "OFF": "ON"); delay (500); float data; if (process(&ds1, &data) == 1) { Serial. print("mytemperature:"); Serial. println (data,DEC); } } else if (content.startsWith("myrelay1:")) { if (content.endsWith("OFF")) { digitalWrite (4, LOW); } else if (content.endsWith("ON")) { digitalWrite (4, HIGH); } } } int mybuttonnewstate = digitalRead (8); if (mybuttonstate != mybuttonnewstate) { mybuttonstate = mybuttonnewstate; Serial. print("mybutton:"); Serial. println (mybuttonstate == LOW ? "OPEN": "CLOSED"); } }
Итак ...? Теперь залить и проверить. Спасибо. Бы сегодня переливать по пробиркам..А логика соответствует схеме так или есть особенности. Но техническую часть то осилим легко..Спасибо еще раз. С Уважением!
Логики особой там пока нет. Предполагается что на 4 ноге висит реле На 5, 6 и 8 - три контакта причем состояние 5 и 6 возвращается по команде "status", а 8 - в момент изменения состояния. На 7 ноге предполагается DS18B20 Итого: если вы запишите в порт ардуины слово status. вам в ответ должно прилететь что-то вроде Код: gate1contact:CLOSED myrelay1:ON mytemperature:23.56 ну и при изменении состояния ноги 4 будут самостоятельно выдаваться сообщения вида Код: mybutton1:OPEN состояние реле можно переключать командами Код: myrelay1:ON myrelay1:OFF
Скетч! Скопировал. При попытке компиляции выходит ошибка "OneWire was declared in this scope". Похоже что синтаксис нарушен? или библиотека ..но я скачал все необходимые. Поскольку скетч для проверки температурного датчика. с данной библиотекой работает. Может посмотрите программатор и компилятор ..Ардуино 1.0.5