亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? opcconnector.java

?? 用于串口通訊測試的工具軟件。完全使用java語言編寫。
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package com.zcsoft.opc;

/**
 * <p>Title: 現場總線通訊 </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005-2006</p>
 * <p>Company: Zhicheng Software&Service Co. Ltd.</p>
 * @author 蔣智湘
 * @version 1.0
 */
import java.util.*;
import java.net.*;
import java.io.*;

/**
 * 同OPC控制中心應用程序(OpcCtrl.exe)進行控制通訊的連接類
 * 使用方法示例:
 * <pre>
 *    OpcConnector oc = new OpcConnector();
 *    oc.setProtocol("S7");
 *    oc.setTopic("demo");
 *    Item item1 = new Item();
 *    item1.setID("DB101,DBB1,1");
 *    Item item2 = new Item();
 *    item2.setID("DB101,DBB2,1");
 *    ...
 *    ItemGroup ig1 = new ItemGroup();
 *    ig1.setName("grp1");
 *    ig1.addItem(item1);
 *    ig1.addItem(item2);
 *    ...
 *    oc.addGroup(ig1);
 *    ...
 *    oc.connect();
 * </pre>
 * 當前版本支持的最大加入的變量組的個數上限為32765。對于組上的變量個數的上限也是32765。
 *
 */
public class OpcConnector implements Runnable, CommandSent
{

	/** 通信協議,如S7。該屬性值將作為實際變量名的一部分 */
	private String protocol;
	/** 通信主題,或應用程序名。該屬性值將作為實際變量名的一部分 */
	private String topic;
	/** 是否已經同OPC控制中心建立好了連接 */
	private boolean connected = false;
	/** 所有數據項組的集合 */
	private List groups = new ArrayList(6);
	/** OPC控制中心程序所在機器的IP地址 */
	private InetAddress hostRequest;
	/** OPC控制中心程序接收控制請求的TCP端口 */
	private int portRequest = 8089;
	/** 接收UDP報文的線程 */
	private Thread threadRcv;
	/** 接收OPC控制中心程序發送過來的UDP報文的套接字 */
	private DatagramSocket socketRcvUDP;

	/**
	 * 構造一個在8087端口上監聽UDP報文的實例
	 */
	public OpcConnector() throws SocketException
	{
		this(8087);
	}

	/**
	 *
	 * @param portReceive 該實例使用哪個本機端口接收控制中心發送過來的UDP通知報文
	 */
	public OpcConnector(int portReceive) throws SocketException
	{
		socketRcvUDP = new DatagramSocket(portReceive);
		threadRcv = new Thread(this);
		threadRcv.start();
	}

	public void run()
	{
		byte[] buffer;
		try
		{
			buffer = new byte[Math.min(4096, socketRcvUDP.getReceiveBufferSize())];
		}
		catch (SocketException ex)
		{
			ex.printStackTrace();
			return;
		}
		while (true)
		{
			try
			{
				DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
				socketRcvUDP.receive(dp);
				int readed = dp.getLength();
				int offset = dp.getOffset();
				byte[] data = dp.getData();
				byte firstByte = data[offset++];
				if (firstByte == 'C')//最頻繁出現的數值變化通知
				{
					dataChanged(data, offset, readed - 1);
				}
				else if (firstByte == 'W')//異步寫完成
				{
					writeCompleted(data, offset, readed - 1);
				}
				else if (firstByte == 'R')//異步讀完成
				{
					dataChanged(data, offset, readed - 1);
				}
				else if(firstByte == 'E'//OPC控制中心退出
					&&	bytesABeginWithB(data, offset, new byte[]{'x', 'i', 't'}))
				{
					connected = false;
				}
				else if(firstByte == 'S'//OPC控制中心重新啟動了,就再連上它
					&&	bytesABeginWithB(data, offset, new byte[]{'t', 'a', 'r', 't', 'u', 'p'}))
				{
					try
					{
						connectGroups(groups.size(), true);
					}
					catch (IOException ex)
					{
						ex.printStackTrace();
					}
				}
				else if (firstByte == 'N')//異步操作取消執行完成通知
				{
				}
				else
				{
					System.err.println("Unknown packet");
				}
			}
			catch (IOException ex)
			{
				System.err.println(ex);
				break;
			}
			catch (Exception ex)
			{
				ex.printStackTrace();
			}
		}
		threadRcv = null;
	}

