Advertisement
ViliusJ93

Untitled

Dec 11th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 30.79 KB | None | 0 0
  1. // 2017-11-13 22:45
  2.  
  3.  
  4. #include <SPI.h>
  5. #include <Ethernet.h>
  6. #include "Settimino.h"
  7. #include <OneWire.h>
  8. #include <DallasTemperature.h>
  9.  
  10.  
  11. // Enter a MAC address and IP address for your controller below.
  12. // The IP address will be dependent on your local network:
  13. byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x08, 0xE1 };
  14.  
  15. IPAddress Local(192,168,99,114); // Local Address
  16. IPAddress PLC(192,168,99,111);   // PLC Address
  17. IPAddress Gateway(192, 168, 99, 1);
  18. IPAddress Subnet(255, 255, 255, 0);
  19.  
  20. // DS magistrales ir kintamieji
  21. #define ds_pin_1 22
  22. #define ds_pin_2 23
  23. #define ds_pin_3 24
  24. #define ds_pin_4 25
  25. #define ds_pin_5 26
  26. #define ds_pin_6 27
  27. #define ds_pin_7 28
  28. #define ds_pin_test 29
  29. #define search_enable_pin 42
  30. //byte gedimo_temperatura = 255;      // Neradus jutiklio, į valdikli nusiunčiama temperatura
  31. //float dvt;
  32.  
  33. // Setup a oneWire instance to communicate with any OneWire devices
  34. OneWire oneWire_1(ds_pin_1);        // Linija Nr. 1
  35. OneWire oneWire_2(ds_pin_2);        // Linija Nr. 2
  36. OneWire oneWire_3(ds_pin_3);        // Linija Nr. 3
  37. OneWire oneWire_4(ds_pin_4);        // Linija Nr. 4
  38. OneWire oneWire_5(ds_pin_5);      // Linija Nr. 5
  39. OneWire oneWire_6(ds_pin_6);      // Linija Nr. 6
  40. OneWire oneWire_7(ds_pin_7);        // Linija Nr. 7
  41. OneWire oneWire_test(ds_pin_test);     // Linija jutikliu paieskai
  42.  
  43. // Pass our oneWire reference to Dallas Temperature.
  44. DallasTemperature sensors_on_1(&oneWire_1);     // Linija Nr. 1
  45. DallasTemperature sensors_on_2(&oneWire_2);     // Linija Nr. 2
  46. DallasTemperature sensors_on_3(&oneWire_3);     // Linija Nr. 3
  47. DallasTemperature sensors_on_4(&oneWire_4);     // Linija Nr. 4
  48. DallasTemperature sensors_on_5(&oneWire_5);     // Linija Nr. 5
  49. DallasTemperature sensors_on_6(&oneWire_6);     // Linija Nr. 6
  50. DallasTemperature sensors_on_7(&oneWire_7);     // Linija Nr. 7
  51. //DallasTemperature sensors_on_test(&oneWire_test);  // Linija jutikliu paieskai
  52.  
  53.  
  54. // konstantos
  55. int DBNum_from_plc = 68;    // This DB must be present in your PLC
  56. int DBNum_to_plc = 69;
  57. byte len_settings_area = 28;   // nustatymai pradiniam nuskaitymui
  58. byte buf_settings[28];      // Pradiniu nustatymu paimamu is valdiklio buferis
  59. byte buf_temperatures_out[240];  //Buffer to store output temperatures
  60.  
  61.  
  62. #define sakos_pos_in_db 20        // Saku skaicius laikomas DB atmintyje, 20 pozicijoje(offset)
  63. #define sakos_max_amount 20        // Didziausias galima saku skaicius valdiklyje
  64. #define linijoje_max_jutikliu 5     // Didziausias galima jutikliu skaicius linijoje
  65. #define jutiklio_gedimo_t_vieta 16    // Neradus jutiklio, į valdikli nusiunčiama temperatura
  66. #define jutikliu_tikslumo_vieta 19    //Jutikliu padalos verte, rezoliucija 9-12
  67. #define atnaujinimo_periodas_vieta 18  //kas kiek laiko nuskaitoma temperatura is termometru
  68.  
  69. DeviceAddress DS_Adresai[7][40];
  70. bool get_settings_mode_previous = true;    //Pasizymima buvusi reiksme skirta duomenu gavimo is valdiklio rezimui.
  71. bool initial_settings_ok=false;
  72. bool vykdyti_Pradinis_jutikliu_konfiguravimas=false;
  73. bool leisti_vykdyti_Request_temperatures = false;
  74. bool temperaturu_uzklausa_jau_issiusta = false;
  75. unsigned long temperatures_requested_at;
  76. unsigned long atnaujinimo_periodas;
  77.  
  78.  
  79. byte new_device[16];
  80. //byte last_device[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  81. //byte new_device[] = {0,0,0,0,0,0,0,0};;
  82. boolean new_device_search_first_run = true;
  83.  
  84.  
  85. S7Client Client(_S7WIRED);
  86.  
  87. unsigned long Elapsed; // To calc the execution time
  88. //----------------------------------------------------------------------
  89. // Setup : Init Ethernet and Serial port
  90. //----------------------------------------------------------------------
  91. void setup() {
  92.   //bandymai
  93.   pinMode(search_enable_pin, INPUT);
  94.  
  95.     // Open serial communications and wait for port to open:
  96.     Serial.begin(115200);
  97.    
  98.  
  99.  
  100.  
  101. //--------------------------------Wired Ethernet Shield Initialization    
  102.     // Start the Ethernet Library
  103.     Ethernet.begin(mac, Local);
  104.     // Setup Time, someone said me to leave 2000 because some
  105.     // rubbish compatible boards are a bit deaf.
  106.     delay(2000);
  107.     Serial.println("");
  108.     Serial.println("Cable connected");  
  109.     Serial.print("Local IP address : ");
  110.     Serial.println(Ethernet.localIP());
  111. }
  112. //----------------------------------------------------------------------
  113. // Main Loop
  114. //----------------------------------------------------------------------
  115. void loop()
  116. {
  117.   //Serial.println("*************************************** LOOP ********************");
  118. MarkTime();
  119. boolean laikinas;
  120.  
  121.  
  122. //----------- Vienkartiniai procesai
  123.   while(!Handle_initial_settings())
  124.   {
  125.     delay(1000);
  126.   }
  127.  
  128.   if(vykdyti_Pradinis_jutikliu_konfiguravimas)
  129.   {
  130.     Pradinis_jutikliu_konfiguravimas();
  131.     vykdyti_Pradinis_jutikliu_konfiguravimas=false;
  132.   }
  133.  
  134.   if(leisti_vykdyti_Request_temperatures==true && temperaturu_uzklausa_jau_issiusta==false) //paklausti temperaturu
  135.   {
  136.     //Pradinis_jutikliu_konfiguravimas();
  137.     //leisti_vykdyti_Request_temperatures = false;
  138.   Request_temperatures(true);
  139.   }
  140.  
  141.   if(leisti_vykdyti_Request_temperatures==true && temperaturu_uzklausa_jau_issiusta==true)  //nuskaityti temperaturas
  142.   {
  143.    
  144.     //leisti_vykdyti_Request_temperatures = false;
  145.   laikinas=Read_Temperatures(true);
  146.   }
  147.  
  148.   if(digitalRead(search_enable_pin)==0)
  149.   {
  150.     new_device_search();
  151.    
  152.   }
  153.  
  154.  
  155. //----------------------------------  
  156.  
  157.  
  158.  
  159.  
  160.  
  161. ShowTime();
  162.  
  163.  
  164. }
  165.  
  166.  
  167.  
  168. byte Low_byte(float x)  //liekana
  169. {
  170.   unsigned int temperatura;
  171.   temperatura=apvalinti_int (x);
  172.   if (temperatura<0){
  173.     temperatura=(256*255)+temperatura;
  174.     temperatura=temperatura+256;
  175. }
  176.   //Serial.print(" ");Serial.print(temperatura);Serial.print(" ");
  177.   return temperatura % 256;
  178. }
  179.  
  180. byte High_byte(float x) //liekana
  181. {
  182.   unsigned int temperatura;
  183.   temperatura=apvalinti_int (x);
  184.   if (temperatura<0){
  185.     temperatura=(256*255)+temperatura;
  186.     temperatura=temperatura+256;
  187.   }
  188. //Serial.print(" ");Serial.print(temperatura);Serial.print(" ");
  189.  
  190.   return temperatura / 256;
  191. }
  192.  
  193.  
  194.  
  195.  
  196. unsigned int apvalinti_int (float x){
  197.   /*
  198.  
  199.   x= 153,2    x=  151,8 x= -122,7
  200.   y= 153    y=  152 y= -123
  201.   */
  202.   x=x*10;
  203.   int y=0;
  204.  
  205.  
  206.  
  207.   if (x > 0){
  208.     x = x+0.5;
  209.   }
  210.   if (x < 0)
  211.    {
  212.     x = x-0.5;
  213.   }
  214.   //x=round(x);
  215.   y = int(x);
  216.  
  217.   return y;
  218.  
  219.   }
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226. bool Read_Temperatures(bool show_execution_duration)
  227. {
  228.   unsigned long current_time;
  229.   unsigned long exe_duration;
  230.   float nuskaityta_temperatura;
  231.   int temperature_out_pozicija;
  232.   byte retry;
  233.   current_time= millis();
  234.   if((current_time-temperatures_requested_at) > atnaujinimo_periodas) //vykdyti temperaturu nuskaityma
  235.   {
  236.   temperature_out_pozicija=0; // Issiunciamu duomenu buferyje nustatoma pirma vieta
  237.     exe_duration=millis();
  238.     for(byte linija_i=1; linija_i <= buf_settings[sakos_pos_in_db] ;linija_i++  )  //visos sakos/linijos
  239.     {
  240.       Serial.println("===============================================");
  241.       Serial.print(" Uzklausiamos temperaturos linijoje nr - ");Serial.println(linija_i);
  242.       if( linija_i==1 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.1
  243.       {
  244.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  245.         {
  246.       nuskaityta_temperatura=sensors_on_1.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  247.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  248.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  249.      
  250.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  251.       //Serial.print("  ");Serial.print(Low_byte(nuskaityta_temperatura));Serial.print("  ");Serial.print(buf_temperatures_out[temperature_out_pozicija]);
  252.       //Serial.print("  ");Serial.print(High_byte(nuskaityta_temperatura));Serial.print("  ");Serial.println(buf_temperatures_out[temperature_out_pozicija+1]);
  253.       temperature_out_pozicija=temperature_out_pozicija+2;
  254.       //Serial.print(" Low ");Serial.print(Low_byte(nuskaityta_temperatura));Serial.print(" High ");Serial.println(High_byte(nuskaityta_temperatura));
  255.      
  256.       //Serial.print(jutiklis_i);Serial.print("  ");Serial.print(nuskaityta_temperatura);Serial.println(" Celcijai ");
  257.         }
  258.       }
  259.       if( linija_i==2 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.2
  260.       {
  261.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  262.         {
  263.       nuskaityta_temperatura=sensors_on_2.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  264.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  265.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  266.       temperature_out_pozicija=temperature_out_pozicija+2;
  267.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  268.         }
  269.       }
  270.       if( linija_i==3 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.3
  271.       {
  272.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  273.         {
  274.       nuskaityta_temperatura=sensors_on_3.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  275.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  276.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  277.       temperature_out_pozicija=temperature_out_pozicija+2;
  278.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  279.         }
  280.       }
  281.       if( linija_i==4 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.4
  282.       {
  283.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  284.         {
  285.       nuskaityta_temperatura=sensors_on_4.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  286.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  287.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  288.       temperature_out_pozicija=temperature_out_pozicija+2;
  289.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  290.         }
  291.       }
  292.       if( linija_i==5 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.5
  293.       {
  294.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  295.         {
  296.       nuskaityta_temperatura=sensors_on_5.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  297.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  298.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  299.       temperature_out_pozicija=temperature_out_pozicija+2;
  300.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  301.         }
  302.       }
  303.       if( linija_i==6 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.6
  304.       {
  305.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  306.         {
  307.       nuskaityta_temperatura=sensors_on_6.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  308.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  309.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  310.       temperature_out_pozicija=temperature_out_pozicija+2;
  311.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  312.         }
  313.       }
  314.       if( linija_i==7 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.7
  315.       {
  316.         for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  317.         {
  318.       nuskaityta_temperatura=sensors_on_7.getTempC(DS_Adresai[linija_i-1][jutiklis_i]);
  319.       buf_temperatures_out[temperature_out_pozicija]=Low_byte(nuskaityta_temperatura);
  320.       buf_temperatures_out[temperature_out_pozicija+1]=High_byte(nuskaityta_temperatura);
  321.       temperature_out_pozicija=temperature_out_pozicija+2;
  322.       Serial.print(jutiklis_i);Serial.print("  ");Serial.println(nuskaityta_temperatura);
  323.         }
  324.       }
  325.     }
  326.   temperaturu_uzklausa_jau_issiusta=false;
  327.   //Serial.print(">>> Read_Temperatures b (ms) ");Serial.println(millis()-exe_duration);
  328.   retry=0;
  329.   while(!Send_temperatures(temperature_out_pozicija) && retry<5){
  330.     if(retry>0)
  331.       Serial.print("Pakartotinai bandomi siusti duomenys po 1 s (kartas) ");Serial.println(retry+1);
  332.     delay(1000);
  333.      retry++;
  334.   }
  335.  
  336.   //send data
  337.     if(show_execution_duration)
  338.       Serial.print(">>> Read_Temperatures ir send data truko (ms) ");Serial.println(millis()-exe_duration);
  339.   }
  340.   return true;
  341. }
  342.  
  343. bool Send_temperatures(int length){
  344.   while (!Client.Connected)
  345.   {
  346.     if (!Connect())
  347.       delay(500);
  348.     Serial.println("Bandoma prisijungti prie PLC funkcijoje 'Send_temperatures' ");
  349.   }
  350.   Serial.print("============ Issiunciami duomenys ====== ");Serial.println(length);
  351.   int eilute=0;
  352.   for(int i=0; i<length;i++){
  353.   Serial.print(buf_temperatures_out[i]);Serial.print(" ");
  354.   eilute++;
  355.   if(eilute==15)
  356.   {
  357.     eilute=0;
  358.     Serial.println();
  359.   }
  360.   }
  361.   Serial.println("");
  362.   int Result=Client.WriteArea(S7AreaDB, // We are requesting DB access
  363.                          DBNum_to_plc,    // DB Number
  364.                          0,        // Start from byte N.0
  365.                          20,     // nustatymai pradiniam nuskaitymui
  366.                          buf_temperatures_out);  // Put them into our target (Buffer or PDU)
  367.   if (Result==0)
  368.   {
  369.   Serial.println(">>>Duomenys issiusti i valdikli ");
  370.   /*
  371.   int result_read=Client.ReadArea(S7AreaDB, // We are requesting DB access
  372.                          DBNum_to_plc,    // DB Number
  373.                          0,        // Start from byte N.0
  374.                          64,     // nustatymai pradiniam nuskaitymui
  375.                          NULL);  // Put them into our target (Buffer or PDU)
  376.  
  377.   if(result_read==0)
  378.   {/*
  379.   eilute=0;
  380.     for(int i=0; i<length+2;i++)
  381.     {
  382.       Serial.print(PDU.DATA[i]);Serial.print(" ");
  383.       eilute++;
  384.       if(eilute==15)
  385.       {
  386.         eilute=0;
  387.         Serial.println();
  388.       }
  389.     }//
  390.     Dump(14);
  391.   }else{
  392.     Serial.println(">>>Protokolo klaida read ");
  393.   }*/
  394.   return true;
  395.   }else
  396.   {
  397.   Serial.println(">>>Protokolo klaida Send_temperatures ");
  398.     CheckError(Result);
  399.   return false;
  400.   }
  401. }
  402.  
  403. void Request_temperatures(bool show_execution_duration)
  404. {
  405.   unsigned long exe_duration;
  406.   exe_duration=millis();
  407.  
  408.   sensors_on_1.requestTemperatures();
  409.   sensors_on_2.requestTemperatures();
  410.   sensors_on_3.requestTemperatures();
  411.   sensors_on_4.requestTemperatures();
  412.   sensors_on_5.requestTemperatures();
  413.   sensors_on_6.requestTemperatures();
  414.   sensors_on_7.requestTemperatures();
  415.  
  416.   temperatures_requested_at=millis();
  417.   temperaturu_uzklausa_jau_issiusta=true;
  418.   Serial.print(">>> Uzklausiamos temperaturos ties (ms) ");Serial.println(temperatures_requested_at);
  419.   if(show_execution_duration)
  420.     Serial.print(">>> Temperaturu uzklausimas truko (ms) ");Serial.println(millis()-exe_duration);
  421.  
  422. }
  423. //----------------------------------------------------------------------
  424.  
  425.  
  426. bool Handle_initial_settings( )
  427. {
  428.   bool result;
  429.   byte get_settings_result = 0;
  430.   if (analogRead(A0) < 20  && get_settings_mode_previous == true)  //Gaunami duomenys
  431.   {
  432.     Serial.println("Vykdomas duomenu nuskaitymas is valdiklio");
  433.     get_settings_mode_previous=false;
  434.   get_settings_result = Get_Settings_From_Plc();
  435.   while(get_settings_result == 1)
  436.   {
  437.     delay(1000);
  438.     Serial.println("Įvyko protokolo klaida, bandoma vėl nuskaityti");
  439.     get_settings_result = Get_Settings_From_Plc();
  440.   }
  441.   if(get_settings_result == 2){
  442.     Serial.println("Įvyko duomenų bazės klaida, pataisykite ir bandykite vel");
  443.     initial_settings_ok = false;
  444.   }
  445.   if(get_settings_result == 0){
  446.     Serial.println("Duomenys nuskaityti sėkmingai");
  447.     initial_settings_ok = true;
  448.   vykdyti_Pradinis_jutikliu_konfiguravimas=true;
  449.   }
  450.   }
  451.   else  //Praleidziama
  452.   {
  453.     //Serial.println("Praleidziamas duomenu nuskaitymas is valdiklio");
  454.     if (analogRead(A0) > 20)    
  455.       get_settings_mode_previous=true;
  456.   }
  457.   if(initial_settings_ok){
  458.   return true;  
  459.   }else{
  460.     return false;
  461.   }
  462.  
  463.  
  464.  
  465. }
  466.  
  467. byte Get_Settings_From_Plc()
  468. {
  469.  
  470.   while (!Client.Connected)
  471.   {
  472.     if (!Connect())
  473.       delay(500);
  474.     Serial.println("Bandoma prisijungti prie PLC funkcijoje 'Get_Settings_From_Plc' ");
  475.   }
  476.  
  477.   int Size, Result;
  478.   byte nuskaitymas_sekmingas = 0;
  479.     // 0 - Nuskaityta sekmingai
  480.     // 1 - klaida is protokolo, galima bandyti vel
  481.     // 2 - klaida buferiuose, neverta iskart bandyti, laukti kol bus istaisyta klaida ir isnaujo paleisti funkcija
  482.    
  483.     //----------------------------Pradinių duomenu gavimas------------------------------------------
  484.   Serial.print("Reading ");Serial.print(len_settings_area);Serial.print(" bytes from DB");Serial.println(DBNum_from_plc);
  485.   // Get the current tick
  486.  
  487.   Result=Client.ReadArea(S7AreaDB, // We are requesting DB access
  488.                          DBNum_from_plc,    // DB Number
  489.                          0,        // Start from byte N.0
  490.                          len_settings_area,     // nustatymai pradiniam nuskaitymui
  491.                          buf_settings);  // Put them into our target (Buffer or PDU)
  492.   if (Result==0)
  493.   {
  494.    
  495.  //Spausdinamas nustatymu buferis i konsole
  496.   for (int i=0; i<len_settings_area ;i++)
  497.   {
  498.     Serial.print(i);
  499.     if (i<10)
  500.       Serial.print(" ");
  501.     Serial.print(" : ");
  502.     Serial.println(buf_settings[i]);
  503.   }
  504.   // sakos_pos_in_db  sakos_max_amount
  505.   //Imami adresai
  506.   if(buf_settings[sakos_pos_in_db] <= sakos_max_amount) // Ar ne per daug atskirų liniju
  507.   {
  508.    int jutikliu_kiekis=0;
  509.     for(int linija_i=1; linija_i <= buf_settings[sakos_pos_in_db] ;linija_i++  )  //visos sakos/linijos
  510.     {
  511.       jutikliu_kiekis=jutikliu_kiekis+buf_settings[sakos_pos_in_db+linija_i];
  512.     }  
  513.   int adresu_nuskaitimo_pradzia = sakos_pos_in_db+buf_settings[sakos_pos_in_db]+1;
  514.     Serial.print("Jutikliai bus nuskaitomi nuo "); Serial.println(sakos_pos_in_db+buf_settings[sakos_pos_in_db]+1);
  515.     Serial.print("Bus nuskaitoma iki ");Serial.print(sakos_pos_in_db+buf_settings[sakos_pos_in_db]+1+(jutikliu_kiekis*8));Serial.println(" baito imtinai");
  516.    
  517.  
  518.   for(byte linija_i=1; linija_i <= buf_settings[sakos_pos_in_db] ;linija_i++  )  //visos sakos/linijos
  519.   {
  520.     if(buf_settings[sakos_pos_in_db+linija_i] <=linijoje_max_jutikliu)  // Ar ne per daug jutikliu linijoje
  521.     {
  522.       byte imamas_adresas = 10;
  523.       byte pdu_pozicija = 0;
  524.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  //kiekviena linija
  525.       {
  526.         if(imamas_adresas>7)  //Standartinis buferis turi 64byte = 8adresus. Jeigu bus imamas aukstesnis adresas, nuskaitomi duomenys is valdiklio
  527.         {
  528.           adresu_nuskaitimo_pradzia=adresu_nuskaitimo_pradzia+pdu_pozicija;
  529.           if(!Atnaujinti_jutikliu_addr_buf(adresu_nuskaitimo_pradzia))
  530.       {
  531.         goto baigti_nuskaitymus;
  532.       }      
  533.           imamas_adresas=0;
  534.           pdu_pozicija=0;
  535.         }
  536.         DS_Adresai[linija_i-1][jutiklis_i][0]=PDU.DATA[pdu_pozicija];
  537.         DS_Adresai[linija_i-1][jutiklis_i][1]=PDU.DATA[pdu_pozicija+1];
  538.         DS_Adresai[linija_i-1][jutiklis_i][2]=PDU.DATA[pdu_pozicija+2];
  539.         DS_Adresai[linija_i-1][jutiklis_i][3]=PDU.DATA[pdu_pozicija+3];
  540.         DS_Adresai[linija_i-1][jutiklis_i][4]=PDU.DATA[pdu_pozicija+4];
  541.         DS_Adresai[linija_i-1][jutiklis_i][5]=PDU.DATA[pdu_pozicija+5];
  542.         DS_Adresai[linija_i-1][jutiklis_i][6]=PDU.DATA[pdu_pozicija+6];
  543.         DS_Adresai[linija_i-1][jutiklis_i][7]=PDU.DATA[pdu_pozicija+7];
  544.         pdu_pozicija=pdu_pozicija+8;
  545.         imamas_adresas++;
  546.       }
  547.       adresu_nuskaitimo_pradzia=adresu_nuskaitimo_pradzia+pdu_pozicija;
  548.     }else{
  549.       Serial.println("Klaida: Per didelis atskiru termometrų skaicius linijoje. Max - linijoje_max_jutikliu jutikliai");
  550.     nuskaitymas_sekmingas=2;
  551.     }
  552.   }
  553.   }else{
  554.     Serial.println("Klaida: Per didelis atskiru termometrų linijų skaicius. Max - sakos_max_amount linijos");
  555.   nuskaitymas_sekmingas=2;
  556.   }
  557.  
  558.   }
  559.   else{
  560.     baigti_nuskaitymus:
  561.   Serial.println("Klaida: Get_Settings_From_Plc nuskaitymas_sekmingas=1");
  562.     CheckError(Result);
  563.   nuskaitymas_sekmingas=1;
  564.   }
  565.  
  566.   if(nuskaitymas_sekmingas == 0)  //Isvesti į ekrana gautus adresus
  567.   {
  568.     for(byte linija_i=1; linija_i <= buf_settings[sakos_pos_in_db] ;linija_i++  )  //visos sakos/linijos
  569.     {
  570.       Parodyti_adresus((linija_i-1),buf_settings[sakos_pos_in_db+linija_i]);
  571.     }
  572.   }
  573.  
  574.  
  575.   delay(500);  
  576.   return nuskaitymas_sekmingas;
  577. }
  578.  
  579. void Parodyti_adresus(byte linijos_nr, byte jutikliu_n)
  580. {
  581.  
  582.   byte cnt=0;
  583.   // DS_Adresai[linija_i][jutiklis_i][7]  linijos_nr
  584.   Serial.println("===============================================");
  585.   Serial.print("[ Nuskaityti ");Serial.print(jutikliu_n);Serial.print(" jutikliu adresai linijoje Nr. ");Serial.println(linijos_nr);
  586.   for (byte jutiklis=0; jutiklis<jutikliu_n; jutiklis++)
  587.   {
  588.   Serial.print(jutiklis+1);
  589.   if((jutiklis+1)<10)
  590.     Serial.print(" ");
  591.   Serial.print(" : ");
  592.   for(byte j=0; j<8; j++)
  593.   {
  594.      
  595.     if (DS_Adresai[linijos_nr][jutiklis][j]<0x10)
  596.       Serial.print("0");
  597.     Serial.print(DS_Adresai[linijos_nr][jutiklis][j], HEX);
  598.     Serial.print(" ");
  599.    
  600.   }
  601.     Serial.println();
  602.    
  603.   }  
  604.   Serial.println("===============================================");
  605.  
  606.  
  607. }
  608.  
  609. bool Atnaujinti_jutikliu_addr_buf(int pradzia)
  610. {
  611.  
  612.   if (pradzia < 100)
  613.   {
  614.   //Serial.print("Reading ");Serial.print(len_settings_area);Serial.print(" bytes from DB");Serial.println(DBNum_from_plc);
  615.  
  616.   int Result=Client.ReadArea(S7AreaDB, // We are requesting DB access
  617.                          DBNum_from_plc,    // DB Number
  618.                          pradzia,        // Start from byte N.0
  619.                          64,     // nustatymai pradiniam nuskaitymui
  620.                          NULL);  // Put them into our target (Buffer or PDU)
  621.   if (Result==0)
  622.   {
  623.    Serial.print("OK 'Atnaujinti_jutikliu_addr_buf', nuskaityta nuo ");Serial.println(pradzia);
  624.    return true;
  625.   }else{
  626.   Serial.println("Protokolo klaida Atnaujinti_jutikliu_addr_buf ");
  627.     CheckError(Result);
  628.   return false;
  629.   }
  630.   }else{
  631.     Serial.print("Klaida 'Atnaujinti_jutikliu_addr_buf', bandoma nuskaityti per toli ");Serial.println(pradzia);
  632.   return false;
  633.   }
  634.  
  635.  
  636. }
  637.  
  638. void Pradinis_jutikliu_konfiguravimas ()
  639. {
  640.   byte tikslumas;  
  641.  
  642.   // Initialize the Temperature measurement library
  643.   sensors_on_1.begin();
  644.   sensors_on_2.begin();
  645.   sensors_on_3.begin();
  646.   sensors_on_4.begin();
  647.   sensors_on_5.begin();
  648.   sensors_on_6.begin();
  649.   sensors_on_7.begin();
  650.   //sensors_on_test.begin();
  651.   // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
  652.  
  653.  
  654.   //*********************** Rezoliucijos nustatymas ******************
  655.   if(buf_settings[jutikliu_tikslumo_vieta] < 9 || buf_settings[jutikliu_tikslumo_vieta] > 12   )
  656.   {
  657.     tikslumas = 12; // numatytas tiksliausia padalos verte
  658.   }
  659.   else
  660.   {
  661.     tikslumas = buf_settings[jutikliu_tikslumo_vieta];
  662.   }
  663.   Serial.print("Jutikliu rezoliucija - ");Serial.println(tikslumas);
  664.   //*********************** atnaujinimo periodo nustatymas ******************
  665.  
  666.   if(buf_settings[atnaujinimo_periodas_vieta] == 0   )
  667.   {
  668.     atnaujinimo_periodas = 10000; // numatytas tiksliausia padalos verte
  669.   }
  670.   else
  671.   {
  672.     atnaujinimo_periodas = buf_settings[atnaujinimo_periodas_vieta]*1000;
  673.   }
  674.   Serial.print("Atnaujinimo periodas - ");Serial.println(atnaujinimo_periodas);
  675.  
  676.   for(byte linija_i=1; linija_i <= buf_settings[sakos_pos_in_db] ;linija_i++  )  //visos sakos/linijos
  677.     {
  678.     if( linija_i==1 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.1
  679.     {
  680.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  681.       {
  682.         sensors_on_1.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  683.       }
  684.     }
  685.     if( linija_i==2 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.2
  686.     {
  687.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  688.       {
  689.         sensors_on_2.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  690.       }
  691.     }
  692.     if( linija_i==3 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.3
  693.     {
  694.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  695.       {
  696.         sensors_on_3.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  697.       }
  698.     }
  699.     if( linija_i==4 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.4
  700.     {
  701.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  702.       {
  703.         sensors_on_4.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  704.       }
  705.     }
  706.     if( linija_i==5 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.5
  707.     {
  708.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  709.       {
  710.         sensors_on_5.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  711.       }
  712.     }
  713.     if( linija_i==6 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.6
  714.     {
  715.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  716.       {
  717.         sensors_on_6.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  718.       }
  719.     }
  720.     if( linija_i==7 && buf_settings[sakos_pos_in_db+linija_i] > 0  )    // Linija Nr.7
  721.     {
  722.       for(byte jutiklis_i=0; jutiklis_i<buf_settings[sakos_pos_in_db+linija_i] ;jutiklis_i=jutiklis_i+1  )  
  723.       {
  724.         sensors_on_7.setResolution(DS_Adresai[linija_i-1][jutiklis_i], tikslumas);
  725.       }
  726.     }
  727.     }
  728.   Serial.println("Pradinis_jutikliu_konfiguravimas baigtas");
  729.   leisti_vykdyti_Request_temperatures = true; //leisti paklausti jutikliu temperaturu
  730. }
  731.  
  732. //----------------------------------------------------------------------
  733. // Connects to the PLC
  734. //----------------------------------------------------------------------
  735. bool Connect()    //OK
  736. {
  737.     int Result=Client.ConnectTo(PLC,
  738.                                   0,  // Rack (see the doc.)
  739.                                   0); // Slot (see the doc.)
  740.     Serial.print("Connecting to ");Serial.println(PLC);  
  741.     if (Result==0)
  742.     {
  743.       Serial.print("Connected ! PDU Length = ");Serial.println(Client.GetPDULength());
  744.     }
  745.     else
  746.       Serial.println("Connection error");
  747.     return Result==0;
  748. }
  749. //----------------------------------------------------------------------
  750. // Dumps a buffer (a very rough routine)
  751. //----------------------------------------------------------------------
  752. void Dump( int Length)
  753. {
  754.   int i, cnt=0;
  755.   pbyte buf;
  756.  
  757.  
  758.     buf = pbyte(&PDU.DATA[0]);
  759.  
  760.   Serial.print("[ Dumping ");Serial.print(Length);
  761.   Serial.println(" bytes ]===========================");
  762.   for (i=0; i<Length; i++)
  763.   {
  764.     cnt++;
  765.     if (buf[i]<0x10)
  766.       Serial.print("0");
  767.     Serial.print(buf[i], HEX);
  768.     Serial.print(" ");
  769.     if (cnt==16)
  770.     {
  771.       cnt=0;
  772.       Serial.println();
  773.     }
  774.   }  
  775.   Serial.println("===============================================");
  776. }
  777. //----------------------------------------------------------------------
  778. // Prints the Error number
  779. //----------------------------------------------------------------------
  780. void CheckError(int ErrNo)
  781. {
  782.   Serial.print("Error No. 0x");
  783.   Serial.println(ErrNo, HEX);
  784.  
  785.   // Checks if it's a Severe Error => we need to disconnect
  786.   if (ErrNo & 0x00FF)
  787.   {
  788.     Serial.println("SEVERE ERROR, disconnecting.");
  789.     Client.Disconnect();
  790.   }
  791. }
  792. //----------------------------------------------------------------------
  793. // Profiling routines
  794. //----------------------------------------------------------------------
  795. void MarkTime()
  796. {
  797.   Elapsed=millis();
  798. }
  799. //----------------------------------------------------------------------
  800. void ShowTime()
  801. {
  802.   // Calcs the time
  803.   Elapsed=millis()-Elapsed;
  804.   if(Elapsed > 10 ){
  805.     Serial.print("loop time (ms) : ");
  806.     Serial.println(Elapsed);  
  807.   }
  808. }
  809.  
  810. void new_device_search()
  811. {
  812.   byte i;
  813.   int Result;
  814.   boolean naujas =false;
  815.  
  816.   discoverOneWireDevices(); //ieskoma nauju prietaisu
  817.  
  818.     while (!Client.Connected)
  819.   {
  820.     if (!Connect())
  821.       delay(500);
  822.     Serial.println("Bandoma prisijungti prie PLC funkcijoje 'new_device_search' ");
  823.   }
  824.  
  825.  
  826.   for(i=0;i<8;i++)  // patikrinti ar rastas naujas adresas
  827.   {
  828.     if(new_device[i+8]!=new_device[i])
  829.   {
  830.     naujas=true;
  831.   }
  832.          /* Serial.print(i);Serial.print(" "); Serial.print(new_device[i]);Serial.print(" "); Serial.print(last_device[i]);Serial.print(" ");
  833.           if(naujas){
  834.           Serial.println("true");
  835.           }else{
  836.             Serial.println("false"); }*/
  837.          
  838.  
  839.   }
  840.  
  841.   if(naujas ){   //issaugoti nauja adresa, issiusti i valdikli  && !new_device_search_first_run
  842.   //Serial.println("Surastas naujas jutiklis");
  843.  
  844.     Serial.print(" Surastas termometras: ");  //Parodyti serial monitor nauja adresa
  845.     for(i=0;i<8;i++)  
  846.     {
  847.       //last_device[i]=new_device[i];
  848.       Serial.print(new_device[i+8]);Serial.print(" ");
  849.     }
  850.     Serial.println(" ");
  851.    
  852.     Result=Client.WriteArea(S7AreaDB,   // We are requesting DB access
  853.                          DBNum_from_plc,    // DB Number
  854.                          0,             // Start from byte N.0
  855.                          16,           // Amount
  856.                          new_device);  // Put them into our target (Buffer or PDU)
  857.   if (Result==0)
  858.   {
  859.   Serial.println(">>>'new_device_search' Duomenys issiusti i valdikli ");
  860.   for(i=0;i<8;i++)  
  861.     {
  862.       new_device[i]=new_device[i+8];
  863.      
  864.     }
  865.   }else{
  866.     Serial.println(">>> 'new_device_search' Nepavyko issiusti i valdikli ");
  867.   }
  868.    
  869.    
  870.    
  871.    
  872.   }
  873.    
  874.    delay(3000);
  875.  
  876.  
  877.  
  878. }
  879.  
  880.  
  881.  
  882. void discoverOneWireDevices(void) {
  883.   byte i;
  884.   byte present = 0;
  885.   byte data[12];
  886.   byte addr[8];
  887.  
  888.   //Serial.print("Looking for 1-Wire devices...\n\r");// "\n\r" is NewLine
  889.   while(oneWire_test.search(addr)) {
  890.     //Serial.print("\n\r\n\rFound \'1-Wire\' device with address:\n\r");
  891.     for( i = 0; i < 8; i++) {
  892.       //Serial.print("0x");
  893.       if (addr[i] < 16) {
  894.      //   Serial.print('0');
  895.    
  896.       }
  897.      // Serial.print(addr[i], HEX);
  898.    
  899.       if (i < 7) {
  900.        // Serial.print(", ");
  901.       }
  902.     }
  903.     if ( OneWire::crc8( addr, 7) != addr[7]) {
  904.       //Serial.print("CRC is not valid!\n\r");
  905.       return;
  906.     }
  907.   }
  908.   //Serial.println();
  909.   for(i=0;i<8;i++)
  910.   {
  911.   new_device[i+8]=addr[i];
  912.   }
  913.   //Serial.println("Done");
  914.   oneWire_test.reset_search();
  915.   return;
  916. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement