modbus远程jdom通信
2014-10-17 20:56
162 查看
public class FactoryBuilder { static ModbusMaster master; public FactoryBuilder(String type) { String ip=" "; int port=502; int refreshTime = 10000; String comm = " "; int baud = 0; int dataBits = 8; int stopBits = 1; int parity =0; try { /* Load Properties from file */ System.out.println("Loading communication settings..."); Properties props = new Properties(); props.load(new FileInputStream("communication.properties")); ip=props.getProperty("IP"); port=Integer.parseInt(props.getProperty("PORT")); comm=props.getProperty("COMM"); baud=Integer.parseInt(props.getProperty(" ")); dataBits=Integer.parseInt(props.getProperty("DATABITS")); stopBits=Integer.parseInt(props.getProperty("STOPBITS")); parity=Integer.parseInt(props.getProperty("PARITY")); }catch(IOException ex){ System.out.println("Problem opening communication.properties file"); } if(type.equals("ip")){ System.out.println("Connecting over IP to ("+ip+":"+port+")"); ModbusFactory factory = new ModbusFactory(); IpParameters params = new IpParameters(); params.setHost(ip); params.setPort(port); //params.setEncapsulated(true); master = factory.createTcpMaster(params, true); }else{ System.out.println("Connecting over serial port ("+comm+")"); ModbusFactory factory = new ModbusFactory(); SerialParameters params = new SerialParameters(); params.setCommPortId(comm); params.setBaudRate(baud); params.setDataBits(dataBits); params.setStopBits(stopBits); params.setParity(parity); master = factory.createRtuMaster(params); } }//FactoryBuilder() public ModbusMaster getMaster(){ return this.master; }//getMaster() }//Class FactoryBuilder
package com.client; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.code.DataType; import com.serotonin.modbus4j.code.RegisterRange; import com.serotonin.modbus4j.exception.ErrorResponseException; import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.exception.ModbusTransportException; import com.serotonin.modbus4j.msg.ModbusRequest; import com.serotonin.modbus4j.msg.ReadInputRegistersRequest; import com.serotonin.modbus4j.msg.ReadInputRegistersResponse; import com.serotonin.modbus4j.msg.WriteCoilRequest; import com.serotonin.modbus4j.msg.WriteRegisterRequest; public class TestMyServlet { static ModbusMaster master; static int node; static boolean color; static boolean modsenseRunning = false; public TestMyServlet() { String version = "3.51"; System.out.println("ModSense v" + version); } public static void main(String[] args) throws Exception { TestMyServlet clientRequest = new TestMyServlet(); clientRequest.machine(); Thread th = new Thread(); do { System.out.print("\nChecking Process Status..."); System.out.println(modsenseRunning); if (!modsenseRunning) { clientRequest.machine(); } th.sleep(100000); } while (true); } public void machine() throws Exception { // TestMyServlet clientRequest = new TestMyServlet(); modsenseRunning = true; /* Values to be set by properties file */ int refreshTime = 100000; String dbAddress = ""; String dbUser = ""; String dbPassword = ""; String dbName = ""; String connection = ""; int offsetBegin = 0; int offsetLength = 100; node = 1; color = true; String serial = ""; String pollOnly = ""; Thread th = new Thread(); try { System.out.println("Loading modsense settings..."); Properties props = new Properties(); props.load(new FileInputStream("modsense.properties")); refreshTime = Integer.parseInt(props.getProperty("REFRESH")); connection = props.getProperty("CONNECTION"); color = Boolean.parseBoolean(props.getProperty("COLOR")); node = Integer.parseInt(props.getProperty("UNITID")); dbName = props.getProperty("DBNAME"); dbAddress = props.getProperty("DBADDRESS"); dbUser = props.getProperty("DBUSER"); dbPassword = props.getProperty("DBPASSWORD"); serial = props.getProperty("SERIAL"); pollOnly = props.getProperty("POLLONLY"); offsetBegin = Integer.parseInt(props.getProperty("OFFSETBEGIN")); offsetLength = Integer.parseInt(props.getProperty("OFFSETLENGTH")); System.out.println("Establishing connection to device..."); FactoryBuilder fb = new FactoryBuilder(connection); master = fb.getMaster(); master.setTimeout(1000); master.setRetries(0); master.init(); } catch (FileNotFoundException e) { System.out.println("ERROR: Could not find properties file..."); modsenseRunning = false; master.destroy(); e.printStackTrace(); } catch (IOException e) { modsenseRunning = false; master.destroy(); e.printStackTrace(); } catch (ModbusInitException e) { System.out .println("ERROR: Could not establish connection to device..."); modsenseRunning = false; master.destroy(); e.printStackTrace(); } do { System.out.println("Beginning process..."); List<String> queryAllData = new ArrayList<String>(); List<String> updatedData = new ArrayList<String>(); query_update(queryAllData, updatedData, dbAddress, dbName, dbUser, dbPassword, serial); response_alldata(queryAllData, updatedData, dbAddress, dbName, dbUser, dbPassword, serial); th.sleep(refreshTime); } while (modsenseRunning); } public void query_update(List queryAllData, List updatedData, String dbAddress, String dbName, String dbUser, String dbPassword, String serial) { Document document = DocumentHelper.createDocument(); Element rootElement = document.addElement("request"); /* * Element typeElement = rootElement.addElement("type"); * typeElement.setText("query"); */ // 以下部分从附件取得 Element dbname = rootElement.addElement("dbname"); dbname.setText(dbName); Element dbuser = rootElement.addElement("dbuser"); dbuser.setText(dbUser); Element dbpassword = rootElement.addElement("dbpassword"); dbpassword.setText(dbPassword); Element serialElement = rootElement.addElement("serial"); serialElement.setText(serial); HttpURLConnection http; System.out .println("----------------发送查询请求的plc/sending query update request----------------"); System.out.println(document.asXML()); try { URL urls = new URL("http://" + dbAddress + "/customplatform/test"); http = (HttpURLConnection) urls.openConnection(); http.setDoOutput(true); http.setDoInput(true); http.setRequestMethod("POST"); DataOutputStream out = new DataOutputStream(http.getOutputStream()); XMLWriter writer = new XMLWriter(out); writer.write(document); writer.close(); out.flush(); System.out .println("----------------接收服务器反馈的更新数据和所有数据地址/receiving updating data and all address----------------"); InputStream resp_in = http.getInputStream(); SAXReader saxReader = new SAXReader(); InputStreamReader resp_strInStream = new InputStreamReader(resp_in, "UTF-8"); Document resp_document = saxReader.read(resp_strInStream); Element resp_root = resp_document.getRootElement(); Iterator resp_lv = resp_root.elementIterator("update-item"); Element resp_el = null; while (resp_lv.hasNext()) {// 循环获得需要更新的address和value: resp_el = (Element) resp_lv.next(); System.out.println(resp_el.elementText("address") + ":" + resp_el.elementText("value")); // if mb if mi if ml, 不同类型的address 在这里分类 if ((resp_el.elementText("address")).substring(0, 2).equals( "MB")) { if (writeCoilToAddress(resp_el.elementText("address"), resp_el.elementText("value"))) { updatedData.add(resp_el.elementText("address")); // 如果修改成功,把数据放入修改成功的数组里面 } } else if ((resp_el.elementText("address")).substring(0, 2) .equals("MI")) { if (writeHoldingToAddress(resp_el.elementText("address"), resp_el.elementText("value"))) { updatedData.add(resp_el.elementText("address")); } } else if ((resp_el.elementText("address")).substring(0, 2) .equals("ML")) { if (writeRegisterToAddress(resp_el.elementText("address"), resp_el.elementText("value"))) { updatedData.add(resp_el.elementText("address")); } } } Iterator resp_lv2 = resp_root.elementIterator("query-item"); Element resp_el2 = null; while (resp_lv2.hasNext()) { resp_el2 = (Element) resp_lv2.next(); queryAllData.add(resp_el2.elementText("address")); } } catch (Exception ex) { ex.printStackTrace(); } } public void response_alldata(List queryAllData, List updatedData, String dbAddress, String dbName, String dbUser, String dbPassword, String serial) { Document document = DocumentHelper.createDocument(); Element rootElement = document.addElement("feedback"); Element dbname = rootElement.addElement("dbname"); dbname.setText(dbName); Element dbuser = rootElement.addElement("dbuser"); dbuser.setText(dbUser); Element dbpassword = rootElement.addElement("dbpassword"); dbpassword.setText(dbPassword); Element serialElement = rootElement.addElement("serial"); serialElement.setText(serial); Map resp_alldata = new HashMap(); for (int i = 0; i < queryAllData.size(); i++) { // String value=getAddressValue(queryAllData[k]); // String value = "x";// 从Plc读出来的 String value = getAddressValue((String) queryAllData.get(i)); resp_alldata.put(queryAllData.get(i), value); } Iterator iter = resp_alldata.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String address = (String) entry.getKey(); String val = (String) entry.getValue(); Element element = rootElement.addElement("response-item"); Element addressElement = element.addElement("address"); Element valueElement = element.addElement("value"); addressElement.setText(address); valueElement.setText(val); } for (int i = 0; i < updatedData.size(); i++) { Ele 9505 ment element = rootElement.addElement("updated-item"); Element addressElement = element.addElement("address"); addressElement.setText((String) updatedData.get(i)); } System.out .println("--------------发送所有plc数据的xml/sending all address value--------------"); System.out.println(document.asXML()); HttpURLConnection http; try { URL urls = new URL("http://" + dbAddress + "/customplatform/test"); http = (HttpURLConnection) urls.openConnection(); http.setDoOutput(true); http.setDoInput(true); http.setRequestMethod("POST"); DataOutputStream out = new DataOutputStream(http.getOutputStream()); XMLWriter writer = new XMLWriter(out); writer.write(document); writer.close(); out.flush(); String resp = ""; java.io.BufferedReader breader = new BufferedReader( new InputStreamReader(http.getInputStream(), "UTF-8")); String str = breader.readLine(); while (str != null) { resp += str; str = breader.readLine(); } System.out.println("resp=" + resp); } catch (Exception e) { e.printStackTrace(); } } public static boolean writeCoilToAddress(String address, String value) { int addressOffset = Integer.parseInt(address.substring(2)); boolean boolValue = Boolean.parseBoolean(value); return writeMI(addressOffset, boolValue); } public static boolean writeMI(int offset, boolean value) { try { ModbusRequest req = new WriteCoilRequest(node, offset, value); master.send(req); return true; } catch (ModbusTransportException ex) { return false; } } public static boolean writeHoldingToAddress(String address, String value) { int addressOffset = Integer.parseInt(address.substring(2)); int intValue = Integer.parseInt(value); return writeHolding(addressOffset, intValue); } public static boolean writeRegisterToAddress(String address, String value) { int addressOffset = Integer.parseInt(address.substring(2)); int intValue = Integer.parseInt(value); return writeRegister(addressOffset, intValue); } public static boolean writeHolding(int offset, int value) { try { ModbusRequest req = new WriteRegisterRequest(node, offset, value); master.send(req); return true; } catch (ModbusTransportException ex) { return false; } } public static boolean writeRegister(int offset, int value) { if (color) { offset = offset + 0x7000; } else { offset = 5100 + (offset * 2); } try { ModbusRequest req = new WriteRegisterRequest(node, offset, value); master.send(req); return true; } catch (ModbusTransportException ex) { return false; } } public static String getAddressValue(String address) { int addressOffset = Integer.parseInt(address.substring(2)); if (address.substring(0, 2).equals("MB")) { return readCoil(addressOffset); } else if (address.substring(0, 2).equals("MI")) { return readHoldingRequest(addressOffset); } else if (address.substring(0, 2).equals("ML")) { return readRegisterRequest(addressOffset); } else { return null; } } public static String readCoil(int offset) { try { Object ob = master.getValue(node, RegisterRange.COIL_STATUS, offset, 1); return ob.toString(); } catch (ModbusTransportException ex) { System.out.println("Problem reading " + offset); return "coilerror"; } catch (ErrorResponseException ex) { System.out.println("Error response in " + offset); return "coilerror"; } } public static String readHoldingRequest(int offset) { try { Object ob = master.getValue(node, RegisterRange.HOLDING_REGISTER, offset, DataType.TWO_BYTE_INT_SIGNED); return ob.toString(); } catch (ModbusTransportException ex) { System.out.println("Problem reading " + offset); return "holdingerror"; } catch (ErrorResponseException ex) { System.out.println("Error response in " + offset); return "holdingerror"; } } public static String readRegisterRequest(int offset) { if (color) { offset = offset + 0x7000; } else { offset = 5100 + (offset * 2); } try { ModbusRequest req = new ReadInputRegistersRequest(node, offset, 2); ReadInputRegistersResponse rep = (ReadInputRegistersResponse) master .send(req); return Short.toString(rep.getShortData()[0]);// +Short.toString(rep.getShortData()[1]); } catch (ModbusTransportException ex) { System.out.println("Problem reading long...(" + offset + ")"); return "error"; } } }
相关文章推荐
- JavaScript/jQuery、HTML、CSS 构建 Web IM 远程及时聊天通信程序
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- ModBus通信协议
- 使用C#+Web+硬件实现远程控制的实现(物联网通信)
- Modbus通信协议 【 初识 Modbus】
- 远程通信之Dubbo架构分析与使用方式介绍
- 一个端口可以和多个远程端口通信
- 基于套接字通信的远程截屏显示与控制技术
- 使用Socket实现远程通信
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- 03_ACS550变频器RS485Modbus通信-CRC校验
- Modbus RTU 通信工具设计
- Modbus RTU 通信工具设计(转)
- 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题
- [远程测控通信]基于DataSocket的电台网络化远程测控系统
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- Avro入门1–序列化与远程通信
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- Web IM 远程及时聊天通信程序(2)