yi eason vor 3 Jahren
Ursprung
Commit
f066a6b362

+ 2 - 0
CarMeterSystem/frmOneYardToEnd.cs

@@ -1011,6 +1011,7 @@ namespace CarMeterSystem
 
                     #region 1.计量完成后,提交车号识别报警信息;2.提交车号识别详细信息
                     // 1.如果车号识别方式为视觉识别;如果双摄像头识别类型为  1:只有一个识别,则正常赋值
+                    /*
                     if (PbCache.carNoSource == 1 && PbCache.collect.carnoAlert == "1")
                     {
                         MeterWorkScheduledHelp meterWorkScheduledHelp = new MeterWorkScheduledHelp();
@@ -1022,6 +1023,7 @@ namespace CarMeterSystem
                         meterWorkScheduledHelp.warmTypeName = "智能终端报警";
                         meterWorkScheduledHelpService.add(meterWorkScheduledHelp);
                     }
+                    //*/
 
                     // 2.提交车号识别详细信息,每一车都要提交
                     /*

+ 29 - 38
RailLocalMeter/App.config

@@ -38,58 +38,45 @@
 		<add key="railwayTypeName" value="静态轨道衡" />
 		
 		<!--秤体量程(单位t)-->
-		<add key="maxRange" value="100" />
+		<add key="maxRange" value="300" />
 		
 		
 
 		<!--硬盘录像机仪表抓拍设置的通道-->
-		<add key="channelOther" value="2,3,5" />
-		<add key="channelVis" value="4,1" />
+		<add key="channelOther" value="1,2" />
+		<add key="channelVis" value="3,5" />
 		<!--需显示视频的通道-->
 		<add key="channelVisHeight" value="300" />
 		<!--需显示高度-->
-		<add key="channelCarNo" value="4" />
-		<!--车号抓拍通道,用于生成图2-->
-		<add key="channel" value="1" />
-		<!--重量仪表抓拍通道-->
-		<!--10.130.0.72是1#北  10.130.0.46是8#西-->
-		<add key="voicePlayIp" value="10.130.0.46" />
+		<add key="channelCarNo" value="3" /><!--车号抓拍通道,用于生成图2-->
+		<add key="channel" value="5" /><!--重量仪表抓拍通道-->
+		<!--10.130.0.72是1#北  10.130.0.46是8#西  10.130.1.36嘉北1#静态轨道衡-->
+		<add key="voicePlayIp" value="10.130.1.36" />
 		<add key="voicePlayPort" value="8000" />
 		<add key="voicePlayUid" value="admin" />
 		<add key="voicePlayPwd" value="jlwj12345" />
-		<!--1#公路北车号抓拍摄像头枪机 10.130.0.76是1#北   10.130.2.49是8#西-->
-		<add key="voiceCarNoIp" value="10.130.2.49" />
-		<add key="voiceCarNoPort" value="8000" />
-		<add key="voiceCarNoUid" value="admin" />
-		<add key="voiceCarNoPwd" value="jlwj12345" />
-		<!--车号抓拍摄像头球机 10.130.0.85是1#北   10.130.0.33是8#西-->
-		<add key="voiceCarNoIp2" value="10.130.0.85" />
-		<add key="voiceCarNoPort2" value="8000" />
-		<add key="voiceCarNoUid2" value="admin" />
-		<add key="voiceCarNoPwd2" value="jlwj12345" />
-
+		
 
-		<!--PLC配置,由于PLC自带了ModbusTcp协议,所以这里配置的是Moudbus的IP跟端口-->
-		<add key="plcIp" value="10.121.80.101" />
+		<!--PLC配置,由于PLC自带了ModbusTcp协议,所以这里配置的是Moudbus的IP跟端口 10.130.1.30是嘉北1#-->
+		<add key="plcIp" value="10.130.1.30" />
 		<add key="plcPort" value="502" />
 		<!--采集的点位,例如D0是0,D3则是3-->
 		<add key="plcLocation" value="0,66,27,28" />
 		<!--点位对应的属性 plc状态,按钮状态,激光车位检测-->
 		<add key="plcLocationName" value="plcState,btnState,topHw,bottomHw" />
 		<!--0关闭plc,1打开plc-->
-		<add key="plcStart" value="0"/>
+		<add key="plcStart" value="1"/>
 
-		<!--*************MoXa配置 10.130.0.69是1#北  10.130.1.173是8#西*****************-->
+		<!--*************MoXa配置 10.130.0.69是1#北  10.130.1.173是8#西   10.130.1.195是嘉北1#静态轨道衡*****************-->
 		<add key="sleepTime" value="100"/>
-		<add key="moxaIP" value="10.130.1.173" />
-		<add key="moxaPort" value="4004" />
-		<!--4001是1#北,4004是8#西-->
+		<add key="moxaIP" value="10.130.1.195" />
+		<add key="moxaPort" value="4001" /><!--4001是1#北,4004是8#西,4001是嘉北1#静态轨道衡-->
 		<!--报文长度 1#北17  8#西12-->
-		<add key="messageLength" value="12" />
+		<add key="messageLength" value="17" />
 		<!--数据截止位符号  1#北13  8#西3-->
-		<add key="separate" value="3" />
-		<!--开始取值位置从1开始数   1#北5  8#西3-->
-		<add key="startPosition" value="4" />
+		<add key="separate" value="13" />
+		<!--开始取值位置从1开始数   1#北5  8#西3 嘉北1#为6 也就是说正向走我这比宾总那需要+1 -->
+		<add key="startPosition" value="6" />
 		<!--取多少位   1#北6  8#西6-->
 		<add key="dataLength" value="6" />
 		<!-- 是否反转 false不反转 true反转-->
@@ -102,14 +89,18 @@
 
 		<!--led地址-->
 		<add key="ledIp" value="10.130.0.134"/>
+		<!--是否启用led  0启用 1不启用-->
+		<add key="ledStart" value="1"/>
 
-		<!--RFID配置只考虑tcp_ip的,如果串口很简单,不过这里不考虑-->
-		<!--rfid的IP地址-->
-		<add key="rfidIP" value="10.130.0.70" />
-		<!--rfid的Port地址-->
-		<add key="rfidPort" value="7086" />
-		<!--rfid断开重连持续时长分钟,若该时间内还是连不上则不再连接-->
-		<add key="rfidConnTime" value="1"/>
+
+		<!--RFID配置走串口,因为轨道衡是采集平台为服务端,现场为客户端,现场发数据给IOT,所以不能变更现场配置,另外现场有串口服务器可以接多根串口线-->
+		<add key="openCom" value="1"/><!--是否开启Com口取车号 0启用,1不启用-->
+		<add key="comPort" value="COM11" /><!--COM口-->
+		<add key="comBaud" value="28800" /><!--波特率-->
+		<add key="comParity" value="None" /><!--奇偶校验方式-->
+		<add key="comLength" value="8" /><!--数据长度-->
+		<add key="comStopBits" value="1" /><!--停止位-->
+		
 
 		<!--上传数据休眠时间毫秒,重量为0,且网络正常时我们每10秒检测一次计量数据是否未上传-->
 		<add key="sleepUploadTime" value="10000"/>

+ 15 - 4
RailLocalMeter/DbOption/MeterWorkRailwayActFirstService.cs

@@ -29,21 +29,23 @@ namespace RailLocalMeter
             return rm;
         }
 
-        internal RESTfulResult<ResponseData> add(MeterWorkRailwayActFirst info)
+        internal RESTfulResult<ResponseData> add(MeterWorkRailwayActFirst info, out string msg)
         {
             DbHelper db = new DbHelper();
             RESTfulResult<ResponseData> rm = db.doOption<ResponseData>("meterworkrailwayactfirsts", "/add", new object[] { info }, 1);
+            msg = rm.ResultMessage;
             return rm;
         }
 
-        internal RESTfulResult<ResponseData> doIdentifyWeight(MeterWorkRailwayActFirst info)
+        internal RESTfulResult<ResponseData> doIdentifyWeight(MeterWorkRailwayActFirst info, out string msg)
         {
             DbHelper db = new DbHelper();
             RESTfulResult<ResponseData> rm = db.doOption<ResponseData>("meterworkrailwayactfirsts", "doIdentifyWeight", new object[] { info }, 1);
+            msg = rm.ResultMessage;
             return rm;
         }
 
-        internal RESTfulResult<ResponseData> doAddWfStaticTwo(PreRailwayScale preRailwayScale, MeterWorkRailwayActFirst gross, MeterWorkRailwayActFirst tare)
+        internal RESTfulResult<ResponseData> doAddWfStaticTwo(PreRailwayScale preRailwayScale, MeterWorkRailwayActFirst gross, MeterWorkRailwayActFirst tare, out string msg)
         {
             DbHelper db = new DbHelper();
             PbSomeModel<PreRailwayScale, MeterWorkRailwayActFirst, MeterWorkRailwayActFirst, MeterMonitorNote> pbSomeModel = new PbSomeModel<PreRailwayScale, MeterWorkRailwayActFirst, MeterWorkRailwayActFirst, MeterMonitorNote>();
@@ -51,13 +53,22 @@ namespace RailLocalMeter
             pbSomeModel.two = gross;
             pbSomeModel.three = tare;
             RESTfulResult<ResponseData> rm = db.doOption<ResponseData>("meterworkrailwayactfirsts", "doAddWfStaticTwo", new object[] { pbSomeModel }, 1);
+            msg = rm.ResultMessage;
             return rm;
         }
 
         internal RESTfulResult<List<DjPbModel>> doDbUpload(List<MeterWorkRailwayActFirst> lm)
         {
             DbHelper db = new DbHelper();
-            RESTfulResult<List<DjPbModel>> rm = db.doOption<List<DjPbModel>>("meterworkrailwayactfirsts", "addFirstEmergencyList", new object[] { lm }, 1);
+            RESTfulResult<List<DjPbModel>> rm = db.doOption<List<DjPbModel>>("meterworkrailwayactfirstbaks", "addFirstEmergencyList", new object[] { lm }, 1);
+            return rm;
+        }
+
+        internal RESTfulResult<string> BatchUpdateLcNo(List<MeterWorkRailwayActFirst> ltAdd, out string msgInfo)
+        {
+            DbHelper db = new DbHelper();
+            RESTfulResult<string> rm = db.doOption<string>("meterworkrailwayactfirsts", "/batchUpdateLcNo", new object[] { ltAdd }, 1);
+            msgInfo = rm.ResultMessage;
             return rm;
         }
     }

+ 9 - 1
RailLocalMeter/DbOption/MeterWorkRailwayActualService.cs

@@ -19,7 +19,15 @@ namespace RailLocalMeter
         internal RESTfulResult<List<DjPbModel>> doDbUpload(List<MeterWorkRailwayActual> lm)
         {
             DbHelper db = new DbHelper();
-            RESTfulResult<List<DjPbModel>> rm = db.doOption<List<DjPbModel>>("meterworkrailwayactuals", "/addNetEmergencyList", new object[] { lm }, 1);
+            RESTfulResult<List<DjPbModel>> rm = db.doOption<List<DjPbModel>>("meterworkrailwayactualbaks", "/addNetEmergencyList", new object[] { lm }, 1);
+            return rm;
+        }
+
+        internal RESTfulResult<string> BatchUpdateLcNo(List<MeterWorkRailwayActual> ltAdd, out string msgInfo)
+        {
+            DbHelper db = new DbHelper();
+            RESTfulResult<string> rm = db.doOption<string>("meterworkrailwayactuals", "/batchUpdateLcNo", new object[] { ltAdd }, 1);
+            msgInfo = rm.ResultMessage;
             return rm;
         }
     }

+ 4 - 4
RailLocalMeter/OptionCls/DbUpload.cs

@@ -64,7 +64,7 @@ namespace RailLocalMeter
                                     if (rmRst.Data.Count == lm.Count)
                                     {
                                         //直接重写文件
-                                        FileOption.clearFile();
+                                        FileOption.clearFile(FileTypeEnum.一次数据);
                                         //然后对图片进行压缩及修改名称处理
                                         foreach (DjPbModel dm in rmRst.Data)
                                         {
@@ -74,7 +74,7 @@ namespace RailLocalMeter
                                     else
                                     {
                                         //清理下文件
-                                        FileOption.clearFile();
+                                        FileOption.clearFile(FileTypeEnum.一次数据);
                                         //重写下未成功的数据
                                         foreach (MeterWorkRailwayActFirst first in lm)
                                         {
@@ -123,7 +123,7 @@ namespace RailLocalMeter
                                     if (rmRst.Data.Count == lmNet.Count)
                                     {
                                         //直接重写文件
-                                        FileOption.clearFile();
+                                        FileOption.clearFile(FileTypeEnum.结净数据);
                                         //然后对图片进行压缩及修改名称处理
                                         foreach (DjPbModel dm in rmRst.Data)
                                         {
@@ -133,7 +133,7 @@ namespace RailLocalMeter
                                     else
                                     {
                                         //清理下文件
-                                        FileOption.clearFile();
+                                        FileOption.clearFile(FileTypeEnum.结净数据);
                                         //重写下未成功的数据
                                         foreach (MeterWorkRailwayActual net in lmNet)
                                         {

+ 1 - 1
RailLocalMeter/OptionCls/MoxaCls.cs

@@ -233,7 +233,7 @@ namespace RailLocalMeter
                             itest = 0;
                         }
 
-                        CacleCls.voicCarNo = "湘G88888";
+                        CacleCls.rfidCarNo = "X70     5337172";
                         //*/
                         #endregion
 #endif

