'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Autor Wątek: Pobieranie danych 750-881 przez program Java  (Przeczytany 4219 razy)

rafkar

  • Newbie
  • *
  • Wiadomości: 6
    • Zobacz profil
Pobieranie danych 750-881 przez program Java
« dnia: Maj 09, 2014, 06:02:49 pm »

Witam mam takie pytanko . Szukam infrmacji na temat jak połączyć się ze sterownikiem przez program napisany w czystej JAVIE ( nie javascript) . Proszę o przykład komunikacji lub jakoś informację która by mnie naprowadziła bo próbuję od dłuższego czasu i nić . Z góry dzięki za pomoc.
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 297
    • Zobacz profil
Odp: Pobieranie danych 750-881 przez program Java
« Odpowiedź #1 dnia: Maj 13, 2014, 08:32:02 am »

Witam,

wg mnie drogi są 2: 

1. Wykorzystać jedną z dostępnych w sieci bibliotek MODBUS dla Javy, jak jamod lub http://sourceforge.net/projects/modbus4j/
2. Wysyłać takie same zapytania Ajaxowe jak spod java scriptu.  Nie wiem konkretnie jak, ale na pewno jest to możliwe

Pozdrawiam,
Zapisane

Arctikman

  • Newbie
  • *
  • Wiadomości: 6
    • Zobacz profil
Odp: Pobieranie danych 750-881 przez program Java
« Odpowiedź #2 dnia: Czerwiec 29, 2014, 08:09:05 pm »

Witam,
oto moja udana próba połączenia i pobrania danych ze sterownika z wykorzystaniem czystej javy
 program w eclipsie:


import java.net.*;
import java.io.*;

class poloczenie {

   private String linia = "1";

   public poloczenie()

   // public (String lina)
   {
      try {
         String sterownik = "192.168.1.101"; // adres ip sterownika

         Socket s = new Socket(sterownik, 502);
         try {
            int unit = 01;//
            int reg_no = 12228;// adres słowa
            int num_regs = 1;// ilość słow

            OutputStream os = s.getOutputStream();
            FilterInputStream is = new BufferedInputStream(
                  s.getInputStream());
            byte obuf[] = new byte[260];
            byte ibuf[] = new byte[260];
            int i;

            // build request of form 0 0 0 0 0 6 ui 3 rr rr nn nn
            for (i = 0; i < 5; i++)
               obuf = 0;
            obuf[5] = 6;
            obuf[6] = (byte) unit;
            obuf[7] = 03;
            obuf[8] = (byte) (reg_no >> 8 ) ;
            obuf[9] = (byte) (reg_no & 0xff ) ;
            obuf[10] = (byte) (num_regs >> 8 ) ;
            obuf[11] = (byte) (num_regs & 0xff ) ;

            // send request
            os.write(obuf, 0, 12);

            // read response
            i = is.read(ibuf, 0, 260);
            if (i < 9) {
               if (i == 0) {
                  System.out
                        .println("unexpected close of connection at remote end");
               } else {
                  System.out.println("response was too short - " + i
                        + " chars");
               }
            } else if (0 != (ibuf[7] & 0x80)) {
               System.out.println("MODBUS exception response - type "
                     + ibuf[8]);
            } else if (i != (9 + 2 * num_regs)) {
               System.out.println("incorrect response size is " + i +

               " expected" + (9 + 2 * num_regs));
            } else {
               for (i = 0; i < num_regs; i++) {

                  int w = (ibuf[9 + i + i] << 8 ) + ibuf[10 + i + i];
                  linia = Integer.toString(w);

               
               }
            }

            
         } finally {
            s.close();
         }
      } catch (Exception e) {
      }
   }

   public String getLinia() {
      return linia;
   }
   
}
« Ostatnia zmiana: Czerwiec 29, 2014, 08:12:24 pm wysłana przez Arctikman »
Zapisane

Arctikman

  • Newbie
  • *
  • Wiadomości: 6
    • Zobacz profil
