yi eason 3 年 前
コミット
9481e1767f

+ 15 - 11
CarLocalMeter/App.config

@@ -4,11 +4,15 @@
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
     </startup>
 	<appSettings>
-		<!--<add key="ServiceUrl" value="http://10.104.0.1:9004/v1" />-->
-		<add key="ServiceUrl" value="http://jgwzjl.jiugang.com/icore.icp.web/pass/systemBase/v1"/>
 		<!--ping服务器的地址-->
-		<add key="ServiceIp" value="127.0.0.1"/>
-		<add key="fpath" value="https://jgwzjl.jiugang.com/icore.icp.web/pass/file/upload/" />
+		<add key="ServiceIp" value="jgwzjl.jiugang.com"/>
+		
+		<!--<add key="ServiceUrl" value="http://10.104.4.130:9004/v1" />-->
+		<add key="ServiceUrl" value="http://10.99.81.20/icore.icp.web/pass/systemBase/v1"/>
+		<!--<add key="ServiceUrl" value="http://jgwzjl.jiugang.com/icore.icp.web/pass/systemBase/v1"/>-->
+		
+		<add key="fpath" value="http://10.99.81.20/icore.icp.web/pass/file/upload/" />
+		<!--<add key="fpath" value="https://jgwzjl.jiugang.com/icore.icp.web/pass/file/upload/" />-->
 		<!--图片压缩比例,由于采用硬盘录像机截图,所以imgMass实际上只有100多kb,所以这里设置为100,imgMass2由于摄像头截图有600kb-->
 		<add key="imgMass" value="100" />
 		<add key="imgMass2" value="100" />
@@ -36,7 +40,7 @@
 		<add key="channelVisHeight" value="300" /><!--需显示高度-->
 		<add key="channelCarNo" value="2" /><!--车号抓拍通道-->
 		<add key="channel" value="1" /><!--重量仪表抓拍通道-->
-		<add key="voicePlayIp" value="10.130.0.59" />
+		<add key="voicePlayIp" value="10.130.1.71" />
 		<add key="voicePlayPort" value="8000" />
 		<add key="voicePlayUid" value="admin" />
 		<add key="voicePlayPwd" value="jlwj12345" />
@@ -63,18 +67,18 @@
 		<add key="plcLocationNameHMI" value="rgLight,dz" />
 		<!--*************MoXa配置*****************-->
 		<add key="sleepTime" value="200"/>
-		<add key="moxaIP" value="10.130.0.29" />
+		<add key="moxaIP" value="10.130.1.178" />
 		<add key="moxaPort" value="4001" />
 		<!--报文长度-->
-		<add key="messageLength" value="17" />
+		<add key="messageLength" value="8" />
 		<!--数据截止位符号-->
-		<add key="separate" value="13" />
-	    <!--开始取值位置从0开始数-->
-		<add key="startPosition" value="5" />
+		<add key="separate" value="61" />
+	    <!--开始取值位置从1开始数-->
+		<add key="startPosition" value="1" />
 		<!--取多少位-->
 		<add key="dataLength" value="6" />
 		<!-- 是否反转 false不反转 true反转-->
-		<add key="isFz" value="false"/>
+		<add key="isFz" value="true"/>
 		<!--波动次数及判稳值,仪表1秒7次,所以我们200ms取一次仪表数据-->
 		<add key="undulateCount" value="25" />
 		<add key="undulateValue" value="50" />

+ 2 - 0
CarLocalMeter/CarLocalMeter.csproj

@@ -103,6 +103,7 @@
   <ItemGroup>
     <Compile Include="DbOption\DbHelper.cs" />
     <Compile Include="DbOption\ExtendCls.cs" />
+    <Compile Include="DbOption\MeterBaseRfidInfoService.cs" />
     <Compile Include="DbOption\MeterWorkCarActualFirstService.cs" />
     <Compile Include="DbOption\MeterWorkCarActualService.cs" />
     <Compile Include="DbOption\MeterWorkImageService.cs" />
