现在工业信息画发展,很多工厂都需要做信息化展示,通常都是利用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位的数据

 

Modbus工业协议在Android中的应用的更多相关文章

  1. MQTT协议实现Android中的消息收发

    前言 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),基于发布/订阅范式的消息协议,是一种极其简单和轻量级的消息协议,专为受限设备和低带宽.高延迟 ...

  2. Android中通信协议

    一.TCP/IP协议(传输层协议) 1.Socket与ServerSocket Socket是应用层与TCP/IP协议簇通讯的中间抽象层,Socket是一组接口,在设计模式中,Socket的设计就是门 ...

  3. Android 中多点触摸协议

    http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/ ...

  4. Android中使用http协议访问网络

    HTTP协议的工作原理:客户端向服务器端发送http请求,服务器端收到请求后返回一下数据给客户端,客户端接受消息并进行解析. 在Android中发送http请求的方式有两种,第一种是通过HttpURL ...

  5. android中的一些问题

    1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...

  6. Modbus通讯协议

    <ignore_js_op> O1CN01P1wxTI1dCdw5nAeMO_!!85243700.jpg (287.43 KB, 下载次数: 0) 下载附件  保存到相册 2019-6- ...

  7. Android 中关于static的使用问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...

  8. Android中的HTTP通信

    前言:近期在慕课网学习了慕课网课程Android中的HTTP通信,就自己总结了一下,其中参考了不少博文,感谢大家的分享. 文章内容包括:1.HTTP简介2.HTTP/1.0和HTTP/1.1之间的区别 ...

  9. Android中脱离WebView使用WebSocket实现群聊和推送功能

    WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...

随机推荐

  1. [问题2014A04] 解答

    [问题2014A04]  解答 (1) 由条件可得 \(AB+BA=0\), 即 \(AB=-BA\), 因此 \[AB=A^2B=A(AB)=A(-BA)=-(AB)A=-(-BA)A=BA^2=B ...

  2. linux环境下安装mysql数据库遇到的问题

    总结一句话: 安装完mysql数据库记得授权远程登录.   坑的现象: ERROR 1045 (28000): Access denied for user 'guoxp'@'localhost' ( ...

  3. log4j2的使用

    预备知识 日志级别:log4j默认六个级别,即trace.debug.info.warn.error.fatal ,对应意味着该消息为追踪.调试.普通信息.警告.错误.严重错误.可以根据需要子定义其他 ...

  4. docker-registry使用笔记

    在国内docker-hub是肯定用不了的,不解释:sweat:. 所以最好还是建一个私有的docker-registry,存储一些常用的images方便随时pull. 相关链接 github:http ...

  5. TCP连接的状态与关闭方式及其对Server与Client的影响

    TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...

  6. ERROR 1018 (HY000): Can't read dir of './test/' (errno: 13)

    不能查看mysql中数据库的表. 一.查看 mysql> desc test; ERROR 1046 (3D000): No database selected mysql> use te ...

  7. Nbimer族助手 部分控件不能用的解决方法(转)

    用户提出的问题现象: 我两天笔记本安装的都是win7 SP1系统,一台为64为一台为32位,网络环境是移动宽带通过D-Link路由器实现无线局域网,DHPC自动分配IP地址.每次打开IE或者Chrom ...

  8. 如何让IE8的菜单栏调到最上方

    如何让IE8的菜单栏调到最上方 运行gpedit.msc,在"用户配置"/"管理模板"/"Windows Components"/" ...

  9. 《浅谈磁盘控制器驱动》,磁盘控制器驱动答疑解惑![2012.1.29完结]by skyfree

    <浅谈磁盘控制器驱动>,磁盘控制器驱动答疑解惑![2012.1.29完结]  https://www.itiankong.net/thread-178655-1-1.html Skyfre ...

  10. 解决asp.net Core Mvc网页汉字乱码问题

    跟着www.asp.net网页的教程做电影网站的例子时,将一些英文标签和按钮改成了汉字的,结果出现了乱码. 在网上搜索这方面的信息也不太多,看到大家众说纷纭,最后有解决问题的,也没有说清楚具体的办法, ...