Пример #1
0
 //判断一个设备通讯状态变化的函数。
 private void CheckOneDeviceStateChange(int ListID, COMMUNICATERESULT ret)
 {
     if (ret == COMMUNICATERESULT.OK)
     {
         DeviceList[ListID].Device.RecoverState = true;
         DeviceList[ListID].Device.ComState     = DivCommStateEnum.Success;
         if ((DeviceList[ListID].Device.RecoverCounter > Port.ReconnectNumber) && (DeviceList[ListID].LastConnect == false))
         {
             DevCommAlarm(ListID, Model_Data.Language.AlarmClass.CommResume, ret, true);//zq
             DeviceList[ListID].LastConnect = true;
         }
         DeviceList[ListID].Device.RecoverCounter = 1;
     }
     else
     {
         if ((DeviceList[ListID].Device.RecoverCounter == Port.ReconnectNumber) && (DeviceList[ListID].LastConnect == true))
         {
             DeviceList[ListID].Device.ComState     = DivCommStateEnum.Failed;
             DeviceList[ListID].Device.RecoverState = false;
             DevCommAlarm(ListID, Model_Data.Language.AlarmClass.CommFail, ret, false);//zq
             DeviceList[ListID].LastConnect = false;
         }
         DeviceList[ListID].Device.RecoverCounter++;
     }
 }
Пример #2
0
        private COMMUNICATERESULT GetOneDeviceData(int ListID)
        {
            COMMUNICATERESULT ret = COMMUNICATERESULT.OtherError;

            AnalogDataList.Clear();
            DigitalDataList.Clear();
            CharactorDataList.Clear();

            //读取数据部分
            lock (LockObject)
            {
                ret = PortBll.GetData(DeviceList[ListID], ref AnalogDataList, ref DigitalDataList, ref CharactorDataList);
            }

            //存储数据
            if (ret == COMMUNICATERESULT.OK)
            {
                if (!DeviceList[ListID].UpdateAnalogListData(AnalogDataList.ToArray()))
                {
                    //告警,模拟量存储错误
                }

                //将状态量数据写入LIST中
                if (!DeviceList[ListID].UpdateDigitalListData(DigitalDataList.ToArray()))
                {
                    //告警,状态量存储错误
                }
            }

            return(ret);
        }
Пример #3
0
 //单次轮询----用于测试连接 0:通讯失败  >0:通讯正常  -1:端口打开失败 -2:端口不存在 -3:前次通讯未结束
 public int PollTest()
 {
     if (PortBll == null || Port == null)
     {
         return(-2);
     }
     //如果端口是连接的,就去轮询设备
     if (Connect())
     {
         try
         {
             AnalogDataList.Clear();
             DigitalDataList.Clear();
             CharactorDataList.Clear();
             COMMUNICATERESULT ret = PortBll.GetData(DeviceList[0], ref AnalogDataList, ref DigitalDataList, ref CharactorDataList);
             if (ret == COMMUNICATERESULT.OK)
             {
                 return(1);
             }
         }
         catch (Exception ee)
         { }
     }
     return(0);
 }
Пример #4
0
        /**设备告警函数
         * 如果是端口下 设备发生故障,则触发设备告警
         * **/
        private void DevCommAlarm(int alarmListID, string Alarmstr, COMMUNICATERESULT ret, bool state)
        {
            AlarmEntity alarm = new AlarmEntity();

            alarm.MessageStr = Port.PortName + " " + DeviceList[alarmListID].Device.DeviceName + " " + Alarmstr + ":" + ret.ToString();
            alarm.OrigSource = AlarmEntity.AlarmSourceClass.Device;
            alarm.Success    = state;
            ACCESSDBDAL.AccessServer.InsertAlarm(alarm.AlarmTime, alarm.MessageStr);
            if (PortAlarmDelegate != null)
            {
                PortAlarmDelegate.Invoke(alarm);
            }
        }
