android modbus协议之 (一)modbus

您所在的位置:网站首页 appinventor手机版安卓版 android modbus协议之 (一)modbus

android modbus协议之 (一)modbus

2023-11-25 11:16| 来源: 网络整理| 查看: 265

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 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 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 re_bool_data=new ArrayList();//申请布尔变量的列表用于回调中使用 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 read_input_discrete_callback.callback_msg(re_bool_data,e.hashCode(),e.getMessage());//未知错误 } } }).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 data, int err_type, String err_info) { Log.e("信息","变量:"+data.toString()); Log.e("信息","错误代码:"+err_type); Log.e("信息","错误的内容:"+err_info); } }); }

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3