schangxiang@126.com
2025-04-01 de7dbe7cf85aa01abb64040aae1c04dfba74c135
SDA/iWareSda/SdaMainForm.cs
@@ -12,7 +12,7 @@
using System.Linq;
using iWareCommon;
using Newtonsoft.Json.Linq;
using System.Threading.Tasks;
namespace iWareSda
{
@@ -32,16 +32,16 @@
        private static IDictionary<string, string> realtimePlcValueDict_Srm = new Dictionary<string, string>();
        /// <summary>
        /// RGV实时PLC值字典
        /// Station实时PLC值字典
        /// </summary>
        private static IDictionary<string, string> realtimePlcValueDict_Rgv = new Dictionary<string, string>();
        private static IDictionary<string, string> realtimePlcValueDict_Station = new Dictionary<string, string>();
        #region 发送WCS心跳
        /// <summary>
        /// 发送堆垛机的心跳
        /// </summary>
        private List<Thread> SendStackerHeartToSrmThreads = new List<Thread>();
        private List<Thread> SendStackerHeartToRgvThreads = new List<Thread>();
        private List<Thread> SendStackerHeartToStationThreads = new List<Thread>();
        /// <summary>
        /// 发送输送线的心跳
        /// </summary>
@@ -51,7 +51,7 @@
        private List<Thread> GetSrmStateThreads = new List<Thread>();
        private List<Thread> GetRgvStateThreads = new List<Thread>();
        private List<Thread> GetStationStateThreads = new List<Thread>();
        private List<Thread> GetLineStateThreads = new List<Thread>();
        #endregion
@@ -62,16 +62,16 @@
        public static bool isShowPlcValue_Srm = false;
        /// <summary>
        /// 是否要显示实时Rgv的PLC值堆垛机
        /// 是否要显示实时Station的PLC值堆垛机
        /// </summary>
        public static bool isShowPlcValue_Rgv = false;
        public static bool isShowPlcValue_Station = false;
        static string errorStr = string.Empty;
        static string infoStr_ChangeHandshake = string.Empty;
        static string errorStr_Line = string.Empty;
        static string errorStr_Srm = string.Empty;
        static string errorStr_Rgv = string.Empty;
        static string errorStr_Station = string.Empty;
        static string infoStr_SaveLine = string.Empty;
        static string infoStr_Connection = string.Empty;
@@ -89,9 +89,9 @@
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
            this.lbl_Main1.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "潍柴西港数据访问服务", "Data service runing");
            this.lbl_Main1.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "鲁丽木业包装线数据访问服务", "Data service runing");
            this.lbl_Main2.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "请勿关闭!", "Please do not close!");
            this.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "潍柴西港数据访问服务", "Data service");
            this.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "鲁丽木业包装线数据访问服务", "Data service");
            this.tabPage_Main.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "服务", "Service");
        }
