我正在使用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
答案 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地址{ strong>被映射(例如第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消息,可以尝试使用调试器手动检查连接实例。