Example #1
0
        /*
         * 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);
        }
Example #2
0
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        //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();  //完成事件置为有信号
            }
        }