1108 lines
49 KiB
C#
1108 lines
49 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.Linq;
|
||
using System.Text;
|
||
|
||
namespace ConsoleGetPLCData.CS
|
||
{
|
||
public class TranData
|
||
{
|
||
/// <summary>
|
||
/// 局域网Modbus通讯协议解析
|
||
/// </summary>
|
||
/// <param name="drData">存储数据的datarow</param>
|
||
/// <param name="usWord">ushort 数组</param>
|
||
/// <param name="SbType">设备类型</param>
|
||
/// <returns></returns>
|
||
public static DataRow GetDataTran_Net(DataRow drData, ushort[] usWord, string SbType)
|
||
{
|
||
switch (SbType)
|
||
{
|
||
case "0": //局域网解析施耐德PLC数据
|
||
string[] tempWord;
|
||
tempWord = new string[20];
|
||
|
||
for (int j = 0; j < 20; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中
|
||
{
|
||
tempWord[j] = usWord[j].ToString("x4");
|
||
}
|
||
|
||
//解析数据为明文-----------------------------------------------------
|
||
//温度
|
||
drData["wd"] = (getInt16(tempWord[13].ToString()) / 10.0).ToString("0.##");
|
||
//压力
|
||
drData["yl"] = (getInt16(tempWord[12].ToString()) / 1000.0).ToString("0.###");
|
||
//差压
|
||
drData["CY"] = (getInt16(tempWord[14].ToString()) / 100.0).ToString("0.###");
|
||
if (drData["CY"].Equals("0"))
|
||
{
|
||
drData["CY"] = "-";
|
||
}
|
||
//瞬时量
|
||
drData["SSL"] = (getUInt32(tempWord[0].ToString(), tempWord[1].ToString()) / 100 * 24).ToString();
|
||
//今日量
|
||
drData["JRL"] = (getUInt32(tempWord[2].ToString(), tempWord[3].ToString())).ToString();
|
||
//昨日量
|
||
drData["ZRL"] = (getUInt32(tempWord[4].ToString(), tempWord[5].ToString())).ToString();
|
||
//累计量
|
||
drData["LJL"] = (getUInt32(tempWord[10].ToString(), tempWord[11].ToString()) / 10000.0).ToString();
|
||
//本月量
|
||
drData["BYL"] = (getUInt32(tempWord[6].ToString(), tempWord[7].ToString()) / 10000.0).ToString();
|
||
//上月量
|
||
drData["SYL"] = (getUInt32(tempWord[8].ToString(), tempWord[9].ToString()) / 10000.0).ToString();
|
||
//今日时间
|
||
drData["JRSJ"] = (getInt16(tempWord[16].ToString())).ToString();
|
||
//昨日时间
|
||
drData["ZRSJ"] = (getInt16(tempWord[17].ToString())).ToString();
|
||
|
||
//仪表状态
|
||
|
||
switch (getInt16(tempWord[15].ToString().Substring(2, 2)).ToString())
|
||
{
|
||
|
||
case "0":
|
||
drData["YBZT"] = "停表";
|
||
break;
|
||
case "1":
|
||
drData["YBZT"] = "运行";
|
||
break;
|
||
case "2":
|
||
drData["YBZT"] = "补偿";
|
||
break;
|
||
case "3":
|
||
drData["YBZT"] = "测试";
|
||
break;
|
||
}
|
||
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return drData;
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// GPRS模块通讯 数据解析
|
||
/// </summary>
|
||
/// <param name="drData">存储数据的datarow</param>
|
||
/// <param name="bufTemp">ushort 数组</param>
|
||
/// <param name="SbType">设备类型</param>
|
||
/// <returns></returns>
|
||
public static DataRow GetDataTran_GPRS(DataRow drData, byte[] bufTemp, string SbType)
|
||
{
|
||
int dataNum = bufTemp[2];
|
||
byte[] CrcNum;
|
||
string strPrint = "";
|
||
switch (SbType)
|
||
{
|
||
#region //施耐德PLC
|
||
case "0": //施耐德PLC
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[20];
|
||
for (int i = 0; i < 20; i++)
|
||
{
|
||
strData[i] = bufTemp[i * 2 + 3].ToString("X2") + bufTemp[i * 2 + 1 + 3].ToString("X2");
|
||
}
|
||
|
||
//解析数据为明文-----------------------------------------------------
|
||
//温度
|
||
drData["WD"] = (getInt16(strData[13].ToString()) / 10.0).ToString("0.##");
|
||
//压力
|
||
drData["YL"] = (getInt16(strData[12].ToString()) / 1000.0).ToString("0.###");
|
||
//差压
|
||
drData["CY"] = (getInt16(strData[14].ToString()) / 100.0).ToString("0.###");
|
||
//if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0"))
|
||
// {
|
||
// ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = "";
|
||
// }
|
||
|
||
//瞬时量
|
||
drData["SSL"] = (getUInt32(strData[0].ToString(), strData[1].ToString()) / 100 * 24).ToString();
|
||
//今日量
|
||
drData["JRL"] = (getUInt32(strData[2].ToString(), strData[3].ToString())).ToString();
|
||
//昨日量
|
||
drData["ZRL"] = (getUInt32(strData[4].ToString(), strData[5].ToString())).ToString();
|
||
//累计量
|
||
drData["LJL"] = (getUInt32(strData[10].ToString(), strData[11].ToString()) / 10000.0).ToString();
|
||
//本月量
|
||
drData["BYL"] = (getUInt32(strData[6].ToString(), strData[7].ToString()) / 10000.0).ToString();
|
||
//上月量
|
||
drData["SYL"] = (getUInt32(strData[8].ToString(), strData[9].ToString()) / 10000.0).ToString();
|
||
//今日时间
|
||
drData["JRSJ"] = (getInt16(strData[16].ToString())).ToString();
|
||
//昨日时间
|
||
drData["ZRSJ"] = (getInt16(strData[17].ToString())).ToString();
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
|
||
}
|
||
break;
|
||
#endregion
|
||
#region //盘古积算仪
|
||
|
||
case "1":
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
string[] jldData = new string[8];
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[32];
|
||
for (int i = 0; i < 32; i++)
|
||
{
|
||
strData[i] = bufTemp[i + 3].ToString("X2");
|
||
}
|
||
jldData[0] = getsingle(strData[2] + strData[3] + strData[0] + strData[1]).ToString("f1"); //瞬时流量
|
||
jldData[1] = getsingle(strData[6] + strData[7] + strData[4] + strData[5]).ToString(); //差压//频率
|
||
jldData[2] = getsingle(strData[10] + strData[11] + strData[8] + strData[9]).ToString("f2"); //温度
|
||
jldData[3] = getsingle(strData[14] + strData[15] + strData[12] + strData[13]).ToString("f3"); //压力
|
||
jldData[4] = getint(strData[18] + strData[19] + strData[16] + strData[17]).ToString(); //总累计流量
|
||
jldData[7] = getsingle(strData[30] + strData[31] + strData[28] + strData[29]).ToString("f4"); //密度
|
||
}
|
||
try
|
||
{
|
||
|
||
|
||
//温度
|
||
drData["WD"] = jldData[2];
|
||
//压力
|
||
drData["YL"] = jldData[3];
|
||
//差压
|
||
try
|
||
{
|
||
drData["CY"] = string.Format("{0:F}", jldData[1]);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
//if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0"))
|
||
//{
|
||
// ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = "";
|
||
//}
|
||
|
||
//累计量
|
||
drData["LJL"] = jldData[4];
|
||
try
|
||
{
|
||
//瞬时量
|
||
drData["SSL"] = (float.Parse(jldData[0]) * 24).ToString("#.#");
|
||
if (drData["SSL"].ToString() == "") drData["SSL"] = "0";
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
drData["SSL"] = "0";
|
||
}
|
||
|
||
|
||
|
||
//本月量
|
||
drData["BYL"] = "";
|
||
//上月量
|
||
drData["SYL"] = jldData[7];
|
||
//今日时间
|
||
drData["JRSJ"] = "";
|
||
//昨日时间
|
||
drData["ZRSJ"] = "";
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
//计算工况流量
|
||
Single sngQN;
|
||
Single sngTf;
|
||
float sngPf;
|
||
if (jldData[0] != "")
|
||
{
|
||
sngQN = Convert.ToSingle(jldData[0]);
|
||
}
|
||
else
|
||
{
|
||
sngQN = 0;
|
||
}
|
||
if (jldData[2] != "")
|
||
{
|
||
sngTf = float.Parse(jldData[2]);
|
||
sngTf = sngTf + 273.15f;
|
||
}
|
||
else
|
||
{
|
||
sngTf = 0;
|
||
}
|
||
|
||
if (jldData[3] != "" && jldData[3] != "0")
|
||
{
|
||
sngPf = Convert.ToSingle(jldData[3]);
|
||
Single sngFz2;
|
||
|
||
if (sngPf > 0.1 && sngPf < 0.5)
|
||
{
|
||
sngFz2 = 0.999f - 0.008f * (sngPf - 0.1f) / (0.5f - sngPf);
|
||
|
||
}
|
||
else
|
||
{
|
||
if (sngPf < 0.1) sngFz2 = 0.998f;
|
||
if (sngPf > 0.5) sngFz2 = 0.988f;
|
||
}
|
||
|
||
drData["SSGKLL"] = (sngQN * sngTf * 0.101325 * 0.998 / 293.15 / sngPf).ToString("#.#");
|
||
|
||
}
|
||
else
|
||
{
|
||
drData["SSGKLL"] = 0;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
|
||
|
||
}
|
||
//try
|
||
//{
|
||
// drData["CXFlag"] = GetCxFlag(drData["SSGKLL"].ToString(), drData["CLXX"].ToString(), drData["CLSX"].ToString());
|
||
|
||
//}
|
||
//catch (Exception)
|
||
//{
|
||
|
||
|
||
//}
|
||
|
||
//ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[2] + "\t压力:" + jldData[2] + "\t累积量:" + jldData[4], drData["STATION_NAME"].ToString());
|
||
|
||
break;
|
||
#endregion
|
||
#region Floboss103
|
||
case "2":
|
||
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
|
||
jldData = new string[11];
|
||
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[44];
|
||
for (int i = 0; i < 44; i++)
|
||
{
|
||
strData[i] = bufTemp[i + 3].ToString("X2");
|
||
}
|
||
// 0B 03 2C 50 87 43 9B 12 D9 41 96 C6 5E 42 7B 12 D9 41 96 C2 AA 44 22 9B 5F 44 4D 33 33 42 C7 2E EF 43 E7 26 31 BD 68 28 69 BE BE 87 D5 C3 77 1A A8
|
||
//jldData[0] = getsingle("439B5087").ToString();
|
||
jldData[0] = (getsingle(strData[2] + strData[3] + strData[0] + strData[1]) * 1000).ToString();
|
||
jldData[1] = (getsingle(strData[6] + strData[7] + strData[4] + strData[5]) * 1000).ToString();
|
||
jldData[2] = (getsingle(strData[10] + strData[11] + strData[8] + strData[9]) * 1000).ToString();
|
||
jldData[3] = (getsingle(strData[14] + strData[15] + strData[12] + strData[12]) / 10).ToString();
|
||
jldData[4] = (getsingle(strData[18] + strData[19] + strData[16] + strData[16]) / 10).ToString();
|
||
jldData[5] = (getsingle(strData[22] + strData[23] + strData[20] + strData[20]) / 10).ToString();
|
||
jldData[6] = getsingle(strData[26] + strData[27] + strData[24] + strData[24]).ToString();
|
||
jldData[7] = getsingle(strData[30] + strData[31] + strData[28] + strData[28]).ToString();
|
||
jldData[8] = getsingle(strData[34] + strData[35] + strData[32] + strData[32]).ToString("f2");
|
||
jldData[9] = (getsingle(strData[38] + strData[39] + strData[36] + strData[36]) / 1000).ToString("f3");
|
||
jldData[10] = getsingle(strData[42] + strData[43] + strData[40] + strData[40]).ToString("f2");
|
||
|
||
|
||
}
|
||
//ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[10] + "\t压力:" + jldData[9] + "\t累积量:" + jldData[5], drData["STATION_NAME"].ToString());
|
||
|
||
//温度
|
||
drData["WD"] = jldData[10];
|
||
//压力
|
||
drData["YL"] = jldData[9];
|
||
//差压
|
||
drData["CY"] = jldData[8];
|
||
//瞬时量
|
||
drData["SSL"] = jldData[0];
|
||
//今日量
|
||
drData["JRL"] = jldData[1];
|
||
//昨日量
|
||
drData["ZRL"] = jldData[2];
|
||
//累计量
|
||
drData["LJL"] = jldData[5];
|
||
//本月量
|
||
drData["BYL"] = jldData[3];
|
||
//上月量
|
||
drData["SYL"] = jldData[4];
|
||
//今日时间
|
||
drData["JRSJ"] = jldData[6].Substring(0, jldData[6].IndexOf('.'));
|
||
//昨日时间
|
||
drData["ZRSJ"] = jldData[7];
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
|
||
drData["CXFlag"] = GetCxFlag(jldData[8]);
|
||
|
||
|
||
break;
|
||
#endregion
|
||
#region tengkongPLC
|
||
case "6":
|
||
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
|
||
jldData = new string[11];
|
||
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[44];
|
||
for (int i = 0; i < 44; i++)
|
||
{
|
||
strData[i] = bufTemp[i + 3].ToString("X2");
|
||
}
|
||
// 0B 03 2C 50 87 43 9B 12 D9 41 96 C6 5E 42 7B 12 D9 41 96 C2 AA 44 22 9B 5F 44 4D 33 33 42 C7 2E EF 43 E7 26 31 BD 68 28 69 BE BE 87 D5 C3 77 1A A8
|
||
//jldData[0] = getsingle("439B5087").ToString();
|
||
jldData[0] = (getsingle(strData[2] + strData[3] + strData[0] + strData[1]) * 1000).ToString();
|
||
jldData[1] = (getsingle(strData[6] + strData[7] + strData[4] + strData[5]) * 1000).ToString();
|
||
jldData[2] = (getsingle(strData[10] + strData[11] + strData[8] + strData[9]) * 1000).ToString();
|
||
jldData[3] = (getsingle(strData[14] + strData[15] + strData[12] + strData[12]) / 10).ToString();
|
||
jldData[4] = (getsingle(strData[18] + strData[19] + strData[16] + strData[16]) / 10).ToString();
|
||
jldData[5] = (getsingle(strData[22] + strData[23] + strData[20] + strData[20]) / 10).ToString();
|
||
jldData[6] = getsingle(strData[26] + strData[27] + strData[24] + strData[24]).ToString();
|
||
jldData[7] = getsingle(strData[30] + strData[31] + strData[28] + strData[28]).ToString();
|
||
jldData[8] = getsingle(strData[34] + strData[35] + strData[32] + strData[32]).ToString("f2");
|
||
jldData[9] = (getsingle(strData[38] + strData[39] + strData[36] + strData[36]) / 1000).ToString("f3");
|
||
jldData[10] = getsingle(strData[42] + strData[43] + strData[40] + strData[40]).ToString("f2");
|
||
|
||
|
||
}
|
||
//ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[10] + "\t压力:" + jldData[9] + "\t累积量:" + jldData[5], drData["STATION_NAME"].ToString());
|
||
|
||
//温度
|
||
drData["WD"] = jldData[10];
|
||
//压力
|
||
drData["YL"] = jldData[9];
|
||
//差压
|
||
drData["CY"] = jldData[8];
|
||
//瞬时量
|
||
drData["SSL"] = jldData[0];
|
||
//今日量
|
||
drData["JRL"] = jldData[1];
|
||
//昨日量
|
||
drData["ZRL"] = jldData[2];
|
||
//累计量
|
||
drData["LJL"] = jldData[5];
|
||
//本月量
|
||
drData["BYL"] = jldData[3];
|
||
//上月量
|
||
drData["SYL"] = jldData[4];
|
||
//今日时间
|
||
drData["JRSJ"] = jldData[6].Substring(0, jldData[6].IndexOf('.'));
|
||
//昨日时间
|
||
drData["ZRSJ"] = jldData[7];
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
|
||
drData["CXFlag"] = GetCxFlag(jldData[8]);
|
||
|
||
|
||
break;
|
||
#endregion
|
||
#region 西门子PLC
|
||
case "3":
|
||
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[120];
|
||
for (int i = 0; i < 120; i++)
|
||
{
|
||
strData[i] = bufTemp[i * 2 + 3].ToString("X2") + bufTemp[i * 2 + 1 + 3].ToString("X2");
|
||
}
|
||
//解析数据为明文-----------------------------------------------------
|
||
//温度
|
||
drData["WD"] = (getInt16(strData[13].ToString()) / 10.0).ToString("0.##");
|
||
//压力
|
||
drData["YL"] = (getInt16(strData[12].ToString()) / 1000.0).ToString("0.###");
|
||
//差压
|
||
drData["CY"] = (getInt16(strData[14].ToString()) / 100.0).ToString("0.###");
|
||
//if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0"))
|
||
// {
|
||
// ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = "";
|
||
// }
|
||
|
||
//瞬时量
|
||
drData["SSL"] = (getUInt32(strData[0].ToString(), strData[1].ToString()) / 100 * 24).ToString();
|
||
//今日量
|
||
drData["JRL"] = (getUInt32(strData[2].ToString(), strData[3].ToString())).ToString();
|
||
//昨日量
|
||
drData["ZRL"] = (getUInt32(strData[4].ToString(), strData[5].ToString())).ToString();
|
||
//累计量
|
||
drData["LJL"] = (getUInt32(strData[10].ToString(), strData[11].ToString()) / 10000.0).ToString();
|
||
//本月量
|
||
drData["BYL"] = (getUInt32(strData[6].ToString(), strData[7].ToString()) / 10000.0).ToString();
|
||
//上月量
|
||
drData["SYL"] = (getUInt32(strData[8].ToString(), strData[9].ToString()) / 10000.0).ToString();
|
||
//今日时间
|
||
drData["JRSJ"] = (getInt16(strData[16].ToString())).ToString();
|
||
//昨日时间
|
||
drData["ZRSJ"] = (getInt16(strData[17].ToString())).ToString();
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
|
||
}
|
||
|
||
break;
|
||
|
||
#endregion
|
||
#region 超声波流量计爱知
|
||
case "4":
|
||
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
|
||
jldData = new string[11];
|
||
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[30];
|
||
for (int i = 0; i < 30; i++)
|
||
{
|
||
strData[i] = bufTemp[i + 3].ToString("X2");
|
||
}
|
||
// 0B 03 2C 50 87 43 9B 12 D9 41 96 C6 5E 42 7B 12 D9 41 96 C2 AA 44 22 9B 5F 44 4D 33 33 42 C7 2E EF 43 E7 26 31 BD 68 28 69 BE BE 87 D5 C3 77 1A A8
|
||
//jldData[0] = getsingle("439B5087").ToString();
|
||
//瞬时工况流量
|
||
drData["CY"] = (getInt32(strData[0] + strData[1] + strData[2] + strData[3]) / 100.0).ToString("0.###");
|
||
//瞬时标况量
|
||
drData["SSL"] = (getInt32(strData[4] + strData[5] + strData[6] + strData[7]) / 100.0).ToString("0.#");
|
||
//压力
|
||
drData["YL"] = (getInt32(strData[8] + strData[9] + strData[10] + strData[11]) / 100000.0).ToString("0.###");
|
||
//温度
|
||
drData["WD"] = (getInt32(strData[12] + strData[13] + strData[14] + strData[15]) / 100.0).ToString("0.#");
|
||
//累计量
|
||
drData["LJL"] = (getInt32(strData[20] + strData[21] + strData[22] + strData[23])/10.0).ToString();
|
||
//jldData[5] = (getInt32(strData[20] + strData[21] + strData[22] + strData[23]) / 10).ToString();
|
||
|
||
|
||
|
||
}
|
||
|
||
////温度
|
||
//drData["WD"] = jldData[10];
|
||
////压力
|
||
//drData["YL"] = jldData[9];
|
||
////差压
|
||
//drData["CY"] = jldData[8];
|
||
////瞬时量
|
||
//drData["SSL"] = jldData[0];
|
||
//今日量
|
||
drData["JRL"] = "";
|
||
//昨日量
|
||
drData["ZRL"] = "";
|
||
//累计量
|
||
//drData["LJL"] = "";
|
||
//本月量
|
||
drData["BYL"] ="";
|
||
//上月量
|
||
drData["SYL"] = "";
|
||
//今日时间
|
||
drData["JRSJ"] = "";
|
||
//昨日时间
|
||
drData["ZRSJ"] = "";
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
|
||
break;
|
||
|
||
#endregion
|
||
|
||
#region //盘古积算仪
|
||
|
||
case "5":
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
jldData = new string[8];
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
string[] strData = new string[60];
|
||
for (int i = 0; i < 60; i++)
|
||
{
|
||
strData[i] = bufTemp[i + 3].ToString("X2");
|
||
}
|
||
jldData[0] = (getsingle(strData[24] + strData[25] + strData[36] + strData[27]) / 1).ToString(); //瞬时流量
|
||
jldData[1] = (getsingle(strData[34] + strData[35] + strData[36] + strData[37]) / 1).ToString(); //差压//频率
|
||
jldData[2] = (getsingle(strData[44] + strData[45] + strData[46] + strData[47]) / 1).ToString(); ; //温度
|
||
jldData[3] = (getsingle(strData[48] + strData[49] + strData[50] + strData[51]) / 1000).ToString(); //压力
|
||
jldData[4] = (getsingle(strData[16] + strData[17] + strData[18] + strData[19]) / 1).ToString(); //总累计流量
|
||
jldData[7] = (getsingle(strData[56] + strData[57] + strData[58] + strData[59]) / 1).ToString(); //瞬时工况流量
|
||
|
||
|
||
|
||
}
|
||
try
|
||
{
|
||
|
||
|
||
//温度
|
||
drData["WD"] = jldData[2];
|
||
//压力
|
||
drData["YL"] = jldData[3];
|
||
//差压
|
||
try
|
||
{
|
||
drData["CY"] = string.Format("{0:F}", jldData[1]);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
//if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0"))
|
||
//{
|
||
// ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = "";
|
||
//}
|
||
|
||
//累计量
|
||
drData["LJL"] = jldData[4];
|
||
try
|
||
{
|
||
//瞬时量
|
||
drData["SSL"] = (float.Parse(jldData[0]) * 24).ToString("#.#");
|
||
if (drData["SSL"].ToString() == "") drData["SSL"] = "0";
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
drData["SSL"] = "0";
|
||
}
|
||
|
||
|
||
|
||
//本月量
|
||
drData["BYL"] = "";
|
||
//上月量
|
||
drData["SYL"] ="";
|
||
//今日时间
|
||
drData["JRSJ"] = "";
|
||
//昨日时间
|
||
drData["ZRSJ"] = "";
|
||
//仪表状态
|
||
drData["YBZT"] = "运行";
|
||
////计算工况流量
|
||
|
||
drData["SSGKLL"] = jldData[7];
|
||
//Single sngQN;
|
||
//Single sngTf;
|
||
//float sngPf;
|
||
//if (jldData[0] != "")
|
||
//{
|
||
// sngQN = Convert.ToSingle(jldData[0]);
|
||
//}
|
||
//else
|
||
//{
|
||
// sngQN = 0;
|
||
//}
|
||
//if (jldData[2] != "")
|
||
//{
|
||
// sngTf = float.Parse(jldData[2]);
|
||
// sngTf = sngTf + 273.15f;
|
||
//}
|
||
//else
|
||
//{
|
||
// sngTf = 0;
|
||
//}
|
||
|
||
//if (jldData[3] != "" && jldData[3] != "0")
|
||
//{
|
||
// sngPf = Convert.ToSingle(jldData[3]);
|
||
// Single sngFz2;
|
||
|
||
// if (sngPf > 0.1 && sngPf < 0.5)
|
||
// {
|
||
// sngFz2 = 0.999f - 0.008f * (sngPf - 0.1f) / (0.5f - sngPf);
|
||
|
||
// }
|
||
// else
|
||
// {
|
||
// if (sngPf < 0.1) sngFz2 = 0.998f;
|
||
// if (sngPf > 0.5) sngFz2 = 0.988f;
|
||
// }
|
||
|
||
// drData["SSGKLL"] = (sngQN * sngTf * 0.101325 * 0.998 / 293.15 / sngPf).ToString("#.#");
|
||
|
||
//}
|
||
//else
|
||
//{
|
||
// drData["SSGKLL"] = 0;
|
||
//}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
|
||
|
||
}
|
||
//try
|
||
//{
|
||
// drData["CXFlag"] = GetCxFlag(drData["SSGKLL"].ToString(), drData["CLXX"].ToString(), drData["CLSX"].ToString());
|
||
|
||
//}
|
||
//catch (Exception)
|
||
//{
|
||
|
||
|
||
//}
|
||
|
||
//ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[2] + "\t压力:" + jldData[2] + "\t累积量:" + jldData[4], drData["STATION_NAME"].ToString());
|
||
|
||
break;
|
||
#endregion
|
||
|
||
|
||
}
|
||
|
||
return drData;
|
||
|
||
}
|
||
/// <summary>
|
||
/// GPRS模块通讯 数据解析 PLC变化的计量点个数
|
||
/// </summary>
|
||
/// <param name="drData">存储数据的datarow</param>
|
||
/// <param name="bufTemp">ushort 数组</param>
|
||
/// <param name="SbType">设备类型</param>
|
||
/// <returns></returns>
|
||
public static DataRow[] GetDataTran_GPRS(DataRow[] drData, byte[] bufTemp, string SbType)
|
||
{
|
||
int dataNum = bufTemp[2];
|
||
byte[] CrcNum;
|
||
string strPrint = "";
|
||
switch (SbType)
|
||
{
|
||
#region //施耐德PLC
|
||
case "0": //施耐德PLC
|
||
CrcNum = GetCRC16(bufTemp, dataNum + 3, true);
|
||
if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4])
|
||
{
|
||
int jldNum = dataNum / 40;
|
||
string[] strData = new string[jldNum * 20];
|
||
for (int i = 0; i < jldNum * 20; i++)
|
||
{
|
||
strData[i] = bufTemp[i * 2 + 3].ToString("X2") + bufTemp[i * 2 + 1 + 3].ToString("X2");
|
||
}
|
||
|
||
for (int jldID = 0; jldID < jldNum; jldID++)
|
||
{
|
||
//解析数据为明文-----------------------------------------------------
|
||
//温度
|
||
drData[jldID]["WD"] = (getInt16(strData[13 + jldID * 20].ToString()) / 10.0).ToString("0.##");
|
||
//压力
|
||
drData[jldID]["YL"] = (getInt16(strData[12 + jldID * 20].ToString()) / 1000.0).ToString("0.###");
|
||
//差压
|
||
drData[jldID]["CY"] = (getInt16(strData[14 + jldID * 20].ToString()) / 100.0).ToString("0.###");
|
||
//if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0"))
|
||
// {
|
||
// ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = "";
|
||
// }
|
||
|
||
//瞬时量
|
||
drData[jldID]["SSL"] = (getUInt32(strData[0 + jldID * 20].ToString(), strData[1 + jldID * 20].ToString()) / 100 * 24).ToString();
|
||
//今日量
|
||
drData[jldID]["JRL"] = (getUInt32(strData[2 + jldID * 20].ToString(), strData[3 + jldID * 20].ToString())).ToString();
|
||
//昨日量
|
||
drData[jldID]["ZRL"] = (getUInt32(strData[4 + jldID * 20].ToString(), strData[5 + jldID * 20].ToString())).ToString();
|
||
//累计量
|
||
drData[jldID]["LJL"] = (getUInt32(strData[10 + jldID * 20].ToString(), strData[11 + jldID * 20].ToString()) / 10000.0).ToString();
|
||
//本月量
|
||
drData[jldID]["BYL"] = (getUInt32(strData[6 + jldID * 20].ToString(), strData[7 + jldID * 20].ToString()) / 10000.0).ToString();
|
||
//上月量
|
||
drData[jldID]["SYL"] = (getUInt32(strData[8 + jldID * 20].ToString(), strData[9 + jldID * 20].ToString()) / 10000.0).ToString();
|
||
//今日时间
|
||
drData[jldID]["JRSJ"] = (getInt16(strData[16 + jldID * 20].ToString())).ToString();
|
||
//昨日时间
|
||
drData[jldID]["ZRSJ"] = (getInt16(strData[17 + jldID * 20].ToString())).ToString();
|
||
//仪表状态
|
||
drData[jldID]["YBZT"] = "运行";
|
||
|
||
//ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData[jldID]["JLD_ID"] + ":\t 瞬时量:" + (getUInt32(strData[0 + jldID * 20].ToString(), strData[1 + jldID * 20].ToString()) / 100 * 24).ToString()
|
||
// + "\t温度:" + (getInt16(strData[13 + jldID * 20].ToString()) / 10.0).ToString("0.##")
|
||
// + "\t压力:" + (getInt16(strData[12 + jldID * 20].ToString()) / 1000.0).ToString("0.###")
|
||
// + "\t累积量:" + (getUInt32(strData[10 + jldID * 20].ToString(), strData[11 + jldID * 20].ToString()) / 10000.0).ToString(), drData[jldID]["STATION_NAME"].ToString());
|
||
|
||
|
||
|
||
}
|
||
|
||
}
|
||
break;
|
||
#endregion
|
||
}
|
||
|
||
return drData;
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断脉冲仪表工况运行状态
|
||
/// </summary>
|
||
/// <param name="Value">工况流量</param>
|
||
/// <param name="strXx">仪表上限</param>
|
||
/// <param name="strSx">仪表下限</param>
|
||
/// <returns>超限级别 4 3 2 1 0 -1 -2 -3 -4</returns>
|
||
public static string GetCxFlag(string Value, string strXx, string strSx)
|
||
{
|
||
string strCxFlag = "";
|
||
try
|
||
{
|
||
//判断工况是否超限
|
||
if (Value != "")
|
||
{
|
||
Single sngSSGK = Convert.ToSingle(Value);
|
||
Single sngCLXX = Convert.ToSingle(strXx);
|
||
Single sngCLSX = Convert.ToSingle(strSx);
|
||
|
||
if (sngSSGK > 0.8 * sngCLSX) strCxFlag = "1";
|
||
if (sngSSGK > 0.95 * sngCLSX) strCxFlag = "2";
|
||
if (sngSSGK > sngCLSX) strCxFlag = "3";
|
||
|
||
if (sngSSGK >= 0.3 * sngCLSX && sngSSGK <= 0.8 * sngCLSX) strCxFlag = "0";
|
||
|
||
if (sngSSGK < 0.3 * sngCLSX) strCxFlag = "-1";
|
||
if (sngSSGK < 0.1 * sngCLSX) strCxFlag = "-2";
|
||
if (sngSSGK < sngCLXX && sngSSGK > 0) strCxFlag = "-3";
|
||
if (sngSSGK == 0) strCxFlag = "-4";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
|
||
}
|
||
return strCxFlag;
|
||
}
|
||
/// <summary>
|
||
/// 判断孔板差压运行情况是否超限
|
||
/// </summary>
|
||
/// <param name="Value">差压值</param>
|
||
/// <returns>超限级别 4 3 2 1 0 -1 -2 -3 -4</returns>
|
||
public static string GetCxFlag(string Value)
|
||
{
|
||
string strCxFlag = "";
|
||
//判断差压是否超限
|
||
try
|
||
{
|
||
Single sngCy = 0;
|
||
if (Value != "" && Value != "-")
|
||
{
|
||
sngCy = Convert.ToSingle(Value);
|
||
}
|
||
|
||
if (sngCy > 40) strCxFlag = "1";
|
||
if (sngCy > 50) strCxFlag = "2";
|
||
if (sngCy > 55) strCxFlag = "3";
|
||
if (sngCy > 60) strCxFlag = "4";
|
||
|
||
if (sngCy >= 5 && sngCy <= 40) strCxFlag = "0";
|
||
|
||
if (sngCy < 5) strCxFlag = "-1";
|
||
if (sngCy < 3) strCxFlag = "-2";
|
||
if (sngCy < 1 && sngCy > 0) strCxFlag = "-3";
|
||
if (sngCy == 0) strCxFlag = "-4";
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
return strCxFlag;
|
||
}
|
||
|
||
|
||
public static DataRow GetPLCPar_Net(DataRow drData, ushort[] usWord, string SbType)
|
||
{
|
||
string[] tempWord;
|
||
tempWord = new string[60];
|
||
for (int j = 0; j < 60; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中
|
||
{
|
||
tempWord[j] = usWord[j].ToString("x4");
|
||
}
|
||
string[] sngPar = new string[30];
|
||
|
||
for (int j = 0; j < 30; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中
|
||
{
|
||
if (j <= 21)
|
||
{
|
||
sngPar[j] = (getsingle(tempWord[j * 2 + 1] + tempWord[j * 2]) * 100).ToString();
|
||
}
|
||
else
|
||
{
|
||
sngPar[j] = getsingle(tempWord[j * 2 + 1] + tempWord[j * 2]).ToString();
|
||
}
|
||
drData[j] = sngPar[j];
|
||
if (j == 28)
|
||
{
|
||
drData["BAK3"] = "读取成功";
|
||
}
|
||
}
|
||
float c1bfs = float.Parse(sngPar[0]);
|
||
if (c1bfs > 7000)
|
||
{
|
||
for (int j = 0; j < 21; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中
|
||
{
|
||
sngPar[j] = (Single.Parse(sngPar[j]) / 100).ToString();
|
||
drData[j] = sngPar[j];
|
||
}
|
||
}
|
||
return drData;
|
||
}
|
||
|
||
public static DataRow netError(DataRow drData)
|
||
{
|
||
//温度
|
||
drData["WD"] = "";
|
||
//压力
|
||
drData["YL"] = "";
|
||
//差压
|
||
drData["CY"] = "";
|
||
//瞬时量
|
||
drData["SSL"] = "";
|
||
//今日量
|
||
drData["JRL"] = "";
|
||
//昨日量
|
||
drData["ZRL"] = "";
|
||
//累计量
|
||
drData["LJL"] = "";
|
||
//本月量
|
||
drData["BYL"] = "";
|
||
//上月量
|
||
drData["SYL"] = "";
|
||
//今日时间
|
||
drData["JRSJ"] = "";
|
||
//昨日时间
|
||
drData["ZRSJ"] = "";
|
||
//仪表状态
|
||
|
||
|
||
drData["YBZT"] = "通讯故障";
|
||
|
||
return drData;
|
||
}
|
||
|
||
public static byte[] Modbus_ReadData(int Addr, int Func, int StartAddr, int DataNum)
|
||
{
|
||
Byte[] RcvStr;
|
||
Byte[] SendStr;
|
||
SendStr = new Byte[8];
|
||
SendStr[0] = byte.Parse(Addr.ToString()); //' ,从站号是2
|
||
SendStr[1] = byte.Parse(Func.ToString());//' ,读多个字的命令代码
|
||
int Hibyte = StartAddr / 256;
|
||
int LowByte = StartAddr % 256;
|
||
SendStr[2] = byte.Parse(Hibyte.ToString());// ',起始地址高字节 0x807开始
|
||
SendStr[3] = byte.Parse(LowByte.ToString());// ',起始地址低字节
|
||
Hibyte = DataNum / 256;
|
||
LowByte = DataNum % 256;
|
||
SendStr[4] = byte.Parse(Hibyte.ToString());//',数据长度高字节
|
||
SendStr[5] = byte.Parse(LowByte.ToString()); //',数据长度低字节
|
||
RcvStr = GetCRC16(SendStr, 6, true);// ',CRC计算
|
||
SendStr[6] = RcvStr[0];
|
||
SendStr[7] = RcvStr[1];
|
||
return SendStr;
|
||
}
|
||
public static string GetFlowGK(ushort[] uhNum, ushort[] uhK,out string strPlusNum)
|
||
{
|
||
int intPlusNum = 0;
|
||
intPlusNum = Convert.ToInt16(uhNum[0]);
|
||
|
||
string[] strPlusK;
|
||
strPlusK = new string[4];
|
||
for (int j = 0; j < 4; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中
|
||
{
|
||
strPlusK[j] = uhK[j].ToString("x4");
|
||
}
|
||
float sngPlusK = 0;
|
||
sngPlusK = getsingle(strPlusK[1] + strPlusK[0]);
|
||
strPlusNum = intPlusNum.ToString();
|
||
return (intPlusNum / sngPlusK * 3600).ToString("0.#");
|
||
|
||
}
|
||
|
||
|
||
#region 数据格式转换
|
||
private static uint getUInt32(string low, string hight)
|
||
{
|
||
if (low == "" & hight == "")
|
||
{
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
return (uint)(Convert.ToUInt16(low, 0x10) + (Convert.ToUInt16(hight, 0x10) * 0xffff));
|
||
}
|
||
}
|
||
|
||
private static short getInt16(string low)
|
||
{
|
||
if (low == "")
|
||
{
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
return Convert.ToInt16(low, 0x10);
|
||
}
|
||
}
|
||
|
||
private static int getInt32(string low)
|
||
{
|
||
if (low == "")
|
||
{
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
return Convert.ToInt32(low, 0x10);
|
||
}
|
||
}
|
||
|
||
private static UInt32 getint(string _strData)
|
||
{
|
||
string shuju = _strData;
|
||
uint num = uint.Parse(shuju, System.Globalization.NumberStyles.AllowHexSpecifier);
|
||
byte[] floatValues = BitConverter.GetBytes(num);
|
||
string f = BitConverter.ToUInt32(floatValues, 0).ToString("0.######");
|
||
return UInt32.Parse(f);
|
||
}
|
||
|
||
|
||
|
||
private static Single getsingle(string _strData)
|
||
{
|
||
string shuju = _strData;
|
||
uint num = uint.Parse(shuju, System.Globalization.NumberStyles.AllowHexSpecifier);
|
||
byte[] floatValues = BitConverter.GetBytes(num);
|
||
string f = BitConverter.ToSingle(floatValues, 0).ToString("0.######");
|
||
return Single.Parse(f);
|
||
}
|
||
|
||
|
||
#endregion
|
||
|
||
|
||
#region 校验和
|
||
/// <summary>
|
||
/// 计算按位异或校验和(返回校验和值)
|
||
/// </summary>
|
||
/// <param name="Cmd">命令数组</param>
|
||
/// <returns>校验和值</returns>
|
||
private static byte GetXOR(byte[] Cmd)
|
||
{
|
||
byte check = (byte)(Cmd[0] ^ Cmd[1]);
|
||
for (int i = 2; i < Cmd.Length; i++)
|
||
{
|
||
check = (byte)(check ^ Cmd[i]);
|
||
}
|
||
return check;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算按位异或校验和(返回包含校验和的完整命令数组)
|
||
/// </summary>
|
||
/// <param name="Cmd">命令数组</param>
|
||
/// <returns>包含校验和的完整命令数组</returns>
|
||
private static byte[] GetXORFull(byte[] Cmd)
|
||
{
|
||
byte check = GetXOR(Cmd);
|
||
List<byte> newCmd = new List<byte>();
|
||
newCmd.AddRange(Cmd);
|
||
newCmd.Add(check);
|
||
return newCmd.ToArray();
|
||
}
|
||
#endregion
|
||
#region CRC16查表法
|
||
|
||
#region CRC对应表
|
||
//高位表
|
||
readonly static byte[] CRCHigh = new byte[]{
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
|
||
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
|
||
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40};
|
||
//低位表
|
||
readonly static byte[] CRCLow = new byte[]{
|
||
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
|
||
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
|
||
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
|
||
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
|
||
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
|
||
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
|
||
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
|
||
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
|
||
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
|
||
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
|
||
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
|
||
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
|
||
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
|
||
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
|
||
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
|
||
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
|
||
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
|
||
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
|
||
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
|
||
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
|
||
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
|
||
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
|
||
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
|
||
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
|
||
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
|
||
0x43, 0x83, 0x41, 0x81, 0x80, 0x40};
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 计算CRC16循环校验码
|
||
/// </summary>
|
||
/// <param name="Cmd">命令数组</param>
|
||
/// <param name="IsHighBefore">高位是否在前</param>
|
||
/// <returns>高低位校验码</returns>
|
||
public static byte[] GetCRC16(byte[] Cmd, int Num, bool IsHighBefore)
|
||
{
|
||
int index;
|
||
int crc_Low = 0xFF;
|
||
int crc_High = 0xFF;
|
||
for (int i = 0; i < Num; i++)
|
||
{
|
||
index = crc_High ^ (char)Cmd[i];
|
||
crc_High = crc_Low ^ CRCHigh[index];
|
||
crc_Low = (byte)CRCLow[index];
|
||
}
|
||
if (IsHighBefore == true)
|
||
{
|
||
return new byte[2] { (byte)crc_High, (byte)crc_Low };
|
||
}
|
||
else
|
||
{
|
||
return new byte[2] { (byte)crc_Low, (byte)crc_High };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算CRC16循环校验码(返回包含校验码的完整命令数组)
|
||
/// </summary>
|
||
/// <param name="Cmd">命令数组</param>
|
||
/// <param name="IsHighBefore">高位是否在前</param>
|
||
/// <returns></returns>
|
||
|
||
#endregion
|
||
|
||
|
||
}
|
||
}
|