android modbus协议之 (一)modbus-TCP/IP通信(安卓系统作为主站)

modbus工具教程链接:https://blog.csdn.net/qq_33593411/article/details/104377141
modbus slave软件下载链接://download.csdn.net/download/qq_33593411/12168018
jamod.jar文件下载链接://download.csdn.net/download/qq_33593411/12168242

一、架设好modbus-TCP服务器(参考教程modbus工具的使用链接:)
假设好modbus服务后设置寄存器并且开启服务
在这里插入图片描述
二、android studio 端新建一MoudBusTCP_Mast 类用于android作为主站时使用
整体的程序思路是:
1、构造方法中填入必须的IP 地址,端口,及设备地址(deviceID),这是为了方便调用后面的方法。
2、网络服务不能放在主线程里面,所以我们必须创建一个新的线程 new Thread(new Runnable() ).start 。如果不重新创建线程执行TCP链接系统会抛出异常。
3、主线程分布下来一个分的线程所以我们需要一个回调的方法,用于提供接收到信息后回调给我们用于更新ui或者刷新数据库。下面是回调代码

public interface ReadInputDiscretesRequestCallback{
        void callback_msg(ArrayList<Boolean> data,int err_type,String err_info);
    }```




#我们已经有思路了,这次主要测试jamod中这个ReadInputDiscretesRequest(读DI寄存器方法)其他的方法类似.后续完整了整体贴出来.
#MoudBusTCP_Mast类代码:




```java
package com.modbus_crtl;

import android.util.Log;
import android.widget.Button;

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.net.TCPMasterConnection;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class MoudBusTCP_Mast  {
    //modbus控制部分
    //故障代码部分
    public int NO_ERR=0;//没有异常


    private TCPMasterConnection con = null; //连接
    private int unitID;//单位ID也是 设备地址
    private int device_port;
    private String device_ip_addr;
    //构造函数
    public MoudBusTCP_Mast(String IP_addr,int port,int device_addr)  {
        device_ip_addr=IP_addr;
        unitID=device_addr;
        device_port=port;
    }

    public interface ReadInputDiscretesRequestCallback{
        void callback_msg(ArrayList<Boolean> data,int err_type,String err_info);
    }
    //读取bool功能码f=02(1x)
    public void read_F02_1x(final int register_addr, final int length, final ReadInputDiscretesRequestCallback read_input_discrete_callback){
//        MoudbusDataType re_data=new MoudbusDataType();

        //网络任务必须在线程里面运行
        new Thread(new Runnable() {
            @Override
            public void run() {
                ArrayList<Boolean> re_bool_data=new ArrayList<Boolean>();//申请布尔变量的列表用于回调中使用
                try{



                    InetAddress addr = InetAddress.getByName(device_ip_addr);//写入地址
                    TCPMasterConnection con = new TCPMasterConnection(addr);//加入地址
                    con.setPort(device_port);//设置端口
                    con.connect();//开始连接
                    //准备请求

                    ReadInputDiscretesRequest req = new ReadInputDiscretesRequest(register_addr, length);
//            ReadMultipleRegistersRequest rem=new ReadMultipleRegistersRequest(ref,count);
                    req.setUnitID(1);//一定要写这个,否则会报出异常
                    //准备处理
                    ModbusTCPTransaction trans = new ModbusTCPTransaction(con);//开始处理
                    trans.setRequest(req);//设置地址
                    trans.execute();
                    ReadInputDiscretesResponse res = (ReadInputDiscretesResponse) trans.getResponse();//获取响应
                    res.getDiscreteStatus(0);
                    Log.e("信息", "Digital Inputs 长度=" +  length);//获取离散项
                    for(int i=0;i<length;i++){
                        re_bool_data.add(res.getDiscreteStatus(i));//将返回来的布尔变量放到 列表里面
//                        Log.e("信息", "Digital Inputs Status=" + res.getDiscreteStatus(i));//获取离散项
                    }

//                    Log.e("信息", "Digital Inputs Status=" + res.getDiscretes().toString());//获取离散项
                    con.close();
                    read_input_discrete_callback.callback_msg(re_bool_data,NO_ERR,"null");//放入callbak里面进行回调

                }catch (Exception e){
                    read_input_discrete_callback.callback_msg(re_bool_data,e.hashCode(),e.getMessage());//未知错误
                    con.close();//关闭连接
                }

            }
        }).start();


    }




}

#MainActivity中创建一个按钮代码如下:

 public void line_type_a(View view) {

            MoudBusTCP_Mast m_modbus= new MoudBusTCP_Mast("192.168.31.70",502,1);//构造函数 输入IP地址  端口号  设备ID(device_id)
        //                       寄存器起始地址   需要读取的数量       new一个ReadInputDiscretesRequestCallback回调方法
            m_modbus.read_F02_1x(0, 15, new MoudBusTCP_Mast.ReadInputDiscretesRequestCallback() {
                @Override
                public void callback_msg(ArrayList<Boolean> data, int err_type, String err_info) {
                    Log.e("信息","变量:"+data.toString());
                    Log.e("信息","错误代码:"+err_type);
                    Log.e("信息","错误的内容:"+err_info);
                }
            });
            
    }

#点击按钮测试一下打印的信息上面我们设置的事 0.1.2这三个寄存器全部设置为true
在这里插入图片描述

到此为止modbus测试完毕 其他的方法只需要再完善测试就可以了

发布了5 篇原创文章 · 获赞 1 · 访问量 449

猜你喜欢

转载自blog.csdn.net/qq_33593411/article/details/104378403