GetPLC_Data/ConsoleGetPLCData/CS/TranData.cs
2025-11-08 08:17:36 +08:00

1108 lines
49 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}