Пример #5
0
        /**计时器触发响应函数
         * 轮询操作
         * 定时器自动重启
         * **/
        private void ReceiveTimerEventHandler(object sender, ElapsedEventArgs e)
        {
            if (PortBll == null || Port == null)
            {
                return;
            }
            if (CommunicateFlage == PortCommunicationState.OutOfCommunicate)
            {
                CommunicateFlage = PortCommunicationState.InCommunicate;
            }
            else
            {
                return;
            }
            mrEvent.Reset();
            //端口连接
            PortConnect();
            //判断端口状态是否改变,并在改变时抛出告警,改变标志位。
            CheckPortStateChang();

            //如果端口是连接的,就去轮询设备
            if (PortBll.ThisConnect)
            {
                for (short ListID = 0; ListID < DeviceList.Count; ListID++)
                {
                    if (DeviceList[ListID].Device.RecoverState)//当前设备状态为--连接许可,执行以下代码
                    {
                        try
                        {
                            COMMUNICATERESULT ret = GetOneDeviceData(ListID); //读取一个设备的数据,并返回读取结果
                            CheckOneDeviceStateChange(ListID, ret);           //判断该设备是否 通讯成功
                        }
                        catch (Exception ee)
                        {
                            string jj = ee.ToString();
                        }
                    }
                    else
                    {
                        CountAdd_SetRecoverState(ListID);
                    }
                }
            }
            else
            {
                SetAllDeviceToCommFail();
            }
            mrEvent.Set();
            CommunicateFlage = PortCommunicationState.OutOfCommunicate;
        }
Пример #6
0
        public override COMMUNICATERESULT GetData(DeviceBll Device, ref List <byte> AnalogDate, ref List <byte> DigitalData, ref List <string> CharacterData)
        {
            COMMUNICATERESULT ret = new COMMUNICATERESULT();

            ret = COMMUNICATERESULT.OK;
            byte[] SendCommand = null;
            byte[] RecByte     = null;
            byte[] RecData     = null;
            int    BytesToRec  = 0;

            foreach (CommandClass AnalogCommand in Device.Device.AnalogCommandList)
            {
                SendCommand = SetBusinessId(AnalogCommand.Command);
                BytesToRec  = AnalogCommand.RecLen;
                ret         = socketWrapper.SendAndReceive(SendCommand, BytesToRec, out RecByte);
                if (ret != COMMUNICATERESULT.OK)
                {
                    return(ret);
                }
                ret = CheckData(RecByte, SendCommand);
                if (ret != COMMUNICATERESULT.OK)
                {
                    return(ret);
                }
                RecData = GetRecDataFromRecByte(RecByte);
                AnalogDate.AddRange(RecData);
            }
            foreach (CommandClass DigitalCommand in Device.Device.DigitalCommandList)
            {
                SendCommand = SetBusinessId(DigitalCommand.Command);
                BytesToRec  = DigitalCommand.RecLen;
                ret         = socketWrapper.SendAndReceive(SendCommand, BytesToRec, out RecByte);
                if (ret != COMMUNICATERESULT.OK)
                {
                    return(ret);
                }
                ret = CheckData(RecByte, SendCommand);
                if (ret != COMMUNICATERESULT.OK)
                {
                    return(ret);
                }
                RecData = GetRecDataFromRecByte(RecByte);
                DigitalData.AddRange(RecData);
            }

            return(ret);
        }
Пример #7
0
        public COMMUNICATERESULT SetData(List <CommandClass> SetCommandList)
        {
            COMMUNICATERESULT ret = COMMUNICATERESULT.OK;

            for (int i = 0; i < SetCommandList.Count; i++)
            {
                ret = SetData(SetCommandList[i]);
                //1、下位机返回值不对,去除返回值判断
                //if (ret != COMMUNICATERESULT.OK)
                //{
                //    return ret;
                //}
                //2、下位机处理速度过比较慢,发送速度过快会出现不稳定的情况,把命令发送间隔延时至1s
                Thread.Sleep(1000);
            }
            return(ret);
        }
Пример #8
0
        /// <summary>
        /// 发送命令并返回接收到的数据的函数
        /// </summary>
        /// <param name="SendData">需要发送的数组</param>
        /// <param name="BytesToRec">需要接收的字节个数</param>
        /// <param name="RetData">接收到的数据暂存区</param>
        /// <returns>通讯成功返回OK,否则返回失败原因</returns>
        public static COMMUNICATERESULT SendAndReceive(byte[] SendData, int BytesToRec, out byte[] RetData)
        {
            RetData = new byte[BytesToRec];
            COMMUNICATERESULT ret = new COMMUNICATERESULT();

            //发送命令
            ret = WriteData(SendData);
            if (ret != COMMUNICATERESULT.OK)
            {
                return(ret);
            }
            //读取回复
            ret = ReadData(BytesToRec, ref RetData);
            if (ret != COMMUNICATERESULT.OK)
            {
                return(ret);
            }
            return(ret);
        }