@@ -107,14 +107,12 @@
            try
            {
                #region 对外发布WCF形式数据访问服务
                var srmServiceHost = new ServiceHost(typeof(iWareSda.SrmService));
                srmServiceHost.Open();
                //var lineServiceHost = new ServiceHost(typeof(iWareSda.LineService));
                //lineServiceHost.Open();
                var rgvServiceHost = new ServiceHost(typeof(iWareSda.RgvService));
                rgvServiceHost.Open();
                Task.Run(() =>
                {
                    var StationServiceHost = new ServiceHost(typeof(iWareSda.StationService));
                    StationServiceHost.Open();
                });
                #endregion
@@ -140,91 +138,35 @@
            #region 状态信息获取
            //获取堆垛机的状态信息
            Srm_CacheEntity.DeviceObjs.ForEach(x =>
            {
                var thread = new Thread(new ParameterizedThreadStart(GetSrmInfo));
                thread.Name = string.Format("获取堆垛机{0}的状态", x.View.DeviceName);
                GetSrmStateThreads.Add(thread);
                StartThread(thread, x);
            });
            ////模拟测试
            //var y = Srm_CacheEntity.DeviceObjs[3];
            //var thread_test = new Thread(new ParameterizedThreadStart(GetSrmInfo));
            //thread_test.Name = string.Format("获取堆垛机{0}的状态", y.View.DeviceName);
            //GetSrmStateThreads.Add(thread_test);
            //StartThread(thread_test, y);
            //获取Rgv的状态信息
            Rgv_CacheEntity.DeviceObjs.ForEach(x =>
            //获取Station的状态信息
            Station_CacheEntity.DeviceObjs.ForEach(x =>
            {
                var thread = new Thread(new ParameterizedThreadStart(GetRgvInfo));
                thread.Name = string.Format("获取Rgv{0}的状态", x.View.DeviceName);
                GetRgvStateThreads.Add(thread);
                var thread = new Thread(new ParameterizedThreadStart(GetStationInfo));
                thread.Name = string.Format("获取Station{0}的状态", x.View.DeviceName);
                GetStationStateThreads.Add(thread);
                StartThread(thread, x);
            });
            /*
            Rgv_CacheEntity.DeviceObjs.ForEach(x =>
            {
                var thread = new Thread(new ParameterizedThreadStart(HandleRGVAckBug));
                thread.Name = string.Format("修复Rgv{0}的ACK BUG", x.View.DeviceName);
                GetRgvStateThreads.Add(thread);
                StartThread(thread, x);
            });
            //*/
            ////获取输送线的状态信息
            //HuscoLine_CacheEntity.DeviceObjs.ForEach(x =>
            //{
            //    var thread = new Thread(new ParameterizedThreadStart(GetLineInfo));
            //    thread.Name = string.Format("获取输送线{0}的状态", x.View.DeviceName);
            //    GetLineStateThreads.Add(thread);
            //    StartThread(thread, x);
            //});
            #endregion
            #region 设备发送心跳
            //开启 堆垛机 心跳的线程
            Srm_CacheEntity.DeviceObjs.ForEach(x =>
            //开启 Station 心跳的线程
            Station_CacheEntity.DeviceObjs.ForEach(x =>
            {
                var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToSrm));
                thread.Name = string.Format("自动发送堆垛机{0}心跳", x.View.DeviceName);
                SendStackerHeartToSrmThreads.Add(thread);
                var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToStation));
                thread.Name = string.Format("自动发送Station{0}心跳", x.View.DeviceName);
                SendStackerHeartToStationThreads.Add(thread);
                StartThread(thread, x);
            });
            //开启 Rgv 心跳的线程
            Rgv_CacheEntity.DeviceObjs.ForEach(x =>
            {
                var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToRgv));
                thread.Name = string.Format("自动发送Rgv{0}心跳", x.View.DeviceName);
                SendStackerHeartToRgvThreads.Add(thread);
                StartThread(thread, x);
            });
            /*
            //开启 输送线 心跳的线程
            HuscoLine_CacheEntity.DeviceObjs.ForEach(x =>
            {
                var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToLine));
                thread.Name = string.Format("自动发送输送线{0}心跳", x.View.DeviceName);
                SendStackerHeartToLineThreads.Add(thread);
                StartThread(thread, x);
            });
            //*/
            #endregion
            #region UI显示
            var treadShowUI = new Thread(ShowUI);
            treadShowUI.Start();
            #endregion
            new Thread(DeleteData).Start();
            //*/
@@ -416,7 +358,7 @@
                        }
                        //赋值报警
                        s.View.R_WarningDBList = s.GetAlertDatas();
                        //s.View.R_WarningDBList = s.GetAlertDatas();
                        //s.IsConnected = s.plcService.IsConnected;
                        ////区域1
