我想制作一个简单的Android应用程序,通过Modbus TCP协议与我的PLC通信。我正在使用modbus4j库。我正在寻找一些基本的东西 - 我只需要一个按钮来打开/关闭一个线圈,一个文本区域用于输入一个保持寄存器,一个编辑文本用于一个输入寄存器(显示温度)和一个离散输入。
我知道它应该很简单,但是我对轮询问题有困难,所以如果有人有一个例子或一个好的教程,那就没关系了。
我写了以下代码:
package com.tadej.mythirdapp;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.ip.tcp.TcpMaster;
import java.util.Arrays;
import com.serotonin.io.serial.SerialParameters;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
//import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.ReadCoilsRequest;
import com.serotonin.modbus4j.msg.ReadCoilsResponse;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
import com.serotonin.modbus4j.msg.ReadExceptionStatusRequest;
import com.serotonin.modbus4j.msg.ReadExceptionStatusResponse;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
import com.serotonin.modbus4j.msg.ReadInputRegistersRequest;
import com.serotonin.modbus4j.msg.ReadInputRegistersResponse;
import com.serotonin.modbus4j.msg.ReportSlaveIdRequest;
import com.serotonin.modbus4j.msg.ReportSlaveIdResponse;
import com.serotonin.modbus4j.msg.WriteCoilRequest;
import com.serotonin.modbus4j.msg.WriteCoilResponse;
import com.serotonin.modbus4j.msg.WriteCoilsRequest;
import com.serotonin.modbus4j.msg.WriteCoilsResponse;
import com.serotonin.modbus4j.msg.WriteMaskRegisterRequest;
import com.serotonin.modbus4j.msg.WriteMaskRegisterResponse;
import com.serotonin.modbus4j.msg.WriteRegisterRequest;
import com.serotonin.modbus4j.msg.WriteRegisterResponse;
import com.serotonin.modbus4j.msg.WriteRegistersRequest;
import com.serotonin.modbus4j.msg.WriteRegistersResponse;
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.ip.IpParameters;
//import com.serotonin.modbus4j.locator.BaseLocator;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) /*throws Exception*/{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
IpParameters ipParameters = new IpParameters();
ipParameters.setHost("192.168.1.25");
ipParameters.setPort(502);
ModbusFactory modbusFactory = new ModbusFactory();
ModbusMaster master = modbusFactory.createTcpMaster(ipParameters, false);
master.setTimeout(10000);
master.setRetries(3);
try {
master.init();
while (true) {
ReadInputRegistersRequest request = new ReadInputRegistersRequest(255, 0, 1);
ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);
TextView temp = (TextView) findViewById(R.id.textView);
temp.setText(response.toString());
Thread.sleep(1000);
}
}
/* catch (ErrorResponseException e) {
//System.out.println(e.getErrorResponse().getExceptionMessage());
Log.e(getClass().getSimpleName(), exceptionStringHelper(e));
}
*/
catch (ModbusInitException m_exception) {
Log.e(getClass().getSimpleName(), exceptionStringHelper(m_exception));
}
catch (ModbusTransportException mte_exception){
Log.e(getClass().getSimpleName(), exceptionStringHelper(mte_exception));
//this.disconnect();
}
catch (InterruptedException ie_exception){
Log.e(getClass().getSimpleName(), exceptionStringHelper(ie_exception));
//this.disconnect();
}
finally {
master.destroy();
}
}
private String exceptionStringHelper(Exception e){
return (e.getMessage() != null)? e.getMessage() : "";
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_my, menu);
return true;
}
public void broadcastIntent(View view) {
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);
}
}
但它没有显示输入寄存器值(“temp”变量 - 作为温度)。通常如何进行民意调查,以便实时显示温度的价值。如果你能解释我或者代码安静地告诉我,请任何人。谢谢