//判断一个设备通讯状态变化的函数。 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++; } }
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); }
//单次轮询----用于测试连接 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); }
/**设备告警函数 * 如果是端口下 设备发生故障,则触发设备告警 * **/ 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); } }
/**计时器触发响应函数 * 轮询操作 * 定时器自动重启 * **/ 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; }
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); }
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); }
/// <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); }
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(); } } }
//读取下位机 存储的历史报警数据----专用通道 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); }
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; } }