+ 5 - 27
RailLocalMeter/OptionCls/PlcCls.cs

@@ -30,7 +30,7 @@ namespace RailLocalMeter
 
 
         #region 重连接
-        int tryReconnNetTimeSpan = AppConfigCache.rfidConnTime;
+        int tryReconnNetTimeSpan = 1;
         private void ReConn()
         {
             bool isSuc = false;
@@ -140,11 +140,12 @@ namespace RailLocalMeter
             {
                 try
                 {
+                    /*
                     //不停的给plc写值,我这写1234,他那会改为4321
                     DataCollectWrite(0, 1234);
                     //将重量信息写入到plc重量位置
                     DataCollectWrite2(4, (ushort)CacleCls.weight);
-
+                    //*/
 
                     foreach (KeyValuePair<string, int> kvp in locationInfo)
                     {
@@ -178,33 +179,10 @@ namespace RailLocalMeter
                         }
                     }
 
-                    #region
-                    /*
-                    try 
+                    if (CacleCls.btnState == "1") 
                     {
-                        if (CacleCls.weight < 500)
-                        {
-                            if (!bFlag) 
-                            {
-                                //实际上红绿灯是自动控制的,所以没影响
-                                //DataCollectWrite();
-                            }
-                            bFlag = true;
-                        }
-                        else 
-                        {
-                            if (bFlag) 
-                            { 
-                                
-                            }
-                            bFlag = false;
-                        }
-                    } catch(Exception ex) 
-                    { 
-                        
+                        lg.WriteLog(LogType.PlcLog, $"写入PLC的按钮值为1{DateTime.Now.ToString("yyyy-MM-dd HH24:mi:ss")}");
                     }
-                    //*/
-                    #endregion
 
                     Thread.Sleep(AppConfigCache.sleepTime);
                     //读取到db之后,则需要将这个db值写入到缓存中

+ 0 - 210
RailLocalMeter/OptionCls/RfIdCarNo.cs

@@ -1,210 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Core = Invengo.NetAPI.Core;
-using IRP1 = Invengo.NetAPI.Protocol.IRP1;
-using Invengo.NetAPI.Protocol.IRP1;
-using Invengo.NetAPI.Core;
-
-using System.Configuration;
-using System.Net;
-using System.Net.Sockets;
-using System.Threading;
-using System.Windows.Forms;
-using System.Net.NetworkInformation;
-
-namespace RailLocalMeter
-{
-    public class RfIdCarNo
-    {
-        Log lg = Log.GetInstance();
-
-        IRP1.Reader reader = new IRP1.Reader("Reader1", "TCPIP_Client", $"{AppConfigCache.rfidIP}:{AppConfigCache.rfidPort}");//网口
-        IRP1.ReadTag scanMsg = new IRP1.ReadTag(IRP1.ReadTag.ReadMemoryBank.EPC_6C);//扫描消息
-        bool blThreadFlag = true;
-        object lockobj = new object();//显示数据锁定
-
-        public RfIdCarNo()
-        {
-            IRP1.Reader.OnApiException += new Core.ApiExceptionHandle(Reader_OnApiException);
-        }
-
-        public void Start()
-        {
-            if (reader.Connect())
-            {
-                //注册接收读写器消息事件
-                reader.OnMessageNotificationReceived += new Invengo.NetAPI.Core.MessageNotificationReceivedHandle(reader_OnMessageNotificationReceived);
-                lg.WriteLog(LogType.RfidLoc, "连接成功");
-
-                if (reader != null && reader.IsConnected)
-                {
-                    if (reader.Send(scanMsg))
-                    {
-                        lg.WriteLog(LogType.RfidLoc, "正在读卡...");
-                    }
-                }
-            }
-            else
-            {
-                lg.WriteLog(LogType.RfidLoc, "连接失败");
-            }
-        }
-
-        public void ClosingCollect()
-        {
-            if (reader != null)
-            {
-                if (reader.IsConnected)
-                {
-                    if (reader.Send(new IRP1.PowerOff()))//发送关功放消息
-                    {
-                        lg.WriteLog(LogType.RfidLoc, "停止读卡");
-                    }
-                }
-
-                reader.OnMessageNotificationReceived -= new Invengo.NetAPI.Core.MessageNotificationReceivedHandle(reader_OnMessageNotificationReceived);
-                reader.Disconnect();
-            }
-            lg.WriteLog(LogType.RfidLoc, "关闭连接");
-        }
-
-
-        void reader_OnMessageNotificationReceived(Invengo.NetAPI.Core.BaseReader reader, Invengo.NetAPI.Core.IMessageNotification msg)
-        {
-            if (msg.StatusCode != 0)
-            {
-                lg.WriteLog(LogType.RfidLoc, msg.ErrInfo);
-                return;
-            }
-            String msgType = msg.GetMessageType();
-            msgType = msgType.Substring(msgType.LastIndexOf('.') + 1);
-            switch (msgType)
-            {
-                case "RXD_TagData":
-                    {
-                        IRP1.RXD_TagData m = (IRP1.RXD_TagData)msg;
-                        string tagType = m.ReceivedMessage.TagType;
-                        display(m);
-                    }
-                    break;
-                case "RXD_IOTriggerSignal_800":
-                    {
-                        IRP1.RXD_IOTriggerSignal_800 m = (IRP1.RXD_IOTriggerSignal_800)msg;
-                        if (m.ReceivedMessage.IsStart)
-                        {
-                            lg.WriteLog(LogType.RfidLoc, "I/O 触发,正在读卡...");
-                        }
-                        else
-                        {
-                            lg.WriteLog(LogType.RfidLoc, "I/O 触发,停止读卡");
-                        }
-                    }
-                    break;
-            }
-        }
-
-        private void display(IRP1.RXD_TagData msg)
-        {
-            lock (lockobj)
-            {
-                string epc = Core.Util.ConvertByteArrayToHexString(msg.ReceivedMessage.EPC);
-                string tid = Core.Util.ConvertByteArrayToHexString(msg.ReceivedMessage.TID);
-                string userDb = Core.Util.ConvertByteArrayToHexString(msg.ReceivedMessage.UserData);
-
-                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;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-
-        bool isTryReconnNet = false;
-        void Reader_OnApiException(Core.ErrInfo e)
-        {
-            if (e.Ei.ErrCode == "FF22") //断网连接尝试
-            {
-                if (isTryReconnNet)
-                    ReConn();
-                lg.WriteLog(LogType.RfidLoc, e.Ei.ErrMsg);
-            }
-            else if (e.Ei.ErrCode == "FF24")//发现连接作废,不作断网恢复尝试
-            {
-                isTryReconnNet = false;
-                lg.WriteLog(LogType.RfidLoc, e.Ei.ErrMsg);
-            }
-        }
-
-
-        #region 重连接
-        int tryReconnNetTimeSpan = AppConfigCache.rfidConnTime;
-        private void ReConn()
-        {
-            bool isSuc = false;
-            using (Ping ping = new Ping())
-            {
-                for (int i = 0; i < tryReconnNetTimeSpan * 60; i++)
-                {
-                    PingReply pingReply = null;
-                    try
-                    {
-                        pingReply = ping.Send(reader.ConnString.Substring(0, reader.ConnString.IndexOf(':')), 1000);//超时为1秒
-
-                        if (pingReply.Status != IPStatus.Success)
-                        {
-                            lg.WriteLog(LogType.RfidLoc, "Ping不通");
-                            continue;
-                        }
-                        else
-                        {
-                            isSuc = true;
-                            break;
-                        }
-                    }
-                    catch (Exception ex)
-                    {
-                        lg.WriteLog(LogType.RfidLoc, $"尝试自动恢复连接失败:{ex.Message}");
-                        return;
-                    }
-                }
-            }
-            //建立连接
-            if (isSuc)
-            {
-                isSuc = false;
-                for (int i = 0; i < 3; i++)//尝试3次
-                {
-                    if (reader.Connect())
-                    {
-                        lg.WriteLog(LogType.RfidLoc, $"尝试自动恢复连接成功");
-                        isSuc = true;
-                        break;
-                    }
-                    else
-                    {
-                        Thread.Sleep(2000);
-                        continue;
-                    }
-                }
-                if (!isSuc)
-                    lg.WriteLog(LogType.RfidLoc, $"尝试自动恢复连接失败");
-            }
-        }
-        #endregion
-    }
-}
-

+ 135 - 0
RailLocalMeter/OptionCls/RfidRailWayNo.cs

@@ -0,0 +1,135 @@
+using System;
+using System.IO;
+using System.IO.Ports;
+using System.Threading;
+
+namespace RailLocalMeter
+{
+    public class RfidRailWayNo
+    {
+        Log lg = Log.GetInstance();
+
+        SerialPort serialPort1;
+        bool blThreadFlag = false;
+       
+        private object obj = new object();
+        private Thread mThread = null;
+
+        /// <summary>
+        /// comPara是配置文件中的comPara
+        /// </summary>
+        /// <param name="comPara"></param>
+        public void StartThreadSweep(out string msg)
+        {
+            #region 串口采集配置
+            Parity parity = Parity.None;
+
+            switch (AppConfigCache.comParity) 
+            {
+                case "ODD": parity = Parity.Odd; break;
+                case "EVEN": parity = Parity.Even; break;
+                default: break;
+            }
+
+            StopBits stopBits = StopBits.None;
+
+            switch (AppConfigCache.comStopBits) 
+            {
+                case "1": stopBits = StopBits.One; break;
+                case "1.5": stopBits = StopBits.OnePointFive; break;
+                case "2": stopBits = StopBits.Two; break;
+                default: break;
+            }
+            
+            serialPort1 = new SerialPort(AppConfigCache.comPort, AppConfigCache.comBaud, parity, AppConfigCache.comLength, stopBits);
+            int icnt = 0;
+            msg = "";
+            while (!serialPort1.IsOpen)
+            {
+                try
+                {
+                    icnt++;
+                    serialPort1.Open();
+                }
+                catch (Exception err)
+                {
+                    lg.WriteLog(LogType.RfidLoc, $"打开串口失败,正重试{err.Message}");
+                }
+                System.Threading.Thread.Sleep(500);
+                if (icnt > 5)
+                {
+                    msg = "串口打开失败,请检查串口是否存在,且是否被占用";
+                    return;
+                }
+            }
+
+            #endregion
+            blThreadFlag = true;
+            mThread = new Thread(new ThreadStart(ThreadSweepInfo));
+            mThread.Start();
+        }
+
+        /// <summary>
+        /// 扫码信息读取
+        /// </summary>
+        /// <returns></returns>
+        private void ThreadSweepInfo()
+        {
+            try
+            {
+                while (blThreadFlag)
+                {
+                    lock (obj)
+                    {
+                        Thread.Sleep(100);
+                        string strtmp = "";
+                        if (serialPort1.BytesToRead > 0)
+                        {
+                            strtmp = serialPort1.ReadExisting();
+                        }
+                        strtmp = strtmp.Split(new char[] { '\r' })[0];
+                        if (strtmp != "")
+                        { 
+                            if (CacleCls.rfidCarNo != strtmp) 
+                            {
+                                CacleCls.rfidCarNo = strtmp;
+                                lg.WriteLog(LogType.RfidLoc, $"读卡器读取的数据:{strtmp}");
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception exp)
+            {
+                lg.WriteLog(LogType.RfidLoc, $"读卡器数据读取异常:{exp.Message}");
+            }
+        }
+        /// <summary>
+        /// 关闭线程
+        /// </summary>
+        /// <returns></returns>
+        public bool CloseThread()
+        {
+            try
+            {
+                blThreadFlag = false;
+                Close();
+                return true;
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+
+        /// <summary>
+        /// 关闭扫描枪
+        /// </summary>
+        private void Close()
+        {
+            lg.WriteLog(LogType.RfidLoc, $"读卡器关闭");
+            if (serialPort1 != null && serialPort1.IsOpen) serialPort1.Close();
+        }
+    }
+}

+ 23 - 55
RailLocalMeter/PbCls/AppConfigCache.cs

@@ -136,47 +136,6 @@ namespace RailLocalMeter
         public static string voicePlayPwd = ConfigurationManager.AppSettings["voicePlayPwd"].ToString();
 
 
-        /// <summary>
-        /// 车号抓拍IP
-        /// </summary>
-        public static string voiceCarNoIp = ConfigurationManager.AppSettings["voiceCarNoIp"].ToString();
-
-        /// <summary>
-        /// 车号抓拍端口
-        /// </summary>
-        public static int voiceCarNoPort = Convert.ToInt32(ConfigurationManager.AppSettings["voiceCarNoPort"].ToString());
-
-        /// <summary>
-        /// 车号抓拍账号
-        /// </summary>
-        public static string voiceCarNoUid = ConfigurationManager.AppSettings["voiceCarNoUid"].ToString();
-
-        /// <summary>
-        /// 车号抓拍密码
-        /// </summary>
-        public static string voiceCarNoPwd = ConfigurationManager.AppSettings["voiceCarNoPwd"].ToString();
-
-        /// <summary>
-        /// 车号抓拍IP
-        /// </summary>
-        public static string voiceCarNoIp2 = ConfigurationManager.AppSettings["voiceCarNoIp2"].ToString();
-
-        /// <summary>
-        /// 车号抓拍端口
-        /// </summary>
-        public static int voiceCarNoPort2 = Convert.ToInt32(ConfigurationManager.AppSettings["voiceCarNoPort2"].ToString());
-
-        /// <summary>
-        /// 车号抓拍账号
-        /// </summary>
-        public static string voiceCarNoUid2 = ConfigurationManager.AppSettings["voiceCarNoUid2"].ToString();
-
-        /// <summary>
-        /// 车号抓拍密码
-        /// </summary>
-        public static string voiceCarNoPwd2 = ConfigurationManager.AppSettings["voiceCarNoPwd2"].ToString();
-
-
         /// <summary>
         /// 
         /// </summary>
@@ -263,39 +222,42 @@ namespace RailLocalMeter
         /// 零点判断绝对值在0到多少内为零点
         /// </summary>
         public static int minValue = Convert.ToInt32(ConfigurationManager.AppSettings["minValue"].ToString());
-        
 
+
+        #region rfid配置
         /// <summary>
-        /// 
+        /// 是否开启Com口取车号 0启用,1不启用
         /// </summary>
-        public static string redisIp = ConfigurationManager.AppSettings["redisIp"].ToString();
+        public static string openCom = ConfigurationManager.AppSettings["openCom"].ToString();
 
         /// <summary>
-        /// 
+        /// COM口
         /// </summary>
-        public static int redisPort = Convert.ToInt32(ConfigurationManager.AppSettings["redisPort"].ToString());
-
+        public static string comPort = ConfigurationManager.AppSettings["comPort"].ToString();
 
-        #region rfid配置
         /// <summary>
-        /// 断开重连持续时间 分钟
+        /// 波特率
         /// </summary>
-        public static int rfidConnTime = Convert.ToInt32(ConfigurationManager.AppSettings["rfidConnTime"].ToString());
+        public static int comBaud = Convert.ToInt32(ConfigurationManager.AppSettings["comBaud"].ToString());
 
         /// <summary>
-        /// 走tcp的采集方式 rfid的ip地址
+        /// 奇偶校验方式
         /// </summary>
-        public static string rfidIP = ConfigurationManager.AppSettings["rfidIP"].ToString();
+        public static string comParity = ConfigurationManager.AppSettings["comParity"].ToString();
 
         /// <summary>
-        /// 走tcp的采集方式 rfid的port
+        /// 数据长度
         /// </summary>
-        public static int rfidPort = Convert.ToInt32(ConfigurationManager.AppSettings["rfidPort"].ToString());
+        public static int comLength = Convert.ToInt32(ConfigurationManager.AppSettings["comLength"].ToString());
 
+        /// <summary>
+        /// 结束符
+        /// </summary>
+        public static string comStopBits = ConfigurationManager.AppSettings["comStopBits"].ToString();
         #endregion
 
         /// <summary>
-        /// 走串口的方式  开始取值位置从0开始数
+        /// 一次计量数据过期时间
         /// </summary>
         public static int isEndHour = Convert.ToInt32(ConfigurationManager.AppSettings["isEndHour"].ToString());
 
@@ -303,7 +265,13 @@ namespace RailLocalMeter
         /// Led的IP地址
         /// </summary>
         public static string ledIp = ConfigurationManager.AppSettings["ledIp"].ToString();
+
+        /// <summary>
+        /// 是否启用led  0启用 1不启用
+        /// </summary>
+        public static string ledStart = ConfigurationManager.AppSettings["ledStart"].ToString();
         
+
         /// <summary>
         /// plc是否打开 0关闭,1打开
         /// </summary>

+ 7 - 6
RailLocalMeter/PbCls/FileOption.cs

@@ -28,12 +28,12 @@ namespace RailLocalMeter
                 if (!File.Exists(sPath))
                 {
                     //不存在则创建文件并直接写入数据
-                    File.WriteAllText(sPath, JsonConvert.SerializeObject(actualDb, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
+                    File.WriteAllText(sPath, JsonConvert.SerializeObject(actualDb, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })+"\n");
                 }
                 else
                 {
                     List<string> ls = new List<string>();
-                    ls.Add(JsonConvert.SerializeObject(actualDb));
+                    ls.Add(JsonConvert.SerializeObject(actualDb, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
                     File.AppendAllLines(sPath, ls);
                 }
                 msgInfo = "计量完成";
@@ -62,7 +62,7 @@ namespace RailLocalMeter
             {
                 string sPath = dbFile + (fileType == FileTypeEnum.一次数据 ? "FristDb.data" : "actualDb.data");
 
-                if (File.Exists(dbFile))
+                if (File.Exists(sPath))
                 {
                     string[] strs = File.ReadAllLines(sPath);
                     foreach (string str in strs) 
@@ -86,15 +86,16 @@ namespace RailLocalMeter
         /// <summary>
         /// 清理文件数据
         /// </summary>
-        public static void clearFile() 
+        public static void clearFile(FileTypeEnum fileType) 
         {
             Log lg = Log.GetInstance();
             try 
             {
-                if (File.Exists(dbFile))
+                string sPath = dbFile + (fileType == FileTypeEnum.一次数据 ? "FristDb.data" : "actualDb.data");
+                if (File.Exists(sPath))
                 {
                     //不存在则创建文件并直接写入数据
-                    File.WriteAllText(dbFile, "");
+                    File.WriteAllText(sPath, "");
                 }
             } catch (Exception ex) 
             {

+ 14 - 3
RailLocalMeter/Program.cs

@@ -14,9 +14,20 @@ namespace RailLocalMeter
         [STAThread]
         static void Main()
         {
-            Application.EnableVisualStyles();
-            Application.SetCompatibleTextRenderingDefault(false);
-            Application.Run(new frmMain());
+            bool createNew;
+            using (System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out createNew))
+            {
+                if (createNew)
+                {
+                    Application.EnableVisualStyles();
+                    Application.SetCompatibleTextRenderingDefault(false);
+                    Application.Run(new frmMain());//
+                }
+                else
+                {
+                    MessageBox.Show("已启动该程序,不允许重复启动!");
+                }
+            }
         }
     }
 }

+ 2 - 2
RailLocalMeter/RailLocalMeter.csproj

@@ -18,7 +18,7 @@
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\CarLocalMeter\bin\Debug\</OutputPath>
+    <OutputPath>bin\Debug\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
@@ -140,7 +140,7 @@
     <Compile Include="OptionCls\MoxaCls.cs" />
     <Compile Include="OptionCls\PingNetwork.cs" />
     <Compile Include="OptionCls\PlcCls.cs" />
-    <Compile Include="OptionCls\RfIdCarNo.cs" />
+    <Compile Include="OptionCls\RfidRailWayNo.cs" />
     <Compile Include="OptionCls\Voice\CamerEs.cs" />
     <Compile Include="OptionCls\Voice\CHCNetSDK.cs" />
     <Compile Include="OptionCls\Voice\CoreDevice.cs" />

+ 6 - 8
RailLocalMeter/frmMain.Designer.cs

@@ -2077,8 +2077,6 @@ namespace RailLocalMeter
             // cbJg
             // 
             this.cbJg.AutoSize = true;
-            this.cbJg.Checked = true;
-            this.cbJg.CheckState = System.Windows.Forms.CheckState.Checked;
             this.cbJg.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.cbJg.ForeColor = System.Drawing.Color.Red;
             this.cbJg.Location = new System.Drawing.Point(9, 179);
@@ -2550,7 +2548,7 @@ namespace RailLocalMeter
             this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 60F));
             this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 150F));
             this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 60F));
-            this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 65F));
+            this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 76F));
             this.tableLayoutPanel7.Controls.Add(this.lbPointName, 1, 0);
             this.tableLayoutPanel7.Controls.Add(this.txtCarNo, 3, 0);
             this.tableLayoutPanel7.Controls.Add(this.lbPntName, 0, 0);
@@ -2576,14 +2574,14 @@ namespace RailLocalMeter
             this.lbPointName.Location = new System.Drawing.Point(86, 1);
             this.lbPointName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
             this.lbPointName.Name = "lbPointName";
-            this.lbPointName.Size = new System.Drawing.Size(517, 36);
+            this.lbPointName.Size = new System.Drawing.Size(506, 36);
             this.lbPointName.TabIndex = 3;
             this.lbPointName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
             // 
             // txtCarNo
             // 
             this.txtCarNo.Font = new System.Drawing.Font("宋体", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
-            this.txtCarNo.Location = new System.Drawing.Point(672, 3);
+            this.txtCarNo.Location = new System.Drawing.Point(661, 3);
             this.txtCarNo.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
             this.txtCarNo.Name = "txtCarNo";
             this.txtCarNo.Size = new System.Drawing.Size(144, 32);
@@ -2612,7 +2610,7 @@ namespace RailLocalMeter
             this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
             this.label2.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.label2.ForeColor = System.Drawing.Color.Blue;
-            this.label2.Location = new System.Drawing.Point(612, 1);
+            this.label2.Location = new System.Drawing.Point(601, 1);
             this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
             this.label2.Name = "label2";
             this.label2.Size = new System.Drawing.Size(52, 36);
@@ -2627,7 +2625,7 @@ namespace RailLocalMeter
             this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
             this.label1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.label1.ForeColor = System.Drawing.Color.Blue;
-            this.label1.Location = new System.Drawing.Point(824, 1);
+            this.label1.Location = new System.Drawing.Point(813, 1);
             this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
             this.label1.Name = "label1";
             this.label1.Size = new System.Drawing.Size(52, 36);
@@ -2638,7 +2636,7 @@ namespace RailLocalMeter
             // pbLineOn
             // 
             this.pbLineOn.Image = ((System.Drawing.Image)(resources.GetObject("pbLineOn.Image")));
-            this.pbLineOn.Location = new System.Drawing.Point(884, 4);
+            this.pbLineOn.Location = new System.Drawing.Point(873, 4);
             this.pbLineOn.Name = "pbLineOn";
             this.pbLineOn.Size = new System.Drawing.Size(39, 30);
             this.pbLineOn.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;

+ 196 - 96
RailLocalMeter/frmMain.cs

@@ -66,7 +66,7 @@ namespace RailLocalMeter
         /// <summary>
         /// rfid车号识别
         /// </summary>
-        RfIdCarNo rfid = new RfIdCarNo();
+        RfidRailWayNo rfid = new RfidRailWayNo();
 
         /// <summary>
         /// Ping服务器服务是否通
@@ -87,13 +87,23 @@ namespace RailLocalMeter
         int iPic = 0;
 
         int lockWgtImg = 0;
-        string strGuid = "";
+
 
         //导出代码,如果要用,则丢到按钮事件中即可
         //ClsControlPack.ExportDataWithSaveDialog2(ref ultraGridFirst, DateTime.Now.ToString("yyyyMMddHHmmss"));
 
         private void frmMain_Load(object sender, EventArgs e)
         {
+            if (AppConfigCache.openCom == "0")
+            {
+                rfid.StartThreadSweep(out string msg);
+                if (!string.IsNullOrEmpty(msg))
+                {
+                    MessageBox.Show(msg);
+                    return;
+                }
+            }
+
             try
             {
                 IPHostEntry ipHost = Dns.Resolve(Dns.GetHostName());
@@ -109,7 +119,7 @@ namespace RailLocalMeter
 
             CacleCls.isJg = true;
             CacleCls.updateRfidInfoTime = DateTime.Now;
-            if (!string.IsNullOrEmpty(AppConfigCache.ledIp))
+            if (!string.IsNullOrEmpty(AppConfigCache.ledIp) && AppConfigCache.ledStart == "0")
             {
                 led_controler = new LED_Control(AppConfigCache.ledIp);
             }
@@ -166,7 +176,6 @@ namespace RailLocalMeter
             //*
             ping.start();
             mx.start();
-            rfid.Start();
             imgControl.Start();
             upload.start();
 
@@ -174,8 +183,8 @@ namespace RailLocalMeter
             DataCollectThread = new Thread(new ThreadStart(DataCollect));
             start();
 
-            BindTable<MeterWorkRailwayActFirst>(ultraGridLocalFirst, dataTableWaitFirst, "localFirst");
-            BindTable<MeterWorkRailwayActual>(ultraGridLocalNet, dataTableWaitNet, "localNet");
+            BindTable<MeterWorkRailwayActFirst>(ultraGridLocalFirst, dataTableLocalFirst, "localFirst");
+            BindTable<MeterWorkRailwayActual>(ultraGridLocalNet, dataTableLocalNet, "localNet");
         }
 
         #region 语音控制
@@ -222,11 +231,12 @@ namespace RailLocalMeter
         bool blThreadFlag;//数据采集线程开关
         Thread DataCollectThread = null;//采集进程
 
-        bool flagCaption = false, isVoiceDownCar = false;
+        bool isVoiceDownCar = false;
         string strOldCarNo = "";
         bool isMeasureSuccess = false;
+        string strFinishCarNo = "";//计量成功的车号
         int voiceNum = 0;
-        int iImgCnt = 0;
+
 
         private void start() => DataCollectThread.Start();
 
@@ -265,10 +275,13 @@ namespace RailLocalMeter
                         }
                         if (strOldCarNo != CacleCls.lockCarNo)
                         {
+                            txtMsgInfo.Text = "";//车号不同的情况下清理下保存按钮
                             isUseLabelTare = false;
                             strOldCarNo = CacleCls.lockCarNo;
                             flagQuery = false;
                             CacleCls.isLock = false;//车号不同了则不锁定
+                            voiceNum = 0;
+                            isMeasureSuccess = false;
                         }
 
                         #region 获取一次数据跟车号
@@ -291,7 +304,6 @@ namespace RailLocalMeter
                         if (CacleCls.weight > 1000)
                         {
                             iError = 21;
-                            iImgCnt = 0;
                             CacleCls.isClear = false;
 
                             #region 如果是自动计量
@@ -301,7 +313,7 @@ namespace RailLocalMeter
                                 {
                                     txtMsgInfo.Text = "车号未识别";
                                     vicPlayClass.GetVoicePlay(VoiceEnum.车号未识别, "");
-                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "车号未识别");
+                                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "车号未识别");
                                     return;
                                 }
 
@@ -309,7 +321,7 @@ namespace RailLocalMeter
                                 {
                                     txtMsgInfo.Text = "车号不为7位";
                                     vicPlayClass.GetVoicePlay(VoiceEnum.车号未识别, "");
-                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "车号不为7位");
+                                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "车号不为7位");
                                     return;
                                 }
 
@@ -319,7 +331,7 @@ namespace RailLocalMeter
                                     //超量程
                                     vicPlayClass.GetVoicePlay(VoiceEnum.车辆超重, CacleCls.lockCarNo);
                                     txtMsgInfo.Text = "当前重量已超量程,秤体量程为【" + AppConfigCache.maxRange + "】T";
-                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "当前重量已超量程,秤体量程为【" + AppConfigCache.maxRange + "】T");
+                                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "当前重量已超量程,秤体量程为【" + AppConfigCache.maxRange + "】T");
                                     CacleCls.isLock = false;
                                     return;
                                 }
