Modbus工业协议在Android中的应用
2016-03-18 15:01
477 查看
现在工业信息画发展,很多工厂都需要做信息化展示,通常都是利用Android一体机来进行展示和交互。
Modbus协议是全球第一个用于工业现场的总线协议,与外设交互可以采用串口通信,tcp等方式;通常在Android中都是用tcp来进行读写,在Android中有Modbus4J.jar这个jar包使用;
简单介绍modbustcp:
读取的是从机有几点需要知道从机的ip地址,端口号(一般为502),slaveID,需要读的寄存器地址
读保持寄存器的功能号为03
先需要根据ip连接:
由以上代码当master初始化成功之后开棋=
publicstaticBatchResults<String>imitateData(ModbusMastermaster,
intslaveID){
BatchResults<String>results=null;
BatchRead<String>batchRead=newBatchRead<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));
//读电表2float部分
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(ModbusTransportExceptione){
e.printStackTrace();
}catch(ErrorResponseExceptione){
e.printStackTrace();
}
returnresults;
}
以上就根据每个寄存器的数据类型进行读取0-46位的数据
Modbus协议是全球第一个用于工业现场的总线协议,与外设交互可以采用串口通信,tcp等方式;通常在Android中都是用tcp来进行读写,在Android中有Modbus4J.jar这个jar包使用;
简单介绍modbustcp:
读取的是从机有几点需要知道从机的ip地址,端口号(一般为502),slaveID,需要读的寄存器地址
读保持寄存器的功能号为03
先需要根据ip连接:
privatevoidconnectIP(){ try{ IpParameterstcpParameters=newIpParameters(); tcpParameters.setHost(MyApplication.getInstance().getIp_electric()); tcpParameters.setPort(PORT); ModbusFactorymodbusFactory=newModbusFactory(); master=modbusFactory.createTcpMaster(tcpParameters,true); master.setTimeout(TIME_OUT); master.setRetries(0); master.init(); if(master.isInitialized()){ mConnected=true; newThread(readTask).start(); } }catch(Exceptione){ master.destroy(); e.printStackTrace(); //L.e(getClass().getSimpleName(),e.getMessage()); try{ Thread.sleep(10*1000); }catch(Exceptionex){ } connectIP(); } }
由以上代码当master初始化成功之后开棋=
/** *板卡读线程 */ publicRunnablereadTask=newRunnable(){ @SuppressLint("SimpleDateFormat") @SuppressWarnings("static-access") @Override publicvoidrun(){ while(mConnected){ try{ Stringmsg=Utils.imitateData(master,SLAVE_ID).toString(); Log.i("msg",msg); Map<String,String>map=Utils.formatResult(msg); str=msg; Thread.currentThread().sleep(1000); }catch(Exceptione){ e.printStackTrace(); } } } };
msg为读取结果独取出来是类似与多个键值对的形式需要自己进行拆分 imitateData为读取数据的方法如下:
以上就根据每个寄存器的数据类型进行读取0-46位的数据
相关文章推荐
- Android --- 读取系统资源函数getResources()小结
- android数据存储的五种方式
- Android-zhi事件工具类(几天,几小时,几分钟前)
- Android屏幕适配全攻略(最权威的官方适配指导)
- 记录一点AndroidStudio使用SVN的经验
- Android加载长图那些事
- android Bitmap的内存管理
- android图片压缩
- RN控件之ProgressBarAndroid进度条
- Android 内存管理 &Memory Leak & OOM 分析
- (初级)单兵开发者开发环境最佳实践(Android+JavaWeb)
- Android 颜色渲染(十) ComposeShader组合渲染
- Android 颜色渲染(九) PorterDuff及Xfermode详解
- Android 颜色渲染(八) SweepGradient扫描/梯度渲染
- Android 中 Bitmap 和 Drawable 相互转换的方法
- Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果
- Android 热补丁动态修复框架小结
- Android 颜色渲染(六) RadialGradient 环形渲染
- Android 颜色渲染(五) LinearGradient线性渲染
- Vitamio一款Android&iOS上的全能多媒体开发框架