using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace ConsoleGetPLCData.CS { public class TranData { /// /// 局域网Modbus通讯协议解析 /// /// 存储数据的datarow /// ushort 数组 /// 设备类型 /// 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; } /// /// GPRS模块通讯 数据解析 /// /// 存储数据的datarow /// ushort 数组 /// 设备类型 /// 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; } /// /// GPRS模块通讯 数据解析 PLC变化的计量点个数 /// /// 存储数据的datarow /// ushort 数组 /// 设备类型 /// 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; } /// /// 判断脉冲仪表工况运行状态 /// /// 工况流量 /// 仪表上限 /// 仪表下限 /// 超限级别 4 3 2 1 0 -1 -2 -3 -4 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; } /// /// 判断孔板差压运行情况是否超限 /// /// 差压值 /// 超限级别 4 3 2 1 0 -1 -2 -3 -4 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 校验和 /// /// 计算按位异或校验和(返回校验和值) /// /// 命令数组 /// 校验和值 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; } /// /// 计算按位异或校验和(返回包含校验和的完整命令数组) /// /// 命令数组 /// 包含校验和的完整命令数组 private static byte[] GetXORFull(byte[] Cmd) { byte check = GetXOR(Cmd); List newCmd = new List(); 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 /// /// 计算CRC16循环校验码 /// /// 命令数组 /// 高位是否在前 /// 高低位校验码 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 }; } } /// /// 计算CRC16循环校验码(返回包含校验码的完整命令数组) /// /// 命令数组 /// 高位是否在前 /// #endregion } }