ReadInputDiscretesResponse错误(Jamod,Android)

时间:2013-08-21 10:08:25

标签: android tcp modbus

我正在使用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

2 个答案:

答案 0 :(得分:0)

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

应该有效的一些测试数字:0,1,7,8

它们可能并非都有效,但至少其中一个应该成功返回。

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

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

后续备注:

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

您在问题'记录300'中说。使用PLC时,通常不将内存称为记录。您是否尝试访问Bit 300,Byte 300,Word 300,DoubleWord 300?

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

也许你打算阅读BIT 300(不是记录300),然后12th WORD 中的18th BIT ,所以它看起来像这样:

// 
startReg = 17;

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

我为startReg建议的不同值旨在帮助您发现Java库如何将PLC输入映射到modbus地址。这可能有助于number conversions

答案 1 :(得分: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消息,可以尝试使用调试器手动检查连接实例。