本文介绍Android通过局域网连接PLC,PLC端开启了Modbus TCP Server。Android可修改数据块中的值实现控制硬件的功能。
项目中使用了modbus4Android(GitHub - zgkxzx/Modbus4Android: Modbus for android)。
第一步:引入jar
在Module的build.gradle中引入lib:
https://wwp.lanzoul.com/iyW4U0d0wh1e
密码:heq0
implementation files('libs\\modbus4Android-1.2.jar')
第二步:创建连接
/**
* 初始化plc链接
* @param modbusIp
* @param modbusPort
*/
public static void initModubusTCP(String modbusIp,Integer modbusPort){
ModbusReq.getInstance().setParam(new ModbusParam()
.setHost("192.168.124.189")
.setPort(502)
.setEncapsulated(false)
.setKeepAlive(true)
.setTimeout(2000)
.setRetries(0))
.init(new OnRequestBack<String>() {
@Override
public void onSuccess(String s) {
Log.d("modbus", "onSuccess " + s);
}
@Override
public void onFailed(String msg) {
Log.d("modbus", "onFailed " + msg);
}
});
}
第三步:读取线圈数据
读取slaveId = 1;数据地址为VB10001开始,向后5位的数据;
ModbusReq.getInstance().readDiscreteInput(new OnRequestBack<boolean[]>() {
@Override
public void onSuccess(boolean[] booleen) {
Log.d("modbus", "readDiscreteInput onSuccess " + Arrays.toString(booleen));
}
@Override
public void onFailed(String msg) {
Log.e("modbus", "readDiscreteInput onFailed " + msg);
}
},1,1,5);
第四步:写(单个)线圈
向slaveId = 1,PLC地址为VB10001,中写入开关量:false(0)
ModbusReq.getInstance().writeCoil(new OnRequestBack<String>() {
@Override
public void onSuccess(String s) {
Log.e("modbus", "writeCoil onSuccess " + s);
}
@Override
public void onFailed(String msg) {
Log.e("modus", "writeCoil onFailed " + msg);
}
},1,1,false);
其它读写类型可参考modbus4android中的readme文件。
调试前可通过Modbus poll 连接PLC,测试与PLC的通信和读写数据是否正常。
modbus功能码:
0x01:读线圈
0x05:写单个线圈
0x0F:写多个线圈
0x02:读离散量输入
0x04:读输入寄存器
0x03:读保持寄存器
0x06:写单个保持寄存器
0x10:写多个保持寄存器