@@ -110,6 +111,7 @@
     <Compile Include="DbOption\ReflexCls.cs" />
     <Compile Include="Endian.cs" />
     <Compile Include="ModelCls\DjPbModel.cs" />
+    <Compile Include="ModelCls\MeterBaseRfidInfo.cs" />
     <Compile Include="ModelCls\MeterWorkPreLink.cs" />
     <Compile Include="OptionCls\Led\LedDll.cs" />
     <Compile Include="OptionCls\Led\LED_Control.cs" />

+ 34 - 0
CarLocalMeter/DbOption/MeterBaseRfidInfoService.cs

@@ -0,0 +1,34 @@
+using com.hnshituo.core.webapp.vo;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CarLocalMeter
+{
+    public class MeterBaseRfidInfoService
+    {
+        /// <summary>
+        /// 查询rfid有效的信息
+        /// </summary>
+        public RESTfulResult<List<MeterBaseRfidInfo>> doQueryRfid(MeterBaseRfidInfo info)
+        {
+            DbHelper db = new DbHelper();
+            RESTfulResult<PageList<List<MeterBaseRfidInfo>>> rm = db.doOption<PageList<List<MeterBaseRfidInfo>>>("meterbaserfidinfos", "/", new object[] { info }, 0);
+
+            RESTfulResult<List<MeterBaseRfidInfo>> result = new RESTfulResult<List<MeterBaseRfidInfo>>();
+            result.Succeed = rm.Succeed;
+            result.Status = rm.Status;
+            result.Message = rm.Message;
+            result.ResultMessage = rm.ResultMessage;
+            result.Code = rm.Code;
+            if (rm.Data != null && rm.Data.list != null && rm.Data.list.Count > 0)
+            {
+                result.Data = rm.Data.list;
+            }
+
+            return result;
+        }
+    }
+}

+ 36 - 0
CarLocalMeter/ModelCls/MeterBaseRfidInfo.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CarLocalMeter
+{
+    public class MeterBaseRfidInfo
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        public string rfidId { get; set; }
+
+        /// <summary>
+        /// rfid卡号
+        /// </summary>
+        public string rfidCode { get; set; }
+
+        /// <summary>
+        /// 车号
+        /// </summary>
+        public string carNo { get; set; }
+
+        /// <summary>
+        /// 0有效 1挂失
+        /// </summary>
+        public string valueFlag { get; set; }
+
+        public string createManNo { get; set; }
+
+        public string createManName { get; set; }
+
+    }
+}

+ 15 - 17
CarLocalMeter/OptionCls/RfIdCarNo.cs

@@ -114,7 +114,21 @@ namespace CarLocalMeter
                 string tid = Core.Util.ConvertByteArrayToHexString(msg.ReceivedMessage.TID);
                 string userDb = Core.Util.ConvertByteArrayToHexString(msg.ReceivedMessage.UserData);
 
-                CacleCls.rfidCarNo = $"epc:{epc},tid:{tid},userDb:{userDb}";
+                if (CacleCls.rfidEpc != epc) 
+                {
+                    CacleCls.rfidEpc = epc;
+                    if (CacleCls.rifdInfo != null && CacleCls.rfidCarNo.Count() > 0)
+                    {
+                        foreach (KeyValuePair<string, string> rfid in CacleCls.rifdInfo)
+                        {
+                            if (rfid.Key == epc)
+                            {
+                                CacleCls.rfidCarNo = rfid.Value;
+                                break;
+                            }
+                        }
+                    }
+                }
             }
         }
 
@@ -191,22 +205,6 @@ namespace CarLocalMeter
             }
         }
         #endregion
-
-        
-
-        
-
-
-        #region 数据采集
-        /// <summary>
-        /// 数据采集线程
-        /// </summary>
-        private void DataCollect()
-        {
-            if (!blThreadFlag) return;
-
-        }
-        #endregion
     }
 }
 

+ 10 - 0
CarLocalMeter/PbCls/CacleCls.cs