Пример #9
0
        public void sendCommand(CommDeviceModbuseControlEntity obj)
        {
            COMMUNICATERESULT ret = new COMMUNICATERESULT();

            byte[]              tempbyte = new byte[2];
            CommandClass        OneSetCommand;
            List <CommandClass> SetCommandList = new List <CommandClass>();
            bool isEnabled = ReceiveTimer.Enabled;

            if (isEnabled)
            {
                ReceiveTimer.Stop();
            }
            try
            {
                if ((Port.PortType == Protocol.Modbus_USBPort)) //USB端口Modbus协议特殊处理
                {
                    SetCommandList = CommandCreat.CreatModbusSetDivInfoCommandList(Port.PortType, (byte)obj.DivID, obj.functioncode, obj.SetData, obj.SetInfoStartAdr, obj.RegisterLen);
                    lock (LockObject)
                    {
                        ret = PortBll.SetData(SetCommandList);
                    }
                }
                else
                {
                    OneSetCommand = CommandCreat.CreatModbusSetDivInfoCommand(Port.PortType, (byte)obj.DivID, obj.functioncode, obj.SetData, obj.SetInfoStartAdr, obj.RegisterLen);
                    lock (LockObject)
                    {
                        ret = PortBll.SetData(OneSetCommand);
                    }
                }
                obj.IsSuccess = ret == COMMUNICATERESULT.OK ? true : false;
            }
            finally
            {
                if (isEnabled)
                {
                    ReceiveTimer.Start();
                }
            }
        }
Пример #10
0
        //读取下位机 存储的历史报警数据----专用通道
        public override COMMUNICATERESULT GetBasicDataFromCommand(byte[] Cmd, ref byte[] RecData, int recLen)
        {
            COMMUNICATERESULT ret = new COMMUNICATERESULT();

            ret = COMMUNICATERESULT.OK;
            byte[] RecByte = null;

            ret = socketWrapper.SendAndReceive(Cmd, recLen, out RecByte);
            if (ret != COMMUNICATERESULT.OK)
            {
                return(ret);
            }
            ret = CheckData(RecByte, Cmd);
            if (ret != COMMUNICATERESULT.OK)
            {
                return(ret);
            }
            RecData = GetRecDataFromRecByte(RecByte);

            return(ret);
        }
Пример #11
0
        public void SetDivInfo(Object Object)
        {
            CommDeviceModbuseControlEntity tempEntity = new CommDeviceModbuseControlEntity();
            COMMUNICATERESULT ret = new COMMUNICATERESULT();

            byte[]              tempbyte = new byte[2];
            CommandClass        OneSetCommand;
            List <CommandClass> SetCommandList = new List <CommandClass>();

            if (ReceiveTimer.Enabled)
            {
                ReceiveTimer.Stop();
            }
            try
            {
                if (Object is CommDeviceModbuseControlEntity)
                {
                    tempEntity = (CommDeviceModbuseControlEntity)Object;
                    if ((Port.PortType == Protocol.Modbus_USBPort)) //USB端口Modbus协议特殊处理
                    {
                        SetCommandList = CommandCreat.CreatModbusSetDivInfoCommandList(Port.PortType, (byte)tempEntity.DivID, tempEntity.functioncode, tempEntity.SetData, tempEntity.SetInfoStartAdr, tempEntity.RegisterLen);
                        lock (LockObject)
                        {
                            ret = PortBll.SetData(SetCommandList);
                        }
                    }
                    else
                    {
                        switch (Port.PortType)
                        {
                        case Protocol.Modbus_SerialPort:
                        case Protocol.Modbus_TCPIPPort:
                            OneSetCommand = CommandCreat.CreatModbusSetDivInfoCommand(Port.PortType, (byte)tempEntity.DivID, tempEntity.functioncode, tempEntity.SetData, tempEntity.SetInfoStartAdr, tempEntity.RegisterLen);
                            break;

                        default:
                            OneSetCommand = CommandCreat.CreatModbusSetDivInfoCommand(Port.PortType, (byte)tempEntity.DivID, tempEntity.functioncode, tempEntity.SetData, tempEntity.SetInfoStartAdr, tempEntity.RegisterLen);
                            break;
                        }
                        lock (LockObject)
                        {
                            ret = PortBll.SetData(OneSetCommand);
                        }
                    }
                    if (ret == COMMUNICATERESULT.OK)
                    {
                        tempEntity.IsSuccess = true;
                    }
                }
            }
            finally
            {
                ReceiveTimer.Start();
            }
            switch (Port.PortType)//只有在Modbus协议通讯时才返回通讯结果
            {
            case Protocol.Modbus_SerialPort:
            case Protocol.Modbus_TCPIPPort:
            case Protocol.Modbus_USBPort:
                if (SetInfoResultMethod != null)
                {
                    SetInfoResultMethod.Invoke(tempEntity);
                }
                break;
            }
        }