/* * public uint NodeID { get { return _NodeID; } } * public string ModuleName { get { return _ModuleName; } } * public string SerialNo { get { lock (SyncObject) return _SerialNo; } } * public string FireWareVer { get { lock (SyncObject) return _FireWareVer; } } * public Byte ModuleIndex { get { lock (SyncObject) return _ModuleIndex; } } * public Byte ErrorCode { get { lock (SyncObject) return _ErrorCode; } } * public Byte WaringCode { get { lock (SyncObject) return _WaringCode; } } * public TModuleType ModuleType { get { lock (SyncObject) return _ModuleType; } } * public Byte ExecMask { get { lock (SyncObject) return _ExecMask; } } * public TModuleState ModuleState { get { lock (SyncObject) return _ModuleState; } } */ public TBaseModule(uint ID, string Name) { //SyncObject = new object(); _NodeID = ID; _ModuleName = Name; _ModuleType = TModuleType.mtNone; _ExecMask = 0; _ModuleState = TModuleState.msNone; _PortOpened = false; _WorkThread = WorkThread.CreateInstance(); _WorkThread.AddModuleToList(this); //Dlgt = new AsyncSendWorker(SendMsgMethod); WriteDlgt = new WriteParamWorker(WriteDataToEEPRom); ReadDlgt = new ReadParamWorker(ReadDataFromEEPRom); _SendCmd = new byte[8]; //_SendCmd = System.Text.Encoding.Unicode.GetBytes(); //处理该模块硬件响应数据的线程 //Task.Factory.StartNew(DataHandlerMethod, cancelTokenSource.Token); }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //async await 编译指令在C# 5.0才有 .net4.5以上 /*public async Task AsyncSendMsg(string Msg) * { * _ReponseEvent.Reset(); * _FinishedEvent.Reset(); * _PrepareEvent.Reset(); * * await Task.Run(() => * { * _SendTime = Environment.TickCount; * _SendCmd = System.Text.Encoding.Unicode.GetBytes(Msg); * * //发送命令到线程的队列中 * _WorkThread.AddMsgToQueue(NodeID, Msg); * * //等待下位机的应答响应 * _ReponseEvent.WaitOne(2000); * } * ); * } * */ //-------------------------------------------------------------------------------------------- //调用子类的实现,在子类中对子类的属性进行赋值完后,再调用父类中实现 protected virtual void SetModuleState(byte[] RecMsg) { _ModuleState = TModuleState.msNone; byte State = RecMsg[1]; string MsgData; for (int i = 0; i < 8; i++) { _State.Set(i, (State & (1 << i)) > 0); } // if (_State.Get(0)) { _ModuleState = _ModuleState | TModuleState.msInited; } if (_State.Get(1)) { _ModuleState = _ModuleState | TModuleState.msPrepared; } if (_State.Get(2)) { _ModuleState = _ModuleState | TModuleState.msActive; } if (_State.Get(3)) { _ModuleState = _ModuleState | TModuleState.msHasErr; } if (_State.Get(4)) { _ModuleState = _ModuleState | TModuleState.msHasWarn; } if (_State.Get(5)) { _ModuleState = _ModuleState | TModuleState.msMoving; } if (_State.Get(6)) { _ModuleState = _ModuleState | TModuleState.msDetect; } if (_State.Get(7)) { _ModuleState = _ModuleState | TModuleState.msData; } if (((_ModuleState & TModuleState.msHasErr) == TModuleState.msHasErr) || ((_ModuleState & TModuleState.msHasWarn) == TModuleState.msHasWarn)) { _ErrorCode = RecMsg[2]; _WaringCode = RecMsg[3]; MsgData = System.Text.Encoding.Unicode.GetString(RecMsg); DoHander(TCommandEvent.CV_MODULE_ERROR, NodeID, MsgData); } else { _ErrorCode = 0; _WaringCode = 0; } if (((_ModuleState & TModuleState.msActive) == TModuleState.msActive) || ((_ModuleState & TModuleState.msPrepared) == TModuleState.msPrepared)) { // _FinishedEvent.Reset(); Interlocked.Exchange(ref _HaveState, 1); //表示已经收到忙碌信息帧上传 } if ((_ModuleState & TModuleState.msPrepared) == TModuleState.msPrepared) { _PrepareEvent.Set(); //有预备完成响应指令上传 } int t = 0; Interlocked.Exchange(ref t, _HaveState); //模块不处于运动状态 //该帧是空闲的帧并且上帧是忙碌帧,表示是由忙碌转为了空闲(动作执行完成) if (((_ModuleState & TModuleState.msActive) != TModuleState.msActive) && ((_ModuleState & TModuleState.msPrepared) != TModuleState.msPrepared) && (t == 1)) { _FinishedEvent.Set(); //完成事件置为有信号 } }