/// <summary> /// PLCThread类 /// </summary> /// <param name="scanReg">扫描寄存器</param> /// <param name="rReg">读寄存器</param> /// <param name="wReg">写寄存器</param> /// <param name="idNo">设备ID</param> /// <param name="name">设备名称</param> public CPLCThread(CUSER_PLCREG plcReg, int idNo = 0, string name = "PLC Thread") { this._idNo = idNo; this._name = name; this._scanReg = plcReg.scanREG; //读寄存器 _rRegMap.Clear(); _rReg.Clear(); _rRegVal.Clear(); _rRegHex.Clear(); for (int i = 0; i < plcReg.rREG.Count; i++) { if (!_rReg.ContainsKey(plcReg.rREG[i].regDes)) { CREG reg = plcReg.rREG[i]; _rRegMap.Add(reg.regName, reg.regDes); _rReg.Add(reg.regDes, reg); _rRegVal.Add(reg.regDes, -1); _rRegHex.Add(reg.regDes, "FFFF"); } } //写寄存器 _wRegMap.Clear(); _wReg.Clear(); _wRegVal.Clear(); _wRegHex.Clear(); for (int i = 0; i < plcReg.wREG.Count; i++) { if (!_wReg.ContainsKey(plcReg.wREG[i].regDes)) { CREG reg = plcReg.wREG[i]; _wRegMap.Add(reg.regName, reg.regDes); _wReg.Add(reg.regDes, reg); _wRegVal.Add(reg.regDes, -1); _wRegHex.Add(reg.regDes, "FFFF"); } } }
/// <summary> /// PLCThread类 /// </summary> /// <param name="scanReg">扫描寄存器</param> /// <param name="rReg">读寄存器</param> /// <param name="wReg">写寄存器</param> /// <param name="idNo">设备ID</param> /// <param name="name">设备名称</param> public CPLCThread(List <CREG> scanReg, List <CREG> rReg, List <CREG> wReg, int idNo = 0, string name = "PLC Thread") { this._idNo = idNo; this._name = name; this._scanReg = scanReg; //读寄存器 _rRegMap.Clear(); _rReg.Clear(); _rRegVal.Clear(); _rRegHex.Clear(); for (int i = 0; i < rReg.Count; i++) { if (!_rReg.ContainsKey(rReg[i].regDes)) { CREG reg = rReg[i]; _rRegMap.Add(reg.regName, reg.regDes); _rReg.Add(reg.regDes, reg); _rRegVal.Add(reg.regDes, -1); _rRegHex.Add(reg.regDes, "FFFF"); } } //写寄存器 _wRegMap.Clear(); _wReg.Clear(); _wRegVal.Clear(); _wRegHex.Clear(); for (int i = 0; i < wReg.Count; i++) { if (!_wReg.ContainsKey(wReg[i].regDes)) { CREG reg = wReg[i]; _wRegMap.Add(reg.regName, reg.regDes); _wReg.Add(reg.regDes, reg); _wRegVal.Add(reg.regDes, -1); _wRegHex.Add(reg.regDes, "FFFF"); } } }
/// <summary> /// 复制 /// </summary> /// <returns></returns> public CREG Clone() { CREG reg = new CREG(); reg.devAddr = this.devAddr; reg.regName = this.regName; reg.regDes = this.regDes; reg.regType = this.regType; reg.regAddr = this.regAddr; reg.len = this.len; return(reg); }
/// <summary> /// This method is for fetching network status of sim card. /// Returns the status through enum: CREG /// </summary> public CREG _creg() { long key = -1; CREG retCREG = CREG.NONE; try { if (isOpen()) { key = AccessControl(); port.WriteLine("at+creg?"); Thread.Sleep(500); String data = port.ReadExisting(); FreeControl(key); int _cr = data.LastIndexOf("+CREG: "); data = data.Substring(_cr + 7, 3); String[] arr = data.Split(new char[] { ',' }); if (arr.Length == 2) { try { retCREG = (CREG)Int32.Parse(arr[1]); } catch (Exception ex) { retCREG = CREG.UNKNOWN; } } } } catch (Exception ex) { FreeControl(key); retCREG = CREG.UNKNOWN; if (notification) { showError("Network Error", "Unable to get response from network.", ex); } } return(retCREG); }
private void _thrSignal() { long key = -1; try { while (true) { if (ConnectionState == Connection.Disconnected) { break; } try { if (isOpen()) { key = AccessControl(); port.WriteLine("at+csq"); //write("at+csq"); Thread.Sleep(300); String data = port.ReadExisting(); //read(); FreeControl(key); int _cr = data.LastIndexOf("+CSQ: "); data = data.Substring(_cr + 6); String[] arr = data.Split(new char[] { ',' }); if (arr.Length == 2) { try { CREG reg = _creg(); int val = Int32.Parse(arr[0].Trim()); if (val >= 2 && val <= 9) { SignalChanged(this, CSIGNAL.Low, reg); } else if (val >= 10 && val <= 14) { SignalChanged(this, CSIGNAL.Ok, reg); } else if (val >= 15 && val <= 19) { SignalChanged(this, CSIGNAL.Good, reg); } else if (val >= 20 && val <= 30) { SignalChanged(this, CSIGNAL.Full, reg); } else if (val == 31) { SignalChanged(this, CSIGNAL.Excellent, reg); } else if (val == 99) { SignalChanged(this, CSIGNAL.No, reg); } else { SignalChanged(this, CSIGNAL.Nothing, reg); } } catch (Exception) { SignalChanged(this, CSIGNAL.Nothing, CREG.UNKNOWN); } } } } catch (Exception ex) { FreeControl(key); } String input = ""; try { String mttt = TypeOfMessage.ToString().Replace("_", " "); key = AccessControl(); port.WriteLine("at+cmgl=\"" + mttt + "\""); //write("at+cmgl=\"" + mttt + "\""); Thread.Sleep(1000); input = port.ReadExisting(); //input = read(); FreeControl(key); List <Message> msgs = new List <Message>(); try { Regex r = new Regex(@"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n(.+)");//\r\n Match m = r.Match(input); while (m.Success) { Message msg = new Message(); msg.Index = m.Groups[1].Value; msg.Status = m.Groups[2].Value; msg.Sender = m.Groups[3].Value; msg.Alphabet = m.Groups[4].Value; msg.Time = m.Groups[5].Value; msg.MessageText = m.Groups[6].Value; msgs.Add(msg); m = m.NextMatch(); } } catch (Exception ex) { FreeControl(key); } if (input.ToLower().Contains("ok")) { input = "ok"; MessageReceived(this, msgs); } if (input.ToLower().Contains("error")) { input = "false"; } if (RemoveReadedMessages) { port.WriteLine("at+cmgd=1,3");//write("AT+CMGD=1,3"); } } catch (Exception ex) { if (notification) { showError("Reading Messages", "Error in raading messages.", ex); } } try { port.BaseStream.Flush(); } catch (Exception) {} Thread.Sleep(5000); } } catch (ThreadAbortException) {} try { Thread.ResetAbort(); } catch (Exception) { } }
void Port_SignalChanged(Port port, CSIGNAL signal, CREG registration) { }
/// <summary> /// 解析读寄存器数值 /// </summary> /// <param name="scanReg"></param> /// <param name="regName"></param> /// <param name="rVal"></param> private bool calrRegVal(CREG scanReg, int reg_offset, int bin_offset, string regName, int[] rVal, out string er) { er = string.Empty; try { //解析读寄存器 if (!_rRegMap.ContainsKey(regName)) { return(true); } string regDes = _rRegMap[regName]; string regHex = string.Empty; int regVal = 0; if (_rReg[regDes].regType == ERegType.D) { if (_rReg[regDes].regLen > scanReg.regLen - reg_offset) { er = "[" + _rReg[regDes].regName + "]" + CLanguage.Lan("设置读长度超出扫描寄存器") + "[" + scanReg.regName + "]"; return(false); } for (int i = 0; i < _rReg[regDes].regLen; i++) { regHex = rVal[reg_offset + i].ToString("X4") + regHex; } lock (_synC) { _rRegHex[regDes] = regHex; if (_rReg[regDes].regLen <= 2) { _rRegVal[regDes] = System.Convert.ToInt32(regHex, 16); } } } else { if (_rReg[regDes].regLen > (scanReg.regLen - reg_offset) * 8 * _devPLC.wordNum - bin_offset) { er = "[" + _rReg[regDes].regName + "]" + CLanguage.Lan("设置读长度超出扫描寄存器") + "[" + scanReg.regName + "]"; return(false); } int offset = reg_offset * 8 * _devPLC.wordNum + bin_offset; for (int i = 0; i < _rReg[regDes].regLen; i++) { if (rVal[offset + i] == 1) { regVal += (1 << i); } } lock (_synC) { _rRegVal[regDes] = regVal; _rRegHex[regDes] = System.Convert.ToString(regVal, 16); } } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }