/// <summary> /// 实时查询 /// </summary> public void ReceSelectFromWeb(string userName) { lock (sendLock) { RtuRegistPackage rtuPackage = new RtuRegistPackage(userName, "查询车位信息", descriptor.Salve, 0x03, readRegist, 1); sendQueue.Enqueue(rtuPackage); Monitor.Pulse(sendLock); } }
private void SendTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (tcpPort != null && tcpPort.ConnStatus == PortStatus.Connected) { //发送了以后 如果没出队列,将不再发送 if (sendQueue.Count == 0) { lock (sendLock) { RtuRegistPackage rtuPackage = new RtuRegistPackage("System", "查询车位状态", descriptor.Salve, 0x03, readRegist, 1); sendQueue.Enqueue(rtuPackage); Monitor.Pulse(sendLock); } } } }
/// <summary> /// 半双工 发送 同时返回数据包 /// </summary> /// <param name="sendPackage"></param> /// <returns></returns> private RtuRecePackage Write(RtuRegistPackage sendPackage) { cmdResponseBytes = null; modBusRtuMessage = sendPackage; if (tcpPort.ConnStatus == PortStatus.Connected) { response.Reset(); lock (parseLock) { receBytesCache.Clear(); } tcpPort.Write(sendPackage.PackageBytes); if (response.WaitOne(1000)) { return(new RtuRecePackage(sendPackage, cmdResponseBytes)); } } return(null); }
/// <summary> /// 从web端 接受命令 /// </summary> /// <param name="index"></param> /// <param name="isUp"></param> public void ReceCommandFromWeb(string userName, int index, bool isUp) { RtuRegistPackage sendPackage = null; RtuRegistPackage tempPackage = null; if (isUp) { if (index <= 8) { sendPackage = new RtuRegistPackage(userName, $"{index}#车位 上升", descriptor.Salve, 0x06, upRegist1, (ushort)(1 << index - 1)); tempPackage = new RtuRegistPackage("System", $"{index}#车位 上升状态置0", descriptor.Salve, 0x06, upRegist1, 0); } else { sendPackage = new RtuRegistPackage(userName, $"{index}#车位 上升", descriptor.Salve, 0x06, upRegist2, (ushort)(1 << index - 1)); tempPackage = new RtuRegistPackage("System", $"{index}#车位 上升状态置0", descriptor.Salve, 0x06, upRegist2, 0); } } else { if (index <= 8) { sendPackage = new RtuRegistPackage(userName, $"{index}#车位 下降", descriptor.Salve, 0x06, downRegist1, (ushort)(1 << index - 1)); tempPackage = new RtuRegistPackage("System", $"{index}#车位 下降状态置0", descriptor.Salve, 0x06, downRegist1, 0); } else { sendPackage = new RtuRegistPackage(userName, $"{index}#车位 下降", descriptor.Salve, 0x06, downRegist2, (ushort)(1 << index - 1)); tempPackage = new RtuRegistPackage("System", $"{index}#车位 下降状态置0", descriptor.Salve, 0x06, downRegist2, 0); } } lock (sendLock) { fastQueue.Enqueue(sendPackage); fastQueue.Enqueue(tempPackage); Monitor.Pulse(sendLock); } }
/// <summary> /// 发送数据包 /// </summary> void SendModBusPackage() { while (!isExit) { if (fastQueue.Count + sendQueue.Count == 0) { lock (sendLock) { Monitor.Wait(sendLock); } } else { RtuRegistPackage sendPackage = null; int waitTime = 100; lock (sendLock) { if (fastQueue.Count > 0) { sendPackage = fastQueue.Dequeue(); } else { if (sendQueue.Count > 0) { sendPackage = sendQueue.Dequeue(); } } } if (sendPackage != null) { sendPackage.SendTime = DateTime.Now; Console.WriteLine(sendPackage.ToString()); //不是查询指令 if (sendPackage.FunctionCode != 0x03) { //不是还原指令 if (sendPackage.LengthOrValue != 0) { waitTime = 2000; } } RtuRecePackage recePackage = Write(sendPackage); if (recePackage != null) { if (sendPackage.FunctionCode == 0x03) { UpdataStatus(sendPackage.CreateTime, DateTime.Now, true, recePackage); } } Console.WriteLine("发送指令成功"); } else { if (sendPackage.FunctionCode == 0x03) { UpdataStatus(sendPackage.CreateTime, DateTime.Now, false, null); } Console.WriteLine("发送指令,返回超时!"); } Thread.Sleep(waitTime); } } }