@@ -46,6 +46,11 @@ namespace CarLocalMeter
         /// </summary>
         public static string rfidCarNo { get; set; }
 
+        /// <summary>
+        /// rfid的epc号,实际上就是卡号
+        /// </summary>
+        public static string rfidEpc { get; set; }
+
 
 
         /// <summary>
@@ -163,6 +168,10 @@ namespace CarLocalMeter
         /// </summary>
         public static bool isJg = false;
 
+        public static DateTime? updateRfidInfoTime = null;
+        public static Dictionary<string, string> rifdInfo = new Dictionary<string, string>();
+
+
         /// <summary>
         /// 重量小于500时执行一次
         /// </summary>
@@ -174,6 +183,7 @@ namespace CarLocalMeter
             voicCarNo = "";
             voicCarNo2 = "";
             rfidCarNo = "";
+            rfidEpc = "";
             firstDb = null;
             preTrackScale = null;
             isClear = true;

+ 195 - 84
CarLocalMeter/frmMain.cs

@@ -42,6 +42,8 @@ namespace CarLocalMeter
         RESTfulResult<List<PreTrackScale>> rmScaleListCarTimer = new RESTfulResult<List<PreTrackScale>>();
         private MeterWorkCarActualFirstService workCarActualFirstService = new MeterWorkCarActualFirstService(); //一次计量数据
         RESTfulResult<List<MeterWorkCarActualFirst>> RESTfulResultOutTimer = new RESTfulResult<List<MeterWorkCarActualFirst>>();
+        MeterBaseRfidInfoService rfidServer = new MeterBaseRfidInfoService();
+
         PlcCls plc = new PlcCls();
 
         /// <summary>
@@ -54,6 +56,11 @@ namespace CarLocalMeter
         /// </summary>
         ImageOption imgControl = new ImageOption();
 
+        /// <summary>
+        /// 重量采集类
+        /// </summary>
+        MoxaCls mx = new MoxaCls();
+
         /// <summary>
         /// 语音播放
         /// </summary>
@@ -86,6 +93,8 @@ namespace CarLocalMeter
 
         private void frmMain_Load(object sender, EventArgs e)
         {
+            CacleCls.updateRfidInfoTime = DateTime.Now;
+
             btnSave.Enabled = false;
             if (!string.IsNullOrEmpty(AppConfigCache.ledIp))
             {
@@ -141,16 +150,18 @@ namespace CarLocalMeter
                 ce.RealPlay(pb, i);
             }
 
-            rfid.Start();
+            mx.start();
 
+            TaskPing();
             /*
+            rfid.Start();
             TaskMain();
-            TaskPing();
+            
             TaskDbUpload();
             imgControl.Start();
             plc.Start();
-            //*/
             carCls.Login(AppConfigCache.voiceCarNoIp, AppConfigCache.voiceCarNoPort, AppConfigCache.voiceCarNoUid, AppConfigCache.voiceCarNoPwd);
+            //*/
             //carCls2.Login(AppConfigCache.voiceCarNoIp2, AppConfigCache.voiceCarNoPort2, AppConfigCache.voiceCarNoUid2, AppConfigCache.voiceCarNoPwd2, false);
         }
 
@@ -410,6 +421,8 @@ namespace CarLocalMeter
             }, _cts.Token);
         }
 
+        string dbFile = Path.Combine(AppConfigCache.path, "data/rfidDb.data");
+
         /// <summary>
         /// ping服务器
         /// </summary>
