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测试完毕 其他的方法只需要再完善测试就可以了