преобразование кода в flprog

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
yura174
Рядовой
Сообщения: 19
Зарегистрирован: 04.12.2015{, 11:12}
Репутация: 0
Откуда: Борисов
Имя: Юрий

преобразование кода в flprog

#1

Сообщение yura174 » 11.04.2017{, 22:28}

// Термостат, до пяти датчиков DS18B20.
Здравствуйте помогите преобразовать для чтения в flprog
СпойлерПоказать
// Термостат, до пяти датчиков DS18B20.//  //  v 0.2.1 beta#include <EEPROM.h>#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal.h> 
OneWire oneWire(15); // A1 вход датчиков 18b20DallasTemperature ds(&oneWire);LiquidCrystal lcd(8, 9, 4, 5, 6, 7);const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов  
byte pos;byte tempOUTon[5]; // массив с температурой включения выходаfloat tempSensor[5]; // массив куда читается температураbyte qty; // количество градусников на шине.// адреса градусников.DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12};DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF};DeviceAddress sensor3 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};DeviceAddress sensor4 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};DeviceAddress sensor5 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};byte gradus[8] = {  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};
byte on[8] = {  0b00110,
  0b01111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11110,
  0b01100
};

void readSet(){  for (byte i = 0; i < qty; i++) tempOUTon = EEPROM.read(i);}
 
void outOff(){ // выключает выходы  for (byte i = 0; i < qty; i++) digitalWrite(OUT, LOW);}

void erorr(){ // останавливает работу программы и сигнализирует ошибку  outOff(); // выключаем выходы   lcd.clear();  lcd.print("sensor error");   while(1){ // крутим бесконечный цикл      analogWrite(10, 100);      delay(500);      analogWrite(10, 255);      delay(500);  }
}
////byte key(){ //// для кнопок ЛСДшилда  int val = analogRead(0);    if (val < 50) return 5;    else if (val < 150) return 3;    else if (val < 350) return 4;    else if (val < 500) return 2;    else if (val < 800) return 1;    else return 0; }
////  void setMenu(byte pos){ // установка температуры  outOff();
 lcd.clear();  
  while(1){ // крутим бесконечный цикл     byte KEY = key(); // читаем состояние кнопок    
    lcd.setCursor(2, 0); // выводим на экран    lcd.print("Out:");    lcd.print(pos+1);    lcd.setCursor(9, 0);    lcd.print("Pin:");    lcd.print(OUT[pos]);    lcd.print(" ");     
    lcd.setCursor(0, 1);     lcd.print(" PinON: ");    lcd.print(tempOUTon[pos]);    lcd.write(1);    lcd.print("C <>");    
    if (KEY == 2) { // если нажата кнопка      tempOUTon[pos]--;   // изменяем значение        if (tempOUTon [pos]> 125) tempOUTon [pos]= 0;      EEPROM.write(pos, tempOUTon[pos]); // сохраняем в еепром     }
     else if (KEY == 5){       tempOUTon[pos]++;
         if (tempOUTon [pos]> 125) tempOUTon [pos]= 0;       EEPROM.write(pos, tempOUTon[pos]);      } 
 
   delay(200);  }///// }//void getTemp(){ // читаем температуру и заполняем массив   ds.requestTemperatures();    
   tempSensor[0] = ds.getTempC(sensor1); // немного китайского кода   tempSensor[1] = ds.getTempC(sensor2);    tempSensor[2] = ds.getTempC(sensor3);   tempSensor[3] = ds.getTempC(sensor4);   tempSensor[4] = ds.getTempC(sensor5);} 

void sensorTest(){ // ищим датчики на шине, если количество изменилось, останавливаем работу   ds.begin();   if(ds.getDeviceCount() != qty) erorr();}

void setup() { // Serial.begin(9600);   ds.begin();   qty = ds.getDeviceCount(); // при включении, сохраняем количество градусников,                              // можно и лучше количество указать руками.   
  for (int i = 0; i < qty; i++) pinMode(OUT, OUTPUT);   for (int i = 0; i < qty; i++) digitalWrite(OUT, LOW);  
  lcd.createChar(1, gradus);  lcd.createChar(2, on);  lcd.begin(16, 2);  lcd.clear();  
  readSet();  // читаем настройки из еепром }

void loop() {   if (key() == 1) setMenu(pos); // если нажата селект, уходим в настройки  
  else if (key() == 4 && pos < qty-1) pos++; // крутим позицию  else if (key() == 3 && pos != 0) pos--;  
  sensorTest(); // тест наличия градусников на шине  getTemp(); // читаем температуру с датчиков  
  //// сверяем температуру и управляем выходами  for (int i = 0; i < qty; i++) {     if (tempSensor < tempOUTon) digitalWrite(OUT, HIGH);    else digitalWrite(OUT, LOW);  } 
  
  /////// вывод инфы на экран  lcd.setCursor(0, 0);   lcd.print(pos+1);   lcd.print(". ");  lcd.print(tempSensor[pos], 1); // показываем температуру с датчика  lcd.write(1);  lcd.print("C ");  lcd.setCursor(2, 1);  lcd.print(tempOUTon[pos]); // показываем установленную температуру  lcd.write(1);  lcd.print("C ");   
  lcd.setCursor(11, 0); // рисуем статус выхода     for (int i = 0; i < qty; i++){       if (digitalRead(OUT)) lcd.write(2);      else lcd.print(" ");    }
  lcd.setCursor(11, 1); // рисуем номера выходов     for (int i = 0; i < qty; i++) lcd.print(i+1); // delay(500); // необязательная задержка}
Последний раз редактировалось yura174 11.04.2017{, 22:30}, всего редактировалось 1 раз.

Аватара пользователя
slavas
Лейтенант
Сообщения: 596
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

преобразование кода в flprog

#2

Сообщение slavas » 11.04.2017{, 22:47}

Зачем? Если хотите использовать этот код запихайте его в пользовательский блок.

yura174
Рядовой
Сообщения: 19
Зарегистрирован: 04.12.2015{, 11:12}
Репутация: 0
Откуда: Борисов
Имя: Юрий

преобразование кода в flprog

#3

Сообщение yura174 » 11.04.2017{, 23:27}

Мне его доработать под себя надо.

Аватара пользователя
slavas
Лейтенант
Сообщения: 596
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

преобразование кода в flprog

#4

Сообщение slavas » 11.04.2017{, 23:47}

Так не проблема, что доработать?  Порты поменять?

Добавлено (11.04.2017, 23:47)
---------------------------------------------
Редко такое написание кода увидишь.

trak
Сержант
Сообщения: 136
Зарегистрирован: 29.08.2016{, 20:27}
Репутация: 0
Откуда: Нижний Новгород

преобразование кода в flprog

#5

Сообщение trak » 13.04.2017{, 20:59}

yura174 писал(а):Здравствуйте помогите преобразовать для чтения в flprog
Проще новую написать , чем дорабатывать. Я пользовался этим скетчем , тоже хотел доработать.Потом наткнулся в инете на flprog посидел немного , поразбирался и написал то что удовлетворит моим желания.Кстати люди здесь на форуме очень отзывчивые.Вы начните а вам помогут.

CraCk
Лейтенант
Сообщения: 637
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

преобразование кода в flprog

#6

Сообщение CraCk » 09.10.2017{, 00:29}

Здравствуйте.
Решил не создавать новую тему и не мусорить. Нужна ваша помощь. В переносе С кода в Flprog. Тема автоматика для ТТ котла. Есть скетч в С работает не плохо. Но хочу редактировать его под себя. Есть очень много лишнего. По этому. Разбираю алгоритм работы автоматики и небольшими кусками создаю в Flprog. В коде С разбираюсь на уровне лузера. Практически все нужное перенес. Осталась одна нерешаемая проблема для меня. ПИД управление и режим работы заслонки серводвигателя относительно заданных значений ПИД регулятора.
В коде есть описание как должно работать ПИД регулирование и сервопривод. Но я немогу сообразить как это отобразить блоками в Flprog. Можете даже не рисовать блоки а только описать логику кода. А я уже сам попробую собрать в блоки.

************* Пид регулятор*********************

// Настройка пид
Input=temp1-2;
Setpoint=setTmp7;
//работа пид регулятора

myPID.Compute();

z=map(Output,0,255,z4,z5); //0-закрыто, 90- открыто.

if(pusk==HIGH&&pauza==LOW){
if(temp2>=setTmp8&&(temp2<=setTmp9)){z6=z;}
if(temp2<setTmp8){z3=setTmp8-temp2; z6=z+z3; }
if(temp2>setTmp9){z3=temp2-setTmp9; z6=z-z3; }
if(z1>=z5){z6=z5;}
if(z1<=z4){z6=z4;}
z1=((z6-z1)/5)+z1;
}
else{z1=0;}
if(avaria1==HIGH){z1=0;}            //закрываем заслонку по аварии датчика теплоносителя
if(avaria==HIGH){z1=0;}             //закрываем заслонку по общей аварии

***** Управление сервоприводом заслонки************

// управляем работой заслонки
if(pusk==HIGH){if(z2!=z1){if(currentTime>=(time3+5000)){time3=currentTime;  myOS.restartScheduler();z2=z1;
stepe=map(z1,0,180,544,2400);delay_ms(500); myOS.haltScheduler();
Вложения
kotel.ino
(29.2 КБ) 67 скачиваний
Последний раз редактировалось CraCk 09.10.2017{, 00:32}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

преобразование кода в flprog

#7

Сообщение Sancho » 09.10.2017{, 09:26}

Примерно так, дальше сам.
Надеюсь, функции myPID.Compute(); myOS.restartScheduler(); myOS.haltScheduler(); реализовал пользовательскими блоками.
Вложения
Primer_1.flp
(191.38 КБ) 113 скачиваний
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

CraCk
Лейтенант
Сообщения: 637
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

преобразование кода в flprog

#8

Сообщение CraCk » 09.10.2017{, 23:14}

Sancho писал(а):Надеюсь, функции myPID.Compute(); myOS.restartScheduler(); myOS.haltScheduler();
А зачем? myPID.Compute() уже есть в версии 2,5,3. myOS можно заменит библиотекой servo? Не очень понимаю функции.
Последний раз редактировалось CraCk 09.10.2017{, 23:14}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

преобразование кода в flprog

#9

Сообщение Sancho » 10.10.2017{, 09:17}

CraCk писал(а):Не очень понимаю функции
Это, по сути своей, маленькие подпрограммы(блоки). Они бывают пользовательские и библиотечные.
Пользовательские - в теле программы создаётся блок, void ИМЯ ФУНКЦИИ(блока)(аргументы) { алгоритм функции}. Затем, любом месте программы указываем ИМЯ ФУНКЦИИ(могут быть аргументы) и здесь произойдёт выполнение её алгоритма.
Библиотечные - объявляется сама библиотека(#include <LiquidCrystal_I2C.h&gt>), а затем её функциям присваиваются конкретные имена для самой программы - LiquidCrystal_I2C lcd(0x3f,20,4);.
Зная функции библ., даём команды
 lcd.init(); 
  lcd.backlight();
  lcd.setCursor(0, 0);
Всё остальное аналогично.
Что-бы воспользоваться сторонней библиотекой в FLProg, необходимо создать блок с включённой библиотекой и в его теле вызывать необходимые функции.
Пытался объяснить как понимаю сам. Не программист.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

CraCk
Лейтенант
Сообщения: 637
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

преобразование кода в flprog

#10

Сообщение CraCk » 13.10.2017{, 23:08}

С частю кода, расчет значение для управления заслонкой разобрался.
Но с управлением сервоприводом не идет. Там используется библиотека много многозадачности, и еще какой то  stepe=map(z1,0,180,544,2400). Не могу понять что здесь происходит и зачем еще время прилепили? Может рассчитанную переменную z1 просто напрямую подавать на вход сервопривода минуя этот кусок кода ?

***** Управление сервоприводом заслонки************
// управляем работой заслонки
if(pusk==HIGH){if(z2!=z1){if(currentTime>=(time3+5000)){time3=currentTime;  myOS.restartScheduler();z2=z1;
stepe=map(z1,0,180,544,2400);delay_ms(500); myOS.haltScheduler();
Последний раз редактировалось CraCk 13.10.2017{, 23:08}, всего редактировалось 1 раз.

Аватара пользователя
Dev1
Майор
Сообщения: 1026
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 59
Откуда: Гондурас

преобразование кода в flprog

#11

Сообщение Dev1 » 14.10.2017{, 00:05}

Цитата CraCk () какой то  stepe=map(z1,0,180,544,2400). Не могу понять что здесь происходит 
Пересчитывается угол поворота z1 из диапазона от 0 до 180 градусов, в длину импульса stepe от 544 до 2400. У разных серво длина импуса разная. 

Вам будет проще взять стандартный блок PID и блок SERVO. Пид настроить на выход 0-180 и получите угол. Как то так.
Вложения
5415978.jpg
Win10-64 FLProg v7.5.2 Portable :fie:

Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

преобразование кода в flprog

#12

Сообщение Alias » 20.04.2018{, 13:53}

То есть, если я правильно понял, плата по управлению сервоприводом может быть вот прямо настолько простой? См. вложение.
Задача - управлять температурой охлаждаемой жидкости регулировкой расхода воды в рубашке проточного теплообменника. Параметры ПИД пока не рассматриваем.
СпойлерПоказать
chill.png

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

преобразование кода в flprog

#13

Сообщение Sancho » 30.04.2018{, 08:52}

Alias писал(а):
20.04.2018{, 13:53}
плата по управлению сервоприводом может быть вот прямо настолько простой?
Да.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

преобразование кода в flprog

#14

Сообщение Alias » 30.04.2018{, 09:05}

Спасибо!
PS Крутяк! :senile:

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

преобразование кода в flprog

#15

Сообщение Boroda » 01.05.2018{, 11:29}

Alias писал(а):
20.04.2018{, 13:53}
плата по управлению сервоприводом может быть вот прямо настолько простой?
А почему бы и нет. Главное ПИД правильно настроить.
1. Сначала Ки, Кд обнуляем и подбираем Кп. Температура должна отрегулироваться на 10..20% ниже уставки.
2. Начинаем подбирать Ки. Чем он меньше, тем быстрее набирается мощность и в какой-то может начаться качание температуры, отодвигаем коэфф немного назад.
3. Далее добавляем Кд, для увеличения скорости реакции системы, также доводим до качания и откатываем коэфф немного назад.

Ответить

Вернуться в «Спросить у знатоков»