您的位置:首页 > 移动开发 > Android开发

Modbus工业协议在Android中的应用

2016-03-18 15:01 477 查看
现在工业信息画发展,很多工厂都需要做信息化展示,通常都是利用Android一体机来进行展示和交互。

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为读取数据的方法如下:


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位的数据


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: