java Modbus TCP SCADA / IHM fonctionne très lentement


J'essaie d'écrire du code en Java pour un simple SCADA/HMI pour connecter mon ordinateur à un automate via Modbus TCP. J'ai écrit le code pour ALLUMER / éteindre 5 bobines sur mon automate, mais l'application fonctionne très lentement - lorsque j'appuie deux fois sur le bouton (ce qui est la condition pour ALLUMER/ÉTEINDRE la bobine), l'automate prend 4 à 6 secondes pour obtenir la commande. Mais je veux que cela fonctionne rapidement.

Dans le code, j'ai écrit la classe principale, dans laquelle j'établis la connexion, et la classe thread, dans laquelle j'exécute le ModBusTCPTransaction pour chaque bobine. J'appelle la classe thread comme "Démon" et il démarre en classe principale. Mais peut – être que ce n'est pas l'approche que les choses devraient être faites-peut-être que n'importe qui peut écrire comment habituellement tese type de systèmes SCADA/HMI sont faits/fonctionnent, juste en 2/3 phrases Do Ai-je même besoin d'une classe de thread deamon??

Voici mon code

import java.net.*;
import java.io.*;
import net.wimpi.modbus.*;
import net.wimpi.modbus.msg.*;
import net.wimpi.modbus.io.*;
import net.wimpi.modbus.net.*;
import net.wimpi.modbus.util.*;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;

// 1. daemon class
class NitCoil extends Thread {

    private WriteCoilRequest coil_req = null;
    private ModbusTCPTransaction trans = null;
    private int i;

    NitCoil(String s , int i) {
        super(s);
        this.i = i;
    }

    public void run(){
        try {
        while(true) {
            coil_req = new WriteCoilRequest(i, ModbusTest.coil_con[i]);
            trans = new ModbusTCPTransaction(ModbusTest.con);
            trans.setRequest(coil_req);
            trans.execute();
            this.sleep((int)(Math.random()*100));
        }
        } catch (Exception ex) {
            ex.printStackTrace();
    }
    }

}
//2. main class
public class ModbusTest {

    public static TCPMasterConnection con = null;
    public static boolean[] coil_con = {false,false,false,false,false};
    public static void main(String[] args) {

      try {

          /* Variables for storing the parameters */
          InetAddress addr = null; //the slave's address
          int port = Modbus.DEFAULT_PORT;
          int repeat = 1; //a loop for repeating the transaction

          //3. Setup the parameters
          if (args.length < 1) {
              System.exit(1);
          } else {
              try {
                  String astr = "192.168.0.25:502"; 
                  int idx = astr.indexOf(':');
                  {
                      port = Integer.parseInt(astr.substring(idx+1));
                      astr = astr.substring(0,idx);
                  }
                  addr = InetAddress.getByName(astr);
                  if (args.length == 1) {
                      repeat = Integer.parseInt(args[0]);
                  }
              } catch (Exception ex) {
                  ex.printStackTrace();
                  System.exit(1);
              }
          }

          //4. Open the connection
          con = new TCPMasterConnection(addr);
          con.setPort(port);
          con.connect();

          //5. defining frame, panel, button
          JFrame frame = new JFrame("JFrame Example");
          JPanel panel = new JPanel();
          panel.setLayout(new FlowLayout());
          JLabel label = new JLabel("This is a label!");

          //6. creating 5 buttons             
          JButton[] button = new JButton[5];

          for (int j = 0; j < 5; j++){
               final int temp = j;
               button[j] = new JButton(String.valueOf(j));

          //7. button
          button[j].setText("Switch ON light "+j);

          button[j].addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                 if (coil_con[temp] == true) 
                     coil_con[temp] = false; 
                    else
                     coil_con[temp] = true;
            }
            });
          };
          panel.add(label);
          panel.add(button[0]);
          panel.add(button[1]);
          panel.add(button[2]);
          panel.add(button[3]);
          panel.add(button[4]);

          //8. call of demon
          NitCoil n1 = new NitCoil("daemon1", 0);
          n1.setDaemon(true);
          n1.start();
          NitCoil n2 = new NitCoil("daemon2", 1);
          n2.setDaemon(true);
          n2.start();
          NitCoil n3 = new NitCoil("daemon3", 2);
          n3.setDaemon(true);
          n3.start();
          NitCoil n4 = new NitCoil("daemon4", 3);
          n4.setDaemon(true);
          n4.start();
          NitCoil n5 = new NitCoil("daemon5", 4);
          n5.setDaemon(true);
          n5.start();


          //9. Close the connection
          JButton buttonClose = new JButton();
          buttonClose.setText("disconnect");

          buttonClose.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                 ModbusTest.con.close();
            }
            }); 
          panel.add(buttonClose);  
          panel.setBackground(Color.green);

          frame.add(panel);
          frame.setSize(300, 300);
          frame.setLocationRelativeTo(null);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);

      } catch (Exception ex) {
        ex.printStackTrace();
      }

    }  

}
Author: taDEUS, 2015-02-07

1 answers

Avez-vous regardé Wireshark pour voir à quoi ressemblent les temps de réponse? Peut-être que l'appareil est lent à répondre.

De plus, de la façon dont vous avez actuellement cette configuration, vous écrivez continuellement les cinq bobines tout le temps, ce qui n'est probablement pas idéal.

Puisque vos adresses de bobines sont contiguës, vous pouvez également utiliser la fonction WriteMultipleCoils (0x0F) pour écrire sur les cinq bobines en une seule requête.

 0
Author: Kevin Herron, 2015-02-08 15:46:44