	/**
	 * 判定字節數組A的前B.length各字節同字節數組B的對應字節相同
	 */
	static boolean bytesABeginWithB(byte[] A, int offset, byte[] B)
	{
		if (A.length - offset < B.length) return false;
		for (int i = 0; i < B.length; i++)
		{
			if (A[offset + i] != B[i]) return false;
		}
	  return true;
	}

	public void setProtocol(String protocol)
	{
		checkStatus();
		this.protocol = protocol;
	}

	public void setTopic(String topic)
	{
		checkStatus();
		this.topic = topic;
	}

	/**
	 * 在連接前添加一個變量值實例。
	 *
	 * @param aGroup 不為null的ItemGroup實例
	 */
	public final void addGroup(ItemGroup aGroup)
	{
		checkStatus();
		aGroup.cmdSentHook = this;
		this.groups.add(aGroup);
	}

	private void checkStatus() throws IllegalStateException
	{
		if (connected)
		{
			throw new IllegalStateException("connected");
		}
	}

	/**
	 * 建立本實例同OPC控制中心之間的連接。
	 * @throws IOException 連接過程可能出現的套接字IO異常
	 */
	public void connect() throws IOException
	{
		if (this.topic == null)
		{
			throw new IllegalStateException("Not specify topic");
		}
		if (this.protocol == null)
		{
			throw new IllegalStateException("Not specify protocol");
		}
		int cntGroups = groups.size();
		if (cntGroups == 0)
		{
			throw new OpcException("none group");
		}

		ItemGroup ig;
		int groupIndex;
		//首先查詢組是否被加入
		TcpConnection conn = getConnection();
		conn.writeHeader("Q?" + DELIMETER + cntGroups);
		for (groupIndex = 0; groupIndex < cntGroups; groupIndex++)
		{
			ig = (ItemGroup)groups.get(groupIndex);
			conn.writeHeader(ig.getName());
		}
		//conn.flushHeanders();
		String hdr = conn.readHeader();
		int index = getResultCode(hdr);
		int cntGroupsNoFounded = 0;
		if (index == -1)
		{
			cntGroupsNoFounded = cntGroups;
		}
		else if (index == 0)
		{
			for (groupIndex = 0; (hdr = conn.readHeader()) != null && groupIndex < cntGroups; groupIndex++)
			{
				ig = (ItemGroup)groups.get(groupIndex);
				ig.index = index = Integer.parseInt(hdr);
//				debug(ig.getName() + "->index = " + index);
				if (index < 0)	++cntGroupsNoFounded;//累加未加入的組
				//else 記錄已經加入的組,準備調用刷新操作
			}
		}
		else
		{
			conn.close();
			throw new OpcException(hdr);
		}
		conn.close();

		//如果存在已經加入的組,則刷新變量值
		if (cntGroupsNoFounded != cntGroups)
		{
			refreshGroups();
		}

		//如果還有沒加入組,則嘗試加入
		if (cntGroupsNoFounded > 0)
		{
			connectGroups(cntGroupsNoFounded, false);
		}
		connected = true;
	}

	public TcpConnection getConnection() throws IOException
	{
		if (hostRequest == null) hostRequest = InetAddress.getByName(null);
		return new TcpConnection(hostRequest, portRequest);
	}

