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

ブロックで例外が発生し続ける場合は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 に答える
0

スレーブ PLC の modbus 構成について詳しく知らなくても、私の最初の提案は、startRegの別の値を試して、エラーが続くかどうかを確認することです。これにより、Java の問題が除外されます。

動作するはずのいくつかのテスト番号: 0,1,7,8

すべてが機能するとは限りませんが、少なくとも 1 つが正常に返されるはずです。

いずれも正常に返されない場合は、PLC の構成に問題があるか、リクエスト コードに問題がある可能性があります。

テスト番号の 1 つが成功した場合は、結果を投稿する必要があります。その場合、これは、PLC に存在しないメモリ位置にアクセスしようとしていることを意味します。未定義の PLC メモリ位置にアクセスすると、多くの場合、PLC は要求を中止します (単に「0」を返すだけではありません)。

フォローアップのコメント:

startReg300 ではなく に異なる値を使用するとコードが機能することがわかった場合、その理由は PLC のメモリ マッピングに関係しており、これは PLC のブランド/モデルごとに異なる可能性があります (PLC のブランド/モデルを投稿する場合)利用可能)。

あなたはあなたの質問で'record 300'と言います。PLC で作業する場合、通常、メモリをレコードとは呼びません。Bit 300、Byte 300、Word 300、DoubleWord 300 にアクセスしようとしていますか?

質問する必要がある実際の質問は、読み取りたい300実際のmodbus アドレス、またはPLC アドレス300がどのようにマップされているか (300 番目の I/O スロットなど、必ずしも 300 番目の WORD ではない) です。8 進数、10 進数、および 16 進数のアドレス間の変換が必要になる場合があります。または、アドレスの再インデックスが必要になる場合があります (一部の PLC は からカウントを開始しますが、一般に modbus は からカウントを開始します)。10

おそらく、BIT 300 (レコード 300 ではない) を読み取るつもりでしたが、これはWORDでは12th BITになるため、次のようになります。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 に答える