基本的Android应用程序,通过Modbus TCP与PLC通信

时间:2015-03-23 21:29:26

标签: android android-studio polling modbus-tcp

我想制作一个简单的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”变量 - 作为温度)。通常如何进行民意调查,以便实时显示温度的价值。如果你能解释我或者代码安静地告诉我,请任何人。谢谢

0 个答案:

没有答案