Odp: Pobieranie danych 750-881 przez program Java
« Odpowiedź #3 dnia: Czerwiec 29, 2014, 08:29:48 pm »

Witam,
oto moja udana próba połączenia i pobrania danych ze sterownika z wykorzystaniem czystej javy
 program w eclipsie:


import java.net.*;
import java.io.*;

class poloczenie {

   private String linia = "1";

   public poloczenie()

   // public (String lina)
   {
      try {
         String sterownik = "192.168.1.101";

         Socket s = new Socket(sterownik, 502);
         try {
            int unit = 0x01;
            int reg_no = 0x3001; // aders danych w sterowniku
            int num_regs = 1;  // ilość słów

            OutputStream os = s.getOutputStream();
            FilterInputStream is = new BufferedInputStream(
                  s.getInputStream());
            byte obuf[] = new byte[260];
            byte ibuf[] = new byte[260];
            int i;

            // build request of form 0 0 0 0 0 6 ui 3 rr rr nn nn
            for (i = 0; i < 5; i++)
               obuf = 0;
            obuf[5] = 6;
            obuf[6] = (byte) unit;
            obuf[7] = 03;
            obuf[8] = (byte) (reg_no >> 8 );
            obuf[9] = (byte) (reg_no & 0xff );
            obuf[10] = (byte) (num_regs >> 8 );
            obuf[11] = (byte) (num_regs & 0xff );

            // send request
            os.write(obuf, 0, 12);

            // read response
            i = is.read(ibuf, 0, 260);
            if (i < 9) {
               if (i == 0) {
                  System.out
                        .println("unexpected close of connection at remote end");
               } else {
                  System.out.println("response was too short - " + i
                        + " chars");
               }
            } else if (0 != (ibuf[7] & 0x80)) {
               System.out.println("MODBUS exception response - type "
                     + ibuf[8]);
            } else if (i != (9 + 2 * num_regs)) {
               System.out.println("incorrect response size is " + i +

               " expected" + (9 + 2 * num_regs));
            } else {
               for (i = 0; i < num_regs; i++) {

                  int w = (ibuf[9 + i + i] << 8 ) + ibuf[10 + i + i];
                  linia = Integer.toString(w);

                  // System.out.println("word " + i + " = " + w);

               }
            }

         

         } finally {
            s.close();
         }
      } catch (Exception e) {
      }
   }

   public String getLinia() {
      return linia;
   }
   }
Zapisane

gojac

  • Newbie
  • *
  • Wiadomości: 16
    • Zobacz profil
Odp: Pobieranie danych 750-881 przez program Java
« Odpowiedź #4 dnia: Czerwiec 30, 2014, 07:42:56 am »

Jest to nic innego jak implementacja Modbusa/TCP i wykorzystanie faktu, że 750-881 z defaultu jest serwerem tegoż. Bardzo ciekawe rozwiązanie. Pokazuje jak prosto skomunikować się ze sterownikiem. Apropos Modbusa/TCP wszelkie specyfikacje zalecają aby w sieci wykorzystywać koncentratory zamiast przełączników, ale u mnie stosuję switch i nie zauważyłem jakichkolwiek problemów.
Zapisane

Arctikman

  • Newbie
  • *
  • Wiadomości: 6
    • Zobacz profil
Odp: Pobieranie danych 750-881 przez program Java
« Odpowiedź #5 dnia: Lipiec 04, 2014, 09:47:59 pm »

Jet to bardzo prosta implementacja Modbusa/TCP funkcji FC3 zgodnie z opisem WAGO.
Co do stosowania koncentratorów w sieci LAN odradzam ze względu  na sposób działania tych urządzeń. Switch ( przełącznik ) jest urządzeniem o podobnej funkcjonalności ale oferuje inteligentne przekazywanie pakietów do odpowiednich gniazd nie blokując pozostałych gniazd zbędnym ruchem sieciowym i usprawniając komunikacje sieciową przechodzącą przez przełącznik.
Zapisane