@@ -329,7 +341,7 @@ namespace RailLocalMeter
                                     //重量稳定,且对射验证不合格
                                     vicPlayClass.GetVoicePlay(VoiceEnum.车辆未停到位, CacleCls.lockCarNo);
                                     txtMsgInfo.Text = "车辆超出秤台,请调整车位";
-                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "车辆超出秤台,请调整车位");
+                                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "车辆超出秤台,请调整车位");
                                     CacleCls.isLock = false;
                                     return;
                                 }
@@ -343,6 +355,10 @@ namespace RailLocalMeter
 
                                     lg.WriteLog(LogType.SystemLog, CacleCls.lockCarNo + "开始保存:" + DateTime.Now.ToLongTimeString());
                                 }
+                                if (CacleCls.lockCarNo == strFinishCarNo && isMeasureSuccess)
+                                {
+                                    return; //如果车号相同,且计量成功了,那么此时不应该触发自动计量
+                                }
                                 btnSave_Click(null, null);
                             }
                             #endregion
@@ -368,9 +384,7 @@ namespace RailLocalMeter
                             voiceNum = 0;
                             isMeasureSuccess = false;
                             lockWgtImg = CacleCls.weight;
-                            flagCaption = false;
                             isVoiceDownCar = false;
-                            strGuid = "";
 
                             if (!CacleCls.isClear)
                             {
@@ -382,7 +396,6 @@ namespace RailLocalMeter
                                 txtFORWARDING_UNIT_NAME.Text = "";
                                 txtRECEIVING_UINT_NAME.Text = "";
                                 txtMETER_TYPE.Text = "";
-                                txtCarNo.Enabled = true;
                                 txtMsgInfo.Text = "";
                                 txtGroess.Text = "";
                                 txtTare.Text = "";
@@ -392,10 +405,6 @@ namespace RailLocalMeter
                                 //释放一次内存
                                 FlushMemory();
                                 iError = 34;
-
-                                //
-                                imgControl.ZipFiles();
-                                iError = 35;
                             }
                         }
                     }));
