You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2894 lines
106 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Data.SqlClient;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Globalization;
using UPPLibs;
using RemoteObjects;
using System.Diagnostics;
using System.ServiceProcess;
namespace CommService
{
/*
*TCPServer
*
*2010-10-30
*
*/
class TCPServer
{
private int srvport;
private bool listenloop;
private Thread tListenner;
private IPAddress ipadd;
private static List<TCPHandler> TCPHandlerList = new List<TCPHandler>();
//private static Hashtable TCPHandlerTable = new Hashtable();
private static Mutex mut = new Mutex();
//private struRequestInQueue sCurrentReq;
private uint unTimeingCount = 0;
private string connectString = Common.configReader.sConnectString;
private DateTime dtPoint;
private DateTime dtPointBegin;
private DateTime dtPointEnd;
public bool bPointCollect = false;
private Mutex mutForHistoryData = new Mutex();
private Hashtable htRecordForHistoryData = new Hashtable();
private int nDaysofHistoryData = 7;
private Hashtable htOnline = new Hashtable();
private Mutex mutForOnline = new Mutex();
private int nOffLineHours;
/*
*RefreshHeartBeat
*
*2010-10-30
*string sTID ID
*void
*线
*/
public void RefreshHeartBeat(string sTID)
{
mutForOnline.WaitOne();
if (htOnline.ContainsKey(sTID) == false)
{
htOnline.Add(sTID, DateTime.Now);
}
else
{
htOnline[sTID] = DateTime.Now;
}
mutForOnline.ReleaseMutex();
}
/*
*CheckOnline
*
*2010-10-30
*void
*void
*线
*/
private void CheckOnline()
{
string sTID = "";
DateTime dtNow = DateTime.Now;
TimeSpan ts = new TimeSpan();
bool res = false;
mutForOnline.WaitOne();
foreach (DictionaryEntry de in htOnline)
{
ts = dtNow - (DateTime)de.Value;
//达到告警时限
if (ts.Hours >= nOffLineHours)
{
sTID = (string)de.Key;
htOnline.Remove(de.Key);
res = true;
break;
}
}
mutForOnline.ReleaseMutex();
//存库
if (res == true)
{
MessageHandler messageHandler = new MessageHandler(null);
messageHandler.SaveOffLineWarning(sTID, ts.Hours);
}
}
/*
*ReplaceSameClient
*
*2010-10-30
*string clientName ID
*void
*
*/
public void ReplaceSameClient(string clientName)
{
//lock
mut.WaitOne();
if (TCPHandlerList.Count > 0)
{
TCPHandlerList.ForEach(delegate(TCPHandler tcpHandler)
{
if (tcpHandler.tName == clientName)
{
tcpHandler.SetReplaceFlag(true);
tcpHandler.Close();
Common.logFile.write("[" + clientName + "] " + "连接被一个同名的终端取代", LogFile.LOGLVL_NORMAL);
return;
}
});
}
//unlock
mut.ReleaseMutex();
}
/*
*AddTCPHandler
*
*2010-10-30
*TCPHandler tcpHandler
*void
*
*/
public void AddTCPHandler(TCPHandler tcpHandler)
{
//lock
mut.WaitOne();
//add
TCPHandlerList.Add(tcpHandler);
//unlock
mut.ReleaseMutex();
}
/*
*RemoveTCPHandler
*
*2010-10-30
*TCPHandler tcpHandler
*void
*
*/
public void RemoveTCPHandler(TCPHandler tcpHandler)
{
//lock
mut.WaitOne();
//remove
TCPHandlerList.Remove(tcpHandler);
//unlock
mut.ReleaseMutex();
}
//
/*
*TCPServer
*
*2010-10-30
*string ip IP, int port
*void
*TCPServer
*/
public TCPServer(string ip, int port)
{
srvport = port;
listenloop = true;
ipadd = IPAddress.Parse(ip);
Common.logFile.write("TCPServer 初始化," + ip + " " + port, LogFile.LOGLVL_NORMAL);
nOffLineHours = Common.configReader.nOffLineHours;
if (nOffLineHours < 1)
{
nOffLineHours = 1;
}
else if (nOffLineHours > 24)
{
nOffLineHours = 24;
}
UpdateNewTimePoint();
}
/*
*UpdateNewTimePoint
*
*2010-10-30
*void
*void
*55
*/
private void UpdateNewTimePoint()
{
DateTime dtNow = DateTime.Now;
dtPoint = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, 0, 0);
dtPoint = dtPoint.AddHours(1);
dtPointBegin = dtPoint.AddSeconds(-55);
dtPointEnd = dtPoint.AddSeconds(55);
UpdateNewTimePointForHistoryData();
}
/*
*UpdateNewTimePointForHistoryData
*
*2010-10-30
*void
*void
*
*/
private void UpdateNewTimePointForHistoryData()
{
try
{
DateTime dtNow = DateTime.Now;
DateTime dtPoint = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, 0, 0);
dtPoint = dtPoint.AddHours(1);
mutForHistoryData.WaitOne();
if (htRecordForHistoryData.Count >= nDaysofHistoryData * 24)
{
//加入最新时间点
htRecordForHistoryData.Add(dtPoint, new Hashtable());
Common.logFile.write("维护历史数据整点列表,添加:" + dtPoint, LogFile.LOGLVL_DEBUG);
//去掉时间点最早的一个
dtPoint = dtPoint.AddHours(-nDaysofHistoryData * 24);
htRecordForHistoryData.Remove(dtPoint);
Common.logFile.write("维护历史数据整点列表,移除:" + dtPoint, LogFile.LOGLVL_DEBUG);
}
else if (htRecordForHistoryData.Count == 0)
{
htRecordForHistoryData.Add(dtPoint, new Hashtable());
for (int i = 0; i < (nDaysofHistoryData * 24 - 1); i++)
{
dtPoint = dtPoint.AddHours(-1);
htRecordForHistoryData.Add(dtPoint, new Hashtable());
}
Common.logFile.write("初始化历史数据整点列表,整点数量:" + htRecordForHistoryData.Count, LogFile.LOGLVL_DEBUG);
}
//nDaysofHistoryData
mutForHistoryData.ReleaseMutex();
}
catch (Exception e1)
{
Common.logFile.write("UpdateNewTimePointForHistoryData出现例外Exception:" + e1, LogFile.LOGLVL_ERROR);
}
}
/*
*QueryTimePointForHistoryData
*
*2010-10-30
*string sHistoryData , string sMeterID
*bool true false
*
*/
public bool QueryTimePointForHistoryData(string sHistoryData, string sMeterID)
{
bool res = false;
try
{
IFormatProvider culture = new CultureInfo("zh-CN", true);
if (sHistoryData.Length == 21)
{
sHistoryData = sHistoryData.Substring(1, 19);
}
DateTime dtHistoryData = DateTime.Parse(sHistoryData, culture);
mutForHistoryData.WaitOne();
//htRecordForHistoryData
foreach (DictionaryEntry de in htRecordForHistoryData)
{
DateTime dtKey = (DateTime)de.Key;
if (dtHistoryData >= dtKey.AddSeconds(-55) && dtHistoryData <= dtKey.AddSeconds(55))
{
Hashtable ht = (Hashtable)de.Value;
if (ht.ContainsKey(sMeterID) == false)
{
res = true;
ht.Add(sMeterID, null);
}
break;
}
}
mutForHistoryData.ReleaseMutex();
}
catch (Exception e1)
{
Common.logFile.write("QueryTimePointForHistoryData产生例外Exception" + e1.ToString(), LogFile.LOGLVL_ERROR);
}
return res;
}
/*
*ListenThreadProc
*
*2010-10-30
*void
*void
*线
*/
public void ListenThreadProc()
{
Common.logDebugFile.write("=====ListenThreadProc 启动...", LogFile.LOGLVL_NORMAL);
listenloop = true;
Hashtable props = new Hashtable();
props.Add("useIpAddress", true);
props.Add("bindTo", Common.configReader.sRemotingIP);
props.Add("port", Common.configReader.nRemotingPort.ToString());
MessageHandler m = new MessageHandler();
MessageHandler.htEParams=new Hashtable();
//暂时不进行初始化
//while (MessageHandler.htEParams.Count == 0)
//{
// Thread.Sleep(30000);
// m.Init();
//}
Common.logDebugFile.write("进入监听循环...", LogFile.LOGLVL_NORMAL);
while (listenloop)
{
TcpListener tcpListener = null;
try
{
Common.logDebugFile.write("初始化TcpListener...", LogFile.LOGLVL_NORMAL);
tcpListener = new TcpListener(ipadd, srvport);
// Start listening for client requests
Common.logDebugFile.write("启动TcpListener...", LogFile.LOGLVL_NORMAL);
tcpListener.Start();
//props.Add( "exclusiveAddressUse", "false" );
TcpServerChannel channel = new TcpServerChannel(props, null);
//TcpServerChannel channel = new TcpServerChannel(Common.configReader.nRemotingPort);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObjects.ReqHandler),
"RemoteObject", WellKnownObjectMode.SingleCall);
//Enter the listening loop
Common.logDebugFile.write("进入连接循环...", LogFile.LOGLVL_NORMAL);
while (listenloop)
{
// Perform a blocking call to accept requests.
// You could also user server.AcceptSocket() here.
TcpClient client = null;
try
{
if (tcpListener.Pending() == false)
{
Thread.Sleep(500);
continue;
}
//Common.logDebugFile.write("1-等待连接请求...1-2-3", LogFile.LOGLVL_NORMAL);
client = tcpListener.AcceptTcpClient();
//Common.logDebugFile.write("2-建立新连接...", LogFile.LOGLVL_NORMAL);
TCPHandler tcpHandler = new TCPHandler(client);
tcpHandler.SetTimeOut(Common.configReader.nTerminalTimeOut);
tcpHandler.Start();
AddTCPHandler(tcpHandler);
//Common.logDebugFile.write("3-建立新连接完成。\r\n\r\n", LogFile.LOGLVL_NORMAL);
//if (count >= 5)
//{
// tcpListener.Stop();
// break;
//}
//count++;
}
catch (Exception e2)
{
Common.logErrFile.write("监听程序 e2---SocketException: " + e2.ToString(), LogFile.LOGLVL_ERROR);
if (listenloop == false)
{
break;
}
Thread.Sleep(1000);
}
}
//if (tcpListener != null)
//{
// tcpListener.Stop();
//}
}
catch (Exception e1)
{
Common.logErrFile.write("监听程序 e1---Exception: " + e1.ToString(), LogFile.LOGLVL_ERROR);
if (listenloop == true)
{
Thread.Sleep(5000);
}
}
}
Common.logDebugFile.write("<<<<<<监听程序 退出>>>>>>>>", LogFile.LOGLVL_NORMAL);
}
/*
*Start
*
*2010-10-30
*void
*void
*线
*/
public void Start()
{
//start listening thread
//Thread.Sleep(60000);
tListenner = new Thread(new ThreadStart(ListenThreadProc));
tListenner.IsBackground = true;
tListenner.Start();
Common.logSystemFile.write("启动侦听 成功", LogFile.LOGLVL_NORMAL);
}
/*
*Stop
*
*2010-10-30
*void
*void
*线
*/
public void Stop()
{
Common.logFile.write("停止侦听,处理中...", LogFile.LOGLVL_NORMAL);
listenloop = false;
//tcpListener.Stop();
TCPHandler tw = null;
bool loop = true;
while (loop)
{
loop = false;
tw = null;
//lock
mut.WaitOne();
if (TCPHandlerList.Count > 0)
{
tw = TCPHandlerList.ElementAt(0);
loop = true;
tw.stoped = true;
}
//unlock
mut.ReleaseMutex();
if (tw != null)
{
tw.Close();
tw.tWorker.Join();
}
}
TCPHandlerList.Clear();
//tListenner.Join();
Common.logFile.write("停止侦听 成功", LogFile.LOGLVL_NORMAL);
}
/*
*GetTCPHandler
*
*2010-10-30
*int hashCode
*TCPHandler
*
*/
public TCPHandler GetTCPHandler(int hashCode)
{
TCPHandler tcpHandler = null;
//lock
mut.WaitOne();
TCPHandlerList.ForEach(delegate(TCPHandler name)
{
if (name.tName.GetHashCode() == hashCode)
{
tcpHandler = name;
return;
}
});
//unlock
mut.ReleaseMutex();
return tcpHandler;
}
/*
*handleRSCommand
*
*2010-10-30
*ref TCPHandler tw ,
*byte flagCtrlF ,
*object param ,
*ref struFrame resp
*bool truefalse
*remoting
*/
private bool handleRSCommand(ref TCPHandler tw, byte flagCtrlF, object param, ref struFrame resp)
{
bool res = false;
struFrame sFrame = new struFrame();
if (UPPHandler.PreframePacking(flagCtrlF, param, ref sFrame) == true)
{
byte[] frame = null;
if (UPPHandler.framePacking(ref sFrame, ref frame) == true)
{
struRequestInQueue sReqInQ = new struRequestInQueue();
sReqInQ.frameInfo = sFrame;
sReqInQ.bMatchOK = false;
sReqInQ.frameBytes = frame;
sReqInQ.frameResp = new struFrame();
sReqInQ.handleReqEvent = new AutoResetEvent(false);
sReqInQ.handleReqEvent.Reset();
tw.PutNewReq(ref sReqInQ);
if (sReqInQ.handleReqEvent.WaitOne(16000, false) == true)
{
Common.logFile.write("消息匹配 OK", LogFile.LOGLVL_DEBUG);
res = true;
//Common.logFile.write("sReqInQ.frameResp" + sReqInQ.frameResp.GetHashCode().ToString(), LogFile.LOGLVL_DEBUG);
UPPHandler.frameCopy(ref sReqInQ.frameResp, ref resp);
//Common.logFile.write("读时间 成功!!!");
}
sReqInQ.handleReqEvent.Close();
}
}
return res;
}
/*
*TimeOut
*
*2010-10-30
*void
*void
*
*/
public void TimeOut()
{
CheckOnline();
CheckPointTime();
CheckHeartBeatTimeout();
}
/*
*CheckHeartBeatTimeout
*
*2010-10-30
*void
*void
*
*/
private void CheckHeartBeatTimeout()
{
try
{
TCPHandler tw = null;
bool loop = true;
unTimeingCount++;
bool bTiming = false;
//0 不校时
if (Common.configReader.nIntervalHoursForTiming > 0
&& unTimeingCount >= 3600 * Common.configReader.nIntervalHoursForTiming)
{
bTiming = true;
unTimeingCount = 0;
}
while (loop)
{
loop = false;
tw = null;
//lock
mut.WaitOne();
for (int i = 0; i < TCPHandlerList.Count; i++)
{
tw = TCPHandlerList.ElementAt(i);
if (tw == null)
{
loop = true;
TCPHandlerList.RemoveAt(i);
break;
}
if (tw.CheckTimeOut() == false)
{
//TCPWorkerList.Remove(tw);
TCPHandlerList.RemoveAt(i);
loop = true;
break;
}
if (bTiming == true)
{
//ReqHandler reqHandler = new ReqHandler();
//reqHandler.SetTime(tw.tName);
tw.ExecuteTiming();
}
}
//unlock
mut.ReleaseMutex();
if (tw != null && loop == true)
{
Common.logFile.write("[" + tw.tName + "]" + " 无心跳等待超时,链接被踢出 Kickoff", LogFile.LOGLVL_NORMAL);
if (tw.tName.CompareTo("未知终端") != 0)
{
//tw.SaveKickoffInfo(DateTime.Now);
tw.bKickOff = true;
}
tw.Close();
if (tw.tWorker.IsAlive)
{
if (tw.tWorker.Join(5000) == false)
tw.tWorker.Abort();
}
tw = null;
}
}
}
catch
{
}
}
/*
*CheckPointTime
*
*2010-10-30
*void
*void
*
*/
private void CheckPointTime()
{
DateTime dtNow = DateTime.Now;
if ((dtNow >= dtPointBegin) && (dtNow <= dtPointEnd))
{
if (this.bPointCollect == false)
{
bPointCollect = true;
Common.logFile.write("Collect time now ON>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + dtPoint + "|" + dtPointBegin + "-" + dtPointEnd, LogFile.LOGLVL_DEBUG);
}
}
else
{
if (this.bPointCollect == true)
{
bPointCollect = false;
UpdateNewTimePoint();
Common.logFile.write("Collect time now Off<<<<<<<<<<<<<<<<<<<<<<<<<<<<" + dtPoint + "|" + dtPointBegin + "-" + dtPointEnd, LogFile.LOGLVL_DEBUG);
}
}
}
/*
*RS_AdjustTime
*
*2010-10-30
*int nHashCode
*bool true false
*
*/
private bool RS_AdjustTime(int nHashCode)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//数据编号与数据
wrData.numPairs = new byte[8];
wrData.numPairs[0] = 0x80;
wrData.numPairs[1] = 0x30;
wrData.numPairs[2] = (byte)0; //秒
wrData.numPairs[3] = (byte)0; //分
wrData.numPairs[4] = (byte)0; //时
wrData.numPairs[5] = (byte)0; //日
wrData.numPairs[6] = (byte)0; //月
wrData.numPairs[7] = (byte)0; //年
wrData.isTimeCorrecting = true;
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetData
*
*2010-10-30
*int nHashCode ,
*object oParam ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetData(int nHashCode, object oParam, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
struParam param = (struParam)oParam;
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = Convert.ToByte(param.sMID, 16);
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
int size = 2 * param.lstParams.Count;
rdData.numPairs = new byte[size];
int i = 0;
foreach (int id in param.lstParams)
{
rdData.numPairs[i] = (byte)(id / 0x100);//终端时间
rdData.numPairs[i + 1] = (byte)(id % 0x100);//
i += 2;
}
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
Hashtable htData = new Hashtable();
MessageHandler mh = new MessageHandler(null);//????????????????????????
sFrame.tName = tw.tName;
res = mh.DataParsing(ref sFrame, ref htData);
oResp = htData;
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetHeartBeatInterval
*
*2010-10-30
*int nHashCode ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetHeartBeatInterval(int nHashCode, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = 0x00;
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[2];
rdData.numPairs[0] = 0xDB;//
rdData.numPairs[1] = 0x41;//
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
int pointer = 1;
uint ID = (uint)(sFrame.strData[pointer] * 0x100 + sFrame.strData[pointer + 1]);
if (ID == 0xDB41)
{
string sInterval = sFrame.strData[pointer + 2].ToString("D2");
oResp = (object)sInterval;
Common.logFile.write("获取终端[" + tw.tName + "]心跳间隔:" + sInterval, LogFile.LOGLVL_NORMAL);
}
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetAutoSendInterval
*
*2010-10-30
*int nHashCode ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetAutoSendInterval(int nHashCode, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = 0x00;
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[2];
rdData.numPairs[0] = 0xDB;//
rdData.numPairs[1] = 0x42;//
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
int pointer = 1;
uint ID = (uint)(sFrame.strData[pointer] * 0x100 + sFrame.strData[pointer + 1]);
if (ID == 0xDB42)
{
string sInterval = sFrame.strData[pointer + 2].ToString("D2");
oResp = (object)sInterval;
Common.logFile.write("获取终端[" + tw.tName + "]主动上传间隔:" + sInterval, LogFile.LOGLVL_NORMAL);
}
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetTime
*
*2010-10-30
*int nHashCode ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetTime(int nHashCode, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = 0x00;
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[2];
rdData.numPairs[0] = 0x80;//终端时间
rdData.numPairs[1] = 0x30;//
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
int pointer = 1;
uint ID = (uint)(sFrame.strData[pointer] * 0x100 + sFrame.strData[pointer + 1]);
if (ID == 0x8030)
{
string strDateTime = "20" + sFrame.strData[pointer + 7].ToString("x2")
+ "-" + sFrame.strData[pointer + 6].ToString("x2")
+ "-" + sFrame.strData[pointer + 5].ToString("x2")
+ " " + sFrame.strData[pointer + 4].ToString("x2")
+ ":" + sFrame.strData[pointer + 3].ToString("x2")
+ ":" + sFrame.strData[pointer + 2].ToString("x2");
oResp = (object)strDateTime;
Common.logFile.write("获取终端[" + tw.tName + "]时间:" + strDateTime, LogFile.LOGLVL_NORMAL);
}
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*HandleRemoteService
*
*2010-10-30
*int nFID remoting,
*string sTName ID,
*object oParam ,
*ref object oResp
*bool true false
*remoting
*/
public bool HandleRemoteService(int nFID, string sTName, object oParam, ref object oResp)
{
bool res = false;
int nHashCode = sTName.GetHashCode();
switch (nFID)
{
//对时
case 0:
res = RS_AdjustTime(nHashCode);
break;
//读时间
case 1:
res = RS_GetTime(nHashCode, ref oResp);
break;
//写IP和端口
case 2:
res = RS_SetIPPort(nHashCode, oParam);
break;
//招唤数据
case 3:
res = RS_GetData(nHashCode, oParam, ref oResp);
break;
//写主动上传间隔
case 4:
res = RS_SetAutoSendInterval(nHashCode, oParam);
break;
//写心跳间隔
case 5:
res = RS_SetHeartBeatInterval(nHashCode, oParam);
break;
//读主动上传间隔
case 6:
res = RS_GetAutoSendInterval(nHashCode, ref oResp);
break;
//读心跳间隔
case 7:
res = RS_GetHeartBeatInterval(nHashCode, ref oResp);
break;
//写集中器ID
case 8:
res = RS_SetTerminalName(nHashCode, oParam);
break;
//写集中器仪表地址
case 9:
res = RS_SetMeterAddr(nHashCode, oParam);
break;
//读集中器仪表地址
case 10:
res = RS_GetMeterAddr(nHashCode, ref oResp);
break;
//写集中器仪表置位
case 11:
res = RS_SetMeterAble(nHashCode, oParam);
break;
//读集中器仪表置位
case 12:
res = RS_GetMeterAble(nHashCode, ref oResp);
break;
//写蒸汽告警参数
case 13:
res = RS_SetStreamThreshold(nHashCode, oParam);
break;
//读蒸汽告警参数
case 14:
res = RS_GetStreamThreshold(nHashCode, oParam, ref oResp);
break;
//写电力告警参数
case 15:
res = RS_SetElectricThreshold(nHashCode, oParam);
break;
//读电力告警参数
case 16:
res = RS_GetElectricThreshold(nHashCode, oParam, ref oResp);
break;
//读集中器信息
case 17:
res = RS_GetInfo(nHashCode, oParam, ref oResp);
break;
//写集中器目标IP和Port
case 18:
res = RS_SetServerIPPort(nHashCode, oParam);
break;
//写电力PT CT
case 19:
res = RS_SetElecPTCT(nHashCode, oParam);
break;
//读电力PT CT
case 20:
res = RS_GetElecPTCT(nHashCode, oParam, ref oResp);
break;
case 21:
res = RS_SetSteamFailInterval(nHashCode, oParam);
break;
default:
break;
}
return res;
}
/// <summary>
/// 设置蒸汽集中器采集数据失败时间间隔
/// </summary>
/// <param name="nHashCode">通信处理实例哈希编码</param>
/// <param name="oParam">参数对象</param>
/// <returns>bools设置成功 true</returns>
private bool RS_SetSteamFailInterval(int nHashCode, object oParam)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
Hashtable ht = (Hashtable)oParam;
byte byParams = (byte)ht["DB44"];
//数据编号与数据
wrData.numPairs = new byte[3];
wrData.numPairs[0] = 0xDB;
wrData.numPairs[1] = 0x44;
wrData.numPairs[2] = byParams; //分钟
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetHeartBeatInterval
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*
*/
public bool RS_SetHeartBeatInterval(int nHashCode, object oParam)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
Hashtable ht = (Hashtable)oParam;
byte byParams = (byte)ht["DB41"];
//数据编号与数据
wrData.numPairs = new byte[3];
wrData.numPairs[0] = 0xDB;
wrData.numPairs[1] = 0x41;
wrData.numPairs[2] = byParams; //分钟
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetAutoSendInterval
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*
*/
public bool RS_SetAutoSendInterval(int nHashCode, object oParam)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
Hashtable ht = (Hashtable)oParam;
byte byParams = (byte)ht["DB42"];
//数据编号与数据
wrData.numPairs = new byte[3];
wrData.numPairs[0] = 0xDB;
wrData.numPairs[1] = 0x42;
wrData.numPairs[2] = byParams; //分钟
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetTerminalName
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*ID
*/
public bool RS_SetTerminalName(int nHashCode, object oParam)
{
string sNewName = (string)oParam;
if (sNewName.Length != 5)
{
return false;
}
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//数据编号与数据
wrData.numPairs = new byte[5];
wrData.numPairs[0] = 0x80;
wrData.numPairs[1] = 0x17;
wrData.numPairs[2] = (byte)sNewName[0];
wrData.numPairs[3] = Convert.ToByte(sNewName.Substring(1, 2), 16);
wrData.numPairs[4] = Convert.ToByte(sNewName.Substring(3, 2), 16);
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetIPPort
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*ip
*/
public bool RS_SetIPPort(int nHashCode, object oParam)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//数据编号与数据
wrData.numPairs = new byte[11];//DPT计算电压时用//DCT计算电流时用//DPQ计算功率时用
wrData.numPairs[0] = 0x80;
wrData.numPairs[1] = 0x10;
Hashtable ht = (Hashtable)oParam;
byte[] byParams = (byte[])ht["8010"];
wrData.numPairs[2] = 0x04;
wrData.numPairs[3] = 0xAA;
wrData.numPairs[4] = 0xAA;
wrData.numPairs[5] = byParams[0];//192
wrData.numPairs[6] = byParams[1];//168
wrData.numPairs[7] = byParams[2]; //0
wrData.numPairs[8] = byParams[3];//58
wrData.numPairs[9] = byParams[4]; //40
wrData.numPairs[10] = byParams[5]; //01
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetServerIPPort
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*ip
*/
public bool RS_SetServerIPPort(int nHashCode, object oParam)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//数据编号与数据
wrData.numPairs = new byte[8];
wrData.numPairs[0] = 0x80;
wrData.numPairs[1] = 0x1A;
Hashtable ht = (Hashtable)oParam;
byte[] byParams = (byte[])ht["801A"];
wrData.numPairs[2] = byParams[0];//192
wrData.numPairs[3] = byParams[1];//168
wrData.numPairs[4] = byParams[2]; //0
wrData.numPairs[5] = byParams[3];//58
wrData.numPairs[6] = byParams[4]; //40
wrData.numPairs[7] = byParams[5]; //01
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*GetTerminalList
*
*2010-10-30
*Hashtable htTerminal ,
*bool true false
*
*/
public bool GetTerminalList(Hashtable htTerminal)
{
htTerminal.Clear();
List<string> lstTerminal = new List<string>();
Hashtable htTerminalForTest = new Hashtable();
Hashtable htTerminalAll = new Hashtable();
//lstTerminal.Clear();
bool res = true;
//lock
mut.WaitOne();
if (TCPHandlerList.Count > 0)
{
foreach (TCPHandler tcpHandler in TCPHandlerList)
{
if (tcpHandler.tName.CompareTo("未知终端") != 0)
{
lstTerminal.Add(tcpHandler.tName);
htTerminalForTest.Add(tcpHandler.tName, false);
htTerminalAll.Add(tcpHandler.tName, false);
}
}
}
else
{
//res = false;
lstTerminal.Add("null");
}
//unlock
mut.ReleaseMutex();
//Common.logFile.write("2.进入数据库查询", LogFile.LOGLVL_NORMAL);
if (res == true)
{
//string sTIDS = "('"+lstTerminal[0]+"'";
//for (int i = 1; i < lstTerminal.Count; i++)
//{
// sTIDS += ",'"+lstTerminal[i]+"'";
//}
//sTIDS += ")";
string queryString = string.Format("SELECT t2.[SettingAddress],t2.[collectdeviceid],[MonitorName] "
+ ",[MeterCommunicationID] "
+ "FROM [dbo].[T_Monitor] as t1 "
+ "Inner Join [dbo].[T_CollectDeviceInfo] as t2 "
+ "on t1.[collectdeviceid] = t2.[collectdeviceid] where t1.[MonitorType]={0} or t1.[MonitorType]={1} order by collectdeviceid", 2,3);//('E0001', 'S0001')
//Common.logFile.write("2.1进入数据库查询,queryString:" + queryString, LogFile.LOGLVL_NORMAL);
using (SqlConnection connection = new SqlConnection(connectString))
{
SqlCommand command = new SqlCommand(queryString, connection);
try
{
connection.Open();
try
{
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
if (!reader[1].ToString().ToUpper().StartsWith("XN"))//过滤 XN 虚拟节点
{
if (htTerminalAll.ContainsKey(reader[1].ToString()))
{
//online
htTerminal.Add(reader[3].ToString() + "\n" + reader[2].ToString(), reader[1].ToString() + "\n" + reader[0].ToString() + "\n" + "1");
}
else
{
//offline
htTerminal.Add(reader[3].ToString() + "\n" + reader[2].ToString(), reader[1].ToString() + "\n" + reader[0].ToString() + "\n" + "0");
}
htTerminalForTest.Remove(reader[1].ToString());
}
}
// Call Close when done reading.
reader.Close();
}
catch (SqlException e)
{
//info2Display += "\r\n蒸汽数据采集 SqlException" + e.ToString() + "\r\n 原SQL语句:" + insertSQLString;
Common.logFile.write("原SQL语句:" + queryString + ",SQL语句错误" + e.ToString(), LogFile.LOGLVL_ERROR);
res = false;
}
}
catch (Exception e)
{
Common.logFile.write("数据库打开错误:" + e.ToString(), LogFile.LOGLVL_ERROR);
Common.logFile.write("数据库打开错误详见err.txt", LogFile.LOGLVL_NORMAL);
res = false;
}
}
//Common.logFile.write("2.2添加集中器测试", LogFile.LOGLVL_NORMAL);
//集中器测试
//
try
{
if (htTerminalForTest.Count > 0)
{
foreach (DictionaryEntry de in htTerminalForTest)
{
for (int i = 1; i <= 4; i++)
{
htTerminal.Add(i.ToString() + "\n" + de.Key.ToString(), de.Key.ToString() + "\n" + "测试" + "\n" + "1");
}
}
}
}
catch (Exception e1)
{
Common.logFile.write("添加集中器测试,Exception:" + e1.ToString(), LogFile.LOGLVL_ERROR);
res = false;
}
}
//Common.logFile.write("3.GetTerminalList结束"+res.ToString(), LogFile.LOGLVL_NORMAL);
return res;
}
/*
*RS_GetMeterAble
*
*2010-10-30
*Hashtable htTerminal ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetMeterAble(int nHashCode, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = 0x00;
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[2];
rdData.numPairs[0] = 0x89;//
rdData.numPairs[1] = 0x00;//
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
int pointer = 1;
uint ID = (uint)(sFrame.strData[pointer] * 0x100 + sFrame.strData[pointer + 1]);
if (ID == 0x8900)
{
byte[] arrParam = new byte[16];
//string sInterval = sFrame.strData[pointer + 2].ToString("D2");
for (int i = 0; i < 16; i++)
{
arrParam[i] = sFrame.strData[pointer + 2 + i];
}
oResp = (object)arrParam;
Common.logFile.writeHexString("获取终端[" + tw.tName + "]仪表使能:", arrParam, LogFile.LOGLVL_NORMAL);// write("获取终端[" + tw.tName + "]主动上传间隔(分钟):" + sInterval, LogFile.LOGLVL_NORMAL);
}
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetStreamThreshold
*
*2010-10-30
*int nHashCode ,
*object oParam ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetStreamThreshold(int nHashCode, object oParam, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
string sMID = (string)oParam;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = Convert.ToByte(sMID, 16);//?????????????????????????
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[32];
rdData.numPairs[0] = 0x8C;//
rdData.numPairs[1] = 0x00;//
rdData.numPairs[2] = 0x8C;//
rdData.numPairs[3] = 0x01;//
rdData.numPairs[4] = 0x8C;//
rdData.numPairs[5] = 0x02;//
rdData.numPairs[6] = 0x8C;//
rdData.numPairs[7] = 0x03;//
rdData.numPairs[8] = 0x8D;//
rdData.numPairs[9] = 0x00;//
rdData.numPairs[10] = 0x8D;//
rdData.numPairs[11] = 0x01;//
rdData.numPairs[12] = 0x8D;//
rdData.numPairs[13] = 0x02;//
rdData.numPairs[14] = 0x8D;//
rdData.numPairs[15] = 0x03;//
rdData.numPairs[16] = 0x8E;//
rdData.numPairs[17] = 0x00;//
rdData.numPairs[18] = 0x8E;//
rdData.numPairs[19] = 0x01;//
rdData.numPairs[20] = 0x8E;//
rdData.numPairs[21] = 0x02;//
rdData.numPairs[22] = 0x8E;//
rdData.numPairs[23] = 0x03;//
rdData.numPairs[24] = 0x8F;//
rdData.numPairs[25] = 0x00;//
rdData.numPairs[26] = 0x8F;//
rdData.numPairs[27] = 0x01;//
rdData.numPairs[28] = 0x8F;//
rdData.numPairs[29] = 0x02;//
rdData.numPairs[30] = 0x8F;//
rdData.numPairs[31] = 0x03;//
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
string[] arrParam = new string[16];
MessageHandler mh = new MessageHandler(null);
res = mh.S_ThresholdParamParsing(ref sFrame, ref arrParam);
oResp = arrParam;
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetMeterAddr
*
*2010-10-30
*int nHashCode ,
*ref object oResp
*bool true false
*
*/
private bool RS_GetMeterAddr(int nHashCode, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = 0x00;
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[2];
rdData.numPairs[0] = 0x89;//
rdData.numPairs[1] = 0x01;//
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
int pointer = 1;
uint ID = (uint)(sFrame.strData[pointer] * 0x100 + sFrame.strData[pointer + 1]);
if (ID == 0x8901)
{
byte[] arrAddr = new byte[16];
//string sInterval = sFrame.strData[pointer + 2].ToString("D2");
for (int i = 0; i < 16; i++)
{
arrAddr[i] = sFrame.strData[pointer + 2 + i];
}
oResp = (object)arrAddr;
Common.logFile.writeHexString("获取终端[" + tw.tName + "]仪表地址:", arrAddr, LogFile.LOGLVL_NORMAL);// write("获取终端[" + tw.tName + "]主动上传间隔(分钟):" + sInterval, LogFile.LOGLVL_NORMAL);
}
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetMeterAble
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*
*/
public bool RS_SetMeterAble(int nHashCode, object oParam)
{
byte[] arrParams = (byte[])oParam;
if (arrParams.Length != 16)
{
return false;
}
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//数据编号与数据
wrData.numPairs = new byte[18];
wrData.numPairs[0] = 0x89;
wrData.numPairs[1] = 0x00;
arrParams.CopyTo(wrData.numPairs, 2);
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetMeterAddr
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*
*/
public bool RS_SetMeterAddr(int nHashCode, object oParam)
{
byte[] arrParams = (byte[])oParam;
if (arrParams.Length != 16)
{
return false;
}
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = 0x00;
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//数据编号与数据
wrData.numPairs = new byte[18];
wrData.numPairs[0] = 0x89;
wrData.numPairs[1] = 0x01;
arrParams.CopyTo(wrData.numPairs, 2);
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetStreamThreshold
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*
*/
public bool RS_SetStreamThreshold(int nHashCode, object oParam)
{
struParam struP = (struParam)oParam;
string[] arrParams = (string[])struP.oParam;
if (arrParams.Length != 16)
{
return false;
}
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = Convert.ToByte(struP.sMID, 16);
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//Hashtable ht = (Hashtable)oParam;
//数据编号与数据
//wrData.numPairs = new byte[18];
//wrData.numPairs[0] = 0x89;
//wrData.numPairs[1] = 0x01;
//arrParams.CopyTo(wrData.numPairs, 2);
MessageHandler mh = new MessageHandler(null);
Hashtable htThreshold = new Hashtable();
res = mh.S_ThresholdParamTrans(ref arrParams, ref wrData.numPairs, htThreshold);
if (res == true)
{
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//存库
if (res == true)
{
res = mh.saveAlarmThreshold(tw.tName, struP.sMID, htThreshold);
}
}
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetElectricThreshold
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*
*/
public bool RS_SetElectricThreshold(int nHashCode, object oParam)
{
struParam struP = (struParam)oParam;
string[] arrParams = (string[])struP.oParam;
if (arrParams.Length != 24)
{
return false;
}
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = Convert.ToByte(struP.sMID, 16);
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//Hashtable ht = (Hashtable)oParam;
//数据编号与数据
//wrData.numPairs = new byte[18];
//wrData.numPairs[0] = 0x89;
//wrData.numPairs[1] = 0x01;
//arrParams.CopyTo(wrData.numPairs, 2);
MessageHandler mh = new MessageHandler(null);
Hashtable htThreshold = new Hashtable();
res = mh.E_ThresholdParamTrans(ref arrParams, ref wrData.numPairs, htThreshold);
if (res == true)
{
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
//存库
if (res == true)
{
res = mh.E_saveAlarmThreshold(tw.tName, struP.sMID, htThreshold);
}
}
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetElectricThreshold
*
*2010-10-30
*int nHashCode ,
*object oParam
*ref object oResp
*bool true false
*
*/
private bool RS_GetElectricThreshold(int nHashCode, object oParam, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
string sMID = (string)oParam;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = Convert.ToByte(sMID, 16);//?????????????????????????
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[16];
rdData.numPairs[0] = 0xda;
rdData.numPairs[1] = 0x80;
rdData.numPairs[2] = 0xda;
rdData.numPairs[3] = 0x81;
rdData.numPairs[4] = 0xda;
rdData.numPairs[5] = 0x82;
rdData.numPairs[6] = 0xda;
rdData.numPairs[7] = 0x83;
rdData.numPairs[8] = 0xda;
rdData.numPairs[9] = 0x85;
rdData.numPairs[10] = 0xda;
rdData.numPairs[11] = 0x86;
rdData.numPairs[12] = 0xda;
rdData.numPairs[13] = 0x87;
rdData.numPairs[14] = 0xda;
rdData.numPairs[15] = 0x88;
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
string[] arrParam = new string[8];
MessageHandler mh = new MessageHandler(null);
res = mh.E_ThresholdParamParsing(ref sFrame, ref arrParam);
oResp = arrParam;
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetInfo
*
*2010-10-30
*int nHashCode ,
*object oParam
*ref object oResp
*bool true false
*
*/
private bool RS_GetInfo(int nHashCode, object oParam, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
string sMID = (string)oParam;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
TimeSpan ts = DateTime.Now - tw.dtLogin;
oResp = "\r\n\t\t\t\tIP和端口" + tw.strIPPort
+ "\r\n\t\t\t\t登录时间" + tw.sLoginTime
+ "\r\n\t\t\t\t在线时间" + ts.Days + " 天, " + ts.Hours + " 小时, " + ts.Minutes + " 分, " + ts.Seconds + " 秒";
res = true;
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_SetElecPTCT
*
*2010-10-30
*int nHashCode ,
*object oParam
*bool true false
*PT CT
*/
public bool RS_SetElecPTCT(int nHashCode, object oParam)
{
struParam struP = (struParam)oParam;
string[] arrParams = (string[])struP.oParam;
if (arrParams.Length != 2)
{
return false;
}
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struWriteData wrData = new struWriteData();
wrData.addrDNL = new byte[2];
////终端类型
wrData.flagDTN = (byte)tw.tName[0];
//if (wrData.flagDTN != 'E')
//{
// MessageBox.Show("终端类型错误,非电力终端!");
// return;
//}
//逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
wrData.addrDNL[0] = (byte)(n / 256);
wrData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
wrData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志(写对象)
wrData.flagCtrlF = 0x08;
//测量点标志 (终端)
wrData.flagPoint = Convert.ToByte(struP.sMID, 16);
//帧序号
wrData.flagFSEQ = tw.GetSeqFrame();
//低级权限
wrData.flagAUT = 0x00;
//口令
wrData.passwd = new byte[3];
wrData.passwd[0] = 0x31;
wrData.passwd[1] = 0x32;
wrData.passwd[2] = 0x33;
//Hashtable ht = (Hashtable)oParam;
//数据编号与数据
//wrData.numPairs = new byte[18];
//wrData.numPairs[0] = 0x89;
//wrData.numPairs[1] = 0x01;
//arrParams.CopyTo(wrData.numPairs, 2);
MessageHandler mh = new MessageHandler(null);
Hashtable htPTCT = new Hashtable();
res = mh.E_PTCTParamTrans(ref arrParams, ref wrData.numPairs, htPTCT);//
if (res == true)
{
struFrame sFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, wrData.flagCtrlF, wrData, ref sFrame);
////存库
//if (res == true)
//{
// res = mh.E_saveAlarmThreshold(tw.tName, struP.sMID, htThreshold);
//}
}
//Common.logFile.write("handleRSCommand ====================");
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
/*
*RS_GetElecPTCT
*
*2010-10-30
*int nHashCode ,
*object oParam
*ref object oResp
*bool true false
*PT CT
*/
private bool RS_GetElecPTCT(int nHashCode, object oParam, ref object oResp)
{
//查找链接信息(终端编号,帧序号)
TCPHandler tw = null;
bool res = false;
string sMID = (string)oParam;
if (nHashCode != 0)
{
tw = (TCPHandler)Common.platForm.tcpServer.GetTCPHandler(nHashCode);
}
if (tw != null)
{
if (tw.tName.Length == 5)
{
struReadData rdData = new struReadData();
rdData.addrDNL = new byte[2];
////终端类型
rdData.flagDTN = (byte)tw.tName[0];
//if (rdData.flagDTN != 'E')
//{
// //MessageBox.Show("终端类型错误,非电力终端!");
// return false;
//}
////逻辑编号
int n = Convert.ToInt32(tw.tName.Substring(1, 4), 16);
rdData.addrDNL[0] = (byte)(n / 256);
rdData.addrDNL[1] = (byte)(n % 256);
////主站地址
//public byte flagMSTA;
rdData.flagMSTA = 0x0;//???????????????????????????????????
//功能标志
rdData.flagCtrlF = 0x01;
//测量点标志
rdData.flagPoint = Convert.ToByte(sMID, 16);//?????????????????????????
//帧序号
rdData.flagFSEQ = tw.GetSeqFrame();
//数据项编号
rdData.numPairs = new byte[4];
rdData.numPairs[0] = 0x89;//PT
rdData.numPairs[1] = 0x11;
rdData.numPairs[2] = 0x89;//CT
rdData.numPairs[3] = 0x12;
struFrame sRespFrame = new struFrame();
//放入链接队列
res = handleRSCommand(ref tw, rdData.flagCtrlF, rdData, ref sRespFrame);
if (res == true)
{
struFrame sFrame = (struFrame)sRespFrame;
string[] arrParam = new string[2];
MessageHandler mh = new MessageHandler(null);
res = mh.E_PTCTParamParsing(ref sFrame, ref arrParam);
oResp = arrParam;
}
}
else
{
//未认证的链接
//MessageBox.Show("未知终端,无权接收请求!");
}
}
return res;
}
}
}