示例#1
0
        /// <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");
                }
            }
        }
示例#2
0
        /// <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");
                }
            }
        }
示例#3
0
            /// <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);
            }
示例#4
0
        /// <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);
        }
示例#5
0
        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) { }
        }
示例#6
0
 void Port_SignalChanged(Port port, CSIGNAL signal, CREG registration)
 {
 }
示例#7
0
        /// <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);
            }
        }