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位的數據

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM