/// <summary> /// 读取M点状态,按字读取 /// </summary> /// <param name="StartPoint">int,M点</param> /// <param name="len">int,读取M点字数,如值为1,则读8个M点,值为2,则读16个M点</param> /// <param name="ReadValue">int,读取M点所在字长度内的状态</param> /// <returns>bool,操作是否成功</returns> public bool FxPlc_ReadM(int StartPoint, int len, out UInt32 ReadValue) { byte[] WriteBuff = new byte[11]; //发送数据 byte[] ReadBuff = new byte[20]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 ReadValue = 0; len = Math.Min(len, 4); byte CrcHi = 0, CrcLo = 0;//CRC校验 if (cMain.isDebug) { ReadValue = 0; return(true); } if (!mFXPLCIsInit)//没有初始化 { FxPlcInit(); return(false); } try { StartPoint = StartPoint / 8; WriteBuff[0] = 0x02; WriteBuff[1] = 0x30; WriteBuff[2] = 0x30; WriteBuff[3] = 0x31; WriteBuff[4] = Encoding.ASCII.GetBytes(string.Format("{0:X1}", (int)(StartPoint / 16) & 0x0F))[0]; WriteBuff[5] = Encoding.ASCII.GetBytes(string.Format("{0:X1}", (int)(StartPoint / 1) & 0x0F))[0]; WriteBuff[6] = Encoding.ASCII.GetBytes(string.Format("{0:X2}", len))[0]; WriteBuff[7] = Encoding.ASCII.GetBytes(string.Format("{0:X2}", len))[1]; WriteBuff[8] = 0x03; FxPlcCrc(WriteBuff, out CrcLo, out CrcHi); WriteBuff[9] = CrcLo; WriteBuff[10] = CrcHi; if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(WriteBuff, 0, 11); NowTime = DateTime.Now; do { Threading.Thread.Sleep(50); if (comPort.BytesToRead >= (4 + len * 2))//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",FxPlc_ReadM," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } return(false); } comPort.Read(ReadBuff, 0, ReturnByte); ReadValue = Convert.ToUInt32(Encoding.ASCII.GetString(ReadBuff, 1, 2 * len), 16); } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",FxPlc_ReadM," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 写入M点状态 /// </summary> /// <param name="StartPoint">int,M点</param> /// <param name="Value">bool,写入M点值</param> /// <returns>bool,操作是否成功</returns> public bool FxPlc_WriteM(int StartPoint, bool Value) { byte[] WriteBuff = new byte[15]; //发送数据 byte[] ReadBuff = new byte[20]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 byte CrcHi = 0, CrcLo = 0; //CRC校验 int tempAddress = 0x800 + StartPoint; byte[] Address = Encoding.ASCII.GetBytes(string.Format("{0:X4}", tempAddress)); if (cMain.isDebug) { Value = false; return(true); } if (!mFXPLCIsInit)//没有初始化 { FxPlcInit(); return(false); } try { WriteBuff[0] = 0x02; WriteBuff[1] = (byte)(Value ? 0x37 : 0x38); WriteBuff[2] = Address[2]; WriteBuff[3] = Address[3]; WriteBuff[4] = Address[0]; WriteBuff[5] = Address[1]; WriteBuff[6] = 0x03; FxPlcCrc(WriteBuff, out CrcLo, out CrcHi); WriteBuff[7] = CrcLo; WriteBuff[8] = CrcHi; if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(WriteBuff, 0, 9); NowTime = DateTime.Now; do { Threading.Thread.Sleep(20); if (comPort.BytesToRead >= 1)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",FxPlc_WriteD," + ":写入失败,接收数据已超时" + (char)13 + (char)10; } return(false); } comPort.Read(ReadBuff, 0, ReturnByte); if (ReadBuff[0] != 06) { if (ErrStr.IndexOf("写入数据失败") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",FxPlc_WriteD," + ":写入失败,写入数据失败" + (char)13 + (char)10; } return(false); } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",FxPlc_WriteD," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
public bool Set(int Vol, int Hz, int Group) { if (cMain.isDebug) { return(true); } if (!mAiNuoIsInit) { Init(); return(false); } bool isReadOk = false; int ReadVol, ReadHz, ReadGroup; byte[] WriteBuff = new byte[29]; //发送数据 byte[] ReadBuff = new byte[20]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime = DateTime.Now; //当前时间 string WriteVolStr; string WriteHzStr; TimeSpan ts;//时间差 try { if (!comPort.IsOpen) { comPort.Open(); } WriteVolStr = string.Format("{0:D3}", Vol); WriteHzStr = string.Format("{0:D4}", Hz * 10); WriteBuff[0] = 0x7B;// Encoding.ASCII.GetBytes(new char[] { '@' }); WriteBuff[1] = 0x1A; WriteBuff[2] = (byte)((AiNuoAddress & 0xFF00) >> 8); WriteBuff[3] = (byte)(AiNuoAddress & 0xFF); WriteBuff[4] = 0x53; WriteBuff[5] = 0x4E; WriteBuff[6] = 0x4F; WriteBuff[7] = 0x3D; WriteBuff[8] = Encoding.ASCII.GetBytes(WriteVolStr)[0];//电压 WriteBuff[9] = Encoding.ASCII.GetBytes(WriteVolStr)[1]; WriteBuff[10] = Encoding.ASCII.GetBytes(WriteVolStr)[2]; WriteBuff[11] = 0x2C; WriteBuff[12] = Encoding.ASCII.GetBytes(WriteHzStr)[0];//频率 WriteBuff[13] = Encoding.ASCII.GetBytes(WriteHzStr)[1]; WriteBuff[14] = Encoding.ASCII.GetBytes(WriteHzStr)[2]; WriteBuff[15] = Encoding.ASCII.GetBytes(WriteHzStr)[3]; WriteBuff[16] = 0x2C; WriteBuff[17] = 0x33;//上浮 WriteBuff[18] = 0x30; WriteBuff[19] = 0x2C; WriteBuff[20] = 0x33;//下浮 WriteBuff[21] = 0x30; WriteBuff[22] = 0x2C; WriteBuff[23] = Encoding.ASCII.GetBytes(Group.ToString("D1"))[0];//组别 WriteBuff[24] = 0x2C; WriteBuff[25] = 0x30;//高档不锁定 WriteBuff[26] = 0x2A; WriteBuff[27] = Sum_DianYuan(WriteBuff, 1, 26); WriteBuff[28] = 0x7D; comPort.DiscardInBuffer(); comPort.Write(WriteBuff, 0, 29); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(20); if (comPort.BytesToRead >= 13)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + mName + ",init," + "初始失败,接收数据已超时" + (char)13 + (char)10; } return(false); } else { comPort.Read(ReadBuff, 0, ReturnByte); //string a = Encoding.ASCII.GetString(ReadBuff); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[4] != 0x53) || (ReadBuff[7] != 0x3D) || (ReadBuff[8] != 0x3D))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + mName + ",init," + ":初始失败,接收数据错误" + (char)13 + (char)10; } return(false); } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + mName + ",init," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } Threading.Thread.Sleep(300); isReadOk = Read(out ReadVol, out ReadHz, out ReadGroup); if ((ReadVol != Vol) || (ReadHz != Hz) || (ReadGroup != Group)) { isReadOk = false; } return(isReadOk); }
public bool Stop() { if (cMain.isDebug) { return(true); } if (!mAiNuoIsInit) { Init(); return(false); } byte[] WriteBuff = new byte[10]; //发送数据 byte[] ReadBuff = new byte[20]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime = DateTime.Now; //当前时间 TimeSpan ts; //时间差 try { if (!comPort.IsOpen) { comPort.Open(); } WriteBuff[0] = 0x7B;// Encoding.ASCII.GetBytes(new char[] { '@' }); WriteBuff[1] = 0x07; WriteBuff[2] = (byte)((AiNuoAddress & 0xFF00) >> 8); WriteBuff[3] = (byte)(AiNuoAddress & 0xFF); WriteBuff[4] = 0x43; WriteBuff[5] = 0x53; WriteBuff[6] = 0x50; WriteBuff[7] = 0x2A; WriteBuff[8] = Sum_DianYuan(WriteBuff, 1, 7); WriteBuff[9] = 0x7D; //string a = Encoding.ASCII.GetString(WriteBuff); comPort.DiscardInBuffer(); comPort.Write(WriteBuff, 0, 10); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(20); if (comPort.BytesToRead >= 13)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + mName + ",init," + "初始失败,接收数据已超时" + (char)13 + (char)10; } return(false); } else { comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[4] != 0x43) || (ReadBuff[7] != 0x3D) || (ReadBuff[8] != 0x3D))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + mName + ",init," + ":初始失败,接收数据错误" + (char)13 + (char)10; } return(false); } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + mName + ",init," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 专用于7188,将指定指令发送到模块,并返回所须要的数据 /// </summary> /// <param name="mWriteBuff">byte[],须要发送出去的指令</param> /// <param name="mReadBuff">byte[] ,返回数据</param> /// <returns>bool,读取数据是否成功</returns> public bool StandarBoard7188Read(byte[] mWriteBuff, out byte[] ReadBuff) { int i, tempInt; ReadBuff = new byte[1]; byte[] mReadBuff = new byte[100]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 if (!mStandarBoardInit) //没有初始化 { StandarBoardInit(); return(false); } //byte NowByte; try { if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(mWriteBuff, 0, mWriteBuff.Length); tempInt = 0; NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(50); tempInt = comPort.BytesToRead; if (tempInt >= 9)//收到数据 { Threading.Thread.Sleep(50); ReturnByte = comPort.BytesToRead; if (ReturnByte == tempInt) { IsReturn = true; } } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } return(false); } if (ReturnByte > 100) { if (errStr.IndexOf("数据长度错误") < 0) { errStr = errStr + DateTime.Now.ToString() + ":读取失败,数据长度错误或过长" + (char)13 + (char)10; } } else { comPort.Read(mReadBuff, 0, ReturnByte); } if ((mReadBuff[0] != mWriteBuff[0]) || (mReadBuff[1] != mWriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据错误" + (char)13 + (char)10; } return(false); } else { if (mReadBuff[5] > 0) { ReadBuff = new byte[mReadBuff[6]]; for (i = 0; i < mReadBuff[6]; i++) { ReadBuff[i] = mReadBuff[i + 7]; } } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 读取模块中多个数据 /// </summary> /// <param name="StartAdd">读取数据开始寄存器</param> /// <param name="PointCount">读取寄存器个数</param> /// <param name="mReturnBuff">读取寄存器数据</param> /// <returns>读取数据是否成功</returns> public bool StandarBoardRead(int StartAdd, int PointCount, ref long[] mReturnBuff) { int i; long[] ReturnBuff = new long[PointCount]; byte[] WriteBuff = new byte[10]; //发送数据 byte[] ReadBuff = new byte[2 * PointCount + 5]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 byte CrcHi = 0, CrcLo = 0; //CRC校验 try { //05 03 24 10 00 06 CF 79 WriteBuff[0] = _StandarModebusAddress; WriteBuff[1] = 0x03; WriteBuff[2] = (byte)((StartAdd & 0xFF00) >> 8); WriteBuff[3] = (byte)(StartAdd & 0x00FF); WriteBuff[4] = (byte)((PointCount & 0xFF00) >> 8); WriteBuff[5] = (byte)(PointCount & 0x00FF); cMain.CRC_16(WriteBuff, 6, ref CrcLo, ref CrcHi); WriteBuff[6] = CrcLo; WriteBuff[7] = CrcHi; if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(WriteBuff, 0, 8); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(50); if (comPort.BytesToRead >= (2 * WriteBuff[5] + 5))//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } return(false); } comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[1] != WriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据错误" + (char)13 + (char)10; } return(false); } else { for (i = 0; i < ReturnBuff.Length; i++) { ReturnBuff[i] = (ReadBuff[i * 2 + 3] & 0xFF) * 256 + (ReadBuff[i * 2 + 4] & 0xFF); mReturnBuff[i] = ReturnBuff[i]; } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 标准模块初始化 /// </summary> /// <returns>返回初始化是否成功</returns> public bool StandarBoardInit() { if (cMain.isDebug) { mStandarBoardInit = true; return(true); } byte[] WriteBuff = new byte[10]; //发送数据 byte[] ReadBuff = new byte[20]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime = DateTime.Now; //当前时间 TimeSpan ts; //时间差 byte CrcHi = 0, CrcLo = 0; //CRC校验 try { if (!comPort.IsOpen) { comPort.Open(); } WriteBuff[0] = (byte)(_StandarModebusAddress & 0xFF); WriteBuff[1] = 0x03; WriteBuff[2] = 0x00; WriteBuff[3] = 0x01; WriteBuff[4] = 0x00; WriteBuff[5] = 0x01; cMain.CRC_16(WriteBuff, 6, ref CrcLo, ref CrcHi); WriteBuff[6] = CrcLo; WriteBuff[7] = CrcHi; comPort.DiscardInBuffer(); comPort.Write(WriteBuff, 0, 8); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(50); if (comPort.BytesToRead >= WriteBuff[5] * 2 + 5)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardInit," + "初始失败,接收数据已超时" + (char)13 + (char)10; } return(false); } else { comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[1] != WriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardInit," + ":初始失败,接收数据错误" + (char)13 + (char)10; } return(false); } else { mStandarBoardInit = true; } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardInit," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 专用于7188,将指定指令发送到模块,并返回设置是否成功 /// </summary> /// <param name="mWriteBuff">byte[],发送7188的指令</param> /// <returns>bool,返回设置指令是否成功</returns> public bool StandarBoard7188Set(byte[] mWriteBuff) { byte[] mReadBuff = new byte[100]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 if (cMain.isDebug) { return(true); } if (!mStandarBoardInit)//没有初始化 { StandarBoardInit(); return(false); } try { if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(mWriteBuff, 0, mWriteBuff.Length); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(50); if (comPort.BytesToRead >= mWriteBuff.Length)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } return(false); } comPort.Read(mReadBuff, 0, ReturnByte); if ((mReadBuff[0] != mWriteBuff[0]) || (mReadBuff[1] != mWriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":读取失败,接收数据错误" + (char)13 + (char)10; } return(false); } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardRead," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 将多个数据写入到寄存器,功能码为Ox10 /// </summary> /// <param name="StartAdd">写入寄存器开始地址</param> /// <param name="PointCount">写入数据长度</param> /// <param name="mWriteBuff">写入的数据,mWriteBuff.Length的个数不要小于PointCount</param> /// <returns>返回写入是否成功</returns> public bool StandarBoardWritePoint(int StartAdd, int PointCount, byte[] mWriteBuff) { long[] ReturnBuff = new long[8]; byte[] WriteBuff = new byte[PointCount * 2 + 9]; //发送数据 byte[] ReadBuff = new byte[21]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 byte CrcHi = 0, CrcLo = 0; //CRC校验 int i; if (cMain.isDebug) { return(true); } if (!mStandarBoardInit)//没有初始化 { StandarBoardInit(); return(false); } try { WriteBuff[0] = _StandarModebusAddress; WriteBuff[1] = 0x10; WriteBuff[2] = (byte)((StartAdd & 0xFF00) >> 8); WriteBuff[3] = (byte)(StartAdd & 0xFF); WriteBuff[4] = (byte)((PointCount & 0xFF00) >> 8); WriteBuff[5] = (byte)(PointCount & 0xFF); WriteBuff[6] = (byte)((PointCount * 2) & 0xFF); for (i = 0; i < PointCount * 2; i++) { WriteBuff[7 + i] = mWriteBuff[i]; } cMain.CRC_16(WriteBuff, PointCount * 2 + 7, ref CrcLo, ref CrcHi); WriteBuff[PointCount * 2 + 7] = CrcLo; WriteBuff[PointCount * 2 + 8] = CrcHi; if (!comPort.IsOpen) { comPort.Open(); } comPort.DiscardInBuffer();//刷新串口 comPort.Write(WriteBuff, 0, PointCount * 2 + 9); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); Threading.Thread.Sleep(50); if (comPort.BytesToRead >= 8)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardWritePoint," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } return(false); } comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[1] != WriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardWritePoint," + ":读取失败,接收数据错误" + (char)13 + (char)10; } return(false); } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",StandarBoardWritePoint," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// WbGonglv初始化 /// </summary> /// <returns>bool,返回初始结果</returns> public bool WbGonglvInit() { if (cMain.isDebug) { mWbGonglvInit = true; return(true); } byte[] WriteBuff = new byte[10]; //发送数据 byte[] ReadBuff = new byte[20]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime = DateTime.Now; //当前时间 TimeSpan ts; //时间差 try { if (!comPort.IsOpen) { comPort.Open(); } WriteBuff[0] = 0x7E; WriteBuff[1] = 0x01; WriteBuff[2] = 0xFF; WriteBuff[3] = 0x50; WriteBuff[4] = 0xB0; WriteBuff[5] = 0x0D; comPort.DiscardInBuffer(); comPort.Write(WriteBuff, 0, 6); NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); System.Threading.Thread.Sleep(100); if (comPort.BytesToRead >= 14)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",mWbGonglvInit," + "初始失败,接收数据已超时" + (char)13 + (char)10; } cMain.WriteErrorToLog(ReturnByte.ToString()); return(false); } else { comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[1] != WriteBuff[1]))//数据检验失败 { if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",mWbGonglvInit," + ":初始失败,接收数据错误" + (char)13 + (char)10; } return(false); } else { mWbGonglvInit = true; } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",mWbGonglvInit," + ":" + exc.ToString() + (char)13 + (char)10; } return(false); } return(true); }
/// <summary> /// 读取2010模块数据 /// </summary> /// <param name="ReturnBuff">返回读取9元素数组,0,1,2为电压,3,4,5为电流,6,7,8为功率</param> /// <returns>返回读取数据是否成功</returns> public bool WbGonglvRead_R(ref double[] ReturnBuff) { if (cMain.isDebug) { ReturnBuff[0] = 220 + 10 * Num.Rand(); ReturnBuff[1] = 220 + 10 * Num.Rand(); ReturnBuff[2] = 220 + 10 * Num.Rand(); ReturnBuff[3] = 4; // +5 * Num.Rand(); ReturnBuff[4] = 6; // +5 * Num.Rand(); ReturnBuff[5] = 8; // +5 * Num.Rand(); ReturnBuff[6] = ReturnBuff[0] * ReturnBuff[3]; ReturnBuff[7] = ReturnBuff[1] * ReturnBuff[4]; ReturnBuff[8] = ReturnBuff[2] * ReturnBuff[5]; return(true); } bool returnValue = false; long[] mReturnBuff = new long[35]; int i; long[] ReturnBuff1 = new long[4]; byte[] WriteBuff = new byte[10]; //发送数据 byte[] ReadBuff = new byte[16]; //接收数据 int ReturnByte = 0; //返回数据 bool IsReturn = false; //是否成功返回 bool IsTimeOut = false; //是否超时 DateTime NowTime; //当前时间 TimeSpan ts; //时间差 try { //05 03 24 10 00 06 CF 79 WriteBuff[0] = 0x7E; WriteBuff[1] = 0x01; WriteBuff[2] = 0xFF; WriteBuff[3] = 0x50; WriteBuff[4] = 0xB0; WriteBuff[5] = 0x0D; NowTime = DateTime.Now; do { //System.Windows.Forms.Application.DoEvents(); //Threading.Thread.Sleep(20); if (comPort.BytesToRead >= 14)//收到数据 { ReturnByte = comPort.BytesToRead; IsReturn = true; } ts = DateTime.Now - NowTime; if (ts.TotalMilliseconds > timeOut)//时间超时 { IsTimeOut = true; } } while (!IsReturn && !IsTimeOut); if (!IsReturn && IsTimeOut)//超时 { if (ErrStr.IndexOf("接收数据已超时") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",WbGonglvRead," + ":读取失败,接收数据已超时" + (char)13 + (char)10; } returnValue = false; return(returnValue); } comPort.Read(ReadBuff, 0, ReturnByte); if ((ReadBuff[0] != WriteBuff[0]) || (ReadBuff[1] != WriteBuff[1]))//数据检验失败 { //string tempStr = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{3},{14},{15},{16},{17},{18},{19},{20}", // ReadBuff[0], ReadBuff[1], ReadBuff[2], ReadBuff[3], ReadBuff[4], ReadBuff[5], ReadBuff[6], ReadBuff[7], ReadBuff[8], // ReadBuff[9], ReadBuff[10], ReadBuff[11], ReadBuff[12], ReadBuff[13], ReadBuff[14], ReadBuff[15], ReadBuff[16], ReadBuff[17] // , ReadBuff[18], ReadBuff[19], ReadBuff[20]); //cMain.WriteErrorToLog(tempStr); if (ErrStr.IndexOf("接收数据错误") < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",WbGonglvRead," + ":读取失败,接收数据错误" + (char)13 + (char)10; } returnValue = false; return(returnValue); } else { for (i = 0; i < ReturnBuff1.Length; i++) { ReturnBuff1[i] = (ReadBuff[i * 2 + 7] & 0xFF) * 256 + (ReadBuff[i * 2 + 6] & 0xFF); //if ((ReadBuff[i * 2 + 4] >> 7) == 1)//如果是负数 //{ // ReturnBuff1[i] = -(ReturnBuff1[i] & 0xFFFF + 1); //} mReturnBuff[i] = ReturnBuff1[i]; } } } catch (Exception exc) { if (ErrStr.IndexOf(exc.ToString()) < 0) { ErrStr = ErrStr + DateTime.Now.ToString() + ",WbGonglvRead," + ":" + exc.ToString() + (char)13 + (char)10; } returnValue = false; return(returnValue); } returnValue = true; if (returnValue) { ReturnBuff[0] = mReturnBuff[2] * 300 / (double)10000;//电压 ReturnBuff[1] = 0; ReturnBuff[2] = 0; ReturnBuff[3] = mReturnBuff[3] * 25 / (double)10000;//电流 ReturnBuff[4] = 0; ReturnBuff[5] = 0; ReturnBuff[6] = mReturnBuff[0] * 7500 / (double)10000;//功率 ReturnBuff[7] = 0; ReturnBuff[8] = 0; } else { if (errStr.IndexOf(mStandarBoard.ErrStr) < 0) { errStr = errStr + mStandarBoard.ErrStr; } } return(returnValue); }