/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and others * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech * Red Hat Inc - Fix build warnigns *******************************************************************************/ package org.eclipse.kura.demo.modbus; import java.lang.Thread.State; import java.util.Map; import java.util.Properties; import org.eclipse.kura.configuration.ConfigurableComponent; import org.eclipse.kura.protocol.modbus.ModbusProtocolDeviceService; import org.eclipse.kura.protocol.modbus.ModbusProtocolException; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ModbusExample implements ConfigurableComponent { private static final Logger s_logger = LoggerFactory.getLogger(ModbusExample.class); static final boolean isTCP = true; private ModbusProtocolDeviceService m_protocolDevice; private Thread m_thread; private Map<String, Object> m_properties; private static Properties modbusProperties; private boolean configured; private boolean m_threadShouldStop; private int m_slaveAddr; public void setModbusProtocolDeviceService(ModbusProtocolDeviceService modbusService) { this.m_protocolDevice = modbusService; } public void unsetModbusProtocolDeviceService(ModbusProtocolDeviceService modbusService) { this.m_protocolDevice = null; } protected void activate(ComponentContext componentContext, Map<String, Object> properties) { this.configured = false; this.m_properties = properties; modbusProperties = getModbusProperties(); this.m_slaveAddr = Integer.valueOf(modbusProperties.getProperty("slaveAddr")).intValue(); this.m_threadShouldStop = false; this.m_thread = new Thread(new Runnable() { @Override public void run() { doModbusLoop(); } }); this.m_thread.start(); } protected void deactivate(ComponentContext componentContext) { s_logger.info("Modbus deactivate"); this.m_threadShouldStop = true; while (this.m_thread.getState() != State.TERMINATED) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } s_logger.info(this.m_thread.getState().toString()); s_logger.info("Modbus polling thread killed"); if (this.m_protocolDevice != null) { try { this.m_protocolDevice.disconnect(); } catch (ModbusProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.configured = false; } public void updated(Map<String, Object> properties) { s_logger.info("updated..."); this.m_properties = properties; modbusProperties = getModbusProperties(); this.m_slaveAddr = Integer.valueOf(modbusProperties.getProperty("slaveAddr")).intValue(); this.configured = false; } private int bcd2Dec(int bcdVal) { byte bcd = (byte) bcdVal; int decimal = (bcd & 0x000F) + ((bcd & 0x000F0) >> 4) * 10 + ((bcd & 0x00F00) >> 8) * 100 + ((bcd & 0x0F000) >> 12) * 1000 + ((bcd & 0xF0000) >> 16) * 10000; return decimal; } private void doModbusLoop() { while (!this.m_threadShouldStop) { if (!this.configured) { try { if (modbusProperties != null) { configureDevice(); // boolean[] ab=m_protocolDevice.readExceptionStatus(); // m_protocolDevice.writeSingleCoil( 2048, false); // int[] regs=m_protocolDevice.readHoldingRegisters(40000, 8); // for(int reg:regs) // s_logger.info(String.valueOf(reg)); // boolean[] ab=m_protocolDevice.readCoils(2048, 8); // for(boolean b:ab) // s_logger.info(String.valueOf(b)); initializeLeds(); } } catch (ModbusProtocolException e) { // s_logger.error(e.getMessage()); e.printStackTrace(); } } else { try { int[] analogInputs = this.m_protocolDevice.readInputRegisters(this.m_slaveAddr, 512, 8); int qc = bcd2Dec(analogInputs[7]); s_logger.info("qc = " + qc); } catch (ModbusProtocolException e) { e.printStackTrace(); } } try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } } this.m_threadShouldStop = false; s_logger.info("Sortie de doModbusLoop"); } private void configureDevice() throws ModbusProtocolException { if (this.m_protocolDevice != null) { this.m_protocolDevice.disconnect(); this.m_protocolDevice.configureConnection(modbusProperties); this.configured = true; } } private void initializeLeds() throws ModbusProtocolException { s_logger.debug("Initializing LEDs"); // once on startup, turn on each light for (int led = 1; led <= 6; led++) { this.m_protocolDevice.writeSingleCoil(this.m_slaveAddr, 2047 + led, true); try { Thread.sleep(200); } catch (Exception e) { e.printStackTrace(); } this.m_protocolDevice.writeSingleCoil(this.m_slaveAddr, 2047 + led, false); } } private Properties getModbusProperties() { Properties prop = new Properties(); if (isTCP) { prop.setProperty("connectionType", "ETHERTCP"); prop.setProperty("port", "502"); prop.setProperty("ipAddress", "192.168.1.3"); } else { if (this.m_properties != null) { String portName = null; String serialMode = null; String baudRate = null; String bitsPerWord = null; String stopBits = null; String parity = null; String ctopic = null; String Slave = null; if (this.m_properties.get("slaveAddr") != null) { Slave = (String) this.m_properties.get("slaveAddr"); } if (this.m_properties.get("port") != null) { portName = (String) this.m_properties.get("port"); } if (this.m_properties.get("serialMode") != null) { serialMode = (String) this.m_properties.get("serialMode"); } if (this.m_properties.get("baudRate") != null) { baudRate = (String) this.m_properties.get("baudRate"); } if (this.m_properties.get("bitsPerWord") != null) { bitsPerWord = (String) this.m_properties.get("bitsPerWord"); } if (this.m_properties.get("stopBits") != null) { stopBits = (String) this.m_properties.get("stopBits"); } if (this.m_properties.get("parity") != null) { parity = (String) this.m_properties.get("parity"); } if (this.m_properties.get("controlTopic") != null) { ctopic = (String) this.m_properties.get("controlTopic"); } prop.setProperty("connectionType", "SERIAL"); if (portName == null) { return null; } if (Slave == null) { Slave = "1"; } if (baudRate == null) { baudRate = "9600"; } if (stopBits == null) { stopBits = "1"; } if (parity == null) { parity = "0"; } if (bitsPerWord == null) { bitsPerWord = "8"; } if (ctopic == null) { ctopic = "/modbus/manager"; } prop.setProperty("port", portName); if (serialMode != null) { prop.setProperty("serialMode", serialMode); } prop.setProperty("exclusive", "false"); prop.setProperty("mode", "0"); prop.setProperty("slaveAddr", Slave); prop.setProperty("baudRate", baudRate); prop.setProperty("stopBits", stopBits); prop.setProperty("parity", parity); prop.setProperty("bitsPerWord", bitsPerWord); prop.setProperty("controlTopic", ctopic); } } return prop; } }