@@ -492,16 +434,16 @@
        #endregion
        #region Rgv
        #region Station
        #region 设备状态信息
        /// <summary>
        /// 获取 Rgv 的状态信息
        /// 获取 Station 的状态信息
        /// </summary>
        /// <param name="obj"></param>
        private void GetRgvInfo(object obj)
        private void GetStationInfo(object obj)
        {
            var s = (RgvEntity)obj;
            var s = (StationEntity)obj;
            if (s.plcService != null && !s.plcService.IsConnected)
            {
                s.plcService.Close();
@@ -514,8 +456,8 @@
                    s.InitData();
                    if (s.plcService == null || !s.plcService.IsConnected)
                    {
                        errorStr_Rgv = "Rgv" + s.View.DeviceName + "连接已断开,正在尝试打开。。。";
                        errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Rgv, "Piler connection disconnected,waiting for reconnection ");
                        errorStr_Station = "Station" + s.View.DeviceName + "连接已断开,正在尝试打开。。。";
                        errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Station, "Piler connection disconnected,waiting for reconnection ");
                        s.plcService.Close();
                        s.plcService.OpenService();
                        Thread.Sleep(100);
@@ -524,7 +466,7 @@
                    else
                    {
                        var s7 = s.plcService;
                        var Rgv_db = s.DBBlockForWrite;
                        var Station_db = s.DBBlockForWrite;
                        s.SetPropertyValueForRead();
                        s.SetPropertyValueForWrite();
@@ -533,46 +475,46 @@
                        //s.View.BodyTestName = s.GetBodyTestName(s.View.r_S);
                        //s.View.StateName = s.GetStateName(s.View.R_State);
                        if (SdaMainForm.isShowPlcValue_Rgv)
                        if (SdaMainForm.isShowPlcValue_Station)
                        {
                            string dbValues = SdaHelper.GetStrShow<RgvView, RgvDBForWrite, RgvDBForRead>(s.View, s.DBBlockForWrite, s.DBBlockForRead, "", "", s.View.DeviceId, s.View.DeviceName);
                            realtimePlcValueDict_Rgv[s.View.DeviceName] = dbValues;
                            string dbValues = SdaHelper.GetStrShow<StationView, StationDBForWrite, StationDBForRead>(s.View, s.DBBlockForWrite, s.DBBlockForRead, "", "", s.View.DeviceId, s.View.DeviceName);
                            realtimePlcValueDict_Station[s.View.DeviceName] = dbValues;
                        }
                        else
                        {
                            realtimePlcValueDict_Rgv[s.View.DeviceName] = "";
                            realtimePlcValueDict_Station[s.View.DeviceName] = "";
                        }
                        foreach (var item in s.View.R_RgvForReadCommList)
                        {
                            //判断如果ACK=1,则写入STB为0
                            if (item.R_ACK == true)
                            {
                                var writeObj = s.View.W_RgvForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault();
                                var writeAddressObj = s.DBBlockForWrite.W_RgvForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault();
                                MessageModel fr = s.plcService.WriteValuePoint(writeAddressObj.W_STP, false, writeObj.W_STP);
                                if (fr.result == false)
                                {
                                    Log4NetHelper.WriteErrorLog(LogType.SrmTheadService, "获取 RGV和输送线 的状态信息时,判断ACK=1,更新STB为0时错误:" + fr.resMsg, null);
                                }
                            }
                        }
                        //foreach (var item in s.View.R_StationForReadCommList)
                        //{
                        //    //判断如果ACK=1,则写入STB为0
                        //    if (item.R_ACK == true)
                        //    {
                        //        var writeObj = s.View.W_StationForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault();
                        //        var writeAddressObj = s.DBBlockForWrite.W_StationForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault();
                        //        MessageModel fr = null;
                        //        if (fr.result == false)
                        //        {
                        //            Log4NetHelper.WriteErrorLog(LogType.SrmTheadService, "获取 Station和输送线 的状态信息时,判断ACK=1,更新STB为0时错误:" + fr.resMsg, null);
                        //        }
                        //    }
                        //}
                        //赋值报警
                        //s.View.R_Line_WarningDBList = s.GetLineAlertDatas();
                        s.View.R_Rgv_WarningDBList = s.GetRgvAlertDatas();
                        // s.View.R_Station_WarningDBList = s.GetStationAlertDatas();
                    }
                }
                catch (Exception ex)
                {
                    s.InitData();
                    errorStr_Rgv = "GetRgvInfo出现异常:" + ex.Message;
                    errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Rgv,
                        "GetRgvInfo throw exceptions: " + ex.Message);
                    errorStr_Station = "GetStationInfo出现异常:" + ex.Message;
                    errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Station,
                        "GetStationInfo throw exceptions: " + ex.Message);
                    Log4NetHelper.WriteErrorLog(LogType.RgvSdaService, "获取 Rgv 的状态信息出现异常", ex);
                    Log4NetHelper.WriteErrorLog(LogType.StationSdaService, "获取 Station 的状态信息出现异常", ex);
                }
                Thread.Sleep(1000);
                Thread.Sleep(600);
            }
        }
@@ -582,26 +524,26 @@
        #region 心跳相关
        /// <summary>
        /// 发送给Rgv的心跳
        /// 发送给Station的心跳
        /// </summary>
        /// <param name="obj"></param>
        private void SendStackerHeartToRgv(object obj)
        private void SendStackerHeartToStation(object obj)
        {
            bool handShakeValue = true;
            while (true)
            {
                var s = (RgvEntity)obj;
                var s = (StationEntity)obj;
                handShakeValue = !handShakeValue;
                try
                {
                    if (s.plcService != null && !s.plcService.IsConnected)
                    {
                        errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, "Rgv" + s.View.DeviceName + "连接已断开", "Piler connection disconnected ");
                        errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, "Station" + s.View.DeviceName + "连接已断开", "Piler connection disconnected ");
                        Thread.Sleep(100);
                        continue;
                    }
                    errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, "Rgv" + s.View.DeviceName + "连接已连接。。。", "Piler connection connected ");
                    errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, "Station" + s.View.DeviceName + "连接已连接。。。", "Piler connection connected ");
                    if (s.plcService != null && s.plcService.IsConnected)
                    {
                        MessageModel fr = s.plcService.WriteValuePoint(s.DBBlockForWrite.W_HandShake, handShakeValue, s.View.W_HandShake);
@@ -615,8 +557,8 @@
                }
                catch (Exception ex)
                {
                    errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, "发送心跳给Rgv出现异常。。。" + ex.Message, "Send to stacker for heart beat throw expection: " + ex.Message);
                    Log4NetHelper.WriteErrorLog(LogType.SdaService, "发送给Rgv的心跳出现异常:" + ex.Message, ex);
                    errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, "发送心跳给Station出现异常。。。" + ex.Message, "Send to stacker for heart beat throw expection: " + ex.Message);
                    Log4NetHelper.WriteErrorLog(LogType.SdaService, "发送给Station的心跳出现异常:" + ex.Message, ex);
                }
            }
        }
@@ -675,7 +617,7 @@
                        //line.View.R_WarningDBList = line.GetAlertDatas();
                        string dbValues = SdaHelper.GetStrShow<HuscoLineView, HuscoLineDBForWrite, HuscoLineDBForRead>(line.View, line.DBBlockForWrite, line.DBBlockForRead, HuscoLine_CacheEntity.W_DBHeader, HuscoLine_CacheEntity.R_DBHeader, line.View.DeviceId, line.View.DeviceName);
                        this.tb_Rgv.Text = dbValues + " \r\n  AssemblyBarcode:" + _AssemblyBarcode + " \r\n CoilCode:" + _CoilCode + " \r\n";
                        this.tb_Station.Text = dbValues + " \r\n  AssemblyBarcode:" + _AssemblyBarcode + " \r\n CoilCode:" + _CoilCode + " \r\n";
                        //首先读取握手信号是否是true,只有true 的时候才能拿值
                        var isRead = Convert.ToInt32(line.plcService.ReadValuePoint("", handShareAddress, typeof(Int32)));
@@ -796,32 +738,13 @@
                Thread.Sleep(1000);
                try
                {
                    foreach (var item in realtimePlcValueDict_Srm)
                    {
                        if (item.Key == "Srm1")
                        {
                            this.tb_Srm1.Text = item.Value;
                        }
                        else if (item.Key == "Srm2")
                        {
                            this.tb_Srm2.Text = item.Value;
                        }
                        else if (item.Key == "Srm3")
                        {
                            this.tb_Srm3.Text = item.Value;
                        }
                        else if (item.Key == "Srm4")
                        {
                            this.tb_Srm4.Text = item.Value;
                        }
                    }
                    var str_rgv = "";
                    foreach (var item in realtimePlcValueDict_Rgv)
                    var str_Station = "";
                    foreach (var item in realtimePlcValueDict_Station)
                    {
                        str_rgv += item.Value;
                        str_Station += item.Value;
                    }
                    this.tb_Rgv.Text = str_rgv;
                    this.tb_Station.Text = str_Station;
                }
                catch (Exception)
@@ -856,7 +779,7 @@
            {
                realtimePlcValueDict_Srm.Add(x.View.DeviceName, "");
            });
            Rgv_CacheEntity.DeviceObjs.ForEach(x =>
            Station_CacheEntity.DeviceObjs.ForEach(x =>
            {
                realtimePlcValueDict_Srm.Add(x.View.DeviceName, "");
            });
@@ -1012,36 +935,36 @@
        private void button2_Click_1(object sender, EventArgs e)
        {
            isShowPlcValue_Rgv = true;
            isShowPlcValue_Station = true;
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            isShowPlcValue_Rgv = false;
            isShowPlcValue_Station = false;
        }
        /*
        /// <summary>
        /// 一直存在RGVACK信号无法清除的BUG,做个定时清除的线程
        /// 一直存在StationACK信号无法清除的BUG,做个定时清除的线程
        /// </summary>
        public void HandleRGVAckBug(object obj)
        public void HandleStationAckBug(object obj)
        {
            var s = (RgvEntity)obj;
            var s = (StationEntity)obj;
            
            while (true)
            {
                Thread.Sleep(1000);
                bool finishRgv = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_RGV_Finish, typeof(bool));
                bool finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_RGV_FinishACK, typeof(bool));
                bool finishStation = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_Station_Finish, typeof(bool));
                bool finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_Station_FinishACK, typeof(bool));
                if (finisAck == false && finishRgv == true)
                if (finisAck == false && finishStation == true)
                {
                    Thread.Sleep(10000);//如果10秒还没清除,就强制清除
                    finishRgv = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_RGV_Finish, typeof(bool));
                    finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_RGV_FinishACK, typeof(bool));
                    if (finisAck == false && finishRgv == true)
                    finishStation = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_Station_Finish, typeof(bool));
                    finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_Station_FinishACK, typeof(bool));
                    if (finisAck == false && finishStation == true)
                    {
                        s.plcService.WriteValuePoint(s.DBBlockForWrite.W_RGV_FinishACK, true, s.View.W_RGV_FinishACK);//重发一次 20230503 王铮
                        s.plcService.WriteValuePoint(s.DBBlockForWrite.W_Station_FinishACK, true, s.View.W_Station_FinishACK);//重发一次 20230503 王铮
                    }
                }