	/**
	 * 將變量組加到OPC控制中心
	 * @param cntGroupsToConnect 待連接的組的個數
	 * @param refresh 是否對那些已經確定索引值的組的索引值進行再確定
	 */
	void connectGroups(int cntGroupsToConnect, boolean refresh) throws IOException
	{
		TcpConnection conn = getConnection();
		String header;
		header = "AD" + DELIMETER + cntGroupsToConnect +  DELIMETER + this.socketRcvUDP.getLocalPort();
		conn.writeHeader(header);
		//System.out.println(header);
		String idPrefix = this.protocol + ":[" + this.topic + "]";
		Item item;
		int itemIndex, itemCount;
		int groupIndex, cntGroups = groups.size();
		ItemGroup ig;
		for (groupIndex = 0; groupIndex < cntGroups; groupIndex++)
		{
			ig = (ItemGroup)groups.get(groupIndex);
			if (!refresh && ig.index != -1) continue;
			itemCount = ig.itemCount();
			header = ig.getName() + DELIMETER + 'D'//(ig.isActive()?'A':'D')
			//只能在加入后單獨設定激活狀態才有效。不然在這個方法還沒有執行完成前,就收到了dataChanged報文
			//此時getGroupAt(int)很可能返回null
								+ DELIMETER + itemCount
								+ DELIMETER + ig.getUpdateRate();
			conn.writeHeader(header);
			//System.out.println("\t" + header);
			for (itemIndex = 0; itemIndex < itemCount; itemIndex++)
			{
				item = ig.getItem(itemIndex);
				header = idPrefix.concat(item.ID)
									  + DELIMETER + (item.active?'A':'D')
									  + DELIMETER + item.value.vt;
				conn.writeHeader(header);
				//System.out.println("\t\t" + header);
			}
		}
		//conn.flushHeanders();
		String hdr = conn.readHeader();
		if (getResultCode(hdr) != 0)
		{
			conn.close();
			throw new OpcException(hdr);
		}
		for (groupIndex = 0; groupIndex < cntGroups; groupIndex++)
		{
			ig = (ItemGroup)groups.get(groupIndex);
			if (!refresh && ig.index != -1) continue;
			hdr = conn.readHeader();
			if (hdr != null)
			{
				ig.index = Integer.parseInt(hdr);
//				debug(ig.getName() + ".index = " + ig.index);
			}
		}
		conn.close();
		//激活實際需要激活的變量組
		activateGroups();
	}


