/// <summary> /// 板卡通用工作回调 /// [注:读写通用变量值] /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _bkgrdwkForGeneralBaseData_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { uint[] uintData; ushort[] ushortData; short[] shortData; int[] intData; float[] floatData; byte[] byteData; bool queueState; //板卡工作状态 while (_netWorkState) { try { //板卡连接状态 if (_netConnected) { //数据单元队列非空(并发队列) if (_netQueue.Count > 0) { ProDriver.Auxiliary.HZZHComBaseData bsData; queueState = _netQueue.TryPeek(out bsData); //获取队列元素成功 if (queueState) { //数据单元读取状态 if (bsData.InitiativeRead) { try { switch (bsData.DataType) { case ProDriver.Auxiliary.HZZHComDataType.Short: _comNet.Read(1, bsData.Address, bsData.RegisterNumber, out shortData); bsData.ShortValue = (short[])shortData.Clone(); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Uint: _comNet.Read(1, bsData.Address, bsData.RegisterNumber, out uintData); bsData.UintValue = (uint[])uintData.Clone(); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Ushort: _comNet.Read(1, bsData.Address, bsData.RegisterNumber, out ushortData); bsData.UshortValue = (ushort[])ushortData.Clone(); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Float: _comNet.Read(1, bsData.Address, bsData.RegisterNumber, out floatData); bsData.FloatValue = (float[])floatData.Clone(); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Byte: _comNet.Read(1, bsData.Address, bsData.RegisterNumber, out byteData); byte[] btArr = new byte[byteData.Length]; for (int i = 0; i < byteData.Length; i++) { //高低位互换 if (i % 2 != 0) { btArr[i - 1] = byteData[i]; btArr[i] = byteData[i - 1]; } } bsData.ByteValue = (byte[])btArr.Clone(); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Int: default: _comNet.Read(1, bsData.Address, bsData.RegisterNumber, out intData); bsData.IntValue = (int[])intData.Clone(); bsData.ComSucceed = true; break; } } catch (System.Exception ex) { throw new Exception("ReadError:" + ex.Message); } } else //数据单元写入状态 { try { switch (bsData.DataType) { case ProDriver.Auxiliary.HZZHComDataType.Int: _comNet.Write(1, bsData.Address, bsData.IntValue); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Short: _comNet.Write(1, bsData.Address, bsData.ShortValue); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Uint: _comNet.Write(1, bsData.Address, bsData.UintValue); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Ushort: _comNet.Write(1, bsData.Address, bsData.UshortValue); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Float: _comNet.Write(1, bsData.Address, bsData.FloatValue); bsData.ComSucceed = true; break; case ProDriver.Auxiliary.HZZHComDataType.Byte: _comNet.Write(1, bsData.Address, bsData.ByteValue); bsData.ComSucceed = true; break; default: break; } } catch (System.Exception ex) { throw new Exception("WriteError:" + ex.Message); } } } else { throw new Exception("Obtain base data failed !"); } queueState = _netQueue.TryDequeue(out bsData); } } } catch { _netWorkState = false; _netConnected = false; } System.Threading.Thread.Sleep(10); } }
/// <summary> /// 写数据线程实体 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void WriteWork(Object sender, DoWorkEventArgs e) { uint[] uintData; ushort[] ushortData; int[] intData; float[] floatData; short[] shortData; byte[] byteData; bool queueState; while (Succeed) { try { if (NetQueue.Count > 0) { BaseData _var; queueState = NetQueue.TryPeek(out _var); if (queueState) { if (!_var.ReadHand) { try { switch (_var.DataTypes) { case DataType.Int: hzaux.Write(1, _var.Address, _var.IntValue); _var.Succeed = true; break; case DataType.Float: hzaux.Write(1, _var.Address, _var.FloatValue); _var.Succeed = true; break; case DataType.Uint: hzaux.Write(1, _var.Address, _var.UintValue); _var.Succeed = true; break; case DataType.Ushort: hzaux.Write(1, _var.Address, _var.UshortValue); _var.Succeed = true; break; case DataType.Short: hzaux.Write(1, _var.Address, _var.ShortValue); _var.Succeed = true; break; case DataType.Byte: hzaux.Write(1, _var.Address, _var.ByteValue); _var.Succeed = true; break; case DataType.Object: hzaux.Write(1, _var.Address, _var.ObjectValue); _var.Succeed = true; break; default: break; } } catch (Exception ex) { throw new Exception("写数据失败:" + ex.Message); } } else { try { switch (_var.DataTypes) { case DataType.Int: hzaux.Read(1, _var.Address, _var.RegisterNum, out intData); _var.IntValue = (int[])intData.Clone(); _var.Succeed = true; break; case DataType.Float: hzaux.Read(1, _var.Address, _var.RegisterNum, out floatData); _var.FloatValue = (float[])floatData.Clone(); _var.Succeed = true; break; case DataType.Uint: hzaux.Read(1, _var.Address, _var.RegisterNum, out uintData); _var.UintValue = (uint[])uintData.Clone(); _var.Succeed = true; break; case DataType.Ushort: hzaux.Read(1, _var.Address, _var.RegisterNum, out ushortData); _var.UshortValue = (ushort[])ushortData.Clone(); _var.Succeed = true; break; case DataType.Short: hzaux.Read(1, _var.Address, _var.RegisterNum, out shortData); _var.ShortValue = (short[])shortData.Clone(); _var.Succeed = true; break; case DataType.Byte: hzaux.Read(1, _var.Address, _var.RegisterNum, out byteData); byte[] bt = new byte[byteData.Length]; for (int i = 0; i < byteData.Length; i++) { if (i % 2 != 0) { bt[i - 1] = byteData[i]; bt[i] = byteData[i - 1]; } } _var.ByteValue = (byte[])bt.Clone(); _var.Succeed = true; break; default: break; } } catch (Exception ex) { throw new Exception("主动读取数据失败:" + ex.Message); } } queueState = NetQueue.TryDequeue(out _var); } else { throw new Exception("取数据不成功"); } } else { readResetEvent.Set(); autoResetEvent.WaitOne(); } } catch (Exception ex) { netSucceed = false; readResetEvent.Set(); LogWriter.WriteLog("控制器掉线:" + ex.ToString()); if (!backworkerConnect.IsBusy) { backworkerConnect.RunWorkerAsync(); } } } }