1

我正在使用 Jamod 库,但我无法读取记录,我想要的是仅读取我连接的记录号 300 PLC,但我收到读取错误(进入捕获)。谢谢你的帮助

package com.JR.scada;

import java.net.InetAddress;

import net.wimpi.modbus.Modbus;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadInputDiscretesRequest;
import net.wimpi.modbus.msg.ReadInputDiscretesResponse;
import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;




public class Main extends Activity{
    TextView text, depurar;
    EditText IP;
    Button boton;
    int i=0;


    TCPMasterConnection con = null;     //the TCP connection
    ModbusTCPTransaction trans = null;  //the Modbus transaction

    InetAddress addr = null;        //direccion del esclavo
    int port = Modbus.DEFAULT_PORT;//puerto por defecto 502 


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = (TextView) findViewById(R.id.lblRegistro);
        IP = (EditText) findViewById(R.id.txtIp);
        depurar = (TextView) findViewById(R.id.txtdepurar); 
        boton = (Button)findViewById(R.id.btnVerRegistro);


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }   
    @Override
    protected void onStop() {
        super.onStop();
        //Close the TCP connection
        con.close();
    }


    public class conectar extends AsyncTask<String,String,Integer>{
        ReadInputDiscretesRequest req = null; //the request
        ReadInputDiscretesResponse res = null; //the response

        int startReg;
        protected void onPreExecute() {
            try {
                //IP address;
                addr = InetAddress.getByName("212.170.50.238");
            } catch (Exception e) {
                Log.d("MODBUS","IP error", e);

            }
         }
        protected Integer doInBackground(String... urls) {
            try {

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

                try {

                    startReg = 300;
                    // Prepare the request
                    req = new ReadInputDiscretesRequest (startReg, 1);

                    // Prepare the transaction
                    trans = new ModbusTCPTransaction(con);
                    trans.setRequest(req);
                    // execute the transaction
                    trans.execute();
                    // get the response
                    res = (ReadInputDiscretesResponse) trans.getResponse ();


                } catch (Exception e) {
                    Log.d("MODBUS", "Error in reading/writing");
                    return 1;
                }   


            } catch (Exception e) {
                Log.d("MODBUS","connection error", e);

                return 1;
            }
            return 0;
        }
         protected void onPostExecute(Integer bytes) {
             if(con.isConnected()){

                 depurar.setText("conecta");
            }
             text.setText("Digital Inputs Status=" + res.getDiscretes ().toString () );

         }
    }

    public void onClick(View v)  {

       // int startReg;
        conectar conectamos = new conectar();
        conectamos.execute("hola");
}

错误:

08-21 10:01:57.554: D/MODBUS(3322): Error in reading/writing
4

2 回答 2

0

在不了解从 PLC 上的 modbus 配置的更多信息的情况下,我的第一个建议是尝试为startReg尝试不同的值,并查看错误是否仍然存在。这将排除 Java 的问题。

一些应该起作用的测试数字:0,1,7,8

它们可能并非全部工作,但至少其中一个应该成功返回。

如果它们都没有成功返回,则可能是 PLC 配置有问题,或者您的请求代码有问题。

如果其中一个测试号码成功,您应该发布您的结果。如果是这样,这意味着您正在尝试访问 PLC 上不存在的内存位置。如果您访问未定义的 PLC 内存位置,PLC 通常会中止请求(它不只是发回“0”)。

后续备注:

如果您发现您的代码在使用不同的值时有效startReg,但不是 300,原因与 PLC 上的内存映射有关,这对于每个品牌/型号的 PLC 可能不同(如果您发布您的 PLC 品牌/型号可用的)。

你在你的问题中说'record 300'。使用 PLC 时,您通常不会将内存称为记录。您是否尝试访问位 300、字节 300、字 300、双字 300?

您需要问的真正问题是您要读取300的实际modbus 地址,或者PLC 地址300是如何映射的(例如第 300 个 I/O 插槽,不一定是第 300 个 WORD)。可能需要在八进制、十进制和十六进制地址之间进行转换。或者,您可能需要重新索引地址(一些 PLC 喜欢从 开始计数,但通常 modbus 从 开始计数)。10

也许您的意思是阅读 BIT 300(而不是记录 300),它会是WORD 中的BIT 12th 所以它看起来像这样:18th

// 
startReg = 17;

// Prepare the request
// Your 300th bit should be the last value returned.
req = new ReadInputDiscretesRequest (startReg, 12);

我建议的不同值startReg旨在帮助您了解您的 PLC 输入如何通过 Java 库映射到 modbus 地址。这可能有助于数字转换

于 2013-08-22T19:37:08.973 回答
0

如果您的块中不断出现异常catch,您可能想了解有关该错误的更多信息。

尝试从您的原始代码更改此行:

            try {
                //...
            } catch (Exception e) {
                Log.d("MODBUS", "Error in reading/writing");
                return 1;
            }   

进入这个:

            try {
                //...
            } catch (Exception e) {
                Log.d("MODBUS", e.getMessage() );
                return 1;
            }

希望这个异常能告诉你更多关于它失败的确切原因。发布这些结果。

如果您收到 NULL 消息,您可以尝试使用调试器手动检查您的连接实例。

于 2013-09-04T11:57:02.630 回答