	void activateGroups() throws IOException
	{
		int groupIndex, cntGroups = groups.size();
		ItemGroup ig;
		TcpConnection conn = getConnection();
		conn.writeHeader("AC A" + DELIMETER + cntGroups);
		for (groupIndex = 0; groupIndex < cntGroups; groupIndex++)
		{
			ig = (ItemGroup)groups.get(groupIndex);
			if (ig.index >= 0 && ig.isActive())

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区色| 亚洲欧美一区二区不卡| 国产成人精品亚洲777人妖 | 粉嫩蜜臀av国产精品网站| 亚洲成人黄色小说| 亚洲蜜臀av乱码久久精品蜜桃| 日日夜夜免费精品| 视频在线观看一区| 91一区二区在线| 日本黄色一区二区| 99精品视频在线观看免费| 北条麻妃一区二区三区| 99视频一区二区| 亚洲一线二线三线视频| 一区二区三区四区乱视频| 亚洲一区二区三区不卡国产欧美| 国产精品正在播放| 91在线观看成人| 国产婷婷色一区二区三区| 国产精品美女www爽爽爽| 国产精品福利电影一区二区三区四区 | 日韩天堂在线观看| 欧美α欧美αv大片| 久久中文娱乐网| 国产精品污污网站在线观看| 麻豆精品国产传媒mv男同| 国产一区 二区| 91视频免费播放| 中文字幕在线观看不卡视频| 亚洲妇熟xx妇色黄| 国产精品系列在线观看| 精品久久国产字幕高潮| 免费国产亚洲视频| 色综合视频一区二区三区高清| 欧美三级乱人伦电影| 精品日韩一区二区三区| 蜜臀99久久精品久久久久久软件| 欧美理论在线播放| 中文一区一区三区高中清不卡| 一区二区三区日韩精品视频| 一本大道av伊人久久综合| 亚洲视频一区在线观看| 精品一区二区三区蜜桃| 色综合一个色综合亚洲| 久久久久久免费网| 午夜精品久久一牛影视| gogo大胆日本视频一区| 亚洲黄色性网站| 成熟亚洲日本毛茸茸凸凹| 欧美精品第1页| 免费看精品久久片| 国产欧美日韩在线观看| 玖玖九九国产精品| 欧美三级视频在线观看| 三级在线观看一区二区| 日韩欧美国产系列| 亚洲成人av中文| 精品国产乱码久久久久久老虎| 亚洲一区二区在线免费看| 9191精品国产综合久久久久久 | 日韩欧美黄色影院| 国产成人自拍网| 亚洲欧美国产77777| 91精品黄色片免费大全| 国产久卡久卡久卡久卡视频精品| 亚洲欧美国产三级| 日韩免费看的电影| 99久久99久久精品免费看蜜桃| 亚洲福中文字幕伊人影院| 久久精品男人的天堂| 色婷婷国产精品久久包臀| 麻豆91精品91久久久的内涵| 中文字幕国产一区| 日韩一二三区视频| 一本高清dvd不卡在线观看| 久久99精品一区二区三区三区| 国产精品美女一区二区三区| 欧美福利电影网| 成人av网站在线观看| 中文字幕精品—区二区四季| 欧美精品xxxxbbbb| 成人久久久精品乱码一区二区三区| 亚洲一区二区三区四区在线观看 | 亚洲精品第1页| 久久久久国产精品麻豆 | a级精品国产片在线观看| 婷婷成人激情在线网| 国产精品少妇自拍| 欧美精品一区二区三| 欧美色手机在线观看| 不卡一区在线观看| 经典一区二区三区| 日欧美一区二区| 一区二区三区免费观看| 中文字幕欧美日韩一区| 久久蜜桃一区二区| 欧美电视剧免费观看| 欧美三级日韩三级| 欧美中文字幕一区| 蜜乳av一区二区| 亚洲另类在线一区| 中文字幕一区二区5566日韩| 精品国产一区二区亚洲人成毛片| 69p69国产精品| 欧美天堂一区二区三区| 看片网站欧美日韩| 日韩在线一区二区三区| 一区二区三区四区在线播放| 日韩一区在线看| 国产欧美一区视频| 欧美国产亚洲另类动漫| 久久美女艺术照精彩视频福利播放 | 久久精品一区二区三区四区| 日韩午夜中文字幕| 91精品国产丝袜白色高跟鞋| 欧美久久久久久久久久| 欧美撒尿777hd撒尿| 欧美日韩中文国产| 欧美另类一区二区三区| 欧美一区欧美二区| 欧美v亚洲v综合ⅴ国产v| 欧美一级国产精品| 精品欧美一区二区三区精品久久 | 国产一区二区调教| 韩国三级中文字幕hd久久精品| 亚洲欧美日韩综合aⅴ视频| 亚洲视频一区二区在线| 亚洲欧美激情视频在线观看一区二区三区| 中文字幕亚洲在| 亚洲综合精品久久| 奇米精品一区二区三区在线观看一| 日韩中文欧美在线| 狠狠色丁香婷综合久久| 国产成人夜色高潮福利影视| 成人av片在线观看| 在线影院国内精品| 欧美一级专区免费大片| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 免费观看一级特黄欧美大片| 免费人成在线不卡| 国产乱码精品一区二区三区忘忧草 | 中文字幕精品—区二区四季| 亚洲免费观看在线视频| 天天综合色天天综合色h| 久久99最新地址| 99视频超级精品| 7777精品伊人久久久大香线蕉超级流畅| 精品国精品国产| 亚洲九九爱视频| 麻豆91在线观看| www.视频一区| 91精品国产91久久久久久一区二区 | 国产精品美女久久久久久2018| 一区二区三区中文在线| 经典一区二区三区| 色婷婷精品大在线视频| 久久综合丝袜日本网| 亚洲自拍另类综合| 国产精品1区二区.| 欧美日韩精品电影| 一本久道中文字幕精品亚洲嫩| 91精品国产色综合久久| 国产精品视频第一区| 日本免费在线视频不卡一不卡二| 一区二区三区视频在线观看| 久久99精品视频| 欧美视频一区在线观看| 国产精品无遮挡| 蜜桃视频第一区免费观看| 91久久线看在观草草青青| 久久久久久免费毛片精品| 视频在线观看一区| 色妞www精品视频| 国产嫩草影院久久久久| 精品无人码麻豆乱码1区2区| 欧美日韩精品一区二区天天拍小说| 国产精品日日摸夜夜摸av| 国产一区二区伦理| 91精品国产综合久久福利软件| 自拍偷拍国产精品| 国产精品1区2区| 亚洲人成小说网站色在线 | 美日韩一级片在线观看| 欧美主播一区二区三区| 国产精品国产三级国产普通话蜜臀 | 亚洲欧洲成人av每日更新| 韩国理伦片一区二区三区在线播放| 欧美午夜视频网站| 亚洲天堂免费在线观看视频| 国产精品夜夜嗨| 久久只精品国产| 久久99精品一区二区三区| 欧美一级在线视频| 日韩精品免费专区| 欧美性猛交xxxxxx富婆| 一区二区三区在线观看国产| 一本一道久久a久久精品| 中文字幕一区不卡| 91色|porny| 亚洲激情网站免费观看|