@@ -432,15 +441,15 @@ namespace RailLocalMeter
 
         private void cbJg_CheckedChanged(object sender, EventArgs e)
         {
-            CacleCls.isJg = cbJg.Checked;
-            btnSave.Enabled = cbJg.Checked;
+            CacleCls.isJg = !cbJg.Checked;
+            btnSave.Enabled = !cbJg.Checked;
         }
 
         private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
         {
             stop();
             try { mx?.ClosingCollect(); } catch { }
-            try { rfid?.ClosingCollect(); } catch { }
+            try { rfid?.CloseThread(); } catch { }
             try { if (bVoice) ce?.StopTalk(); } catch { }
             try { upload?.stop(); } catch { }
 
@@ -470,6 +479,8 @@ namespace RailLocalMeter
         {
             try
             {
+                isMeasureSuccess = false;
+
                 #region 下面是业务逻辑代码
                 string msgInfo = "";
                 if (txtCarNo.Focused) return; //如果正在修改车号,就必须等光标离开后再保存,否则容易导致车号输入了一半保存了
@@ -489,7 +500,7 @@ namespace RailLocalMeter
                 }
 
 
-                if (CacleCls.isJg) 
+                if (CacleCls.isJg)
                 {
                     //接管状态点的保存
                     if (!isUseLabelTare && MessageBox.Show("是否确认保存当前计量数据?", "提示", MessageBoxButtons.OKCancel) != DialogResult.OK)
@@ -502,13 +513,13 @@ namespace RailLocalMeter
                         txtMsgInfo.Text = "没有车号,无法保存";
                         return;
                     }
-                    
+
                     if (CacleCls.lockWgt < 1000)
                     {
                         txtMsgInfo.Text = "重量过小,无法保存";
                         return;
                     }
-                    
+
                     if (CacleCls.isWd != 0)
                     {
                         DialogResult dr = MessageBox.Show($"[{CacleCls.lockCarNo}]重量不稳定,请确认是否保存当前计量数据?", "提示", MessageBoxButtons.OKCancel);
@@ -517,7 +528,7 @@ namespace RailLocalMeter
                             return;
                         }
                     }
-                    
+
                     if (CacleCls.topJg == "1" || CacleCls.bottomJg == "1")
                     {
                         DialogResult dr = MessageBox.Show($"[{CacleCls.lockCarNo}]未停到位,请确认是否保存当前计量数据?", "提示", MessageBoxButtons.OKCancel);
@@ -537,7 +548,7 @@ namespace RailLocalMeter
                         }
                     }
                 }
-                
+
 
                 /*
                 //存在零点,且不为接管状态则禁止计量
@@ -545,7 +556,7 @@ namespace RailLocalMeter
                 {
                     vicPlayClass.GetVoicePlay(VoiceEnum.仪表未归零, CacleCls.lockCarNo);
                     txtMsgInfo.Text = "仪表未归零,无法计量"; //btnSave_Click
-                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "仪表未归零,无法计量");
+                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "仪表未归零,无法计量");
                     return;
                 }
                 //*/
@@ -554,7 +565,7 @@ namespace RailLocalMeter
                 CacleCls.firstDb = null;
                 CacleCls.preTrackScale = null;
                 //如果是自动计量的,只保存一次数据,且不匹配预报
-                if (CacleCls.isJg) 
+                if (CacleCls.isJg)
                 {
                     ultraGridFirst.UpdateData();
                     foreach (UltraGridRow ugr in ultraGridFirst.Rows)
@@ -576,7 +587,7 @@ namespace RailLocalMeter
                         }
                     }
                 }
-                
+
 
                 if (CacleCls.firstDb != null && !isUseLabelTare)
                 {
@@ -591,48 +602,12 @@ namespace RailLocalMeter
                 }
 
                 lg.WriteLog(LogType.SystemLog, $"锁定车号:{CacleCls.lockCarNo},锁定重量:{CacleCls.lockWgt},rfid编号:{CacleCls.rfidEpc},rfid车号:{CacleCls.rfidCarNo}");
