Modbus工业协议在Android中的应用
2024-10-15 06:03:10
现在工业信息画发展,很多工厂都需要做信息化展示,通常都是利用Android一体机来进行展示和交互。
Modbus协议是全球第一个用于工业现场的总线协议,与外设交互可以采用串口通信,tcp等方式;通常在Android中都是用tcp来进行读写,在Android中有Modbus4J.jar这个jar包使用;
简单介绍modbustcp:
读取的是从机 有几点需要知道 从机的ip地址,端口号(一般为502),slaveID,需要读的寄存器地址
读保持寄存器的功能号为03
先需要根据ip连接:
private void connectIP() {
try {
IpParameters tcpParameters = new IpParameters();
tcpParameters.setHost(MyApplication.getInstance().getIp_electric());
tcpParameters.setPort(PORT);
ModbusFactory modbusFactory = new ModbusFactory(); master = modbusFactory.createTcpMaster(tcpParameters, true);
master.setTimeout(TIME_OUT);
master.setRetries(0);
master.init();
if (master.isInitialized()) {
mConnected = true;
new Thread(readTask).start();
}
} catch (Exception e) {
master.destroy();
e.printStackTrace();
// L.e(getClass().getSimpleName(), e.getMessage()); try {
Thread.sleep(10 * 1000);
} catch (Exception ex) {
}
connectIP();
}
}
由以上代码当master初始化成功之后 开棋=
/**
* 板卡读线程
*/ public Runnable readTask = new Runnable() {
@SuppressLint("SimpleDateFormat")
@SuppressWarnings("static-access")
@Override
public void run() {
while (mConnected) {
try {
String msg = Utils.imitateData(master, SLAVE_ID).toString();
Log.i("msg", msg);
Map<String, String> map = Utils.formatResult(msg); str = msg;
Thread.currentThread().sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
msg为读取结果 独取出来是类似与多个键值对的形式 需要自己进行拆分
imitateData为读取数据的方法 如下:
public static BatchResults<String> imitateData(ModbusMaster master,
int slaveID) {
BatchResults<String> results = null;
BatchRead<String> batchRead = new BatchRead<String>(); //读int部分
batchRead.addLocator(Config.Voltage_1, BaseLocator.holdingRegister(
slaveID, 0000, DataType.TWO_BYTE_INT_UNSIGNED));
batchRead.addLocator(Config.Voltage_2, BaseLocator.holdingRegister(
slaveID, 0002, DataType.TWO_BYTE_INT_UNSIGNED)); batchRead
.addLocator(Config.Electricity_1, BaseLocator
.holdingRegister(slaveID, 0004,
DataType.TWO_BYTE_INT_UNSIGNED));
batchRead
.addLocator(Config.Electricity_2, BaseLocator
.holdingRegister(slaveID, 0006,
DataType.TWO_BYTE_INT_UNSIGNED)); //读float部分 电表1
batchRead.addLocator(Config.Voltage_Va_1, BaseLocator.holdingRegister(
slaveID, 8, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Voltage_Vb_1, BaseLocator.holdingRegister(
slaveID, 10, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Voltage_Vc_1, BaseLocator
.holdingRegister(slaveID, 12, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Voltage_Avg_1, BaseLocator
.holdingRegister(slaveID, 14, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_A_1, BaseLocator
.holdingRegister(slaveID, 16, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_B_1, BaseLocator
.holdingRegister(slaveID, 18, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_C_1, BaseLocator
.holdingRegister(slaveID, 20, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_Avg_1, BaseLocator
.holdingRegister(slaveID, 22, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Energy_Positive_1, BaseLocator
.holdingRegister(slaveID, 24, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Energy_Reverse_1, BaseLocator
.holdingRegister(slaveID, 26, DataType.FOUR_BYTE_FLOAT_SWAPPED)); //读电表2 float部分
batchRead.addLocator(Config.Voltage_Va_2, BaseLocator
.holdingRegister(slaveID, 28, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Voltage_Vb_2, BaseLocator
.holdingRegister(slaveID, 30, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Voltage_Vc_2, BaseLocator
.holdingRegister(slaveID, 32, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Voltage_Avg_2, BaseLocator
.holdingRegister(slaveID, 34, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_A_2, BaseLocator
.holdingRegister(slaveID, 36, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_B_2, BaseLocator
.holdingRegister(slaveID, 38, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_C_2, BaseLocator
.holdingRegister(slaveID, 40, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Electricity_Avg_2, BaseLocator
.holdingRegister(slaveID, 42, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Energy_Positive_2, BaseLocator
.holdingRegister(slaveID, 44, DataType.FOUR_BYTE_FLOAT_SWAPPED)); batchRead.addLocator(Config.Energy_Reverse_2, BaseLocator
.holdingRegister(slaveID, 46, DataType.FOUR_BYTE_FLOAT_SWAPPED)); try {
results = master.send(batchRead);
} catch (ModbusTransportException e) {
e.printStackTrace();
} catch (ErrorResponseException e) {
e.printStackTrace();
}
return results;
}
以上就根据每个寄存器的数据类型进行读取0-46位的数据
最新文章
- nodejs随记04
- JavaScript函数编程-Ramdajs
- .NET 平台下的插件化开发内核(Rabbit Kernel)
- 黄聪:MYSQL使服务器内存CPU占用过高问题的分析及解决方法
- 《笨办法学Python》
- c#自定义控件属性面板及选择资源设置
- ListView用法及加载数据时的闪烁问题和加载数据过慢问题
- 测试peerdroid示例程序步骤
- Android编程中常用的PopupWindow和Dialog对话框
- 于win7使用虚拟磁盘隐藏文件
- 把记事本文件固定在Win8的开始屏幕
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
- JS中的函数传参
- rabbitmq延迟队列demo
- 第三百七十九节,Django+Xadmin打造上线标准的在线教育平台—xadmin的安装
- OC基础:内存(内存管理) 分类: ios学习 OC 2015-06-25 16:50 73人阅读 评论(0) 收藏
- 2018-2019-2 20162318《网络攻防技术》Exp5 MSF基础应用
- docker跨主机互联
- Problem K: 零起点学算法107——统计元音
- MyEclipse 为xml添加本地的dtd文件