zoukankan      html  css  js  c++  java
  • Modbus工业协议在Android中的应用

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

     
  • 相关阅读:
    java学习之成员内部类
    上海 炉石面试题及解析
    利用RALL机制来事项String类的赋值操作
    关于信号打断正在读取终端的read与select来监视0文件描述符的问题
    ubuntu16.04开机花屏蓝屏解决方案
    gcc 中__thread 关键字的示例代码
    成长、责任和公司的关系
    团队贡献分
    团队如何做决定
    分析app的NABCD
  • 原文地址:https://www.cnblogs.com/yjpjy/p/5292150.html
Copyright © 2011-2022 走看看