-
                 txtMsgInfo.Text = "称重保存中......";
 
                 CacleCls.isLock = true;
                 txtCarNo.Enabled = false;
 
-                strGuid = strGuid == "" ? Guid.NewGuid().ToString() : strGuid;
-                #region 截图
-                if (!flagCaption)
-                {
-                    for (int i = 0; i < lc.Count(); i++)
-                    {
-                        //从_2开始,因为_1是仪表图片  2是车号快照抓拍
-                        ce.CapPic((uint)lc[i], $"{AppConfigCache.path}/imgShort/formalImg/{AppConfigCache.pointNo}_C{strGuid}_tempImg_{i + 2}.jpg");
-                    }
-                    flagCaption = true;
-                }
-
-                if (lockWgtImg != CacleCls.lockWgt)
-                {
-                    lockWgtImg = CacleCls.lockWgt;
-
-                    foreach (Control cn in panel1.Controls)
-                    {
-                        if (cn.Name.Substring(cn.Name.Length - 1) == $"{AppConfigCache.channel}")
-                        {
-                            if (cn is PictureBox)
-                            {
-                                Bitmap bit = new Bitmap(cn.Width, cn.Height);//实例化一个和窗体一样大的bitmap
-                                Graphics g = Graphics.FromImage(bit);
-                                g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高 HighQuality
-                                g.CopyFromScreen(panel1.Left, panel1.Top + 25, 0, 0, new Size(cn.Width, cn.Height));//保存整个窗体为图片       
-                                bit.Save($"{AppConfigCache.path}/imgShort/formalImg/{AppConfigCache.pointNo}_C{strGuid}_tempImg_1.jpg");//默认保存格式为PNG,保存成jpg格式质量不是很好
-                                bit.Dispose();
-                                break;
-                            }
-                        }
-                    }
-                }
-                #endregion
-
-                
+                string strGuid = Guid.NewGuid().ToString();
 
                 if (isUseLabelTare) //如果是用期限皮结净
                 {
@@ -640,25 +615,27 @@ namespace RailLocalMeter
                     {
                         MeterWorkRailwayActFirst firstDb = new MeterWorkRailwayActFirst();
                         CreateFirst(ref firstDb);
-                        
+
                         if (CacleCls.preTrackScale != null)
                         {
                             CacleCls.preTrackScale.format(firstDb);
                         }
-                        
+
                         firstDb.weightType = "0";
-                        firstDb.railwayFactoryWeight = Convert.ToDouble((txtTare.Value * 1000).ToString());
+                        firstDb.railwayFactoryWeight = Convert.ToDouble(txtTare.Value * 1000);
                         firstDb.valueFlag = "2";
 
-                        if (firstService.doIdentifyWeight(firstDb).Succeed)
+                        RESTfulResult<ResponseData> rt = firstService.doIdentifyWeight(firstDb, out msgInfo);
+                        if (rt.Succeed)
                         {
                             //保存成功
                             isMeasureSuccess = true;
+                            CaptionImg(rt.Data.actuals[0].actualFirst1No);
                         }
                         else
                         {
                             vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
-                            led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                            led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
                             txtMsgInfo.Text = "计量失败写入,本地文件异常:" + msgInfo;
                             lg.WriteLog(LogType.serverLog, "计量失败,写入本地文件异常:" + msgInfo);
                             CacleCls.isLock = false;
@@ -669,6 +646,7 @@ namespace RailLocalMeter
                     {
                         //断网只有一种结净,就是标识皮结净
                         MeterWorkRailwayActual netDb = new MeterWorkRailwayActual();
+                        netDb.actualNo = strGuid;
                         netDb.baseSpot1No = AppConfigCache.pointNo;
                         netDb.baseSpot1Name = AppConfigCache.pointName;
                         netDb.baseSpot2No = AppConfigCache.pointNo;
@@ -681,7 +659,7 @@ namespace RailLocalMeter
                         netDb.conveyanceType = CacleCls.carType;
                         netDb.railwayNo = CacleCls.lockCarNo;
                         netDb.lcNo = "无列次";
-                        netDb.tareWeight = Convert.ToDouble(txtTare.Value);
+                        netDb.tareWeight = Convert.ToDouble(txtTare.Value * 1000);
                         netDb.tareManNo = "system";
                         netDb.tareManName = "system";
                         netDb.tareTime = DateTime.Now;
@@ -694,7 +672,7 @@ namespace RailLocalMeter
                         netDb.netManNo = "system";
                         netDb.netManName = "system";
                         netDb.netTime = DateTime.Now;
-                        netDb.netWeight = Convert.ToDouble(CacleCls.lockWgt - txtTare.Value);
+                        netDb.netWeight = Convert.ToDouble(CacleCls.lockWgt - txtTare.Value * 1000);
 
                         netDb.dataSource = "3";
                         netDb.noticeNo = $"{ip},{Thread.CurrentThread.Name}";
@@ -703,8 +681,9 @@ namespace RailLocalMeter
                         {
                             //保存成功
                             isMeasureSuccess = true;
+                            CaptionImg(strGuid);
                         }
-                        else 
+                        else
                         {
                             vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
                             lg.WriteLog(LogType.SystemLog, "计量失败1:" + msg);
@@ -726,15 +705,17 @@ namespace RailLocalMeter
                                 CacleCls.preTrackScale.format(firstDb);
                             }
 
-                            if (firstService.add(firstDb).Succeed)
+                            RESTfulResult<ResponseData> rt = firstService.add(firstDb, out msgInfo);
+                            if (rt.Succeed)
                             {
                                 //保存成功
                                 isMeasureSuccess = true;
+                                CaptionImg(rt.Data.firsts[0].actualFirstNo);
                             }
                             else
                             {
                                 vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
-                                led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                                led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
                                 txtMsgInfo.Text = "计量失败写入,本地文件异常:" + msgInfo;
                                 lg.WriteLog(LogType.serverLog, "计量失败,写入本地文件异常:" + msgInfo);
                                 CacleCls.isLock = false;
@@ -750,7 +731,7 @@ namespace RailLocalMeter
 
                                 MeterWorkRailwayActFirst mwraf = new MeterWorkRailwayActFirst();
                                 CreateFirst(ref mwraf);
-                                
+
                                 if (CacleCls.preTrackScale != null)
                                 {
                                     CacleCls.preTrackScale.format(mwraf);
@@ -778,14 +759,16 @@ namespace RailLocalMeter
                                     gross = CacleCls.firstDb;
                                 }
 
-                                if (firstService.doAddWfStaticTwo(CacleCls.preTrackScale, gross, tare).Succeed)
+                                RESTfulResult<ResponseData> rt = firstService.doAddWfStaticTwo(CacleCls.preTrackScale, gross, tare, out msgInfo);
+                                if (rt.Succeed)
                                 {
                                     isMeasureSuccess = true; //保存成功
+                                    CaptionImg(rt.Data.firsts[0].actualFirstNo);
                                 }
                                 else
                                 {
                                     vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
-                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
                                     txtMsgInfo.Text = "计量失败写入,本地文件异常:" + msgInfo;
                                     lg.WriteLog(LogType.serverLog, "计量失败,写入本地文件异常:" + msgInfo);
                                     CacleCls.isLock = false;
@@ -802,14 +785,17 @@ namespace RailLocalMeter
                                     CacleCls.preTrackScale.format(firstDb);
                                 }
 
-                                if (firstService.add(firstDb).Succeed)
+                                RESTfulResult<ResponseData> rt = firstService.add(firstDb, out msgInfo);
+                                if (rt.Succeed)
                                 {
-                                    isMeasureSuccess = true; //保存成功
+                                    //保存成功
+                                    isMeasureSuccess = true;
+                                    CaptionImg(rt.Data.firsts[0].actualFirstNo);
                                 }
                                 else
                                 {
                                     vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
-                                    led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                                    led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
                                     txtMsgInfo.Text = "计量失败写入,本地文件异常:" + msgInfo;
                                     lg.WriteLog(LogType.serverLog, "计量失败,写入本地文件异常:" + msgInfo);
                                     CacleCls.isLock = false;
@@ -823,15 +809,16 @@ namespace RailLocalMeter
                     {
                         MeterWorkRailwayActFirst firstDb = new MeterWorkRailwayActFirst();
                         CreateFirst(ref firstDb);
-
+                        firstDb.actualFirstNo = strGuid;
                         if (FileOption.WriterDb(firstDb, FileTypeEnum.一次数据, out string msg))
                         {
                             isMeasureSuccess = true;
+                            CaptionImg(strGuid);
                         }
                         else
                         {
                             vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
-                            led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
+                            led_controler?.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
                             txtMsgInfo.Text = "计量失败写入,本地文件异常:" + msgInfo;
                             lg.WriteLog(LogType.serverLog, "计量失败,写入本地文件异常:" + msgInfo);
                             CacleCls.isLock = false;
@@ -844,6 +831,7 @@ namespace RailLocalMeter
                 //计量成功
                 if (isMeasureSuccess)
                 {
+                    strFinishCarNo = txtCarNo.Text.Trim();
                     txtMsgInfo.Text = "计量完成";
                     #region 毛皮净赋值
                     if (CacleCls.firstDb != null && CacleCls.firstDb.meterWeight > 0 && CacleCls.lockWgt > 0)
@@ -864,18 +852,17 @@ namespace RailLocalMeter
 
                     if (!string.IsNullOrEmpty(CacleCls.LEDResultMessage))
                     {
-                        led_controler.setStaticLineMsg(AppConfigCache.ledIp, CacleCls.LEDResultMessage);
+                        led_controler?.setStaticLineMsg(AppConfigCache.ledIp, CacleCls.LEDResultMessage);
                     }
                     #endregion
 
-                    //屏幕截图操作
-                    _ = BeginInvoke(new Action(() => { shotImageScreen(strGuid); }));
+
 
 
                     BindTable<PreRailwayScale>(ultraGridWaitFirst, dataTableWaitFirst, "firstWait");
                     BindTable<MeterWorkRailwayActual>(ultraGridWaitNet, dataTableWaitNet, "netWait");
-                    BindTable<MeterWorkRailwayActFirst>(ultraGridLocalFirst, dataTableWaitFirst, "localFirst");
-                    BindTable<MeterWorkRailwayActual>(ultraGridLocalNet, dataTableWaitNet, "localNet");
+                    BindTable<MeterWorkRailwayActFirst>(ultraGridLocalFirst, dataTableLocalFirst, "localFirst");
+                    BindTable<MeterWorkRailwayActual>(ultraGridLocalNet, dataTableLocalNet, "localNet");
                 }
                 #endregion
             }
@@ -883,10 +870,48 @@ namespace RailLocalMeter
             {
                 vicPlayClass.GetVoicePlay(VoiceEnum.程序处理异常, CacleCls.lockCarNo);
                 lg.WriteLog(LogType.SystemLog, "计量失败1:" + ex.Message);
+            }
+            finally
+            {
                 CacleCls.isLock = false;
+                txtCarNo.Enabled = true;
             }
         }
 
+
+        private void CaptionImg(string actNo) 
+        {
+            #region 截图
+            //屏幕截图操作
+            //_ = BeginInvoke(new Action(() => { shotImageScreen(actNo); }));
+
+            for (int i = 0; i < lc.Count(); i++)
+            {
+                //从_2开始,因为_1是仪表图片  2是车号快照抓拍
+                ce.CapPic((uint)lc[i], $"{AppConfigCache.path}/imgShort/formalImg/{AppConfigCache.pointNo}_R{actNo}{(CacleCls.serverFlag?"":"_tempImg")}_{i + 2}.jpg");
+            }
+
+            foreach (Control cn in panel1.Controls)
+            {
+                if (cn.Name.Substring(cn.Name.Length - 1) == $"{AppConfigCache.channel}")
+                {
+                    if (cn is PictureBox)
+                    {
+                        Bitmap bit = new Bitmap(cn.Width, cn.Height);//实例化一个和窗体一样大的bitmap
+                        Graphics g = Graphics.FromImage(bit);
+                        g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高 HighQuality
+                        g.CopyFromScreen(panel1.Left, panel1.Top + 25, 0, 0, new Size(cn.Width, cn.Height));//保存整个窗体为图片       
+                        bit.Save($"{AppConfigCache.path}/imgShort/formalImg/{AppConfigCache.pointNo}_R{actNo}{(CacleCls.serverFlag ? "" : "_tempImg")}_1.jpg");//默认保存格式为PNG,保存成jpg格式质量不是很好
+                        bit.Dispose();
+                        break;
+                    }
+                }
+            }
+            #endregion
+        }
+
+
+
         bool isUseLabelTare = false;
         private void btnTareSaveOver_Click(object sender, EventArgs e)
         {
@@ -897,7 +922,7 @@ namespace RailLocalMeter
                 return;
             }
 
-            if (CacleCls.weight - txtTare.Value <= 0)
+            if (CacleCls.weight - txtTare.Value * 1000 <= 0)
             {
                 MessageBox.Show("结净重量过小无法结净");
                 txtTare.Focus();
@@ -909,7 +934,7 @@ namespace RailLocalMeter
                 return;
             }
 
-            if (CacleCls.weight - txtTare.Value < AppConfigCache.differenceWgt)
+            if (CacleCls.weight - txtTare.Value * 1000 < AppConfigCache.differenceWgt)
             {
                 DialogResult dr = MessageBox.Show("净重小于" + AppConfigCache.differenceWgt / 1000 + "吨,请确认是否保存当前计量数据?", "提示", MessageBoxButtons.OKCancel);
                 if (dr == DialogResult.Cancel)
@@ -917,7 +942,8 @@ namespace RailLocalMeter
                     return;
                 }
             }
-
+            voiceNum = 0;
+            isMeasureSuccess = false;
             txtMsgInfo.Text = "";
             isUseLabelTare = true;
             btnSave.PerformClick();
@@ -1007,6 +1033,26 @@ namespace RailLocalMeter
             if (lm != null && lm.Count > 0)
             {
                 dtV = lm.ListToDataTable<T>();
+
+                List<string> ls = new List<string>();
+                foreach (DataColumn dc in dtV.Columns) 
+                {
+                    if (dc.ColumnName == "meterWeight"|| dc.ColumnName == "grossWeight" || dc.ColumnName == "tareWeight" || dc.ColumnName == "netWeight") 
+                    {
+                        ls.Add(dc.ColumnName);
+                    }
+                }
+
+                foreach (DataRow dr in dtV.Rows) 
+                {
+                    foreach (string str in ls) 
+                    {
+                        if (!string.IsNullOrEmpty(dr[str]?.ToString())) 
+                        {
+                            dr[str] = Convert.ToDouble(dr[str]) / 1000;
+                        }
+                    }
+                }
             }
             ClsControlPack.CopyDataToDatatable(ref dtV, ref dtDatabase, true);
             ClsControlPack.RefreshAndAutoSize(ug);
@@ -1101,14 +1147,68 @@ namespace RailLocalMeter
         private void btnSubmitFirstWait_Click(object sender, EventArgs e)
         {
             ultraGridWaitFirst.UpdateData();
+            if (dataTableWaitFirst != null && dataTableWaitFirst.Rows.Count > 0) 
+            {
+                List<MeterWorkRailwayActFirst> ltAdd = new List<MeterWorkRailwayActFirst>();
+                List<MeterWorkRailwayActFirst> lt = dataTableWaitFirst.TableToDataList<MeterWorkRailwayActFirst>();
+                foreach (UltraGridRow ugr in ultraGridWaitFirst.Rows)
+                {
+                    if (ugr.Cells["UNCK"].Value.ToString().ToUpper() == "TRUE") 
+                    {
+                        MeterWorkRailwayActFirst first = lt.Where(s=>s.actualFirstNo== ugr.Cells["actualFirstNo"].Text.Trim()).FirstOrDefault();
+                        if (first != null) ltAdd.Add(first);
+                    }
+                }
 
-
+                if (ltAdd.Count > 0) 
+                {
+                    if (firstService.BatchUpdateLcNo(ltAdd,out string msgInfo).Succeed)
+                    {
+                        isMeasureSuccess = true; //保存成功
+                        MessageBox.Show("操作成功");
+                    }
+                    else
+                    {
+                        MessageBox.Show("操作失败:" + msgInfo);
+                        lg.WriteLog(LogType.serverLog, "操作失败:" + msgInfo);
+                    }
+                }
+            }
         }
 
         private void btnNetSubmit_Click(object sender, EventArgs e)
         {
+            //先提交一次,然后再提交结净。按目前的搞法是如此
+            btnSubmitFirstWait_Click(null, null);
+
             ultraGridWaitNet.UpdateData();
+            if (dataTableWaitNet != null && dataTableWaitNet.Rows.Count > 0)
+            {
+                List<MeterWorkRailwayActual> ltAdd = new List<MeterWorkRailwayActual>();
+                List<MeterWorkRailwayActual> lt = dataTableWaitNet.TableToDataList<MeterWorkRailwayActual>();
+                foreach (UltraGridRow ugr in ultraGridWaitNet.Rows)
+                {
+                    if (ugr.Cells["UNCK"].Value.ToString().ToUpper() == "TRUE")
+                    {
+                        MeterWorkRailwayActual net = lt.Where(s => s.actualNo == ugr.Cells["actualNo"].Text.Trim()).FirstOrDefault();
+                        if (net != null) ltAdd.Add(net);
+                    }
+                }
 
+                if (ltAdd.Count > 0)
+                {
+                    if (netService.BatchUpdateLcNo(ltAdd, out string msgInfo).Succeed)
+                    {
+                        isMeasureSuccess = true; //保存成功
+                        MessageBox.Show("操作成功");
+                    }
+                    else
+                    {
+                        MessageBox.Show("操作失败:" + msgInfo);
+                        lg.WriteLog(LogType.serverLog, "操作失败:" + msgInfo);
+                    }
+                }
+            }
 
         }
 
@@ -1189,7 +1289,7 @@ namespace RailLocalMeter
             mwraf.noticeNo = $"{ip},{Thread.CurrentThread.Name}";
             if (isUseLabelTare)
             {
-                mwraf.railwayFactoryWeight = Convert.ToDouble(txtTare.Value.ToString());
+                mwraf.railwayFactoryWeight = Convert.ToDouble(txtTare.Value * 1000);
             }
         }
         #endregion