@@ -417,20 +430,97 @@ namespace CarLocalMeter
         {
             _cts2 = new CancellationTokenSource();
             Task.Run(() => {
-                try
+                while (!_cts2.IsCancellationRequested) 
                 {
-                    Ping pingSend = new Ping();
-                    PingReply reply = pingSend.Send(AppConfigCache.ServiceIp, 1000);
-                    if (reply.Status == IPStatus.Success)
-                        CacleCls.serverFlag = true;
-                    else
+                    try
+                    {
+                        Ping pingSend = new Ping();
+                        PingReply reply = pingSend.Send(AppConfigCache.ServiceIp, 1000);
+                        if (reply.Status == IPStatus.Success)
+                            CacleCls.serverFlag = true;
+                        else
+                            CacleCls.serverFlag = false;
+                    }
+                    catch (Exception)
+                    {
                         CacleCls.serverFlag = false;
+                    }
+                    finally 
+                    {
+                        if (CacleCls.serverFlag)
+                        {
+                            if (CacleCls.weight < 500 && DateTime.Now > CacleCls.updateRfidInfoTime)
+                            {
+                                CacleCls.updateRfidInfoTime.Value.AddHours(1); //每隔一小时更新一次rfid数据
+
+                                Dictionary<string, string> rfidInfo = new Dictionary<string, string>();
+                                RESTfulResult<List<MeterBaseRfidInfo>> rfids = rfidServer.doQueryRfid(new MeterBaseRfidInfo { valueFlag = "0" });
+                                if (rfids.Succeed)
+                                {
+                                    if (rfids.Data != null && rfids.Data.Count > 0) 
+                                    {
+                                        StringBuilder sb = new StringBuilder();
+                                        foreach (MeterBaseRfidInfo rfid in rfids.Data)
+                                        {
+                                            try
+                                            {
+                                                sb.AppendLine($"{rfid.rfidCode},{rfid.carNo}");
+                                                rfidInfo.Add(rfid.rfidCode, rfid.carNo);
+                                            }
+                                            catch { }
+                                        }
+                                        try
+                                        {
+                                            //如果目标文件存在则覆盖,不存在则创建
+                                            File.WriteAllText(dbFile, sb.ToString());
+                                        }
+                                        catch(Exception ex) 
+                                        {
+                                            lg.WriteLog(LogType.SystemLog, "写入rfid数据到本地失败:" + ex.Message);
+                                        }
+                                        CacleCls.rifdInfo = rfidInfo;
+                                    }
+                                }
+                                else 
+                                {
+                                    lg.WriteLog(LogType.serverLog, $"获取RFID信息失败:{rfids.Message}");
+                                }
+                            }
+                        }
+                        else 
+                        {
+                            if (CacleCls.rifdInfo == null || CacleCls.rifdInfo.Count == 0) 
+                            {
+                                //读取本地rfid数据文件
+                                try
+                                {
+                                    if (File.Exists(dbFile))
+                                    {
+                                        Dictionary<string, string> rfidInfo = new Dictionary<string, string>();
+                                        string[] strs = File.ReadAllLines(dbFile);
+                                        foreach (string str in strs)
+                                        {
+                                            try 
+                                            {
+                                                string[] strInfo = str.Split(',');
+                                                if (strInfo.Length == 2)
+                                                {
+                                                    rfidInfo.Add(strInfo[0], strInfo[1]);
+                                                }
+                                            } catch { }
+                                        }
+                                        CacleCls.rifdInfo = rfidInfo;
+                                    }
+                                }
+                                catch (Exception ex)
+                                {
+                                    lg.WriteLog(LogType.WriteDbLog, "写入信息失败:" + ex.Message);
+                                }
+                            }
+                        }
+                    }
+                    Thread.Sleep(500);
                 }
-                catch (Exception)
-                {
-                    CacleCls.serverFlag = false;
-                }
-                Thread.Sleep(500);
             }, _cts2.Token);
         }
 
@@ -444,77 +534,81 @@ namespace CarLocalMeter
         {
             Dictionary<string, string> dic = new Dictionary<string, string>();
             _dbCts = new CancellationTokenSource();
-            Task.Run(() => {
-                try
+            Task.Run(() =>
+            {
+                while (!_cts2.IsCancellationRequested)
                 {
-                    if (CacleCls.weight < 500 && CacleCls.serverFlag) 
+                    try
                     {
-                        dic.Clear();
-                        //检索本地实时库中结净数据。(若本地数据结净后,一次数据得删除,而结净数据中会保留一次数据的编号、重量、计量时间、计量点信息)
-                        //若本地存在结净数据未进行上传的,则进行数据上传并得到返回的结果:老一次计量编号|一次计量编号,老二次计量编号|新二次计量编号
-                        //得到结果后构造成Dictionary然后进行图片操作,修改图片名称及位置
-                        bool bReadFlag = false;
-                        string strRtMsgInfo = "";
-                        List<MeterWorkCarActualFirst> lm = FileOption.ReadDb(ref bReadFlag, ref strRtMsgInfo);
-                        if (bReadFlag)
+                        if (CacleCls.weight < 500 && CacleCls.serverFlag)
                         {
-                            //进行结净
-                            RESTfulResult<List<DjPbModel>> rmRst = workCarActualFirstService.doDbUpload(lm);
-                            if (rmRst.Succeed)
+                            dic.Clear();
+                            //检索本地实时库中结净数据。(若本地数据结净后,一次数据得删除,而结净数据中会保留一次数据的编号、重量、计量时间、计量点信息)
+                            //若本地存在结净数据未进行上传的,则进行数据上传并得到返回的结果:老一次计量编号|一次计量编号,老二次计量编号|新二次计量编号
+                            //得到结果后构造成Dictionary然后进行图片操作,修改图片名称及位置
+                            bool bReadFlag = false;
+                            string strRtMsgInfo = "";
+                            List<MeterWorkCarActualFirst> lm = FileOption.ReadDb(ref bReadFlag, ref strRtMsgInfo);
+                            if (bReadFlag)
                             {
-                                if (rmRst.Data.Count == lm.Count)
+                                //进行结净
+                                RESTfulResult<List<DjPbModel>> rmRst = workCarActualFirstService.doDbUpload(lm);
+                                if (rmRst.Succeed)
                                 {
-                                    //直接重写文件
-                                    FileOption.clearFile();
-                                    //然后对图片进行压缩及修改名称处理
-                                    foreach (DjPbModel dm in rmRst.Data) 
+                                    if (rmRst.Data.Count == lm.Count)
                                     {
-                                        dic.Add(dm.key, dm.value);
+                                        //直接重写文件
+                                        FileOption.clearFile();
+                                        //然后对图片进行压缩及修改名称处理
+                                        foreach (DjPbModel dm in rmRst.Data)
+                                        {
+                                            dic.Add(dm.key, dm.value);
+                                        }
                                     }
-                                }
-                                else 
-                                {
-                                    //清理下文件
-                                    FileOption.clearFile();
-                                    //重写下未成功的数据
-                                    foreach (MeterWorkCarActualFirst first in lm)
+                                    else
                                     {
-                                        DjPbModel pm = rmRst.Data.Where(s => s.key == first.actualFirstNo).FirstOrDefault();
-                                        if (pm == null || string.IsNullOrEmpty(pm.key) || string.IsNullOrEmpty(pm.value))
+                                        //清理下文件
+                                        FileOption.clearFile();
+                                        //重写下未成功的数据
+                                        foreach (MeterWorkCarActualFirst first in lm)
                                         {
-                                            //Thread.Sleep(100);
-                                            bool flag = FileOption.WriterDb(new ActualFirstModel { actualFirstNo = first.actualFirstNo, baseSpotNo = first.baseSpotNo, baseSpotName = first.baseSpotName, carNo = first.carNo, createTime = first.createTime, meterWeight = first.meterWeight }, out string msgInfo);
-                                            if (!flag)
+                                            DjPbModel pm = rmRst.Data.Where(s => s.key == first.actualFirstNo).FirstOrDefault();
+                                            if (pm == null || string.IsNullOrEmpty(pm.key) || string.IsNullOrEmpty(pm.value))
                                             {
-                                                lg.WriteLog(LogType.serverLog, $"重写失败:{msgInfo},数据:actualFirstNo{first.actualFirstNo},baseSpotNo:{first.baseSpotNo},baseSpotName:{first.baseSpotName},carNo:{first.carNo},createTime:{first.createTime},meterWeight:{first.meterWeight}");
+                                                //Thread.Sleep(100);
+                                                bool flag = FileOption.WriterDb(new ActualFirstModel { actualFirstNo = first.actualFirstNo, baseSpotNo = first.baseSpotNo, baseSpotName = first.baseSpotName, carNo = first.carNo, createTime = first.createTime, meterWeight = first.meterWeight }, out string msgInfo);
+                                                if (!flag)
+                                                {
+                                                    lg.WriteLog(LogType.serverLog, $"重写失败:{msgInfo},数据:actualFirstNo{first.actualFirstNo},baseSpotNo:{first.baseSpotNo},baseSpotName:{first.baseSpotName},carNo:{first.carNo},createTime:{first.createTime},meterWeight:{first.meterWeight}");
+                                                }
+                                            }
+                                            else
+                                            {
+                                                dic.Add(pm.key, pm.value);
                                             }
-                                        }
-                                        else
-                                        {
-                                            dic.Add(pm.key, pm.value);
                                         }
                                     }
-                                }
 
-                                if (dic.Count > 0) imgControl.ZipFiles(dic);
-                            }
-                            else
-                            {
-                                //计量失败,播报失败,然后写led屏幕及日志
-                                led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
-                                txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
-                                lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
-                                CacleCls.isLock = false;
-                                return;
+                                    if (dic.Count > 0) imgControl.ZipFiles(dic);
+                                }
+                                else
+                                {
+                                    //计量失败,播报失败,然后写led屏幕及日志
+                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                                    txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
+                                    lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
+                                    CacleCls.isLock = false;
+                                    return;
+                                }
                             }
                         }
                     }
+                    catch (Exception)
+                    {
+                        CacleCls.serverFlag = false;
+                    }
+                    Thread.Sleep(1000);
                 }
-                catch (Exception)
-                {
-                    CacleCls.serverFlag = false;
-                }
-                Thread.Sleep(1000);
             }, _dbCts.Token);
         }
 
@@ -671,6 +765,7 @@ namespace CarLocalMeter
                     return;
                 }
 
