C#上位机软件读取三菱FX_2N数据分析问题
/// <summary>/// 根据寄存器地址返回读取结果
/// </summary>
/// <param name="intAddr">寄存器地址</param>
/// <param name="strType">读取类型 0:正常地址 1:4位地址</param>
/// <param name="strDataType">读取数据类型 0:整形 1:浮点型</param>
/// <param name="decValue">读取的结果</param>
/// <returns></returns>
public bool Read_PLC(int intAddr, string strType, string strDataType, out decimal decValue)
{
bool bolValue = false;
decimal decGet = 0;
DateTime dtOut;
TimeSpan tsOut;
//object objct = new object();
//lock (objct)
//{
try
{
if (SerPort.IsOpen)
{
byte bytEven_H = 0;
byte bytEven_L = 0;
//三菱PLC通讯协议 02(开始符) 30(功能码 0:读 1:写) XX XX XX XX(寄存器地址) 30 32(2字节数) 03(结束符) XX XX(校验)
byte[] bytBuff = new byte[11];
bytBuff[0] = 0x02;
bytBuff[1] = 0x30;
string strPrt = PLC_Addr(intAddr, strType).PadLeft(4, '0'); //根据三菱PLC地址算法返回地址
byte[] bytPrt = Encoding.ASCII.GetBytes(strPrt);
bytBuff[2] = bytPrt[0];
bytBuff[3] = bytPrt[1];
bytBuff[4] = bytPrt[2];
bytBuff[5] = bytPrt[3];
bytBuff[6] = 0x30;
//if (strDataType == "0")
// bytBuff[7] = 0x32; //读取2个字节
//else
bytBuff[7] = 0x34;
bytBuff[8] = 0x03;
PLC_Even(bytBuff, out bytEven_H, out bytEven_L);
bytBuff[9] = bytEven_L;
bytBuff[10] = bytEven_H;
serPort.DiscardInBuffer(); //刷新端口
serPort.Write(bytBuff, 0, bytBuff.Length);
dtOut = DateTime.Now;
Thread.Sleep(100);
int intCunt = serPort.BytesToRead;
tsOut = DateTime.Now - dtOut;
if (tsOut.Milliseconds > intTimeOut)
{
bolValue = false;
strPLCErr = "根据寄存器地址:" + intAddr.ToString() + "读取寄存器超时:" + tsOut.Milliseconds.ToString();
}
else
{
if (intCunt > 0)
{
byte[] bytRec = new byte[intCunt];
serPort.Read(bytRec, 0, bytRec.Length);
if (bytRec.Length >= 6)
{
for (int i = 0; i < bytRec.Length; i++)
{
if (bytRec[i] == 2)
{
if (bytRec[i + 9] == 3 )
{
if (strDataType == "0")
{
byte[] bytCopy = new byte[9];
Array.Copy(bytRec, i, bytCopy, 0, 9);
string strA = Encoding.ASCII.GetString(bytCopy, 1, 2);
string strB = Encoding.ASCII.GetString(bytCopy, 3, 2);
string strC = Encoding.ASCII.GetString(bytCopy, 5, 2);
string strD = Encoding.ASCII.GetString(bytCopy, 7, 2);
decGet = Convert.ToInt32(strA, 16) + 256 * Convert.ToInt32(strB, 16) + 65536 * Convert.ToInt32(strC, 16);
if (decGet > 9999999 && (Int32.Parse(decGet.ToString()) & 0x800) == 0x800)
{
int intGet = 0;
intGet = -(((int)(~Int32.Parse(decGet.ToString())) & 0x7FF) + 1);
decGet = decimal.Parse(intGet.ToString());
}
}
else
{
byte[] byt = new byte[8];
Array.Copy(bytRec, 1, byt, 0, 8);
string strASC = Encoding.ASCII.GetString(byt);
string strDSC = string.Empty;
for (int x = 0; x < 4; x++)
{
strDSC += strASC.Substring(2 * (3 - x), 2);
}
for (int j = 0; j < 4; j++)
{
string str = strDSC.Substring(2 * (3 - j), 2);
byt[j] = Convert.ToByte(str, 16);
}
float flt = BitConverter.ToSingle(byt, 0);
string strflt = flt.ToString("F3");
decGet = decimal.Parse(strflt);
//decGet = intStrToFloat(bytRec);
}
bolValue = true;
break;
}
}
}
}
}
}
}
else
{
strPLCErr = "请确定PLC通讯端口已打开...";
bolValue = false;
}
}
catch (Exception expt)
{
strPLCErr = "根据寄存器地址:" + intAddr.ToString() + "读取结果发生异常:" + expt.Message;
bolValue = false;
}
//}
decValue = decGet;
return bolValue;
}
读取数据后,如果为整数数据的话,如何分析呢
byte[] bytCopy = new byte[9];
Array.Copy(bytRec, i, bytCopy, 0, 9);
string strA = Encoding.ASCII.GetString(bytCopy, 1, 2);
string strB = Encoding.ASCII.GetString(bytCopy, 3, 2);
string strC = Encoding.ASCII.GetString(bytCopy, 5, 2);
string strD = Encoding.ASCII.GetString(bytCopy, 7, 2);
decGet = Convert.ToInt32(strA, 16) + 256 * Convert.ToInt32(strB, 16) + 65536 * Convert.ToInt32(strC, 16);
if (decGet > 9999999 && (Int32.Parse(decGet.ToString()) & 0x800) == 0x800)
{
int intGet = 0;
intGet = -(((int)(~Int32.Parse(decGet.ToString())) & 0x7FF) + 1);
decGet = decimal.Parse(intGet.ToString());
}
这部分不是思路不是很清晰,请教大神们帮忙,谢谢!