+                
                 //一次计量
                 if (CacleCls.firstDb == null)
                 {
@@ -690,6 +785,22 @@ namespace CarLocalMeter
                         dataSource = "1",
                         checkFlag = "1"
                     });
+
+                    if (rmRst.Succeed)
+                    {
+                        isMeasureSuccess = true;
+                        CacleCls.actualNo = rmRst.Data?.actualFirstNo;
+                        CacleCls.tempNo = strGuid;
+                    }
+                    else
+                    {
+                        //计量失败,播报失败,然后写led屏幕及日志
+                        led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                        txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
+                        lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
+                        CacleCls.isLock = false;
+                        return;
+                    }
                 }
                 else //结净操作
                 {
@@ -708,24 +819,22 @@ namespace CarLocalMeter
                         dataSource = "1",
                         checkFlag = "1"
                     });
-                }
-
-                
 
-                if (rmRst.Succeed)
-                {
-                    isMeasureSuccess = true;
-                    CacleCls.actualNo = rmRst.Data?.actualFirstNo;
-                    CacleCls.tempNo = strGuid;
-                }
-                else
-                {
-                    //计量失败,播报失败,然后写led屏幕及日志
-                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
-                    txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
-                    lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
-                    CacleCls.isLock = false;
-                    return;
+                    if (rmRst.Succeed)
+                    {
+                        isMeasureSuccess = true;
+                        CacleCls.actualNo = rmRst.Data;
+                        CacleCls.tempNo = strGuid;
+                    }
+                    else
+                    {
+                        //计量失败,播报失败,然后写led屏幕及日志
+                        led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                        txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
+                        lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
+                        CacleCls.isLock = false;
+                        return;
+                    }
                 }
             }
             else 
@@ -795,6 +904,8 @@ namespace CarLocalMeter
 
         private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
         {
+            
+            try { mx.ClosingCollect(); } catch { }
             try { rfid.ClosingCollect(); } catch { }
             try { if (bVoice) ce.StopTalk(); } catch { }