From e1eb90c6edf9241c667e0da8fe5675d13d214e0b Mon Sep 17 00:00:00 2001 From: yexingqiang Date: Mon, 8 Jun 2026 17:19:31 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B9=B3?= =?UTF-8?q?=E8=8A=9D126KV=E6=96=AD=E8=B7=AF=E5=99=A8=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/09MesDataFunction/MesDataFunction.sln | 25 + .../MesDataFunction/01-MesDataFunction.csproj | 151 + .../04-DataBaseAccess/DataAccess.cs | 746 +++++ .../04-DataBaseAccess/JsonHelper.cs | 336 ++ .../08-WebFun_base/MesWebFun_base.cs | 165 + .../08-WebFun_base/MesWebFun_baseFun.cs | 1860 +++++++++++ .../12SendMessageToWeb/MIS.SendMessage.cs | 100 + .../12SendMessageToWeb/Mqtt.cs | 281 ++ .../12SendMessageToWeb/SendMessage.cs | 666 ++++ .../12SendMessageToWeb/SendMessageFun.cs | 249 ++ .../13MIS_FuntionSaveData/Funtion.Alarm.cs | 247 ++ .../13MIS_FuntionSaveData/Funtion.MesRead.cs | 635 ++++ .../GetQualityData_GoodBad.cs | 99 + .../14MisDataFunctionDB/CommFun_CATL.cs | 18 + .../14MisDataFunctionDB/MisDataFun.Base.DB.cs | 299 ++ .../MisDataFun.CommonUtils.cs | 49 + .../14MisDataFunctionDB/MisDataFun.DB.cs | 1785 ++++++++++ .../14MisDataFunctionDB/MisDataFun.MES.cs | 163 + .../MisDataFun.ShaftPositionData.cs | 156 + .../MisDataFun.TagTypeCodeID.cs | 462 +++ .../14MisDataFunctionDB/Reflection.cs | 94 + .../MesDataFunction/LoadTagTypeCodeID.cs | 128 + .../MesDataFunction/InitTagValueListData.cs | 83 + .../MesDataFunction/MIS.Functions.Barcode.cs | 95 + .../MIS.Functions.ConfirmOkGo.cs | 47 + ...IS.Functions.EngineTypeGetOver_PLC_Work.cs | 139 + .../MesDataFunction/MIS.Functions.FalseGO.cs | 48 + .../MIS.Functions.Material_Insert.cs | 59 + .../MIS.Functions.MesReadOver.cs | 66 + .../MIS.Functions.SendMessage.cs | 162 + .../MIS.Functions.WebSubmit.cs | 282 ++ .../MIS.Functions.WorkStart.cs | 45 + .../MesDataFunction/MIS.Hashtable.TagID.cs | 805 +++++ .../MesDataFunction/MIS.Hashtable.cs | 91 + .../MIS.Machine.ServicePlan.cs | 98 + .../MesDataFunction/MIS.OpcServerMIS.Read.cs | 1196 +++++++ .../MesDataFunction/MIS.OpcServerMIS.Write.cs | 574 ++++ .../MesDataFunction/MIS.QualityData.Read.cs | 75 + .../MesDataFunction/MIS_BASE.cs | 341 ++ .../MesDataFunction/MesWorkPlc.cs | 41 + .../MisDataFunction/Heartbeat.cs | 25 + .../MisDataFunction/MIS.Interface.cs | 326 ++ .../MisDataFunction/MesRead.cs | 465 +++ .../MisDataFunction/WorkStart.cs | 236 ++ .../Properties/AssemblyInfo.cs | 36 + .../MesDataFunction/ToPrinter/PP.cs | 24 + .../MesDataFunction/ToPrinter/PrintTo.cs | 65 + .../MesDataFunction/ToPrinter/Print_Sql.cs | 80 + .../ToPrinter/PrinterCommandCenter.cs | 33 + Common/MyLog4Net/00_MyLog4Net.csproj | 61 + Common/MyLog4Net/MyLogEventArgs.cs | 14 + Common/MyLog4Net/MyLogHelper.cs | 65 + Common/MyLog4Net/Properties/AssemblyInfo.cs | 37 + Common/MyLog4Net/log4net.config | 35 + Common/MyLog4Net/packages.config | 4 + MES基础数据.xlsx | Bin 0 -> 140111 bytes Mes32X32.ico | Bin 0 -> 4286 bytes MisDataFun.sln | 88 + MisDataFun/MisDataFun/Mes32X32.ico | Bin 0 -> 4286 bytes MisDataFun/MisDataFun/MisDataFun.Designer.cs | 1986 ++++++++++++ MisDataFun/MisDataFun/MisDataFun.cs | 1036 ++++++ MisDataFun/MisDataFun/MisDataFun.csproj | 253 ++ MisDataFun/MisDataFun/MisDataFun.resx | 230 ++ .../MisDataFun/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 83 + .../MisDataFun/Properties/Resources.resx | 127 + .../Properties/Settings.Designer.cs | 26 + .../MisDataFun/Properties/Settings.settings | 7 + MisDataFun/MisDataFun/Resources/断开状态.png | Bin 0 -> 4941 bytes MisDataFun/MisDataFun/Resources/连接状态.png | Bin 0 -> 1154 bytes MisDataFun/MisDataFun/app.manifest | 79 + MisDataFun/MisDataFun/jsconfig1.json | 10 + .../mes_signal_conf/MES_CONF.Designer.cs | 113 + .../MisDataFun/mes_signal_conf/MES_CONF.cs | 421 +++ .../MisDataFun/mes_signal_conf/MES_CONF.resx | 120 + .../mes_signal_conf/SqlOperation.cs | 68 + .../MisDataFun/webApi/Analysis_MOM_Msg.cs | 386 +++ .../webApi/Controller/ipcControll.cs | 54 + MisDataFun/MisDataFun/webApi/InitServer.cs | 66 + .../MisDataFun/webApi/OnlineCheckData.cs | 98 + MisDataFun/MisDataFun/webApi/msgResHeader.cs | 100 + .../Function1051/DataAccess/DataAccess.cs | 16 + .../Function1051/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1051/Db.cs | 15 + .../Function1051/Function08.csproj.vspscc | 10 + .../Function1051/Function1051.csproj | 137 + .../MesServerFunction/Function1051.cs | 305 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 285 ++ .../Function1051/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1051/OpcServer/Barcode.cs | 236 ++ .../Function1051/OpcServer/EngineGetOver.cs | 108 + .../OpcServer/MaterialsScanOver.cs | 55 + .../Function1051/OpcServer/MesRead.cs | 81 + .../Function1051/OpcServer/MesReadOver.cs | 36 + .../Function1051/OpcServer/PartLoad.cs | 74 + .../Function1051/OpcServer/ReqEarlyFeeding.cs | 72 + .../Function1051/OpcServer/ReqTestResistor.cs | 238 ++ .../Function1051/OpcServer/WebSubmit.cs | 410 +++ .../Function1051/OpcServer/WorkStart.cs | 66 + .../Function1051/OpcServer/vssver2.scc | Bin 0 -> 305 bytes .../Function1051/Properties/AssemblyInfo.cs | 36 + .../Function1051/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1051/mssccprj.scc | 5 + MisDataFunction/Function1051/packages.config | 15 + MisDataFunction/Function1051/vssver2.scc | Bin 0 -> 163 bytes .../Function1052/DataAccess/DataAccess.cs | 15 + .../Function1052/DataAccess/vssver2.scc | Bin 0 -> 129 bytes .../Function1052/Function02.csproj.vspscc | 10 + .../Function1052/Function1052.csproj | 170 + .../MesServerFunction/Fun_1052.cs | 250 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 106 + .../Function1052/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1052/OpcServer/Barcode.cs | 89 + .../Function1052/OpcServer/EngineGetOver.cs | 114 + .../Function1052/OpcServer/MesRead.cs | 86 + .../Function1052/OpcServer/ReqEarlyFeeding.cs | 72 + .../Function1052/OpcServer/ReqTestResistor.cs | 238 ++ .../Function1052/OpcServer/WebSubmit.cs | 352 ++ .../Function1052/OpcServer/WorkIsOk.cs | 44 + .../Function1052/OpcServer/WorkStart.cs | 57 + .../Function1052/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1052/Properties/AssemblyInfo.cs | 36 + .../Function1052/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1052/mssccprj.scc | 5 + MisDataFunction/Function1052/packages.config | 15 + MisDataFunction/Function1052/vssver2.scc | Bin 0 -> 163 bytes .../Function1053/DataAccess/DataAccess.cs | 15 + .../Function1053/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1053/Db.cs | 16 + .../Function1053/Function02.csproj.vspscc | 10 + .../Function1053/Function1053.csproj | 167 + .../MesServerFunction/Fun_1053.cs | 262 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 115 + .../Function1053/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1053/OpcServer/Barcode.cs | 79 + .../Function1053/OpcServer/EngineGetOver.cs | 72 + .../Function1053/OpcServer/HeartBeat.cs | 34 + .../Function1053/OpcServer/MesRead.cs | 88 + .../Function1053/OpcServer/PartLoad.cs | 55 + .../Function1053/OpcServer/WebSubmit.cs | 336 ++ .../Function1053/OpcServer/WorkIsOk.cs | 44 + .../Function1053/OpcServer/WorkStart.cs | 49 + .../Function1053/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1053/Properties/AssemblyInfo.cs | 36 + .../Function1053/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1053/mssccprj.scc | 5 + MisDataFunction/Function1053/packages.config | 15 + MisDataFunction/Function1053/vssver2.scc | Bin 0 -> 163 bytes .../Function1054/DataAccess/DataAccess.cs | 15 + .../Function1054/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1054/Db.cs | 15 + .../Function1054/Function02.csproj.vspscc | 10 + .../Function1054/Function1054.csproj | 167 + .../MesServerFunction/Fun_1054.cs | 235 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 177 + .../Function1054/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1054/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1054/Properties/AssemblyInfo.cs | 36 + .../Function1054/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1054/mssccprj.scc | 5 + MisDataFunction/Function1054/packages.config | 15 + MisDataFunction/Function1054/vssver2.scc | Bin 0 -> 163 bytes .../Function1055/DataAccess/DataAccess.cs | 15 + .../Function1055/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1055/Db.cs | 60 + .../Function1055/Function02.csproj.vspscc | 10 + .../Function1055/Function1055.csproj | 169 + .../MesServerFunction/Fun_1055.cs | 242 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 120 + .../Function1055/Methods/SubmitToMisweb.cs | 127 + .../Function1055/Methods/UDP.Send.cs | 53 + .../Function1055/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1055/OpcServer/Barcode.cs | 90 + .../Function1055/OpcServer/ConfirmOkGo.cs | 41 + .../Function1055/OpcServer/EngineGetOver.cs | 79 + .../Function1055/OpcServer/FalseGO.cs | 46 + .../Function1055/OpcServer/HeartBeat.cs | 35 + .../Function1055/OpcServer/MesRead.cs | 77 + .../Function1055/OpcServer/MesReadOver.cs | 55 + .../Function1055/OpcServer/MesSaveNowData.cs | 40 + .../Function1055/OpcServer/WebSubmit.cs | 304 ++ .../Function1055/OpcServer/WorkIsOk.cs | 45 + .../Function1055/OpcServer/WorkStart.cs | 53 + .../Function1055/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1055/Properties/AssemblyInfo.cs | 36 + .../Function1055/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1055/mssccprj.scc | 5 + MisDataFunction/Function1055/packages.config | 15 + MisDataFunction/Function1055/vssver2.scc | Bin 0 -> 163 bytes .../Function1056/DataAccess/DataAccess.cs | 15 + .../Function1056/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1056/Db.cs | 57 + .../Function1056/Function02.csproj.vspscc | 10 + .../Function1056/Function1056.csproj | 169 + .../MesServerFunction/Fun_1056.cs | 223 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 109 + .../Function1056/Methods/SubmitToMisweb.cs | 127 + .../Function1056/Methods/UDP.Send.cs | 53 + .../Function1056/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1056/OpcServer/Barcode.cs | 98 + .../Function1056/OpcServer/ConfirmOkGo.cs | 41 + .../Function1056/OpcServer/EngineGetOver.cs | 67 + .../Function1056/OpcServer/FalseGO.cs | 41 + .../Function1056/OpcServer/HeartBeat.cs | 35 + .../Function1056/OpcServer/MesRead.cs | 92 + .../Function1056/OpcServer/MesReadOver.cs | 55 + .../Function1056/OpcServer/MesSaveNowData.cs | 40 + .../Function1056/OpcServer/WebSubmit.cs | 294 ++ .../Function1056/OpcServer/WorkStart.cs | 46 + .../Function1056/OpcServer/WritePLC.cs | 41 + .../Function1056/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1056/Properties/AssemblyInfo.cs | 36 + .../Function1056/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1056/mssccprj.scc | 5 + MisDataFunction/Function1056/packages.config | 15 + MisDataFunction/Function1056/vssver2.scc | Bin 0 -> 163 bytes .../Function1057/DataAccess/DataAccess.cs | 15 + .../Function1057/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1057/Db.cs | 67 + .../Function1057/Function02.csproj.vspscc | 10 + .../Function1057/Function1057.csproj | 167 + .../MesServerFunction/Fun_1057.cs | 206 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 98 + .../Function1057/Methods/SubmitToMisweb.cs | 127 + .../Function1057/Methods/UDP.Send.cs | 53 + .../Function1057/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1057/OpcServer/Barcode.cs | 228 ++ .../Function1057/OpcServer/ConfirmOkGo.cs | 41 + .../Function1057/OpcServer/EngineGetOver.cs | 79 + .../Function1057/OpcServer/FalseGO.cs | 41 + .../Function1057/OpcServer/HeartBeat.cs | 35 + .../Function1057/OpcServer/MesRead.cs | 123 + .../Function1057/OpcServer/MesReadOver.cs | 55 + .../Function1057/OpcServer/WebSubmit.cs | 307 ++ .../Function1057/OpcServer/WorkStart.cs | 44 + .../Function1057/OpcServer/vssver2.scc | Bin 0 -> 332 bytes .../Function1057/Properties/AssemblyInfo.cs | 36 + .../Function1057/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1057/mssccprj.scc | 5 + MisDataFunction/Function1057/packages.config | 15 + MisDataFunction/Function1057/vssver2.scc | Bin 0 -> 163 bytes .../Function1058/DataAccess/DataAccess.cs | 16 + .../Function1058/DataAccess/vssver2.scc | Bin 0 -> 129 bytes MisDataFunction/Function1058/Db.cs | 74 + .../Function1058/Function08.csproj.vspscc | 10 + .../Function1058/Function1058.csproj | 168 + .../MesServerFunction/Function1058.cs | 253 ++ .../MesServerFunction/vssver2.scc | Bin 0 -> 132 bytes .../Methods/EngineGetOverBaseWork.cs | 288 ++ .../Function1058/Methods/SubmitToMisweb.cs | 145 + .../Function1058/Methods/UDP.Send.cs | 62 + .../Function1058/Methods/vssver2.scc | Bin 0 -> 199 bytes .../Function1058/OpcServer/Barcode.cs | 220 ++ .../Function1058/OpcServer/ConfirmOkGo.cs | 35 + .../Function1058/OpcServer/EngineGetOver.cs | 98 + .../Function1058/OpcServer/FalseGO.cs | 37 + .../Function1058/OpcServer/HeartBeat.cs | 35 + .../Function1058/OpcServer/MesRead.cs | 85 + .../Function1058/OpcServer/MesReadOver.cs | 37 + .../Function1058/OpcServer/WebSubmit.cs | 342 ++ .../Function1058/OpcServer/WorkStart.cs | 55 + .../Function1058/OpcServer/vssver2.scc | Bin 0 -> 305 bytes .../Function1058/Properties/AssemblyInfo.cs | 36 + .../Function1058/Properties/vssver2.scc | Bin 0 -> 131 bytes MisDataFunction/Function1058/mssccprj.scc | 5 + MisDataFunction/Function1058/packages.config | 15 + MisDataFunction/Function1058/vssver2.scc | Bin 0 -> 163 bytes .../Function1059/DataAccess/DataAccess.cs | 16 + MisDataFunction/Function1059/Db.cs | 74 + .../Function1059/Function1059.csproj | 113 + .../MesServerFunction/Function1059.cs | 270 ++ .../Methods/EngineGetOverBaseWork.cs | 279 ++ .../Function1059/Methods/SubmitToMisweb.cs | 145 + .../Function1059/Methods/UDP.Send.cs | 62 + .../Function1059/OpcServer/Barcode.cs | 239 ++ .../Function1059/OpcServer/ConfirmOkGo.cs | 35 + .../Function1059/OpcServer/EngineGetOver.cs | 108 + .../Function1059/OpcServer/FalseGO.cs | 37 + .../Function1059/OpcServer/HeartBeat.cs | 35 + .../Function1059/OpcServer/MesRead.cs | 77 + .../Function1059/OpcServer/MesReadOver.cs | 37 + .../Function1059/OpcServer/MesSaveNowData.cs | 35 + .../Function1059/OpcServer/PartLoad.cs | 39 + .../Function1059/OpcServer/WebSubmit.cs | 343 ++ .../Function1059/OpcServer/WorkStart.cs | 75 + .../Function1059/Properties/AssemblyInfo.cs | 36 + MisDataFunction/Function1059/mssccprj.scc | 5 + MisDataFunction/Function1059/packages.config | 15 + .../Function1060/DataAccess/DataAccess.cs | 15 + MisDataFunction/Function1060/Db.cs | 74 + .../Function1060/Function1060.csproj | 109 + .../MesServerFunction/Fun_1060.cs | 217 ++ .../Methods/EngineGetOverBaseWork.cs | 96 + .../Function1060/Methods/SubmitToMisweb.cs | 127 + .../Function1060/Methods/UDP.Send.cs | 53 + .../Function1060/OpcServer/Barcode.cs | 97 + .../Function1060/OpcServer/ConfirmOkGo.cs | 41 + .../Function1060/OpcServer/EngineGetOver.cs | 90 + .../Function1060/OpcServer/FalseGO.cs | 41 + .../Function1060/OpcServer/HeartBeat.cs | 35 + .../Function1060/OpcServer/MesRead.cs | 72 + .../Function1060/OpcServer/MesReadOver.cs | 55 + .../Function1060/OpcServer/MesSaveNowData.cs | 35 + .../Function1060/OpcServer/PartLoad.cs | 23 + .../Function1060/OpcServer/WebSubmit.cs | 334 ++ .../Function1060/OpcServer/WorkStart.cs | 91 + .../Function1060/Properties/AssemblyInfo.cs | 36 + MisDataFunction/Function1060/packages.config | 15 + dll_common/Monitor.MesWork.xml | 2860 +++++++++++++++++ icon/断开状态.png | Bin 0 -> 4941 bytes icon/连接状态.png | Bin 0 -> 1154 bytes 318 files changed, 39531 insertions(+) create mode 100644 Common/09MesDataFunction/MesDataFunction.sln create mode 100644 Common/09MesDataFunction/MesDataFunction/01-MesDataFunction.csproj create mode 100644 Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/DataAccess.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/JsonHelper.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_base.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_baseFun.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/MIS.SendMessage.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/Mqtt.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessage.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessageFun.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.Alarm.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.MesRead.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/GetQualityData_GoodBad.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/CommFun_CATL.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.Base.DB.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.CommonUtils.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.DB.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.MES.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.ShaftPositionData.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.TagTypeCodeID.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/Reflection.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/ToPrinter/PP.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/ToPrinter/PrintTo.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/ToPrinter/Print_Sql.cs create mode 100644 Common/09MesDataFunction/MesDataFunction/ToPrinter/PrinterCommandCenter.cs create mode 100644 Common/MyLog4Net/00_MyLog4Net.csproj create mode 100644 Common/MyLog4Net/MyLogEventArgs.cs create mode 100644 Common/MyLog4Net/MyLogHelper.cs create mode 100644 Common/MyLog4Net/Properties/AssemblyInfo.cs create mode 100644 Common/MyLog4Net/log4net.config create mode 100644 Common/MyLog4Net/packages.config create mode 100644 MES基础数据.xlsx create mode 100644 Mes32X32.ico create mode 100644 MisDataFun.sln create mode 100644 MisDataFun/MisDataFun/Mes32X32.ico create mode 100644 MisDataFun/MisDataFun/MisDataFun.Designer.cs create mode 100644 MisDataFun/MisDataFun/MisDataFun.cs create mode 100644 MisDataFun/MisDataFun/MisDataFun.csproj create mode 100644 MisDataFun/MisDataFun/MisDataFun.resx create mode 100644 MisDataFun/MisDataFun/Properties/AssemblyInfo.cs create mode 100644 MisDataFun/MisDataFun/Properties/Resources.Designer.cs create mode 100644 MisDataFun/MisDataFun/Properties/Resources.resx create mode 100644 MisDataFun/MisDataFun/Properties/Settings.Designer.cs create mode 100644 MisDataFun/MisDataFun/Properties/Settings.settings create mode 100644 MisDataFun/MisDataFun/Resources/断开状态.png create mode 100644 MisDataFun/MisDataFun/Resources/连接状态.png create mode 100644 MisDataFun/MisDataFun/app.manifest create mode 100644 MisDataFun/MisDataFun/jsconfig1.json create mode 100644 MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.Designer.cs create mode 100644 MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.cs create mode 100644 MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.resx create mode 100644 MisDataFun/MisDataFun/mes_signal_conf/SqlOperation.cs create mode 100644 MisDataFun/MisDataFun/webApi/Analysis_MOM_Msg.cs create mode 100644 MisDataFun/MisDataFun/webApi/Controller/ipcControll.cs create mode 100644 MisDataFun/MisDataFun/webApi/InitServer.cs create mode 100644 MisDataFun/MisDataFun/webApi/OnlineCheckData.cs create mode 100644 MisDataFun/MisDataFun/webApi/msgResHeader.cs create mode 100644 MisDataFunction/Function1051/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1051/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1051/Db.cs create mode 100644 MisDataFunction/Function1051/Function08.csproj.vspscc create mode 100644 MisDataFunction/Function1051/Function1051.csproj create mode 100644 MisDataFunction/Function1051/MesServerFunction/Function1051.cs create mode 100644 MisDataFunction/Function1051/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1051/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1051/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1051/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1051/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1051/OpcServer/MaterialsScanOver.cs create mode 100644 MisDataFunction/Function1051/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1051/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1051/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/Function1051/OpcServer/ReqEarlyFeeding.cs create mode 100644 MisDataFunction/Function1051/OpcServer/ReqTestResistor.cs create mode 100644 MisDataFunction/Function1051/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1051/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1051/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1051/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1051/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1051/mssccprj.scc create mode 100644 MisDataFunction/Function1051/packages.config create mode 100644 MisDataFunction/Function1051/vssver2.scc create mode 100644 MisDataFunction/Function1052/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1052/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1052/Function02.csproj.vspscc create mode 100644 MisDataFunction/Function1052/Function1052.csproj create mode 100644 MisDataFunction/Function1052/MesServerFunction/Fun_1052.cs create mode 100644 MisDataFunction/Function1052/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1052/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1052/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1052/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1052/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1052/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1052/OpcServer/ReqEarlyFeeding.cs create mode 100644 MisDataFunction/Function1052/OpcServer/ReqTestResistor.cs create mode 100644 MisDataFunction/Function1052/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1052/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/Function1052/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1052/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1052/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1052/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1052/mssccprj.scc create mode 100644 MisDataFunction/Function1052/packages.config create mode 100644 MisDataFunction/Function1052/vssver2.scc create mode 100644 MisDataFunction/Function1053/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1053/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1053/Db.cs create mode 100644 MisDataFunction/Function1053/Function02.csproj.vspscc create mode 100644 MisDataFunction/Function1053/Function1053.csproj create mode 100644 MisDataFunction/Function1053/MesServerFunction/Fun_1053.cs create mode 100644 MisDataFunction/Function1053/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1053/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1053/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1053/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1053/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1053/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1053/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1053/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/Function1053/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1053/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/Function1053/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1053/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1053/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1053/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1053/mssccprj.scc create mode 100644 MisDataFunction/Function1053/packages.config create mode 100644 MisDataFunction/Function1053/vssver2.scc create mode 100644 MisDataFunction/Function1054/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1054/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1054/Db.cs create mode 100644 MisDataFunction/Function1054/Function02.csproj.vspscc create mode 100644 MisDataFunction/Function1054/Function1054.csproj create mode 100644 MisDataFunction/Function1054/MesServerFunction/Fun_1054.cs create mode 100644 MisDataFunction/Function1054/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1054/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1054/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1054/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1054/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1054/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1054/mssccprj.scc create mode 100644 MisDataFunction/Function1054/packages.config create mode 100644 MisDataFunction/Function1054/vssver2.scc create mode 100644 MisDataFunction/Function1055/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1055/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1055/Db.cs create mode 100644 MisDataFunction/Function1055/Function02.csproj.vspscc create mode 100644 MisDataFunction/Function1055/Function1055.csproj create mode 100644 MisDataFunction/Function1055/MesServerFunction/Fun_1055.cs create mode 100644 MisDataFunction/Function1055/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1055/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1055/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/Function1055/Methods/UDP.Send.cs create mode 100644 MisDataFunction/Function1055/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1055/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1055/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/Function1055/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1055/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/Function1055/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1055/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1055/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1055/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/Function1055/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1055/OpcServer/WorkIsOk.cs create mode 100644 MisDataFunction/Function1055/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1055/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1055/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1055/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1055/mssccprj.scc create mode 100644 MisDataFunction/Function1055/packages.config create mode 100644 MisDataFunction/Function1055/vssver2.scc create mode 100644 MisDataFunction/Function1056/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1056/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1056/Db.cs create mode 100644 MisDataFunction/Function1056/Function02.csproj.vspscc create mode 100644 MisDataFunction/Function1056/Function1056.csproj create mode 100644 MisDataFunction/Function1056/MesServerFunction/Fun_1056.cs create mode 100644 MisDataFunction/Function1056/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1056/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1056/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/Function1056/Methods/UDP.Send.cs create mode 100644 MisDataFunction/Function1056/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1056/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1056/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/Function1056/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1056/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/Function1056/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1056/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1056/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1056/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/Function1056/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1056/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1056/OpcServer/WritePLC.cs create mode 100644 MisDataFunction/Function1056/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1056/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1056/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1056/mssccprj.scc create mode 100644 MisDataFunction/Function1056/packages.config create mode 100644 MisDataFunction/Function1056/vssver2.scc create mode 100644 MisDataFunction/Function1057/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1057/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1057/Db.cs create mode 100644 MisDataFunction/Function1057/Function02.csproj.vspscc create mode 100644 MisDataFunction/Function1057/Function1057.csproj create mode 100644 MisDataFunction/Function1057/MesServerFunction/Fun_1057.cs create mode 100644 MisDataFunction/Function1057/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1057/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1057/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/Function1057/Methods/UDP.Send.cs create mode 100644 MisDataFunction/Function1057/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1057/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1057/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/Function1057/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1057/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/Function1057/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1057/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1057/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1057/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1057/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1057/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1057/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1057/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1057/mssccprj.scc create mode 100644 MisDataFunction/Function1057/packages.config create mode 100644 MisDataFunction/Function1057/vssver2.scc create mode 100644 MisDataFunction/Function1058/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1058/DataAccess/vssver2.scc create mode 100644 MisDataFunction/Function1058/Db.cs create mode 100644 MisDataFunction/Function1058/Function08.csproj.vspscc create mode 100644 MisDataFunction/Function1058/Function1058.csproj create mode 100644 MisDataFunction/Function1058/MesServerFunction/Function1058.cs create mode 100644 MisDataFunction/Function1058/MesServerFunction/vssver2.scc create mode 100644 MisDataFunction/Function1058/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1058/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/Function1058/Methods/UDP.Send.cs create mode 100644 MisDataFunction/Function1058/Methods/vssver2.scc create mode 100644 MisDataFunction/Function1058/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1058/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/Function1058/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1058/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/Function1058/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1058/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1058/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1058/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1058/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1058/OpcServer/vssver2.scc create mode 100644 MisDataFunction/Function1058/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1058/Properties/vssver2.scc create mode 100644 MisDataFunction/Function1058/mssccprj.scc create mode 100644 MisDataFunction/Function1058/packages.config create mode 100644 MisDataFunction/Function1058/vssver2.scc create mode 100644 MisDataFunction/Function1059/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1059/Db.cs create mode 100644 MisDataFunction/Function1059/Function1059.csproj create mode 100644 MisDataFunction/Function1059/MesServerFunction/Function1059.cs create mode 100644 MisDataFunction/Function1059/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1059/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/Function1059/Methods/UDP.Send.cs create mode 100644 MisDataFunction/Function1059/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1059/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/Function1059/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1059/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/Function1059/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1059/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1059/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1059/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/Function1059/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/Function1059/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1059/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1059/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1059/mssccprj.scc create mode 100644 MisDataFunction/Function1059/packages.config create mode 100644 MisDataFunction/Function1060/DataAccess/DataAccess.cs create mode 100644 MisDataFunction/Function1060/Db.cs create mode 100644 MisDataFunction/Function1060/Function1060.csproj create mode 100644 MisDataFunction/Function1060/MesServerFunction/Fun_1060.cs create mode 100644 MisDataFunction/Function1060/Methods/EngineGetOverBaseWork.cs create mode 100644 MisDataFunction/Function1060/Methods/SubmitToMisweb.cs create mode 100644 MisDataFunction/Function1060/Methods/UDP.Send.cs create mode 100644 MisDataFunction/Function1060/OpcServer/Barcode.cs create mode 100644 MisDataFunction/Function1060/OpcServer/ConfirmOkGo.cs create mode 100644 MisDataFunction/Function1060/OpcServer/EngineGetOver.cs create mode 100644 MisDataFunction/Function1060/OpcServer/FalseGO.cs create mode 100644 MisDataFunction/Function1060/OpcServer/HeartBeat.cs create mode 100644 MisDataFunction/Function1060/OpcServer/MesRead.cs create mode 100644 MisDataFunction/Function1060/OpcServer/MesReadOver.cs create mode 100644 MisDataFunction/Function1060/OpcServer/MesSaveNowData.cs create mode 100644 MisDataFunction/Function1060/OpcServer/PartLoad.cs create mode 100644 MisDataFunction/Function1060/OpcServer/WebSubmit.cs create mode 100644 MisDataFunction/Function1060/OpcServer/WorkStart.cs create mode 100644 MisDataFunction/Function1060/Properties/AssemblyInfo.cs create mode 100644 MisDataFunction/Function1060/packages.config create mode 100644 dll_common/Monitor.MesWork.xml create mode 100644 icon/断开状态.png create mode 100644 icon/连接状态.png diff --git a/Common/09MesDataFunction/MesDataFunction.sln b/Common/09MesDataFunction/MesDataFunction.sln new file mode 100644 index 0000000..5cc56d6 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32901.82 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MesDataFunction", "MesDataFunction\MesDataFunction.csproj", "{90E76FB4-646D-45E2-95DB-0B8AB4E465D6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {48DF007D-B08C-43B9-9AC7-78F6B2C23954} + EndGlobalSection +EndGlobal diff --git a/Common/09MesDataFunction/MesDataFunction/01-MesDataFunction.csproj b/Common/09MesDataFunction/MesDataFunction/01-MesDataFunction.csproj new file mode 100644 index 0000000..72b6042 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/01-MesDataFunction.csproj @@ -0,0 +1,151 @@ + + + + + Debug + AnyCPU + {90E76FB4-646D-45E2-95DB-0B8AB4E465D6} + Library + Properties + MesDataFunction + 09MesDataFunction + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\dll_common\BasicData.dll + + + ..\..\..\dll_common\ConLink.dll + + + ..\..\..\dll_common\ConLink19.dll + + + ..\..\..\dll_common\DataLinkMesWork.dll + + + ..\..\..\dll_common\MesWork.DeviceDriver.dll + + + ..\..\..\dll_common\Monitor.MesWork.dll + + + ..\..\..\dll_common\MQTTnet.dll + + + ..\..\..\dll_common\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\..\dll_common\Newtonsoft.Json.dll + + + ..\..\..\dll_common\NPOI.dll + + + ..\..\..\dll_common\NPOI.OOXML.dll + + + ..\..\..\dll_common\NPOI.OpenXml4Net.dll + + + ..\..\..\dll_common\NPOI.OpenXmlFormats.dll + + + ..\..\..\dll_common\Opc.Ua.Client.dll + + + ..\..\..\dll_common\Opc.Ua.Configuration.dll + + + ..\..\..\dll_common\Opc.Ua.Core.dll + + + ..\..\..\dll_common\OpcUaHelper.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + + + + + + + + + {1dc48c83-1842-4de8-acaf-26e1e7f7c58f} + 00_MyLog4Net + + + + + + + + + + \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/DataAccess.cs b/Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/DataAccess.cs new file mode 100644 index 0000000..aa173d8 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/DataAccess.cs @@ -0,0 +1,746 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataLinkMesWork1 +{ + public class DataAccess + { + // 读配置文件有问题,先直接写死 + public static string ConnectionString_MES = ConfigurationManager.AppSettings["ConnectionString_MES"]; + public static bool ExecuteNonQuery(string sql, string connectionString, out string errorMessage) + { + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + //ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + + } + public static bool ExecuteDataset(string sql, string connectionString, out DataSet ds, out string errorMessage) + { + errorMessage = ""; + bool result = true; + errorMessage = ""; + ds = new DataSet(); + + /// SQLSERVER + /// SQLiteDB + try + { + //bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + //ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + catch (Exception err) + { + + } + + return result; + + + } + /// + /// 增 删 改 + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlCommand cmd = new SqlCommand(procedureName, conn)) + { + cmd.CommandTimeout = 0; + cmd.CommandType = CommandType.StoredProcedure; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + cmd.Parameters.Add(sqlParameters[i]); + } + } + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + if (conn.State == ConnectionState.Open) + conn.Close(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters,out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + //ds = new DataSet(); + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out DataSet ds) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out string errorMessage) + { + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlCommand cmd = new SqlCommand(procedureName, conn)) + { + cmd.CommandTimeout = 0; + cmd.CommandType = CommandType.StoredProcedure; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + cmd.Parameters.Add(sqlParameters[i]); + } + } + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + if (conn.State == ConnectionState.Open) + conn.Close(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out DataTable dt, out string errorMessage) + { + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + //ds = new DataSet(); + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, out DataSet ds, out string errorMessage) + { + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + dsCommand.SelectCommand.CommandTimeout = 0; + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteDataset(string sql, out DataSet ds) + { + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + ds = new DataSet(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(ds); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteDataTable(string sql, out DataTable dt) + { + //public static bool ExecuteDataTable(string sql, string connectionString, out DataTable dt, out string errorMessage) + string errorMessage; + string connectionString = ConnectionString_MES; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(sql, conn); + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static DataTable ExecuteSQL(string sql, ref SqlParameter[] sqlParameters) + { + string connectionString = ConnectionString_MES; + string err; + bool result = false; + err = ""; + DataTable dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter(sql, conn)) + { + if (sqlParameters != null) + { + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); + } + } + dsCommand.Fill(dt); + } + result = true; + } + catch (Exception e) + { + err = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSelectMesWork\r\n" + sql + "\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return dt; + } + + public static bool ExecuteSQL(string sql) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + cmd.ExecuteNonQuery(); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// 存储过程名称 + /// 存储过程参数数组 + /// 增加数据的数据表 + /// + public static bool ExecuteStoredProcedure(string procedureName, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(procedureName, conn); + dsCommand.InsertCommand.CommandType = CommandType.StoredProcedure; + for (int i = 0; i < sqlParameters.Length; i++) + { + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// 提供通用的调用存储过程的方法(增加数据的数据表的到数据库的调用) + /// + /// + /// + /// + public static bool ExecuteStoredProcedure(string procedureName, out DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + dt = new DataTable(); + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.SelectCommand = new SqlCommand(procedureName, conn); + dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; + + dsCommand.Fill(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n�洢���̣�\r\n" + procedureName + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + /// + /// + /// + /// + /// + /// + /// + public static bool ExecuteSQL(string sql, ref SqlParameter[] sqlParameters, DataTable dt) + { + string connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + + + try + { + // if (!SqlServerConnectionStatus) return false; + conn.Open(); + using (SqlDataAdapter dsCommand = new SqlDataAdapter()) + { + dsCommand.InsertCommand = new SqlCommand(sql, conn); + + for (int i = 0; i < sqlParameters.Length; i++) + { + sqlParameters[i].IsNullable = true; + dsCommand.InsertCommand.Parameters.Add(sqlParameters[i]); + } + if (dt == null) return false; + dt.AcceptChanges(); + for (int i = 0; i < dt.Rows.Count; i++) + { + dt.Rows[i].SetAdded(); + } + dsCommand.Update(dt); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + //ApplicationConfig.ConnectionStringPIS_NEW_Value = "0"; + //TestConnection(); + //errorMessage = e.ToString(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteSQL\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + + public static bool ExecuteNonQuery_newID(string sql, out long newID) + { + sql += ";select @@identity"; + string connectionString; + connectionString = ConnectionString_MES; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + conn.Open(); + newID = Convert.ToInt64(cmd.ExecuteScalar()); + } + return true; + } + catch (Exception e) + { + newID = 0; + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\n ExecuteNonQuery_newID\r\n�洢���̣�\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + return false; + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + } + + public static bool ExecuteOutNum(string sql, out int count) + { + string connectionString; + connectionString = ConnectionString_MES; + string errorMessage; + bool result = false; + errorMessage = ""; + using (SqlConnection conn = new SqlConnection(connectionString)) + { + count = 0; + try + { + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + //if (!SqlServerConnectionStatus) return false; + conn.Open(); + count = Convert.ToInt32(cmd.ExecuteScalar().ToString()); + } + //SqlServerConnectionStatus = true; + result = true; + } + catch (Exception e) + { + errorMessage = e.ToString(); + //TestConnection(); + ////ApplicationLog.WriteLog(e, "\r\nExecuteNonQuery\r\nSQL��䣺\r\n" + sql + "\r\n�����ַ�����\r\n" + connectionString); + } + finally + { + if (conn.State == ConnectionState.Open) + conn.Close(); + } + } + return result; + } + } + + +} diff --git a/Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/JsonHelper.cs b/Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/JsonHelper.cs new file mode 100644 index 0000000..5ec9f9c --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/04-DataBaseAccess/JsonHelper.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Data; +using System.Runtime.Serialization.Json; +using System.Web.Script.Serialization; +//using System.Runtime.Serialization.Json; + +//using System.Runtime.Serialization.Json; + +public class JsonHelper +{ + #region 序列化和反序列化 + // 序列化 + public static string JsonSerializer(T t) + { + // 使用 DataContractJsonSerializer 将 T 对象序列化为内存流。 + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + MemoryStream ms = new MemoryStream(); + // 使用 WriteObject 方法将 JSON 数据写入到流中。 + jsonSerializer.WriteObject(ms, t); + // 流转字符串 + string jsonString = Encoding.UTF8.GetString(ms.ToArray()); + ms.Close(); + //替换Json的Date字符串 + string p = @"\\/Date\((\d+)\+\d+\)\\/"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + return jsonString; + } + public static T JsonDeserialize(string jsonString) + { + //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 + string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; + MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); + Regex reg = new Regex(p); + jsonString = reg.Replace(jsonString, matchEvaluator); + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T)); + // 字符串转流 + MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); + // 通过使用 DataContractJsonSerializer 的 ReadObject 方法,将 JSON 编码数据反序列化为T + T obj = (T)jsonSerializer.ReadObject(ms); + return obj; + } + public static string ConvertJsonDateToDateString(Match match) + { + string result = string.Empty; + DateTime dateTime = new DateTime(1970, 1, 1); + dateTime = dateTime.AddMilliseconds(long.Parse(match.Groups[1].Value)); + dateTime = dateTime.ToLocalTime(); + result = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); + return result; + } + private static string ConvertDateStringToJsonDate(Match m) + { + string result = string.Empty; + DateTime dt = DateTime.Parse(m.Groups[0].Value); + dt = dt.ToUniversalTime(); + TimeSpan ts = dt - DateTime.Parse("1970-01-01"); + result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); + return result; + } + #endregion + + // 对象转换为Json + public static string ObjectToJson(object obj) + { + JavaScriptSerializer js = new JavaScriptSerializer(); + js.MaxJsonLength = Int32.MaxValue; // 定义JavaScriptSerializer接受字符串的最大长度 hdk 20180524 + try + { + return js.Serialize(obj); + } + catch (Exception exception) + { + + throw new Exception(exception.Message); + } + } + // 数据表转化为集合 + public static List> DataTableToList(DataTable dt) + { + List> list = new List>(); + foreach (DataRow dataRow in dt.Rows) + { + Dictionary dic = new Dictionary(); + + + foreach (DataColumn dc in dt.Columns) + { + if (dataRow[dc.ColumnName].GetType() == typeof(DateTime)) + { + string str = Convert.ToDateTime(dataRow[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss"); + dic.Add(dc.ColumnName, str); + } + else if + (dataRow[dc.ColumnName].GetType() == typeof(byte[])) + { + string str = Convert.ToBase64String((byte[])dataRow[dc.ColumnName]); + dic.Add(dc.ColumnName, str); + } + else + { + dic.Add(dc.ColumnName, dataRow[dc.ColumnName]); + } + + //Type type1 = dt.Rows[0]["产品图片"].GetType(); + //Type type2 = typeof(byte[]); + + } + list.Add(dic); + } + return list; + } + /// + /// 表转换为Json + /// + /// + /// + public static string DataTableToJson(DataTable dt) + { + return ObjectToJson(DataTableToList(dt)); + } + /// + /// 将DataTable中的数据转换成JSON格式 + /// + /// 数据源DataTable + /// 是否输出数据总条数 + /// JSON中显示的数据总条数 + /// + public static string CreateJsonParameters(DataTable dt, bool displayCount, int totalcount) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + if (displayCount) + { + JsonString.Append(","); + + JsonString.Append("\"total\":"); + JsonString.Append(totalcount); + } + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + public static string CreateJsonParameters(DataTable dt) + { + StringBuilder JsonString = new StringBuilder(); + //Exception Handling + + if (dt != null) + { + JsonString.Append("{ "); + JsonString.Append("\"rows\":[ "); + for (int i = 0; i < dt.Rows.Count; i++) + { + JsonString.Append("{ "); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j < dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower() + ","); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString() + ","); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + } + } + else if (j == dt.Columns.Count - 1) + { + //if (dt.Rows[i][j] == DBNull.Value) continue; + if (dt.Columns[j].DataType == typeof(bool)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + dt.Rows[i][j].ToString().ToLower()); + } + else if (dt.Columns[j].DataType == typeof(string)) + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + + ObjectToJson(dt.Rows[i][j]).ToString()); + //JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + } + else + { + JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + } + } + } + /*end Of String*/ + if (i == dt.Rows.Count - 1) + { + JsonString.Append("} "); + } + else + { + JsonString.Append("}, "); + } + } + JsonString.Append("]"); + + JsonString.Append("}"); + return JsonString.ToString().Replace("\n", ""); + } + else + { + return null; + } + } + StringBuilder result = new StringBuilder(); + StringBuilder sb = new StringBuilder(); + /// + /// 根据DataTable生成EasyUI Tree Json树结构 + /// + /// 数据源 + /// ID列 + /// Text列 + /// 节点Url + /// 关系字段 + /// 父ID + public string GetTreeJsonByTable(DataTable tabel, string idCol, string txtCol, string url, string rela, object pId) + { + result.Append(sb.ToString()); + sb.Clear(); + if (tabel.Rows.Count > 0) + { + sb.Append("["); + string filer = string.Format("{0}='{1}'", rela, pId); + DataRow[] rows = tabel.Select(filer); + if (rows.Length > 0) + { + foreach (DataRow row in rows) + { + sb.Append("{\"id\":\"" + row[idCol] + "\",\"text\":\"" + row[txtCol] + "\",\"attributes\":\"" + row[url] + "\",\"state\":\"open\""); + if (tabel.Select(string.Format("{0}='{1}'", rela, row[idCol])).Length > 0) + { + sb.Append(",\"children\":"); + GetTreeJsonByTable(tabel, idCol, txtCol, url, rela, row[idCol]); + result.Append(sb.ToString()); + sb.Clear(); + } + result.Append(sb.ToString()); + sb.Clear(); + sb.Append("},"); + } + sb = sb.Remove(sb.Length - 1, 1); + } + sb.Append("]"); + result.Append(sb.ToString()); + sb.Clear(); + } + return result.ToString(); + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_base.cs b/Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_base.cs new file mode 100644 index 0000000..a9d1eb8 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_base.cs @@ -0,0 +1,165 @@ +using System; +namespace MesWebFun_base +{ + public partial class MisWebInterface + { + public static MesWebFun_base _MesWebFun_base = new MesWebFun_base(); + public string WebSocket_Function(string msg) + { + var responseStr = ""; + try + { + //返回的数据msg.data,包含了协议中的4部分9 + var arrays_signal = msg.Split('|'); + var m_Source = arrays_signal[0]; + var m_Command = arrays_signal[1]; + var m_Opname = arrays_signal[2]; + var m_Value = arrays_signal[3]; + // var opName = $("#tbx_opname").val(); + switch (m_Source) + { + case "MES": + + switch (m_Command) + { + //显示托盘信息 √ + case "ShowMoby": + try + { + responseStr = MesWebFun_base.MobySelect(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShowMoby" + "|" + "info"); + } + break; + //显示操作指南√ + case "ProcessList": + try + { + responseStr = MesWebFun_base.ProcessList(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ProcessList" + "|" + "info"); + } + break; + //显示物料√ + case "MaterialList": + try + { + responseStr = MesWebFun_base.MaterialList(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:MaterialList" + "|" + "info"); + } + break; + //显示操作图片√ + case "PicShow": + try + { + responseStr = MesWebFun_base.PictureShow(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:PicShow" + "|" + "info"); + } + break; + //显示拧紧位置√ + case "ShaftPosition": + try + { + responseStr = MesWebFun_base.ShaftPotion_Select(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShaftPosition" + "|" + "info"); + } + break; + //实时显示质量数据√ + case "ShowTimelyQuality": + try + { + responseStr = MesWebFun_base.Quality_Select(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShowTimelyQuality" + "|" + "info"); + } + break; + //手动拧紧实时显示质量数据√ + case "ShowTimelyQuality_Tight": + try + { + responseStr = MesWebFun_base.Quality_Select(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ShowTimelyQuality_Tight" + "|" + "info"); + } + break; + + //√ + case "OrderFormList": + try + { + responseStr = MesWebFun_base.OrderFormList(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:OrderFormList" + "|" + "info"); + } + break; + //弹窗消息√ + case "Notice": + try + { + responseStr = MesWebFun_base.ShowWindowNotice(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:Notice" + "|" + "info"); + } + break; + //LED消息提醒√ + case "ScrollNotice": + try + { + responseStr = MesWebFun_base.ShowLEDNotice(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:ScrollNotice" + "|" + "info"); + } + break; + //物料检测初始化√ + case "MaterialCheckPosition": + try + { + responseStr = MesWebFun_base.MaterialCheckPosition(m_Opname); + } + catch (Exception exception) + { + //ApplicationLog.WriteLog("信息提示" + "|" + "错误断点:MaterialCheckPosition" + "|" + "info"); + } + break; + + default: + // Web_Socket_Interface(m_Opname, msg); + break; + } + break; + } + } + catch (Exception exception) + { + var error = exception.ToString(); + //ApplicationLog.WriteLog("信息提示" + "|" + "系统出现错误,接受onmessage:" + "|" + error + "|" + "info"); + responseStr = ""; + } + return responseStr; + } + + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_baseFun.cs b/Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_baseFun.cs new file mode 100644 index 0000000..f9004d2 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/08-WebFun_base/MesWebFun_baseFun.cs @@ -0,0 +1,1860 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Text; + +using System.Data; +using MisDataFunDll; +//using SystemFramework; + +namespace MesWebFun_base +{ + public partial class MesWebFun_base + { + ///// + ///// 电子看板_发动机号_合格放行_记录_增加 + ///// + ///// + //private string Insert_ConfirmOk(string opName, string operatorNum, string type) + //{ + // string text = ""; + // try + // { + // // string operatorNum = HttpContext.Current.Request["userName"];//放行者工号 + // // string type = HttpContext.Current.Request["recordType"];//放行类型 + // MES.InsertRecord_ComfirmOkGO(opName, operatorNum, type); + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_ConfirmOk"); + // } + // return text; + //} + + + + ///// + ///// 初始化节拍数据 + ///// + ///// + //private string InitOpNameOuputCount(string opnameValue) + //{ + // string text = ""; + // try + // { + // int outputValue = 0; //工位产量 + // int nowOutputValue = 0; //在线产量 + // int opNameBeatValue = 0; //工位节拍 + // int NowOpNameBeatValue = 0; //在线节拍 + // int classNumber = 0;//班次代码 + // MisDataFun.InitOpNameOuputCount(opnameValue, out outputValue, out nowOutputValue, out opNameBeatValue, out NowOpNameBeatValue, out classNumber); + // text = "{\"outputValue\":\"" + outputValue + "\",\"nowOutputValue\":\"" + nowOutputValue + "\",\"opNameBeatValue\":\"" + opNameBeatValue + "\",\"NowOpNameBeatValue\":\"" + NowOpNameBeatValue + "\",\"classNumber\":\"" + classNumber + "\"}"; + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:InitOpNameOuputCount"); + // } + // return text; + //} + + ///// + ///// 功能按钮 - 从数据库中初始化在线 / 离线 / 屏蔽的combobox + ///// + ///// + //private string Init_OnlineOutline(string opnameValue) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // MES.Init_OnlineOutline(opnameValue, out dt); + // string value = ""; + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // value = dt.Rows[0]["工位状态"].ToString(); + // } + // } + // text = "{\"value\":\"" + value + "\"}"; + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Init_OnlineOutline"); + // } + // return text; + //} + + ///// + ///// 功能按钮---将在线,离线,屏蔽更新到数据库中 + ///// + ///// + //private string Insert_OnlineOutline(string opnameValue, string selectValue) + //{ + // string text = ""; + // try + // { + // //string opnameValue = HttpContext.Current.Request["opnameValue"];//工位号 + // //string selectValue = HttpContext.Current.Request["selectValue"];//选择的值 + // if (selectValue == "") + // { + // selectValue = "0"; + // } + // int selectValueint = Convert.ToInt32(selectValue); + // bool falg = MES.Insert_OnlineOutline(opnameValue, selectValueint); + // if (falg) + // { + // text = "{\"falg\":\"1\"}"; + // } + // else + // { + // text = "{\"falg\":\"0\"}"; + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_OnlineOutline"); + // } + // return text; + //} + + ///// + ///// 合格放行 + ///// + ///// + //private string functionButtonConfirmOk(string userName, string passWord) + //{ + // string text = ""; + // try + // { + // string roleFlag = ""; + // string loginFlag = ""; + // System.Data.DataTable dt_User = null; + // //string userName = HttpContext.Current.Request["function_button_confirmOkGo_userName"]; + // //string passWord = HttpContext.Current.Request["function_button_confirmOkGo_passWord"]; + + // BaseDataSystemMES.UserInfo_Login(userName, passWord, out dt_User); + // if (dt_User != null) + // { + // if (dt_User.Rows.Count == 1) + // { + // int roleCodSum = Convert.ToInt32(dt_User.Rows[0][0].ToString()); + // bool IsOK = false; + // RoleDistribution(roleCodSum, out IsOK); + // if (IsOK == true) + // { + // roleFlag = "1"; + // loginFlag = "1"; + // } + // else + // { + // roleFlag = "0"; + // } + // } + // else + // { + // loginFlag = "0"; + // } + // } + // else + // { + // loginFlag = "0"; + // } + // text = "{\"roleFlag\":\"" + roleFlag + "\",\"loginFlag\":\"" + loginFlag + "\"}"; + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:functionButtonConfirmOk"); + // } + // return text; + //} + + ///// + ///// 看用户是否有权限访问该页面 + ///// + ///// + ///// + //private void RoleDistribution(int roleCodSum, out bool IsOK) + //{ + // IsOK = false; + // //登录工位MES的权限是256 如果role&256>0则有权限登录MES软件 + // int roleCode = 64; + // //ArrayList aList = new ArrayList(); + // if ((roleCodSum & roleCode) > 0) + // { + // ////加了没用上 + // //aList.Add(roleCode); + + // switch (roleCode) + // { + // case 64: + // { + // //一级用户管理 + // IsOK = true; + // } + // break; + + // default: + // break; + // } + // } + //} + + ///// + ///// 选择订单_增加订单号 + ///// + ///// + //private string InsertOrderNum(string orderlist, string opName) + //{ + // //string orderlist = HttpContext.Current.Request["orderNum"]; + // MES.OrderNum_Add(opName, orderlist); + // return orderlist; + //} + + ///// + ///// 选择订单_增加发动机型号 + ///// + ///// + //private string InsertEngineNum(string opName, string enginetype, string enginetypecode) + //{ + // string orderlist = ""; + // //string enginetype = HttpContext.Current.Request["enginetype"]; + // //string enginetypecode = HttpContext.Current.Request["enginetypecode"]; + // int enginetypeID = Convert.ToInt32(enginetypecode); + // MES.EngineNum_Add(opName, enginetype, enginetypeID); + // return orderlist; + //} + + ///// + ///// 物料拉动_确认接受 + ///// + ///// + //private string AffirmReceive(string opName, string DistributionNums) + //{ + // string text = ""; + // try + // { + // bool falg = false; + // //string DistributionNums = HttpContext.Current.Request["DistributionNums"]; + // string[] array = DistributionNums.Split(','); + // string DistributionNum = ""; + // for (int i = 0; i < array.Length; i++) + // { + // DistributionNum = array[i]; + // falg = MaterialPull.DistributionNum(opName, DistributionNum); + // } + // if (falg) + // { + // text = "{\"falg\":\"1\"}"; + // } + // else + // { + // text = "{\"falg\":\"0\"}"; + // } + // } + // catch (Exception err) + // { + // //////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:AffirmReceive"); + // } + // return text; + //} + + ///// + ///// 设备管理_设备保养记录增加 + ///// + ///// + //private string equipmentmanagementSubmit(string opname, string mark) + //{ + // string text = ""; + // try + // { + // bool flag; + // // string mark = HttpContext.Current.Request["mark"]; + // flag = bizFacade.MES_MachineManage.Mes_MachineTakeCare_Insert(opname, mark); + // if (flag) + // { + // text = "{\"flag\":\"1\"}"; + // } + // else + // { + // text = "{\"flag\":\"0\"}"; + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:equipmentmanagementSubmit"); + // } + // return text; + //} + + ///// + ///// 获取对应工位的质量数据 + ///// + ///// + //private string QualityDataSelect(string opName, string opname) + //{ + // string qualitydata = ""; + // try + // { + // System.Data.DataTable dt = null; + // //string opName = HttpContext.Current.Request["value"]; + // //string opname = HttpContext.Current.Request["opname"]; + // MES.QualityDataSelect(opName, opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // qualitydata = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:QualityDataSelect"); + // } + // return qualitydata; + //} + + + + ///// 获取设备保养类型 + ///// + ///// + //private string LoadMachineType(string opName) + //{ + // string Maintain = ""; + // try + // { + // System.Data.DataTable dt = null; + // //string opName = HttpContext.Current.Request["value"]; + // MES.LoadMachineType(opName, out dt); + // if (dt.Rows.Count > 0) + // { + // Maintain = JsonHelper.DataTableToJson(dt); + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:LoadMachineType"); + // } + // return Maintain; + //} + + + ///// 获取设备保养内容 + ///// + ///// + //private string ShowMaintainData(string opName, string MachineType) + //{ + // string Maintain = ""; + // try + // { + // System.Data.DataTable dt = null; + // //string opName = HttpContext.Current.Request["value"]; + // //string MachineType = HttpContext.Current.Request["machinetype"]; + // MES.ShowMaintainData(opName, MachineType, out dt); + // if (dt.Rows.Count > 0) + // { + // Maintain = JsonHelper.CreateJsonParameters(dt); + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowMaintainData"); + // } + // return Maintain; + //} + + ///// + ///// 获取设备保养图片 + ///// + ///// + //private string ShowMaintainPic(string opName, string MachineType) + //{ + // string Maintain = ""; + // try + // { + // //string opName = HttpContext.Current.Request["value"]; + // //string MachineType = HttpContext.Current.Request["machinetype"]; + // byte[] imgBytesIn; + // MES.GetMaintainImageFile(opName, MachineType, out imgBytesIn); + // if (imgBytesIn == null) + // { + // return Maintain; + // } + // Maintain = Convert.ToBase64String(imgBytesIn); + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowMaintainPic"); + // } + // return Maintain; + //} + + ///// + ///// 物料ando复位 + ///// + ///// + //private string submitAndoMaterialReset(string opname, string andoTypeCode, string andoListCode, string number) + //{ + // string text = ""; + // try + // { + // string number1 = ""; + // //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // //string andoListCode = HttpContext.Current.Request["andoListCode"]; + // //string number = HttpContext.Current.Request["number"]; + + // string[] number_array = number.Split(','); + // string number_value = ""; + // string callInfo = "复位信息"; + + // for (int i = 0; i < number_array.Length - 1; i++) + // { + // number_value = number_array[i].ToString(); + // string[] valuelist = number_value.Split('_'); + // if (valuelist.Length >= 4) + // { + // number1 = valuelist[3]; + // bizFacade.ando_matertial.AndoMaterialReset(opname, number1, andoTypeCode, andoListCode, callInfo); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:submitAndoMaterialReset"); + // } + + // return text; + //} + + ///// + ///// ando界面_质量ando复位 + ///// + ///// + //private string submitAndoQualityReset(string opname, string andoTypeCode, string andoListCode, string number) + //{ + // string text = ""; + // try + // { + // string number1 = ""; + // //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // //string andoListCode = HttpContext.Current.Request["andoListCode"]; + // //string number = HttpContext.Current.Request["number"]; + // string[] valuelist = number.Split('_'); + // if (valuelist.Length >= 4) + // { + // number1 = valuelist[3]; + // } + + // //呼叫内容 + // string callInfo = "复位信息"; + // bool flag = bizFacade.ando_matertial.AndoMaterialReset(opname, number1, andoTypeCode, andoListCode, callInfo); + // if (flag) + // { + // text = "{\"flag\":\"1\"}"; + // } + // else + // { + // text = "{\"flag\":\"0\"}"; + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:submitAndoQualityReset"); + // } + // return text; + //} + + ///// + ///// 物料ando_更新ando的具体的tabel + ///// + ///// + //private string updataAndoMaterialTabel(string opname, string andoTypeCode) + //{ + // string text = ""; + // try + // { + // //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // text = bizFacade.ando_matertial.CreatAndo_Material_table(opname, andoTypeCode); + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:updataAndoMaterialTabel"); + // } + // return text; + //} + + ///// + ///// 质量ando_更新ando的具体的tabel + ///// + ///// + //private string updataAndoQualityTabel(string opname, string andoTypeCode) + //{ + // string text = ""; + // try + // { + // // string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // text = bizFacade.ando_quality.CreatAndo_quality_table(opname, andoTypeCode); + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:updataAndoQualityTabel"); + // } + // return text; + //} + + ///// + ///// ando界面_提交物料ando信息(插入呼叫信息) + ///// + ///// + //private string submitAndoMaterialCall(string opname, string andoTypeCode, string andoListCode, string number) + //{ + // string text = ""; + // try + // { + // string number1 = ""; + // //System.Data.DataTable tb; + // //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // //string andoListCode = HttpContext.Current.Request["andoListCode"]; + // //string number = HttpContext.Current.Request["number"]; + // string[] number_array = number.Split(','); + // string number_value = ""; + // string callInfo = "0"; + // int callCount = 0; + // string cardNumber = "0"; + // string noNumber = "0"; + + // for (int i = 0; i < number_array.Length - 1; i++) + // { + // number_value = number_array[i].ToString(); + // string[] valuelist = number_value.Split('_'); + // if (valuelist.Length >= 4) + // { + // number1 = valuelist[3]; + // bizFacade.ando_matertial.andoMaterialCall(opname, andoTypeCode, andoListCode, number1, callInfo, callCount, cardNumber, noNumber); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:submitAndoMaterialCall"); + // } + // return text; + //} + + ///// + ///// 安东界面_质量ando_呼叫提交 + ///// + ///// + //private string submitAndoQualityCall() + //{ + // string text = ""; + // //string number1 = ""; + // //string opname = HttpContext.Current.Request["opname"]; + // //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // //string andoListCode = HttpContext.Current.Request["andoListCode"]; + // //string number = HttpContext.Current.Request["number"]; + // //string[] valuelist = number.Split('_'); + // //if (valuelist.Length >= 4) + // //{ + // // number1 = valuelist[3]; + // //} + // //string callInfo = "0"; + // //int callCount = 5; + // //string cardNumber = "0"; + // //string noNumber = "0"; + // //bool flag = bizFacade.ando_matertial.andoMaterialCall(opname, andoTypeCode, andoListCode, number1, callInfo, callCount, cardNumber, noNumber); + // //if (flag) + // //{ + // // text = "{\"flag\":\"1\"}"; + // //} + // //else + // //{ + // // text = "{\"flag\":\"0\"}"; + // //} + // return text; + //} + + ///// + ///// 查询物料ando条数,为了左移动的 + ///// + ///// + //private string InitMaterailAndoCount(string opname, string andoTypeCode) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt_material; + // System.Data.DataTable dt_quality; + // System.Data.DataTable dt_machine; + // //string andoTypeCode = HttpContext.Current.Request["andoTypeCode"]; + // //查询物料ando具体的button个数 + // bizFacade.ando_matertial.andoListSelect(opname, "1", out dt_material); + // int count_material = 0; + + // //不为空 + // if (dt_material != null) + // { + // if (dt_material.Rows.Count == 0) + // { + // count_material = 0; + // } + // else + // { + // count_material = dt_material.Rows.Count; + // } + // } + // //查询质量ando具体的button个数 + // bizFacade.ando_matertial.andoListSelect(opname, "2", out dt_quality); + // int count_quality = 0; + // if (dt_quality != null) + // { + // if (dt_quality.Rows.Count == 0) + // { + // count_quality = 0; + // } + // else + // { + // count_quality = dt_quality.Rows.Count; + // } + // } + // //查询设备ando具体的button个数 + // bizFacade.ando_matertial.andoListSelect(opname, "3", out dt_machine); + + // int count_machine = 0; + // if (dt_machine != null) + // { + // if (dt_machine.Rows.Count == 0) + // { + // count_machine = 0; + // } + // else + // { + // count_machine = dt_machine.Rows.Count; + // } + // } + // text = "{\"material_count\":\"" + count_material + "\",\"machine_count\":\"" + count_machine + "\",\"quality_count\":\"" + count_quality + "\"}"; + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:InitMaterailAndoCount"); + // } + // return text; + //} + + ///// + ///// 初始化ando + ///// + ///// + //private string InitMaterailAndo(string opname) + //{ + // string text = ""; + // try + // { + // text = bizFacade.ando_load.ando_loading(opname); + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:InitMaterailAndo"); + // } + // return text; + //} + + ///// + ///// ando_查询具体ando类型明细 + ///// + ///// + //private string InitComboboxAndoDetail() + //{ + // string text = ""; + // //System.Data.DataTable dt = null; + // //string andoType="1"; + // //bizFacade.ando.select_ando_detail(andoType, out dt); + // //text = JsonHelper.DataTableToJson(dt); + // return text; + //} + + ///// + ///// 初始化装配线MES + ///// + ///// + //private string MesloadingSelect(string opname, string languageType, string mainModule) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + + // //string languageType = HttpContext.Current.Request["mainModule"]; + // //string mainModule = HttpContext.Current.Request["MesWebCode"]; + // bizFacade.MES_Loading.MES_Loading_select(languageType, mainModule, opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = JsonHelper.DataTableToJson(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MesloadingSelect"); + // } + // return text; + //} + + + + ///// + ///// 查询物料库存信息 + ///// + ///// + //private string MaterialListStock(string OpName) + //{ + // string jsonStr_Materail = ""; + // try + // { + // string orderNum = ""; + // int EngineTypeID = 0; + // string EngineType = ""; + // string EngineID = ""; + // string PartPallet_Code = ""; + // int IsrepairBarcode = 0; + // string repairBarcode = ""; + // string EngineTypeString = ""; + // MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + // DataTable dt_Material; + + // MisDataFun.PartMaterialVerify_Select(OpName, EngineTypeID, EngineType, out dt_Material); + // if (dt_Material != null) + // { + // if (dt_Material.Rows.Count > 0) + // { + // jsonStr_Materail = JsonHelper.CreateJsonParameters(dt_Material); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialList"); + // } + // return jsonStr_Materail; + //} + + + + + + ///// + ///// 获得工步属性 + ///// + ///// + //private string StepProperty(string opName) + //{ + // string stepProperty = "512"; + // System.Data.DataTable dt = null; + // bizFacade.UserLogin.GetUrl(opName, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // stepProperty = dt.Rows[0]["工步属性"].ToString(); + // } + // } + // return stepProperty; + //} + + + + //private static string CreateJsonParameters(DataTable dt) + //{ + // StringBuilder JsonString = new StringBuilder(); + // //Exception Handling + // if (dt != null) + // { + // JsonString.Append("{ "); + // JsonString.Append("\"total\":"); + // JsonString.Append(dt.Rows.Count); + // JsonString.Append(","); + // JsonString.Append("\"rows\":[ "); + // for (int i = 0; i < dt.Rows.Count; i++) + // { + // JsonString.Append("{ "); + // for (int j = 0; j < dt.Columns.Count; j++) + // { + // if (j < dt.Columns.Count - 1) + // { + // //if (dt.Rows[i][j] == DBNull.Value) continue; + // if (dt.Columns[j].DataType == typeof(bool)) + // { + // JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + + // dt.Rows[i][j].ToString().ToLower() + ","); + // } + // else if (dt.Columns[j].DataType == typeof(string)) + // { + // JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\","); + // } + // else + // { + // JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\","); + // } + // } + // else if (j == dt.Columns.Count - 1) + // { + // //if (dt.Rows[i][j] == DBNull.Value) continue; + // if (dt.Columns[j].DataType == typeof(bool)) + // { + // JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + + // dt.Rows[i][j].ToString().ToLower()); + // } + // else if (dt.Columns[j].DataType == typeof(string)) + // { + // JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + + // dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\""); + // } + // else + // { + // JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\""); + // } + // } + // } + // /*end Of String*/ + // if (i == dt.Rows.Count - 1) + // { + // JsonString.Append("} "); + // } + // else + // { + // JsonString.Append("}, "); + // } + // } + // JsonString.Append("]"); + // JsonString.Append("}"); + // return JsonString.ToString().Replace("\n", ""); + // } + // else + // { + // return null; + // } + //} + + ///// + ///// 获得机型 + ///// + ///// + //private string Orderenginetypeselect() + //{ + // string enginetypelist = ""; + // try + // { + // System.Data.DataTable dt = null; + // ShaftPosition.EngineType_Select(out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // enginetypelist = JsonHelper.DataTableToJson(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Orderenginetypeselect"); + // } + // return enginetypelist; + //} + + ///// + ///// 物料拉动_获取单号 + ///// + ///// + //private string MaterialPush_ListNumer(string opName) + //{ + // string listNumber = ""; + // try + // { + // System.Data.DataTable dt = null; + // MaterialPull.MaterialPush_ListNumer_Select(0, "", 1, opName, 0, "", out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // listNumber = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialPush_ListNumer"); + // } + // return listNumber; + //} + + ///// + ///// 物料拉动_根据单号获取详细信息 + ///// + ///// + //private string MaterialPush_Details(string opname, string listNumer) + //{ + // string listDetails = ""; + // try + // { + // System.Data.DataTable dt = null; + // //单号 + // //string listNumer = HttpContext.Current.Request["listNumber"]; + // MaterialPull.MaterialPush_Details_Select(listNumer, opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // listDetails = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialPush_Details"); + // } + // return listDetails; + //} + + ///// + ///// 物料拉动_根据单号获取详细信息 + ///// + ///// + //private string QualityDataButton_bgColor_Select(string opname) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // //单号 + // MES.QualityDataButton_bgColor_Select(opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count >= 0) + // { + // text = Buttons.Createbuttons(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:QualityDataButton_bgColor_Select"); + // } + // return text; + //} + + + + + + ///// + ///// 获取生产订单 + ///// + ///// + //private string GetOrderForm(string opname) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // MES.OpName_MIS_OrderForm_Select(opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = dt.Rows[0]["订单号"].ToString(); + // return text; + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetOrderForm"); + // } + // return text; + //} + + ///// + ///// 获取发动机型号 + ///// + ///// + //private string GetEngineType(string opname) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // MES.OpName_MIS_EngineType_Select(opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = dt.Rows[0]["产品型号代码"].ToString() + "&" + dt.Rows[0]["发动机型号"].ToString(); + // return text; + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetEngineType"); + // } + // return ("" + "&" + ""); + //} + + ///// + ///// + ///// + ///// + //private string ShowOpNameMessage(string opname) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // BaseDataSystemMES.GetOpNameByOpName(opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = dt.Rows[0]["工序名称"].ToString() + "&" + dt.Rows[0]["操作者工号"].ToString() + "&" + dt.Rows[0]["是否启用物料拉动"].ToString(); + // return text; + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowOpNameMessage"); + // } + // return ("" + "&" + "" + "&" + "0"); + //} + + ///// + ///// 系统初始化时 + ///// + ///// + //private string WebLoginIn(string opname) + //{ + // string text = ""; + // MES.WebLoginIn(opname); + // return text; + //} + + + + ///// + ///// 获取对应工位的物料数据 + ///// + ///// + //private string MaterialDataSelect(string opName, string opname) + //{ + // string qualitydata = ""; + // try + // { + // System.Data.DataTable dt = null; + // //string opName = HttpContext.Current.Request["value"]; + // //string opname = HttpContext.Current.Request["opname"]; + // MES.MaterialDataSelect(opName, opname, out dt); + // if (dt != null) + // { + // //if (dt.Rows.Count > 0) + // { + // qualitydata = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialDataSelect"); + // } + // return qualitydata; + //} + + ///// + ///// 电子看板_装配零件_查询 + ///// + ///// + //private string MaterialSelect(string opName, string enginetypeid, string enginetype) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // //string enginetypeid = HttpContext.Current.Request["enginetypeid"]; + // //string enginetype = HttpContext.Current.Request["enginetype"]; + // ShaftPosition.Material_Select(opName, enginetypeid, enginetype, out dt); + + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialSelect"); + // } + // return text; + //} + + //public string GetLoginOutUrl() + //{ + // string url = System.Configuration.ConfigurationManager.AppSettings["Linklogin"].ToString(); + // return url; + //} + + ///// + ///// 手动修改批次信息 + ///// + ///// + //private string MaterialManualUpdateBetch(string opName,string arrays, string enginetype) + //{ + // string text = ""; + // try + // { + // //string arrays = HttpContext.Current.Request["arrays"];//组合 + // //string enginetype = HttpContext.Current.Request["enginetype"];//产品型号 + + // //创建datatable + // DataRow row; + // DataTable dt = new DataTable(); + // dt.Columns.AddRange(new DataColumn[] { + // new DataColumn("零件图号"), + // new DataColumn("零件批号"), + // new DataColumn("生产厂家") }); + + // string[] collection = arrays.Split('^');//获取 + // if (collection.Length > 0) + // { + // for (int i = 0; i < collection.Length; i++) + // { + // string a = collection[i]; + // string[] a_array = a.Split('&'); + // if (a_array.Length > 2) + // { + // row = dt.NewRow(); + // string materialid = a_array[0].ToString(); + // string betch = a_array[1].ToString(); + // string factory = a_array[2].ToString(); + // row["零件图号"] = materialid; + // row["零件批号"] = betch; + // row["生产厂家"] = factory; + // dt.Rows.Add(row); + // } + // } + + // //修改到数据库 + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // MES.Material_Betch_Update(opName, enginetype, dt); + // } + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialManualUpdateBetch"); + // } + // return text; + //} + + ///// + ///// 获得返修数量信息 + ///// + ///// + //private string GetRepaireNum(string opname) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // MES.OpName_MIS_RepiareNum_Select(opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = dt.Rows[0]["当前数量"].ToString() + "&" + dt.Rows[0]["设置数量"].ToString(); + // return text; + // } + // else + // { + // return text = "0&0"; + // } + // } + // else + // { + // return text = "0&0"; + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetEngineType"); + // } + // return ("" + "&" + ""); + //} + + ///// + ///// 插入返修数量 + ///// + ///// + //private string Insert_RepiareNum(string opnameValue, string selectValue) + //{ + // string text = ""; + // try + // { + // //string selectValue = HttpContext.Current.Request["CurrentNum"];//选择值 + // if (selectValue == "") + // { + // selectValue = "0"; + // } + // int selectValueint = Convert.ToInt32(selectValue); + // bool falg = MES.Insert_RepiareNum(opnameValue, selectValueint); + // if (falg) + // { + // text = "{\"falg\":\"1\"}"; + // } + // else + // { + // text = "{\"falg\":\"0\"}"; + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_RepiareNum"); + // } + // return text; + //} + + ///// + ///// 初始化返修选择tree数据 + ///// + ///// + //private string Init_TreeData(string opnameValue) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt; + // //string opnameValue = HttpContext.Current.Request["Opname"];//工位号 + // MES.Init_TreeData(opnameValue, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Init_TreeData"); + // } + // return text; + //} + + ///// + ///// 返修上线--初始化质量数据 + ///// + ///// + //private string Quality_Select_Repair(string OpName, string EngineID) + //{ + // string text = ""; + // try + // { + // DataTable dt; + // MES.QualitySelect(OpName, EngineID, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // text = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Quality_Select_Repair"); + // } + // return text; + //} + + ///// + ///// 返修上线-将选择的根节点数据更新到数据库中 + ///// + ///// + //private string Insert_selectTreeData(string opName, string engineTypeId, string selectIdsArray) + //{ + // string text = ""; + // try + // { + // //string engineTypeId = HttpContext.Current.Request["engineTypeId"];//产品型号代码 + // //string selectIdsArray = HttpContext.Current.Request["selectId"];//选中的节点数据数据 + // //创建datatable + // DataRow row; + // DataTable dt = new DataTable(); + // dt.Columns.AddRange(new DataColumn[] { + // new DataColumn("工位号"), + // new DataColumn("产品型号代码"), + // new DataColumn("序号") }); + // string[] collection = selectIdsArray.Split(',');//获取 + // if (collection.Length > 0) + // { + // for (int i = 0; i < collection.Length - 1; i++) + // { + // string idValue = collection[i]; + // row = dt.NewRow(); + // string opNameValue = opName; + // int engineTypeIdValue = Convert.ToInt32(engineTypeId); + // int selectId = Convert.ToInt32(idValue); + // row["工位号"] = opNameValue; + // row["产品型号代码"] = engineTypeIdValue; + // row["序号"] = selectId; + // dt.Rows.Add(row); + // } + // //修改到数据库 + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // MES.Insert_selectTreeData(dt); + // } + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Insert_selectTreeData"); + // } + + // return text; + //} + + ///// + ///// 质量报警_根据按钮获取详细信息 20170318 + ///// + ///// + //public static string QualityDataButton_bgColor_alert_Select(string opname) + //{ + // string text = ""; + // try + // { + // System.Data.DataTable dt = null; + // //单号 + // //string opname = HttpContext.Current.Request["value"]; + // //string lineout_barcode = HttpContext.Current.Request["lineout_barcode"]; + // MES.QualityDataButton_bgColor_alert_Select(opname, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count >= 0) + // { + // text = Buttons.Createbuttons_alert(dt); + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:QualityDataButton_bgColor_alert_Select"); + // } + // return text; + //} + + ///// + ///// 获取对应工位的物料数据_根据发动机 20170319 + ///// + ///// + //private string MaterialDataSelect_F_EnergineID(string opname, string energineID) + //{ + // string qualitydata = ""; + // try + // { + // System.Data.DataTable dt = null; + // //string energineID = HttpContext.Current.Request["value"]; + // MES.MaterialDataSelect_F_EnergineID(opname, energineID, out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // qualitydata = JsonHelper.CreateJsonParameters(dt); + // } + // } + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialDataSelect"); + // } + // return qualitydata; + //} + + ///// + ///// 获取操作指南的PDF路径 + ///// + ///// + //private string GetPdfSrc(string OpName) + //{ + // string PdfSrc = ""; + // try + // { + // System.Data.DataTable dt = null; + + // string orderNum = ""; + // int EngineTypeID = 0; + // string EngineType = ""; + // string EngineID = ""; + // string PartPallet_Code = ""; + // int IsrepairBarcode = 0; + // string repairBarcode = ""; + // string EngineTypeString = ""; + // MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + // BaseDataSystemMES.GetPdfSrc(OpName, EngineTypeID.ToString(), out PdfSrc); + // } + // catch (Exception err) + // { + // //ApplicationLog.WriteLog(err, "MesWebFun_baseFun:GetPdfSrc"); + // } + // return PdfSrc; + //} + + + + #region 目前有用的函数 + + /// + /// 查询托盘信息 + /// + /// + public static string MobySelect(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + data = orderNum + "&" + EngineTypeID + "&" + EngineType + "&" + EngineID + "&" + PartPallet_Code + "&" + IsrepairBarcode + "&" + repairBarcode + "&" + + workCode + "&" + projectName + "&" + splitCode + "&" + unidCode + "&" + engineType + "&" + engineTypeModel + "&" + startTime; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MobySelect"); + } + return data; + } + + /// + /// 查询操作图片 + /// + /// + public static string PictureShow(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + byte[] imgBytesIn; + MisDataFun.GetImageFile(OpName, EngineTypeID, out imgBytesIn); + if (imgBytesIn == null) + { + return data; + } + data = Convert.ToBase64String(imgBytesIn); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:PictureShow"); + } + return data; + } + + /// + /// 查询物料 + /// + /// + public static string MaterialList(string OpName) + { + string jsonStr_Materail = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + DataTable dt_Material; + MisDataFun.PartMaterialVerify_Select(OpName, EngineTypeID, EngineType, out dt_Material); + if (dt_Material != null) + { + if (dt_Material.Rows.Count > 0) + { + jsonStr_Materail = JsonHelper.CreateJsonParameters(dt_Material); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialList"); + } + return jsonStr_Materail; + } + /// + /// 查询操作指南 + /// + /// + public static string ProcessList(string OpName) + { + string jsonStr_Process = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + + DataTable dt_Proccess; + MisDataFun.Process_Select(OpName, EngineTypeID, EngineType, out dt_Proccess); + if (dt_Proccess != null) + { + if (dt_Proccess.Rows.Count > 0) + { + jsonStr_Process = JsonHelper.CreateJsonParameters(dt_Proccess); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ProcessList"); + } + return jsonStr_Process; + } + /// + /// 创建动态div + /// + /// + public static string ShaftPotion_Select(string OpName) + { + string text = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + + DataTable dt; + MisDataFun.ShaftPositionSelect(OpName, EngineTypeID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShaftPotion_Select"); + } + return text; + } + /// + /// 实时显示质量数据 + /// + /// + public static string Quality_Select(string OpName) + { + string text = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string workCode = ""; // 制造编号 + string projectName = ""; // 项目名称 + string splitCode = ""; // 间隔号 + string unidCode = ""; // 单元号 + string engineType = ""; // 本体类型 + string engineTypeModel = ""; // 附件类型 + string startTime = ""; // 开始时间 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, + out workCode, out projectName, out splitCode, out unidCode, out engineType, out engineTypeModel, out startTime); + + DataTable dt; + MisDataFun.QualitySelect(OpName, EngineID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Quality_Select"); + } + return text; + } + /// + /// 订单完工,上线数量大于计划数量,界面提示 + /// + /// + private string OrderFormList_OrderComplete(string opName) + { + string text = ""; + try + { + int isCompleted;//订单数量是否完全上线 + int num_plan;//计划数量 + int num_complete;//上线数量 + MisDataFun.Select_OrderFormList_OrderComplete(opName, out isCompleted, out num_plan, out num_complete); + text = "{\"isCompleted\":\"" + isCompleted + "\",\"num_plan\":\"" + num_plan + "\",\"num_complete\":\"" + num_complete + "\"}"; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:OrderFormList_OrderComplete"); + } + return text; + } + /// + /// 获得订单信息 + /// + /// + public static string OrderFormList(string opName) + { + string orderlist = ""; + try + { + System.Data.DataTable dt = null; + MisDataFun.OrderFormList_Select(opName, out dt); + //对其进行判断 + if (dt != null) + { + if (dt.Rows.Count > 0) + { + int planCount;//计划数量 + int finishCount;//完成数量 + int isOverCount;//是否超标,0表示未完成,1表示正好完成,2表示超过预期 + int isSelect;//选择标志 + int isCanSelect;//是否有订单选择权限 + string status;//状态 + for (int i = 0; i < dt.Rows.Count; i++) + { + planCount = 0; + finishCount = 0; + isOverCount = 0; + isSelect = 0; + isCanSelect = 0; + status = ""; + + if (dt.Rows[i]["计划数量"].ToString() != "") + { + planCount = Convert.ToInt32(dt.Rows[i]["计划数量"]); + } + if (dt.Rows[i]["完成数量"].ToString() != "") + { + finishCount = Convert.ToInt32(dt.Rows[i]["完成数量"]); + } + if (dt.Rows[i]["选择标志"].ToString() != "") + { + isSelect = Convert.ToInt32(dt.Rows[i]["选择标志"]); + } + if (dt.Rows[i]["订单选择权限"].ToString() != "") + { + isCanSelect = Convert.ToInt32(dt.Rows[i]["订单选择权限"]); + } + if (isSelect == 1)//表示选择当前订单,显示"√" + { + status = "√"; + } + if (finishCount == planCount)//完成数量>计划数量则表示超标 + { + isOverCount = 1; + } + if (finishCount > planCount)//完成数量>计划数量则表示超标 + { + isOverCount = 2; + } + //重新赋值 + dt.Rows[i]["状态"] = status; + dt.Rows[i]["是否超标"] = isOverCount;//0表示未完成,1表示正好完成,2表示超过预期 + dt.Rows[i]["选择标志"] = isSelect; + dt.Rows[i]["订单选择权限"] = isCanSelect; + } + } + } + + orderlist = JsonHelper.CreateJsonParameters(dt); + //orderlist = CreateJsonParameters(dt); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:OrderFormList"); + } + return orderlist; + } + /// + /// 消息提醒 + /// + /// + public static string ShowWindowNotice(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MisDataFun.ShowWindowNotice(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowWindowNotice"); + } + return text; + } + /// + /// 消息滚动 + /// + /// + public static string ShowLEDNotice(string opname) + { + string text = ""; + try + { + DataTable dt = null; + MisDataFun.ShowLEDNotice(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowLEDNotice"); + } + return text; + } + /// + /// 物料检测 + /// + /// + public static string MaterialCheckPosition(string OpName) + { + string text = ""; + try + { + DataTable dt; + MisDataFun.MaterialCheckSelect(OpName, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialCheckPosition"); + } + return text; + } + + + + + + + + + + + + + + #endregion + + + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/MIS.SendMessage.cs b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/MIS.SendMessage.cs new file mode 100644 index 0000000..120fb56 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/MIS.SendMessage.cs @@ -0,0 +1,100 @@ +using System; +using System.Data; +using System.Collections; +//using BasicData; +////using bizFacade; +//using SystemFramework; +using System.Configuration; +//using MesWork; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Receiving; +using MQTTnet; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + public partial class MIS_SendMessage + { + /// + /// + /// + public static string MqttTargetTopic = ConfigurationManager.AppSettings["MqttTargetTopic"]; + /// + /// + /// + static new MesWebFun_base.MisWebInterface misWebInterface = new MesWebFun_base.MisWebInterface(); + /// + /// + /// + static readonly Object locker = new Object(); + /// + /// 发消息给通讯服务器 + /// + /// + public static string asyncSendMessage(string Message) + { + lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + Task.Run(() => Mqtt.Publish(topic, Message)); + + var responseStr = misWebInterface.WebSocket_Function(Message); + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + return responseStr; + } + } + + public static string asyncSendMessageDemo(string Message) + { + lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + + //Mqtt.Publish(topic, Message); + string responseStr = ""; + //var responseStr = misWebInterface.WebSocket_Function(Message); + //if (responseStr.Length > 0) + //{ + + // Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}"); + //} + return responseStr; + } + } + + /// + /// 发消息给通讯服务器 + /// + /// + public static string asyncSendMessageQos0(string Message) + { + lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + Mqtt.PublishQos0(topic, Message); + + return ""; + } + } + + + + } +} + diff --git a/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/Mqtt.cs b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/Mqtt.cs new file mode 100644 index 0000000..e6a69e6 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/Mqtt.cs @@ -0,0 +1,281 @@ + +using MQTTnet; +using MQTTnet.Client; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Options; +using MQTTnet.Client.Receiving; +using MQTTnet.Extensions.ManagedClient; +using MQTTnet.Formatter; + +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + public class Mqtt + { + /// + /// + /// + public static IManagedMqttClient mqttClient = null; + public static string MqttUrl = ConfigurationManager.AppSettings["MqttUrl"]; + /// + /// + /// + public static string topic = ""; + + + /// + /// + /// + /// + /// + public static async Task StartAsync() + { + string uri = MqttUrl; + //127.0.0.1:18083,123 + var array = uri.Split(new char[] { ':', ',' }); + string mqttUser = "MisDataFun"; + string mqttPassword = ""; + var options = new MqttClientOptions + { + ClientId = "MisDataFun-200170511", + ProtocolVersion = MqttProtocolVersion.V311, + ChannelOptions = new MqttClientTcpOptions { Server = array[0], Port = Convert.ToInt32(array[1]) }, + CleanSession = false, + SessionExpiryInterval = 300, + KeepAlivePeriod = TimeSpan.FromSeconds(20), + Credentials = new MqttClientCredentials + { + Username = mqttUser, + Password = Encoding.UTF8.GetBytes(mqttPassword) + } + }; + mqttClient = new MqttFactory().CreateManagedMqttClient(); + + //mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); + //mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); + //mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); + await mqttClient.StartAsync(new ManagedMqttClientOptions { ClientOptions = options }); + topic = array[2]; + await mqttClient.SubscribeAsync(new MqttTopicFilter { Topic = topic }); + + } + + + /// + /// + /// + /// + /// + /// + public static async Task Publish(string publish_topic, string publish_msg) + { + if (mqttClient != null) + { + try + { + await mqttClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithExactlyOnceQoS().Build()); + + } + catch (Exception err) + { + + } + } + } + /// + /// + /// + /// + /// + /// + public static async Task PublishQos0(string publish_topic, string publish_msg) + { + if (mqttClient != null) + { + await mqttClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithAtLeastOnceQoS().Build()); + } + } + /// + /// + /// + /// + public static async Task StopAsync() + { + if (mqttClient != null) + { + await mqttClient.UnsubscribeAsync(new string[] { topic }); + await mqttClient.StopAsync(); + } + } + ///// + ///// + ///// + ///// + //private static void OnSubscriberConnected(MqttClientConnectedEventArgs x) + //{ + // var rec = x.AuthenticateResult.ResultCode.ToString(); + // // label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) + //{ + // //var rec = x.AuthenticateResult.ResultCode.ToString(); + // //label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) + //{ + // var rec = x.ApplicationMessage.ConvertPayloadToString(); + // // txt_Rec.Text = txt_Rec.Text + rec + System.Environment.NewLine; + + //} + + + + } + + public class Mqtt2 + { + /// + /// + /// + public IManagedMqttClient mqttClient = null; + public string MqttUrl; + /// + /// + /// + public string topic = ""; + + public Mqtt2() + { + mqttClient = new MqttFactory().CreateManagedMqttClient(); + } + /// + /// + /// + /// + /// + public async Task StartAsync() + { + string uri = MqttUrl; + //127.0.0.1:18083,123 + var array = uri.Split(new char[] { ':', ',' }); + string mqttUser = ""; + string mqttPassword = ""; + var options = new MqttClientOptions + { + ClientId = Guid.NewGuid().ToString(), + ProtocolVersion = MqttProtocolVersion.V311, + ChannelOptions = new MqttClientTcpOptions { Server = array[0], Port = Convert.ToInt32(array[1]) }, + CleanSession = true, + KeepAlivePeriod = TimeSpan.FromSeconds(100), + Credentials = new MqttClientCredentials + { + Username = mqttUser, + Password = Encoding.UTF8.GetBytes(mqttPassword) + } + }; + //mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); + //mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); + //mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); + await mqttClient.StartAsync(new ManagedMqttClientOptions { ClientOptions = options }); + //topic = array[2]; + await mqttClient.SubscribeAsync(new MqttTopicFilter { Topic = topic }); + + } + + + /// + /// + /// + /// + /// + /// + public async Task Publish(string publish_topic, string publish_msg) + { + if (mqttClient != null) + { + try + { + await mqttClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithExactlyOnceQoS().Build()); + + } + catch (Exception err) + { + + } + } + } + //static public async Task Publish(IManagedMqttClient mqttClient_1, string publish_topic, string publish_msg) + //{ + // if (mqttClient_1 != null) + // { + // try + // { + // await mqttClient_1.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(publish_topic).WithPayload(publish_msg).WithExactlyOnceQoS().Build()); + + // } + // catch (Exception err) + // { + + // } + // } + //} + /// + /// + /// + /// + public async Task StopAsync() + { + if (mqttClient != null) + { + await mqttClient.UnsubscribeAsync(new string[] { topic }); + await mqttClient.StopAsync(); + } + } + ///// + ///// + ///// + ///// + //private static void OnSubscriberConnected(MqttClientConnectedEventArgs x) + //{ + // var rec = x.AuthenticateResult.ResultCode.ToString(); + // // label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) + //{ + // //var rec = x.AuthenticateResult.ResultCode.ToString(); + // //label_State.Text = rec; + //} + ///// + ///// + ///// + ///// + //private static void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) + //{ + // var rec = x.ApplicationMessage.ConvertPayloadToString(); + // // txt_Rec.Text = txt_Rec.Text + rec + System.Environment.NewLine; + + //} + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessage.cs b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessage.cs new file mode 100644 index 0000000..d5d8ee6 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessage.cs @@ -0,0 +1,666 @@ +using MisDataFunDll; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + + /// + /// 命令 + ///显示托盘信息√ case "ShowMoby": + ///显示操作指南√ case "ProcessList": + ///显示物料√ case "MaterialList": + ///显示操作图片√ case "PicShow": + ///显示拧紧位置√ case "ShaftPosition": + ///实时显示质量数据√ case "ShowTimelyQuality": + ///手动拧紧实时显示质量数据√case "ShowTimelyQuality_Tight": + ///√ case "OrderFormList": + ///弹窗消息√ case "Notice": + ///LED消息提醒√ case "ScrollNotice": + ///物料检测初始化√ case "MaterialCheckPosition": + ///返修质量数据显示√ case "RepairQuality" + /// + /// + public class SendMessage + { + /// + /// MES/InstantMessaging/BQ + /// + public static string MqttTargetTopic = ConfigurationManager.AppSettings["MqttTargetTopic"]; + + /// + /// 5 显示订单、机型信息 上线工位 + /// + /// + public static void ShowMoby_FirstOpName(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = ShowMoby_String_FirstOpName(opName); + string cmd = "ShowMoby"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + /// + /// 5 显示订单、机型信息 非上线工位 + /// + /// + public static void ShowMoby(string opName, int type = 1) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = ShowMoby_String(opName, type); + string cmd = "ShowMoby"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + public static void MaterialList_Dif(string opName, string msgText) + { + var topic = $"{MqttTargetTopic}/{opName}"; + string cmd = "MaterialList_Dif"; + if (msgText.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{msgText}")); + } + } + public static void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + MisDataFun.Web_Notice_Insert(opname, notice); + Notice(opname); + } + public static void Notice(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = Notice_String(opName); + string cmd = "Notice"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + /// + /// 1(直接在界面通过选择机型确认工序内容) + /// + /// + public static void ProcessList(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = ProcessList_String(opName); + string cmd = "ProcessList"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + public static void ProcessList_FirstOpName(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = ProcessList_String_FirstOpName(opName); + string cmd = "ProcessList"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + /// + /// 2显示物料 + /// + /// + public static void MaterialList(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = MaterialList_String(opName); + string cmd = "MaterialList"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + + } + public static void MaterialList_FirstOpName(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = MaterialList_String_FirstOpName(opName); + string cmd = "MaterialList"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + + } + /// + /// 3显示操作指导图片 + /// + /// + public static void PicShow(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = PicShow_String(opName); + string cmd = "PicShow"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + public static void PicShow_FirstOpName(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = PicShow_String_FirstOpName(opName); + string cmd = "PicShow"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + + /// + /// 4订单完工模块刷新完成数量 + /// + /// + public static void OrderFormList(string opName) + { + var topic = $"{MqttTargetTopic}/{opName}"; + var responseStr = OrderFormList_String(); + string cmd = "OrderFormList"; + if (responseStr.Length > 0) + { + Task.Run(() => Mqtt.Publish(topic, $"MES|{cmd}_Resources|{opName}|{responseStr}")); + } + } + + //实时显示质量数据√ + public static void ShowTimelyQuality(string opName) + { + + } + + public static void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + //if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + + MisDataFun.OpNameCount_BQ(OpName, out opNameCount, out opNameCountTime); //基本数据_工作日历_班次产量查询_New + + SendInfomation("ActuallyCount", opNameCount.ToString() + "&" + opNameCountTime.ToString(), OpName); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function01:SendActuallyCount"); + } + } + } + + public static void SendInfomation(string Command, string Value, string OpName) + { + + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + } + + public static void AsyncSendMessage(string Message) + { + //lock (locker) + { + //"MES|MachinePlan|OpName|Value + var array = Message.Split('|'); + var cmd = array[1]; + var opName = array[2]; + var topic = $"{MqttTargetTopic}/{opName}"; + Task.Run(() => Mqtt.Publish(topic, Message)); + + } + + + } + private static string ProcessList_String(string OpName) + { + string jsonStr_Process = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + DataTable dt_Proccess; + + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.Process_Select(OpName, EngineTypeID, EngineType, out dt_Proccess); + if (dt_Proccess != null) + { + if (dt_Proccess.Rows.Count > 0) + { + jsonStr_Process = JsonHelper.CreateJsonParameters(dt_Proccess); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ProcessList"); + } + return jsonStr_Process; + } + private static string ProcessList_String_FirstOpName(string OpName) + { + string jsonStr_Process = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + DataTable dt_Proccess; + + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.Process_Select(OpName, EngineTypeID, EngineType, out dt_Proccess); + if (dt_Proccess != null) + { + if (dt_Proccess.Rows.Count > 0) + { + jsonStr_Process = JsonHelper.CreateJsonParameters(dt_Proccess); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ProcessList"); + } + return jsonStr_Process; + } + // + private static string PicShow_String(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + byte[] imgBytesIn; + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.GetImageFile(OpName, EngineTypeID, out imgBytesIn); + if (imgBytesIn == null) + { + return data; + } + data = Convert.ToBase64String(imgBytesIn); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:PictureShow"); + } + return data; + } + + private static string PicShow_String_FirstOpName(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + byte[] imgBytesIn; + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.GetImageFile(OpName, EngineTypeID, out imgBytesIn); + if (imgBytesIn == null) + { + return data; + } + data = Convert.ToBase64String(imgBytesIn); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:PictureShow"); + } + return data; + } + /// + /// 上线工位 + /// + /// + /// + private static string ShowMoby_String(string OpName, int type = 1) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + //非上线工位 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + data = orderNum + "&" + EngineTypeID + "&" + EngineType + "&" + EngineID + "&" + PartPallet_Code + "&" + IsrepairBarcode + "&" + repairBarcode + "&" + EngineTypeString; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MobySelect"); + } + return data; + } + private static string ShowMoby_String_FirstOpName(string OpName) + { + string data = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + //上线工位 + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + data = orderNum + "&" + EngineTypeID + "&" + EngineType + "&" + EngineID + "&" + PartPallet_Code + "&" + IsrepairBarcode + "&" + repairBarcode + "&" + EngineTypeString; + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MobySelect"); + } + return data; + } + private static string MaterialList_String(string OpName) + { + string jsonStr_Materail = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.PartMaterialVerify_Select(OpName, EngineTypeID, EngineType, out DataTable dt_Material); + if (dt_Material != null) + { + if (dt_Material.Rows.Count > 0) + { + jsonStr_Materail = JsonHelper.CreateJsonParameters(dt_Material); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialList"); + } + return jsonStr_Materail; + } + private static string MaterialList_String_FirstOpName(string OpName) + { + string jsonStr_Materail = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.PartMaterialVerify_Select(OpName, EngineTypeID, EngineType, out DataTable dt_Material); + if (dt_Material != null) + { + if (dt_Material.Rows.Count > 0) + { + jsonStr_Materail = JsonHelper.CreateJsonParameters(dt_Material); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:MaterialList"); + } + return jsonStr_Materail; + } + + private static string ShowTimelyQuality_String(string OpName) + { + string text = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + DataTable dt; + + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.QualitySelect(OpName, EngineID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Quality_Select"); + } + return text; + } + private static string ShowTimelyQuality_String_FirstOpName(string OpName) + { + string text = ""; + try + { + string orderNum = ""; + int EngineTypeID = 0; + string EngineType = ""; + string EngineID = ""; + string PartPallet_Code = ""; + int IsrepairBarcode = 0; + string repairBarcode = ""; + string EngineTypeString = ""; + DataTable dt; + MisDataFun.Moby_Select(OpName, out orderNum, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out IsrepairBarcode, out repairBarcode, out EngineTypeString); + MisDataFun.QualitySelect(OpName, EngineID, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.CreateJsonParameters(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Quality_Select"); + } + return text; + } + + private static string OrderFormList_String() + { + string enginetypelist = ""; + try + { + System.Data.DataTable dt = null; + MisDataFun.EngineType_Select(out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + enginetypelist = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:Orderenginetypeselect"); + } + return enginetypelist; + } + + /// + /// 消息提醒 + /// + /// + private static string Notice_String(string opname) + { + string text = ""; + try + { + System.Data.DataTable dt = null; + MisDataFun.ShowWindowNotice(opname, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + text = JsonHelper.DataTableToJson(dt); + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MesWebFun_baseFun:ShowWindowNotice"); + } + return text; + } + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + void Sendmessage(string MessageNumm, string Value, string OpName) + { + for (int i = 0; i < MessageNumm.Length; i++) + { + Sendmessage(MessageNumm[i], Value[i].ToString(), OpName); + + } + } + + /// + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + static void Sendmessage(char Num, string Value, string OpName) + { + string SendMessage; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + + case '3': + + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '4': + //3显示操作指导图片 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '8': + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case 'b': + SendMessage = "MES|ShaftPosition|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case 'c': + SendMessage = "MES|ShowQuality|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + } + } + ///// + ///// 发送信息到MES通讯服务器或者其他的 + ///// + ///// + //static private void AsyncSendMessage1(string Message) + //{ + // MIS_BASE.asyncSendMessage(Message); + //} + + + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessageFun.cs b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessageFun.cs new file mode 100644 index 0000000..af96e4a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/12SendMessageToWeb/SendMessageFun.cs @@ -0,0 +1,249 @@ +using MisDataFunDll; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + /// + /// 命令 + ///显示托盘信息√ case "ShowMoby": + ///显示操作指南√ case "ProcessList": + ///显示物料√ case "MaterialList": + ///显示操作图片√ case "PicShow": + ///显示拧紧位置√ case "ShaftPosition": + ///实时显示质量数据√ case "ShowTimelyQuality": + ///手动拧紧实时显示质量数据√case "ShowTimelyQuality_Tight": + ///√ case "OrderFormList": + ///弹窗消息√ case "Notice": + ///LED消息提醒√ case "ScrollNotice": + ///物料检测初始化√ case "MaterialCheckPosition": + ///返修质量数据显示√ case "RepairQuality" + /// + /// + public class SendMessageFun + { + /// + /// 批量发送WEB消息(Value为BOOL值) + /// 1:显示工序内容 + /// 2:显示物料 + /// 3:显示操作指导图片 + /// 5:显示机型、工件流水号、订单信息 + /// c:显示质量数据 + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + static public void SendMessage(string MessageNumm, string Value, string OpName) + { + for (int i = 0; i < MessageNumm.Length; i++) + { + SendMessageFun.SendMessage(MessageNumm[i], Value[i].ToString(), OpName); + + } + } + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + static public void SendInfomation(string Command, string Value, string OpName) + { + + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + } + + static public void AsyncSendMessage_Notice(string opname, string notice, string noticeType = "misServer") + { + //通知Web界面 + notice = $"{{\"Notice\":\"{notice}\",\"NoticeType\":\"{noticeType}\"}}"; + + MisDataFun.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice_Info|" + opname + "|" + notice; + MIS_SendMessage.asyncSendMessage(SendMessage); + } + /// + /// + /// + /// + /// + /// barcode mis + static public void AsyncSendMessage_Notice_Error(string opname, string notice, string noticeType) + { + //通知Web界面 + // notice: notice, noticeType: noticeType + + notice = $"{{\"Notice\":\"{notice}\",\"NoticeType\":\"{noticeType}\"}}"; + + MisDataFun.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice_Error|" + opname + "|" + notice; + MIS_SendMessage.asyncSendMessage(SendMessage); + } + /// + /// 选择发送给WEB的消息 + /// 1:显示工序内容 + /// 2:显示物料 + /// 3:显示操作指导图片 + /// 5:显示机型、工件流水号、订单信息 + /// c:显示质量数据 + /// + /// 消息类型 + /// 消息工位 + static void SendMessage(char Num, string Value, string OpName) + { + string SendMessage; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + + case '3': + + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '4': + //3显示操作指导图片 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '8': + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case 'b': + SendMessage = "MES|ShaftPosition|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case 'c': + //SendMessage = "MES|ShowQuality|" + OpName + "|" + Value; + SendMessage = "MES|ShowTimelyQuality|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + } + } + + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + //void SendInfomation(string Command, string Value, string OpName) + //{ + + // string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + //} + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + + MisDataFun.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); //基本数据_工作日历_班次产量查询_New + + SendInfomation("ActuallyCount", opNameCount.ToString() + "&" + opNameCountTime.ToString(), OpName); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function01:SendActuallyCount"); + } + } + } + + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + static public void AsyncSendMessage(string Message) + { + MIS_SendMessage.asyncSendMessage(Message); + } + + ///// + ///// 发送提示消息 + ///// + ///// + //static public void AsyncSendMessage_Notice(string opname, string notice) + //{ + // //通知Web界面 + // BaseDataSystemMES.Web_Notice_Insert(opname, notice); + // string SendMessage = "MES|Notice|" + opname + "|" + "1"; + // MIS_BASE.asyncSendMessage(SendMessage); + //} + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + + + } +} + diff --git a/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.Alarm.cs b/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.Alarm.cs new file mode 100644 index 0000000..bd04a2f --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.Alarm.cs @@ -0,0 +1,247 @@ +using DataLinkMesWork1; +using MesServerFunctions; +using MesServerWork; +using MisDataFunDll; +using Newtonsoft.Json; +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace MisDataSaveDate +{ + public partial class FuntionMesRead + { + + #region 2023.05.14,新增报警 + + public static Hashtable Base_TagIdList = new Hashtable(); + public static Hashtable Base_ObjList = new Hashtable(); + + + public static void GetAlarmInit() + { + Base_TagIdList.Clear(); + GetTagIdList("", out DataTable dt); + + for (int i = 0; i < dt.Rows.Count; i++) + { + string tagid = dt.Rows[i]["TagID"].ToString(); + + if (tagid[0].ToString() == "9") + { + var opName = dt.Rows[i]["工位号"].ToString(); + var ItemName = dt.Rows[i]["测量项目"].ToString(); // 报警内容 + var ShaftID = dt.Rows[i]["测量位置"].ToString(); // 报警类型 + + string SendMessage = "MES|PlcAlarm|" + opName + "|" + tagid + "&@TagValue&" + ItemName + "&" + ShaftID; + Base_TagIdList.Add(tagid, SendMessage); + + //在存一份报警对象到键值对中 + Base_ObjList.Add(tagid, dt.Rows[i]); + } + } + } + + //public static void Send_AlarmMsg(string tagid, string tagVvalue) + //{ + // var val = Base_TagIdList[tagid]; + // if (val != null) + // { + // //var msg = Base_TagIdList[tagid].ToString(); + // //var sendmsg = msg.Replace("@TagValue", tagVvalue); + // //SendMessageFun.AsyncSendMessage(sendmsg); + // string alarmTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + // var msg = Base_TagIdList[tagid].ToString(); + // var sendmsg = msg.Replace("@TagValue", tagVvalue) + "&" + alarmTime; + // SendMessageFun.AsyncSendMessage(sendmsg); + // // 去存一份记录到数据库 + // DataRow errObj = (DataRow)Base_ObjList[tagid]; + // MisDataFun.Alarm_Insert2(Convert.ToInt32(errObj["TagID"]), errObj["工位号"].ToString(), errObj["测量项目"].ToString(), Convert.ToInt32(tagVvalue), errObj["测量位置"].ToString()); + // } + //} + public static DataRow Send_AlarmMsg(string tagid, string tagVvalue) + { + var val = Base_TagIdList[tagid]; + DataRow errObj = null; + if (val != null) + { + //var msg = Base_TagIdList[tagid].ToString(); + //var sendmsg = msg.Replace("@TagValue", tagVvalue); + //SendMessageFun.AsyncSendMessage(sendmsg); + + var msg = Base_TagIdList[tagid].ToString(); + var sendmsg = msg.Replace("@TagValue", tagVvalue); + SendMessageFun.AsyncSendMessage(sendmsg); + // 去存一份记录到数据库 + errObj = (DataRow)Base_ObjList[tagid]; + + MisDataFun.Alarm_Insert2(Convert.ToInt32(errObj["TagID"]), errObj["工位号"].ToString(), errObj["测量项目"].ToString(), Convert.ToInt32(tagVvalue), errObj["测量位置"].ToString()); + } + return errObj; + } + + + + static public void GetTagIdList(string opName, out DataTable dt) + { + string procedureName; + procedureName = "MES_基本变量_原始数据_根据工位号查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + + + + + #endregion + + public static void Alarm_Insert_Init(string Opname) + { + DataTable dt; + MisDataFun.Alarm_Moby_Search(out dt); + if (dt == null) return; + for (int i = 0; i < dt.Rows.Count; i++) + { + string TagId = dt.Rows[i]["TagId"].ToString(); + object tagValueStr = ""; + string tagValue = "0"; + MIS_BASE.Read_TagValueByTagID(TagId, out tagValueStr); + if (tagValueStr != null) + { + switch (tagValueStr.ToString().ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + Send_AlarmMsg(TagId, tagValue); + } + } + } + + public static void Alarm_InitAlarm_Send(string opName, out Hashtable ht) + { + var tagValues = MIS_BASE.ReadPLC_OpName(opName); + //过滤出来质量数据 //获得带合格标志的质量数据 + var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value); + ht = new Hashtable(); + + foreach (KeyValuePair _cd in keyValues) + { + var tf = _cd.Value; + string TagID = tf.TagID.ToString(); + if (TagID[0].ToString() == "9") + { + string tagValue = tf.TagValue.ToString(); + if (tf.TagValue == null) return; + switch (tagValue.ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + if (tagValue == "1") + { + ht.Add(tf.TagID, tagValue); + } + } + } + } + public static bool Alarm_Insert(string TagID, string tagTypeID, string opName, int TagValue, + DateTime alarmStartTime, DateTime alarmEndTime, int TimeDiff, + string Text1, string Text2, string TagOrderBy) + { + + + string produceName = "测量数据工位报警全部_增加数据"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@TagID", TagID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagTypeID", tagTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@opName", opName); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@alarmStartTime", alarmStartTime); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@alarmEndTime", alarmEndTime); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@TimeDiff", TimeDiff); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Text1", Text1); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@Text2", Text2); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@TagOrderBy", TagOrderBy); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + + return true; + } + return false; + } + + /// + /// 报错详细工件记录日志 (有可能报错 所以封装) + /// + /// 1.申请上线 2.传递机型 3.允许保存 4.扫码 + /// + public static void Alarm_SaveFileLog4Error(string errorStep, object e, string FunName, Exception err) + { + try + { + MyLog4Net.MyLogHelper.Error($"{FunName}异常:", $"Message:{err.Message} InnerException: {err.InnerException}"); + string leftErrorStep; + if (errorStep == "PartLoad") + { + leftErrorStep = "申请上线"; + } + else if (errorStep == "EngineGetOver") + { + leftErrorStep = "传递机型"; + } + else if (errorStep == "MesRead") + { + leftErrorStep = "允许保存"; + } + else if (errorStep == "Barcode") + { + leftErrorStep = "扫码"; + } + else + { + leftErrorStep = $"未知类型{errorStep}"; + } + + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + MIS_BASE.GetEngineTypeFromPLC(OpName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code, out string OrderForm); + MyLog4Net.MyLogHelper.Error($"{FunName}{leftErrorStep}操作异常:", $"工位号:{OpName}、总成号:{EngineID}、机型:{EngineType}、机型代码:{EngineTypeID}、订单号:{OrderForm}、托盘号:{PartPallet_Code}"); + + string saveString = $"{FunName}{leftErrorStep}操作异常 Message:{err.Message} InnerException: {err.InnerException}:工位号:{OpName}、总成号:{EngineID}、机型:{EngineType}、机型代码:{EngineTypeID}、订单号:{OrderForm}、托盘号:{PartPallet_Code}"; + var sql = + $"INSERT INTO 合力_系统日志 ([工位号],[日志类型],[日志文本])"+ + $" VALUES('{OpName}', 'system', '{saveString}')"; + DataAccess.ExecuteDataTable(sql, out DataTable dt); + } + catch (Exception ex) + { + MyLog4Net.MyLogHelper.Error($"{FunName}保存错误日志失败:", $"Message:{ex}"); + } + } + + public static void Alarm_SystemError(string FunName, Exception err) + { + MyLog4Net.MyLogHelper.Error($"系统{FunName}方法异常:", $"Message:{err.Message} InnerException:{err.InnerException}"); + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.MesRead.cs b/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.MesRead.cs new file mode 100644 index 0000000..3866226 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/Funtion.MesRead.cs @@ -0,0 +1,635 @@ +using BasicData; +using MesServerFunctions; +using MesServerWork; +using MisDataFunDll; +using Newtonsoft.Json; +using OpcBasic; +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using DataLinkMesWork1; + +using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskBand; + +namespace MisDataSaveDateMesRead +{ + public partial class Funtion + { + + + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + public static int MesRead(string opName, string tagValue, string tagid, bool isCheck = false) + { + int qualityMask = 0; + + qualityMask = SaveQualityData(opName, Convert.ToInt32(tagValue), tagid, isCheck); + + + //if (tagValue == "0") + //{ + // MIS_BASE.Write_TagTypeID(20, opName, false); + //} + //else + //{ + // qualityMask = SaveQualityData(opName, Convert.ToInt32(tagValue), tagid, isCheck); + // MIS_BASE.Write_TagTypeID(20, opName, true); + //} + return qualityMask; + } + public static string GetRealTimeQualityData(string opName) + { + string message = ""; + DataTable dt1 = new DataTable(); + DataTable dt_WWW; + DataTable dt_WWW_Copy1; + DataTable dt_WWW_Copy2; + Hashtable valueList; + try + { + //读取工位全部数据 + var rtList = MIS_BASE.ReadPLC_OpName(opName); //GetDbAndMaxLengthByOpNameByBytes(opName); + var pp = JsonConvert.SerializeObject(rtList); + var tagValues = JsonConvert.DeserializeObject>(pp); + //过滤出来质量数据 //获得带合格标志的质量数据 + valueList = ReadPLC_OpName_Qd(tagValues); + + //获得带基本信息的质量数据表 + GetQualityDataTable(valueList, opName, MIS_BASE.BasicDataTagValue, MIS_BASE.BasicDataTagValueUpDown, out dt_WWW); + + dt_WWW_Copy1 = dt_WWW.Copy().Select("变量排序 = 1").CopyToDataTable(); + DataView dv1 = dt_WWW_Copy1.DefaultView; + dv1.Sort = "列位置 DESC"; + dt_WWW_Copy1 = dv1.ToTable(); + + dt_WWW_Copy2 = dt_WWW.Copy().Select("变量排序 = 2").CopyToDataTable(); + DataView dv2 = dt_WWW_Copy2.DefaultView; + dv2.Sort = "列位置 DESC"; + dt_WWW_Copy2 = dv2.ToTable(); + + dt1.Columns.Add("列位置", System.Type.GetType("System.String")); + dt1.Columns.Add("测量项目1", System.Type.GetType("System.String")); + dt1.Columns.Add("测量项目2", System.Type.GetType("System.String")); + dt1.Columns.Add("合格标志", System.Type.GetType("System.String")); + dt1.Columns.Add("名称", System.Type.GetType("System.String")); + + for (int i = 0; i < dt_WWW_Copy1.Rows.Count; i++) + { + if (Convert.ToInt32(dt_WWW_Copy1.Rows[i]["TagValue"]) > 45) + { + var dr = dt1.NewRow(); + dr["列位置"] = dt_WWW_Copy1.Rows[i]["列位置"].ToString(); + dr["测量项目1"] = dt_WWW_Copy1.Rows[i]["TagValue"].ToString(); + dr["合格标志"] = "1"; + dr["名称"] = dt_WWW_Copy1.Rows[i]["测量项目"].ToString(); + dt1.Rows.Add(dr); + } + } + for (int i = 0; i < dt_WWW_Copy2.Rows.Count; i++) + { + if (Convert.ToInt32(dt_WWW_Copy2.Rows[i]["TagValue"]) > 45) + { + var dr = dt1.NewRow(); + dr["列位置"] = dt_WWW_Copy2.Rows[i]["列位置"].ToString(); + dr["测量项目1"] = dt_WWW_Copy2.Rows[i]["TagValue"].ToString(); + dr["合格标志"] = "1"; + dr["名称"] = dt_WWW_Copy2.Rows[i]["测量项目"].ToString(); + dt1.Rows.Add(dr); + } + } + } + catch (Exception err) + { + } + message = JsonHelper.CreateJsonParameters(dt1); + + return message; + } + /// + /// 返回合格标志 + /// + /// + /// + /// + /// + private static int SaveQualityData(string opName, int tagValue, string tagID, bool isCheck = false) + + { + int id_tagCF; + int qualityMask = 0; + int engineTypeID = 0; + string engineID = ""; + string engineType = ""; + string partPallet = ""; + string orderFormPlc = ""; + DataTable dt_WWW; + Hashtable valueList; + try + { + + //读取工位全部数据 + var rtList = MIS_BASE.ReadPLC_OpName(opName); //GetDbAndMaxLengthByOpNameByBytes(opName); + var pp = JsonConvert.SerializeObject(rtList); + var tagValues = JsonConvert.DeserializeObject>(pp); + //过滤出来质量数据 //获得带合格标志的质量数据 + valueList = ReadPLC_OpName_Qd(tagValues); + + + engineTypeID = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineTypeID))); + engineID = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineID)).ToString(); + engineType = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineType)).ToString(); + orderFormPlc = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.OrderFormPLC)).ToString(); + qualityMask = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.QualityMask))); + + + + //获得带基本信息的质量数据表 + GetQualityDataTable(valueList, opName, MIS_BASE.BasicDataTagValue, + MIS_BASE.BasicDataTagValueUpDown, out dt_WWW); + + DateTime lastupdatetime = DateTime.Now; + //保存质量数 + BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); + BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW, isCheck); + //保存质量数据到 接口表 + MisDataFun.SaveQualityInterfaceData(opName, engineID); + } + catch (Exception err) + { + //MIS_BASE.Write_TagTypeID(20, opName, true); + ////ApplicationLog.WriteLog(err, err.Message); + } + return qualityMask; + } + + public class QualityDataType1 + { + public int tagValueType; + public int tagTypeID; + public string opName; + public string tagID; + public object TagValeNormal; + public object TagValueDown; + public object TagValueUp; + public object Unit; + public object tagValue; + public int tagQuality; + public int tagOrderBy; + public int tagItemOrderBy; + public int tagProperty; + public int isGoodBad; + } + static public void GetQualityDataTable(Hashtable valuList, string opName, DataTable BasicDataTagValue, DataTable BasicDataTagValueUpDown, out DataTable dt) + { + //78 0:屏蔽MES;1:启用MES(必须MIS) + //79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线;0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS) + //41 机体流向标志(1 BYTE):0普通工位:1:上线(发动机上线);2:下线(发动机下线);(必须PLC) + //51 返修工位,修改后的数据MES将数据写入PLC ,MES通知PLC数据修改完成。(YN) + //8 只要返修,必须由mes发送此信号,plc接收此信号后才能放行 + //(暂时没用)用于有扳手拧紧工位。通知设备螺钉拧紧完成。PC已经将数据保存到数据库中。(B5A) + + QualityDataType1 qualityData; + //是否有数据 + //bool isUsing; + + DataRow dr; + DataRow[] dr_WWW; + //MES_基本数据_测量范围 + DataRow[] dr_WWW_UpDown; + + dt = MisDataFun.BuildDataTables_WWW(); + + //测量位置 + string shaftID; + //测量项目 + string item; + //测量单位 + string unit; + //机体类型 + //原始数据中的机型代码 + int engineTypeID_Source; + //上限值 + string tagValueUp; + //下限值 + string tagValueDown; + //理论值 + string tagValeNormal; + //TagValue + // 合格标志 + //string IsGoodBad; + + foreach (DictionaryEntry valueItem in valuList) //ht为一个Hashtable实例 + { + try + { + qualityData = (QualityDataType1)valueItem.Value; + + + //if ((qualityData.tagProperty != 2) || (qualityData.tagProperty != 6)) + //{ + // continue ; + //} + //if ((qualityData.tagProperty == 2) || (qualityData.tagProperty == 6)) + { + //if (engineTypeID == 0) + //{ + // engineTypeID = 1; + //} + dr_WWW = BasicDataTagValue.Select("TagID = " + qualityData.tagID); + //try + //{ + // dr_WWW_UpDown = BasicDataTagValueUpDown.Select("TagID = " + qualityData.tagID); + //} + //catch { dr_WWW_UpDown = null; } + + + //if (dr_WWW.Length > 0) + //{ + // { + // engineTypeID_Source = Convert.ToInt32(dr_WWW[0]["机体类型"]); + // int temp; + // temp = engineTypeID_Source & engineTypeID; + // if (temp == 0) + // { + // continue; + // } + // if (qualityData.isGoodBad == -1) + // { + // continue; + // } + // } + //} + //else + //{ + // continue; + + //} + + try + { + shaftID = dr_WWW[0]["测量位置"].ToString(); + } + catch + { + shaftID = ""; + } + try + { + item = dr_WWW[0]["测量项目"].ToString(); + } + catch + { + item = ""; + } + try + { + unit = dr_WWW[0]["测量单位"].ToString(); + } + catch + { + unit = ""; + } + try + { + tagValueUp = qualityData.TagValueUp.ToString(); + //if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0) + //{ + // tagValueUp = dr_WWW_UpDown[0]["值上限"].ToString(); + //} + //else + //{ + // tagValueUp = ""; + //} + } + catch + { + tagValueUp = ""; + } + try + { + tagValueDown = ""; + tagValueDown = qualityData.TagValueDown.ToString(); + //if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0) + //{ + // tagValueDown = dr_WWW_UpDown[0]["值下限"].ToString(); + //} + } + catch + { + tagValueDown = ""; + } + try + { + tagValeNormal = ""; + tagValeNormal = qualityData.TagValeNormal.ToString(); + //if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0) + //{ + // tagValeNormal = dr_WWW_UpDown[0]["理论值"].ToString(); + //} + + } + catch + { + tagValeNormal = ""; + } + + dr = dt.NewRow(); + + dr["TagID"] = qualityData.tagID; + dr["测量位置"] = shaftID; + dr["测量项目"] = item; + dr["测量单位"] = unit; + dr["上限值"] = tagValueUp; + dr["下限值"] = tagValueDown; + dr["理论值"] = tagValeNormal; + dr["工位号"] = opName; + dr["列位置"] = qualityData.tagOrderBy; + dr["变量排序"] = qualityData.tagItemOrderBy; + + dr["IsGoodBad"] = qualityData.isGoodBad; + + switch (qualityData.tagTypeID)// + { + //合格标志数组 + case 8203: + dr["TagValue"] = MisDataFun.GetQualityData_GoodBad_String((bool[])qualityData.tagValue); + break; + case 8209: + dr["TagValue"] = ""; + break; + //非标准REAL + case 8210: + dr["TagValue"] = MisDataFun.GetNoNormalReal(qualityData.tagValue); + dt.Rows.Add(dr); + break; + default: + dr["TagValue"] = Convert.ToString(qualityData.tagValue); + dt.Rows.Add(dr); + break; + } + + ////福田对质量数据特殊处理,MA20保留4位小数点,其余保留两位 + //if (opName == "J07MA020") + //{ + // dr["TagValue"] = Convert.ToDouble(dr["TagValue"]).ToString("0.####"); + //} + //else + //{ + // dr["TagValue"] = Convert.ToDouble(dr["TagValue"]).ToString("0.##"); + //} + + //if (opName == "J07MA150") + //{ + // dr["变量排序"] = 1; + // dr["IsGoodBad"] = 1; + //} + + + } + + + + } + catch (Exception err) + { + //ApplicationLog.WriteLog(err, err.Message); + } + } + } + /// + /// 数据表 + /// + /// + private static object GetValueByTagTypeCodeID(ConcurrentDictionary opTagList, int TagTypeCodeID) + { + try + { + return opTagList.Where(x => x.Value.TagTypeCodeID == TagTypeCodeID).ToList()[0].Value.TagValue; + + } + catch (Exception err) { return "-3"; } + } + /// + /// 根据工位名称,读取工位对应的质量数据,带合格标志 + /// + /// + /// + public static Hashtable ReadPLC_OpName_Qd(ConcurrentDictionary tagValues) + { + //lock (l) + { + + //var tagValues = DtWebApi.ReadWritePLC.ReadPLC_OpName(opName); //GetDbAndMaxLengthByOpNameByBytes(opName); + + var keyValues = tagValues.Where(x => x.Value.TagTypeCodeID == 105).OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value); + + TagFormat tagFormatTemp; + int tagIndex = 1; + int isOK = 0; + string TagValeNormal = ""; + string TagValueDown = ""; + string TagValueUp = ""; + + Hashtable ht = new Hashtable(); + + for (int i = 0; i < keyValues.Count / 8; i++) + { + isOK = Convert.ToInt32(keyValues.ElementAt(i * 8 + 0).Value.TagValue); + TagValeNormal = keyValues.ElementAt(i * 8 + 3).Value.TagValue.ToString(); + TagValueUp = keyValues.ElementAt(i * 8 + 4).Value.TagValue.ToString(); + TagValueDown = keyValues.ElementAt(i * 8 + 5).Value.TagValue.ToString(); + + var TF1 = keyValues.ElementAt(i * 8 + 1).Value; + QualityDataType1 qualityDataType1; + qualityDataType1 = GetQualityDataType(TF1); + qualityDataType1.isGoodBad = isOK; + qualityDataType1.TagValeNormal = TagValeNormal; + qualityDataType1.TagValueDown = TagValueDown; + qualityDataType1.TagValueUp = TagValueUp; + ht.Add(qualityDataType1.tagID, qualityDataType1); + var TF2 = keyValues.ElementAt(i * 8 + 2).Value; + QualityDataType1 qualityDataType2; + qualityDataType2 = GetQualityDataType(TF2); + qualityDataType2.isGoodBad = isOK; + qualityDataType2.TagValeNormal = TagValeNormal; + qualityDataType2.TagValueDown = TagValueDown; + qualityDataType2.TagValueUp = TagValueUp; + ht.Add(qualityDataType2.tagID, qualityDataType2); + } + + + + //foreach (KeyValuePair _cd in keyValues) + //{ + // if (_cd.Key.ToString()[0].ToString() == "7") + // { + // tagFormatTemp = _cd.Value; + // if (tagIndex % 8 == 1) + // { + // isOK = Convert.ToInt32(tagFormatTemp.TagValue); + // } + // else if (tagIndex % 8 == 2) + // { + // var TF = _cd.Value; + + // QualityDataType qualityDataType; + // qualityDataType = GetQualityDataType(TF); + // qualityDataType.isGoodBad = isOK; + // ht.Add(qualityDataType.tagID, qualityDataType); + // } + // else if (tagIndex % 8 == 3) + // { + // var TF = (TagFormat)_cd.Value; + + // QualityDataType qualityDataType; + // qualityDataType = GetQualityDataType(TF); + // qualityDataType.isGoodBad = isOK; + // ht.Add(qualityDataType.tagID, qualityDataType); + // } + + // tagIndex++; + // } + // //Console.WriteLine($"key:{kv.Key} value:{kv.Value}"); + //} + return ht; + } + } + + //public static Hashtable ReadPLC_OpName_Entite(string opName) + //{ + // //lock (l) + // { + + // var tagValues = DtWebApi.ReadWritePLC.ReadPLC_OpName(opName); //GetDbAndMaxLengthByOpNameByBytes(opName); + + // var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value); + + // TagFormat tagFormatTemp; + // int tagIndex = 1; + // int isOK = 0; + + // Hashtable ht = new Hashtable(); + + + // foreach (KeyValuePair _cd in keyValues) + // { + // if (_cd.Key.ToString()[0].ToString() == "7") + // { + // tagFormatTemp = _cd.Value; + // if (tagIndex % 3 == 1) + // { + // isOK = Convert.ToInt32(tagFormatTemp.TagValue); + // } + // else if (tagIndex % 3 == 2) + // { + // var TF = _cd.Value; + + // QualityDataType qualityDataType; + // qualityDataType = GetQualityDataType(TF); + // qualityDataType.isGoodBad = isOK; + // ht.Add(qualityDataType.tagID, qualityDataType); + // } + // else if (tagIndex % 3 == 0) + // { + // var TF = (TagFormat)_cd.Value; + + // QualityDataType qualityDataType; + // qualityDataType = GetQualityDataType(TF); + // qualityDataType.isGoodBad = isOK; + // ht.Add(qualityDataType.tagID, qualityDataType); + // } + + // tagIndex++; + // } + // //Console.WriteLine($"key:{kv.Key} value:{kv.Value}"); + // } + // return ht; + // } + //} + public static QualityDataType1 GetQualityDataType(TagFormat TF) + { + QualityDataType1 qualityDataType; + + qualityDataType = new QualityDataType1(); + + qualityDataType.tagID = TF.TagID; + qualityDataType.tagTypeID = TF.TagTypeID;//变量类型 + qualityDataType.opName = TF.OpName; + qualityDataType.tagValueType = TF.TagTypeCodeID; + int.TryParse(TF.TagOrderBy, out int TagOrderBy); + qualityDataType.tagOrderBy = TagOrderBy; + int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy); + qualityDataType.tagItemOrderBy = TagItemOrderBy; + qualityDataType.tagValue = TF.TagValue;//变量值 + + return qualityDataType; + } + + public static bool BaseData_tagTable_QualityData_B5A_IndexInsert(string EngineID, string tagID, string EngineType, int EngineTypeID, string opName, int isGoodBad, string PartPalletCode, out int Id_tagCF) + { + string procedureName; + procedureName = "测量数据合格索引_增加"; + Id_tagCF = 0; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString()); + return true; + } + return false; + } + public static bool BaseData_tagTable_QualityData_B5A_Insert(int Id_tagCF, int engineTypeID, string engineID, string opName, DataTable dt, bool IsCheck = false) + { + string procedureName; + procedureName = "测量数据合格_增加"; + SqlParameter[] thisParms = new SqlParameter[15]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", SqlDbType.Int, 4, "TagID"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", SqlDbType.NVarChar, 100, "TagValue"); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", SqlDbType.Int, 4, "IsGoodBad"); + //是否保存无合格标志数据数据 + //thisParms[6] = new System.Data.SqlClient.SqlParameter("@IsCheck", IsCheck); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@测量位置", SqlDbType.NVarChar, 50, "测量位置"); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@测量项目", SqlDbType.NVarChar, 50, "测量项目"); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@工位号", opName); //为了给J07MA020 保留四位精度而设置 + thisParms[9] = new System.Data.SqlClient.SqlParameter("@理论值", SqlDbType.NVarChar, 50, "理论值"); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@上限值", SqlDbType.NVarChar, 50, "上限值"); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@下限值", SqlDbType.NVarChar, 50, "下限值"); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@测量单位", SqlDbType.NVarChar, 50, "测量单位"); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@列位置", SqlDbType.Int, 4, "列位置"); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@变量排序", SqlDbType.Int, 4, "变量排序"); + //table.Columns.Add("TagID", typeof(System.Int32)); + //table.Columns.Add("TagValue", typeof(System.String)); + //table.Columns.Add("IsGoodBad", typeof(System.Int32)); + //table.Columns.Add("测量位置", typeof(System.String)); + //table.Columns.Add("测量项目", typeof(System.String)); + //table.Columns.Add("工位号", typeof(System.String)); + //table.Columns.Add("理论值", typeof(System.String)); + //table.Columns.Add("上限值", typeof(System.String)); + //table.Columns.Add("下限值", typeof(System.String)); + //table.Columns.Add("测量单位", typeof(System.String)); + //table.Columns.Add("列位置", typeof(System.Int32)); + //table.Columns.Add("变量排序", typeof(System.Int32)); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, dt); + } + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/GetQualityData_GoodBad.cs b/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/GetQualityData_GoodBad.cs new file mode 100644 index 0000000..45c05f8 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/13MIS_FuntionSaveData/GetQualityData_GoodBad.cs @@ -0,0 +1,99 @@ +using System; + +using System.Data; + + + +namespace MisDataSaveDateMesRead +{ + + public partial class Funtion + { + /// + /// 数据表 + /// + /// + static public DataTable BuildDataTables_WWW() + { + DataTable table; + DataColumnCollection columns; + table = new DataTable(); + columns = table.Columns; + table.Columns.Add("TagID", typeof(System.String)); + table.Columns.Add("TagValue", typeof(System.String)); + table.Columns.Add("IsGoodBad", typeof(System.Int32)); + table.Columns.Add("测量位置", typeof(System.String)); + table.Columns.Add("测量项目", typeof(System.String)); + table.Columns.Add("工位号", typeof(System.String)); + table.Columns.Add("理论值", typeof(System.String)); + table.Columns.Add("上限值", typeof(System.String)); + table.Columns.Add("下限值", typeof(System.String)); + table.Columns.Add("测量单位", typeof(System.String)); + table.Columns.Add("列位置", typeof(System.Int32)); + table.Columns.Add("变量排序", typeof(System.Int32)); + + return table; + } + /// + /// 返回非标准real + /// + /// + /// + static public string GetNoNormalReal(object vDataValue) + { + try + { + string real_a; + string real_b; + string groupValueString; + int length; + + //int real_b_Int; + + length = ((System.Array)(vDataValue)).Length; + groupValueString = ""; + if (length != 2) + return "0.0"; + + real_a = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(0))).ToString(); + real_b = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(1))).ToString("00"); + groupValueString = real_a + "." + real_b; + return groupValueString; + } + catch + { + ////ApplicationLog.WriteLog(err, "GetNoNormalReal"); + return "0.0"; + + } + } + + /// + /// 29 工位具体零件合格标志 + /// + /// + static public string GetQualityData_GoodBad_String(bool[] QualityData_GoodBad) + { + string str; + str = ""; + if (QualityData_GoodBad != null) + { + + for (int i = 0; i < QualityData_GoodBad.Length; i++) + { + str = str + (Convert.ToInt32(QualityData_GoodBad[i])).ToString() + "|"; + } + + } + return str; + + } + /// + /// 返回非标准real + /// + /// + /// + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/CommFun_CATL.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/CommFun_CATL.cs new file mode 100644 index 0000000..84a1056 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/CommFun_CATL.cs @@ -0,0 +1,18 @@ + +using System.Threading; + +namespace MisDataFunDll +{ + public partial class CommFun_CATL + { + + // 由于现在没有接口,先模拟调用webapi,输入参数1.电芯码,返回参数1.对比结果 + public static int GetCellInfo(string cellCode) + { + int result = 1; + Thread.Sleep(200); + return result; + + } + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.Base.DB.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.Base.DB.cs new file mode 100644 index 0000000..77f7171 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.Base.DB.cs @@ -0,0 +1,299 @@ + +using DataLinkMesWork1; +using System.Data; +using System.Data.SqlClient; + +namespace MisDataFunDll +{ + public partial class MisDataFun + { + public static DataTable BaseData_tagTable_TagName() + { + DataTable dt = null; + string sql; + sql = "SELECT distinct[TagName],[变量类型代码] FROM[MES_基本变量_原始数据] "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + public static DataTable GetMesServerCodeFromMIS() + { + DataTable dt; + string sql; + sql = "exec MES_计划BOM_工位与名称_查询应用程序"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + public static DataTable dt_Signal() + { + DataTable dt; + string sql; + sql = "SELECT * FROM [MES_基本变量_原始数据]"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + public static DataTable dt_Device() + { + DataTable dt; + string sql; + sql = "SELECT * FROM [MES_基本变量设备类型对应表]"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + public static DataTable dt_TagTypeDataType() + { + DataTable dt; + string sql; + sql = "SELECT TOP (1000) [序号],[变量类型],[TagTypeDataType],[TagName],[变量类型代码],[TagTypeChange],[MesTagTypeChange],[WebTagTypeChange],[信号点名称][变量类型名称] FROM [MES_基本变量变量类型代码]"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + public static DataTable GetCheckOpName() + { + DataTable dt = new DataTable(); + string produceName = "MES_计划BOM_工位与名称_查询"; + SqlParameter[] thisParms = null; + + + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + + return dt; + } + + /// + /// 查询工步属性 + /// + /// + public static DataTable GetworkStepPropertyFromMIS() + { + DataTable dt; + string sql; + sql = "SELECT distinct 工位号,工步属性 FROM [MES_计划BOM_工位与名称] where 是否监控=1"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 查询返修工位号 + /// + /// + public static DataTable GetOpNameRepairFromMIS() + { + DataTable dt; + string sql; + sql = "SELECT distinct 工位号,返修工位号 FROM [MES_计划BOM_工位与名称] where 是否监控=1"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + + + /// + /// 测量工位号和工位名称 + /// + /// + public static DataTable BaseData_tagTable_QualityData_OpName_Name() + { + DataTable dt; + string sql = "SELECT distinct [工位号],[工位名称] FROM [MES_计划BOM_工位与名称] " + + " where (监控属性代码 = '" + 1 + "')" + + " ORDER BY 工位号 "; + //来源于SQL Server + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_计划BOM_工位与名称 + /// + /// + public static DataTable BaseData_tagTable_OpName() + { + //DataTable dt; + //string sql = "SELECT * FROM [MES_计划BOM_工位与名称] " + // + " where (监控属性代码 = '" + ApplicationConfig.MES_Code.ToString() + "')" + // + " ORDER BY 工位号 "; + //DataAccess.ExecuteDataTable(sql, out dt); + //return dt; + + //2022.07.27.LLX 处理了一下子 + DataTable dt; + string sql = "SELECT * FROM [MES_计划BOM_工位与名称] " + + " where (监控属性代码 = '" + 1 + "') and [是否通过监控系统保存数据] is not null" + + " ORDER BY 工位号 "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_基本变量_DB数据结构_根据工位代码_获得普通变量 + /// + /// + public static DataTable BaseData_tagTable_OpcServerMES(int mesCode, string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 = " + mesCode.ToString() + " and 是否启用 = 1" + + " and 工位号='" + opName + "'" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_基本变量_DB数据结构_根据工位代码_获得普通变量 + /// + /// + public static DataTable BaseData_tagTable_OpcServerMES(int mesCode) + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 = " + mesCode.ToString() + " and 是否启用 = 1" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// MES_基本变量_DB数据结构_获得激发变量 + /// + /// + public static DataTable BaseData_tagTable_All() + { + //string errorMessage; + DataTable dt = null; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where ((变量类型代码 >= 19 and 变量类型代码 <= 27) or (变量类型代码 = 101) or (变量类型代码 = 102) or (变量类型代码 = 105) or (变量类型代码 = 1000) or (变量类型代码 = 1001) or (变量类型代码 = 1002) or (变量类型代码 = 1003) or (变量类型代码 = 1004)) and (是否启用 = 1) " + + " and (监控属性代码 = '" + 1 + "')" + + " ORDER BY TagID "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_基本变量_DB数据结构_获得激发变量 + /// + /// + public static DataTable BaseData_tagTable_All_B5A() + { + //string errorMessage; + DataTable dt = null; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where ((变量类型代码 = 101) or (变量类型代码 = 102) ) and (是否启用 = 1) " + + " and (监控属性代码 = '" + 1 + "')" + + " ORDER BY TagID "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 20170310 新加 + /// MES_基本变量_DB数据结构_获得所有普通变量(除101.102.103.104.105) + /// + /// + public static DataTable BaseData_tagTable_OpcServerMES_ALL_CF() + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 " + + " FROM MES_基本变量_原始数据 " + + " where 变量类型代码 <> 101 and 变量类型代码 <> 102 and 变量类型代码 <> 103 and 变量类型代码 <> 104 and 变量类型代码 <> 105 and 是否启用 = 1" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 发动机类型转换表 + /// SELECT ID,发动机机型代码 FROM MES_计划BOM_发动机型号代码 + /// + /// + public static DataTable BaseData_tagTable_QualityData_EngineTypeID() + { + DataTable dt; + string sql; + sql = "SELECT ID,发动机机型代码 FROM MES_计划BOM_发动机型号代码 "; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位 + /// + /// + public static DataTable BaseData_tagTable_QualityData_GoodBad_MIS_OpName_B5A() + { + DataTable dt; + string sql; + sql = "SELECT distinct 工位号 " + + " FROM MES_基本变量_原始数据 " + + " where 变量特点 = 8 and 是否启用 = 1 " + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位的数据来源 + /// + /// + public static DataTable BaseData_tagTable_QualityData_GoodBad_MIS_OpName(string opName) + { + DataTable dt; + string sql; + sql = "SELECT TagID,工位号,数据来源 " + + " FROM MES_基本变量_原始数据 " + + " where OpcServer_OPNAME = '1' and 是否启用 = 1 " + + " and 工位号='" + opName + "'" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位的数据来源的测量变量 + /// + /// + public static DataTable BaseData_tagTable_QualityData_GoodBad_MIS_OpName(string opName, string opNameFrom) + { + DataTable dt; + string sql; + sql = "SELECT TagID " + + " FROM MES_基本变量_原始数据 " + + " where OpcServer_OPNAME = '2' and 是否启用 = 1 " + + " and 工位号='" + opName + "'" + + " and 数据来源='" + opNameFrom + "'" + + " and (监控属性代码 = '" + 1 + "')"; + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + /// + /// MES_基本变量_机型代码_查询 + /// + /// + static public void EngineType_Select(out DataTable dt) + { + dt = null; + string sql = "exec MES_基本变量_机型代码_查询"; + DataAccess.ExecuteDataTable(sql, out dt); + } + + + + + + + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.CommonUtils.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.CommonUtils.cs new file mode 100644 index 0000000..8150218 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.CommonUtils.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; + +namespace MisDataFunDll +{ + public partial class MisDataFun + { + /// + /// Source|Cmd|OpName|TagValue + /// + /// + /// + public static List GetCmdStringList(string cmd) + { + List list = new List(); + string item; + int index; + try + { + index = cmd.IndexOf('|'); + item = cmd.Substring(0, index); + list.Add(item); + + cmd = cmd.Substring(index + 1); + index = cmd.IndexOf('|'); + item = cmd.Substring(0, index); + list.Add(item); + + cmd = cmd.Substring(index + 1); + index = cmd.IndexOf('|'); + item = cmd.Substring(0, index); + list.Add(item); + + item = cmd.Substring(index + 1); + + list.Add(item); + + } + catch { } + + + return list; + } + + + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.DB.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.DB.cs new file mode 100644 index 0000000..6711bfb --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.DB.cs @@ -0,0 +1,1785 @@ + +using DataLinkMesWork1; +using MesServerFunctions; +using Newtonsoft.Json; +using NPOI.XWPF.UserModel; +using Opc.Ua.Export; +using System; +using System.Data; +using System.Data.SqlClient; +using System.Diagnostics.Eventing.Reader; + +namespace MisDataFunDll +{ + public partial class MisDataFun + { + + public class MobyTagType + { + /// + /// 配方号 + /// + public static string PLCRcipe = "配方号"; + /// + /// 工位号 + /// + public static string OpName = "工位号"; + /// + /// 订单号 + /// + public static string OrderForm = "订单号"; + /// + /// 订单号 + /// + public static string OrderForm_MES = "订单号_MES"; + /// + /// 产品型号代码 + /// + public static string EngineTypeID = "产品型号代码"; + /// + /// 变速器序列号 + /// 变速器序列号 + public static string EngineID = "变速器序列号"; + + /// + /// 发动机型号 + /// + public static string EngineType = "发动机型号"; + /// + /// 机型基本代码 + /// + public static string EngineTypeBasicID = "机型基本代码"; + /// + /// 机型基本代码 + /// + public static string EngineTypeBasic = "基本机型"; + /// + /// 变速器总成号 + /// + public static string EngineIDPrinte = "变速器总成号"; + /// + /// 托盘号 + /// + public static string PartPallet_Code = "托盘号"; + /// + /// 产品型号代码_MES + /// + public static string EngineTypeID_MES = "产品型号代码_MES"; + /// + /// 变速器序列号_MES + /// + public static string EngineID_MES = "变速器序列号_MES"; + /// + /// 发动机型号_MES + /// + public static string EngineType_MES = "发动机型号_MES"; + /// + /// 到达时间线外工位 + /// + public static string WorkStartOutSideIn = "到达时间线外工位"; + /// + /// 离开时间线外工位 + /// + public static string WorkStartOutSideOut = "离开时间线外工位"; + /// + /// 到达时间 + /// + public static string WorkStartIn = "到达时间"; + /// + /// 离开时间 + /// + public static string WorkStartOut = "离开时间"; + /// + /// 持续时间 + /// + public static string WorkStartTime = "持续时间"; + /// + /// 扫描条码 + /// + public static string BarCode = "扫描条码"; + /// + /// 工件到位 2 + /// + public static string WorkStart = "工件到位"; + /// + /// 传递机型 44 + /// + public static string EngineTypeGetOverPLC = "传递机型"; + /// + /// 申请上件 43 + /// + public static string PartLoad = "申请上件"; + /// + /// 允许保存 19 + /// + public static string MesRead = "允许保存"; + /// + /// 保存完成 20 + /// + public static string MesReadOver = "保存完成"; + /// + /// 允许工作 20 + /// + public static string FixAllow = "允许工作"; + + + + + /// [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位] + /// [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格] + /// [工号],[班次],[是否返修件],[合格放行],[不合格放行] + /// [到达时间],[离开时间],[持续时间] + // engineTypeID = Convert.ToInt32(thisParms[2].Value); + //engineType = thisParms[3].Value.ToString(); + //engineID = thisParms[4].Value.ToString(); + //palletCode = thisParms[5].Value.ToString(); + } + + /// + /// 测量数据工位_监控系统_MOBY_线首_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_MOBY_Insert_FirstOpName(string opName, int engineTypeID, int engineTypeID_MES, string engineType, string engineType_MES, string engineID, string engineID_MES, int palletCode, string orderForm, string orderForm_MES) + { + string produceName = "测量数据工位_监控系统_MOBY_线首_增加"; + SqlParameter[] thisParms = new SqlParameter[10]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码_MES", engineTypeID_MES); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", engineType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机型号_MES", engineType_MES); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@发动机号_MES", engineID_MES); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@订单号_MES", orderForm_MES); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@托盘号", palletCode); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 测量数据工位_监控系统_MOBY_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_MOBY_Insert(string opName, string tagType, string tagValue) + { + string produceName = "北汽福田工位状态监控MOBY_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@变量类型", tagType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@变量值", tagValue); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 生产计划_派工订单_工件追溯_校验 + /// + /// + /// + /// + public static DataTable WorkOrderCheck(string opName, string EngineID, string OrderFrom, string EngineType) + { + string produceName = "生产计划_派工订单_工件追溯_校验"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@机型", EngineType); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out DataTable dt); + return dt; + } + + /// + /// 接口_IOT接口_报工记录_是否报工判断 + /// + /// + /// + /// + public static DataTable IOT_ReqData_UpLoad_IsSend(string opName, string OrderFrom, string reqType) + { + string produceName = "接口_IOT接口_报工记录_是否报工判断"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@报工类型", reqType); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out DataTable dt); + return dt; + } + + /// + /// 测量数据工位_监控系统_MOBY_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OpName_MIS_MOBY_Insert_JZ(string opName, string engineID) + { + string produceName = "测量数据工位_监控系统_MOBY_静置工位_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + public static void BarCodeIsSecondVerification(string opName, out bool isSecondVerification) + { + isSecondVerification = false; + DataTable dt = new DataTable(); + string produceName = "测量数据工位_监控系统_是否二次验证_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + if (dt.Rows.Count > 0) + { + string isVerification = dt.Rows[0]["是否验证"].ToString(); + if(isVerification == "1") + { + isSecondVerification = true; + } + } + } + /// + /// 日志_工位操作_增加 + /// + /// + /// + /// + /// + /// + public static bool LogRecording_OP(string OpName, string type, string msgType, string content) + { + string produceName = "日志_工位操作_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@消息类型", type); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@操作类型", msgType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@内容", content); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 电子看板_工序内容_临时表_增加 + /// + /// + /// + public static bool MesServer_ProcessList_EngineTypeOver(string opName) + { + string produceName = "电子看板_工序内容_临时表_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 电子看板_装配零件_临时表_增加 + /// + /// + /// + public static bool MesServer_Process_EngineTypeOver(string opName) + { + string produceName = "电子看板_装配零件_临时表_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 测量数据工位_监控系统_MOBY_查询 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void Moby_Select(string opName, out string OrderForm, out int EngineTypeID, out string EngineType, out string EngineID, out string PartPallet_Code, out int IsrepairBarcode, out string repairBarcode, out string EngineTypeString) + { + DataTable dt = new DataTable(); + OrderForm = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = "0"; + IsrepairBarcode = 0; + repairBarcode = "0"; + EngineTypeString = ""; + try + { + string procedureName; + procedureName = "测量数据工位_监控系统_MOBY_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + if (dt.Rows.Count > 0) + { + OrderForm = dt.Rows[0]["订单号"].ToString(); + EngineTypeID = Convert.ToInt32(dt.Rows[0]["产品型号代码"]); ; + EngineType = dt.Rows[0]["发动机型号"].ToString(); + EngineID = dt.Rows[0]["发动机号"].ToString(); + PartPallet_Code = dt.Rows[0]["托盘号"].ToString(); + } + } + catch + { + OrderForm = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = "0"; + IsrepairBarcode = 0; + repairBarcode = ""; + EngineTypeString = ""; + } + } + + /// + /// 测量数据工位_监控系统_MOBY_查询 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void Moby_Select(string opName, out string orderNum, + out int EngineTypeID, out string EngineType, out string EngineID, out string PartPallet_Code, + out int IsrepairBarcode, out string repairBarcode, + out string workCode, out string projectName, out string splitCode, out string unidCode, out string engineType, out string engineTypeModel, out string startTime) + { + orderNum = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + workCode = ""; // 制造编号 + projectName = ""; // 项目名称 + splitCode = ""; // 间隔号 + unidCode = ""; // 单元号 + engineType = ""; // 本体类型 + engineTypeModel = ""; // 附件类型 + startTime = ""; // 开始时间 + + try + { + string procedureName; + procedureName = "测量数据工位_监控系统_MOBY_查询"; + SqlParameter[] thisParms = new SqlParameter[15]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", SqlDbType.NVarChar, 50, "订单号"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@产品型号代码", SqlDbType.Int, 4, "产品型号代码"); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@发动机型号", SqlDbType.NVarChar, 50, "发动机型号"); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@发动机号", SqlDbType.NVarChar, 50, "发动机号"); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘号", SqlDbType.NVarChar, 50, "托盘号"); + thisParms[5].Direction = ParameterDirection.Output; + thisParms[6] = new System.Data.SqlClient.SqlParameter("@拆解标志", SqlDbType.Int, 4, "拆解标志"); + thisParms[6].Direction = ParameterDirection.Output; + thisParms[7] = new System.Data.SqlClient.SqlParameter("@拆解返修条码", SqlDbType.NVarChar, 50, "拆解返修条码"); + thisParms[7].Direction = ParameterDirection.Output; + thisParms[8] = new System.Data.SqlClient.SqlParameter("@制造编号", SqlDbType.NVarChar, 50, "制造编号"); + thisParms[8].Direction = ParameterDirection.Output; + thisParms[9] = new System.Data.SqlClient.SqlParameter("@间隔号", SqlDbType.NVarChar, 50, "间隔号"); + thisParms[9].Direction = ParameterDirection.Output; + thisParms[10] = new System.Data.SqlClient.SqlParameter("@单元号", SqlDbType.NVarChar, 50, "单元号"); + thisParms[10].Direction = ParameterDirection.Output; + thisParms[11] = new System.Data.SqlClient.SqlParameter("@项目名称", SqlDbType.NVarChar, 50, "项目名称"); + thisParms[11].Direction = ParameterDirection.Output; + thisParms[12] = new System.Data.SqlClient.SqlParameter("@本体类型", SqlDbType.NVarChar, 50, "本体类型"); + thisParms[12].Direction = ParameterDirection.Output; + thisParms[13] = new System.Data.SqlClient.SqlParameter("@附件类型", SqlDbType.NVarChar, 50, "附件类型"); + thisParms[13].Direction = ParameterDirection.Output; + thisParms[14] = new System.Data.SqlClient.SqlParameter("@开始时间", SqlDbType.NVarChar, 50, "开始时间"); + thisParms[14].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null && thisParms[3].Value != null && thisParms[4].Value != null && thisParms[5].Value != null && thisParms[6].Value != null && thisParms[7].Value != null) + { + orderNum = thisParms[1].Value.ToString(); + EngineTypeID = Convert.ToInt32(thisParms[2].Value); ; + EngineType = thisParms[3].Value.ToString(); + EngineID = thisParms[4].Value.ToString(); + PartPallet_Code = thisParms[5].Value.ToString(); + IsrepairBarcode = Convert.ToInt32(thisParms[6].Value); + repairBarcode = thisParms[7].Value.ToString(); + workCode = thisParms[8].Value.ToString(); // 制造编号 + projectName = thisParms[9].Value.ToString(); // 项目名称 + splitCode = thisParms[10].Value.ToString();// 间隔号 + unidCode = thisParms[11].Value.ToString(); // 单元号 + engineType = thisParms[12].Value.ToString(); // 本体类型 + engineTypeModel = thisParms[13].Value.ToString(); // 附件类型 + startTime = thisParms[14].Value.ToString(); // 开始时间 + } + } + catch + { + orderNum = ""; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + PartPallet_Code = ""; + IsrepairBarcode = 0; + repairBarcode = ""; + workCode = ""; // 制造编号 + projectName = ""; // 项目名称 + splitCode = ""; // 间隔号 + unidCode = ""; // 单元号 + engineType = ""; // 本体类型 + engineTypeModel = ""; // 附件类型 + } + } + + /// + /// 电子看板_工序内容_查询 + /// + /// 工位号 + /// 产品型号代码 + /// + static public void Process_Select(string opName, int engineTypeID, string EngineType, out DataTable dt) + { + dt = null; + string sql = "exec 电子看板_工序内容_查询 '" + opName + "','" + EngineType + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// 电子看板_装配零件_物料验证_查询 + /// + /// 工位号 + /// 发动机号 + /// + static public bool PartMaterialVerify_Select(string opName, int engineTypeID, string engineType, out DataTable dt) + { + dt = null; + string procedureName; + procedureName = "电子看板_装配零件_临时表_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 电子看板_装配零件_临时表_判断_是否允许工作 + /// + /// + /// + /// + public static bool MesServer_Judge_IsCanWork(string opName, out int IsAllowWork) + { + IsAllowWork = 0; + string produceName = "电子看板_装配零件_临时表_判断_是否允许工作"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否允许工作", IsAllowWork); + thisParms[1].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsAllowWork = Convert.ToInt32(thisParms[1].Value); + return true; + } + return false; + } + + /// + /// [电子看板_装配零件_临时表_增加_北汽] + /// + /// + /// + public static bool MesServer_Process_EngineTypeOverBQ(string opName) + { + string produceName = "电子看板_装配零件_临时表_增加_北汽"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 发送页面点位 同时存入数据库状态 + /// + /// + public static void MobySendWebAndSaveData(string OpName, string tagType, string tagValue) + { + MisDataFun.OpName_MIS_MOBY_Insert(OpName, tagType, tagValue); + // 判断是否为涉及前端页面的信号,如果是则同步发送点位 + string tagName = ""; + switch (tagType) + { + case "工件到位": + tagName = "WorkStart"; + break; + case "传递机型": + tagName = "EngineTypeGetOverPLC"; + break; + case "申请上件": + tagName = "PartLoad"; + break; + case "允许工作": + tagName = "FixAllow"; + break; + case "允许保存": + tagName = "MesRead"; + break; + case "保存完成": + tagName = "MesReadOver"; + break; + default: + break; + } + if (tagName != "") + { + SendMessageFun.SendInfomation(tagName, Convert.ToString(Convert.ToInt32(tagValue)), OpName); + } + } + + /// + /// 电子看板_装配零件_临时表_修改_零件条码 + /// + /// + /// + /// + /// + public static bool PartMaterial_DM_Update(string opName, string barCode, out bool IsSuccess) + { + IsSuccess = false; + string produceName = "电子看板_装配零件_临时表_修改_零件条码"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@条码", barCode); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@条码是否符合", IsSuccess); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsSuccess = Convert.ToBoolean(thisParms[2].Value); + return true; + } + return false; + } + + /// + /// 测量数据合格索引_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_IndexInsert(string EngineID, string tagID, string EngineType, int EngineTypeID, string opName, int isGoodBad, string PartPalletCode, out int Id_tagCF) + { + string procedureName; + procedureName = "测量数据合格索引_增加"; + Id_tagCF = 0; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString()); + return true; + } + return false; + } + /// + /// 测量数据合格_增加 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert(int Id_tagCF, int engineTypeID, string engineID, string opName, DataTable dt, bool IsCheck = false) + { + string procedureName; + procedureName = "测量数据合格_增加"; + SqlParameter[] thisParms = new SqlParameter[15]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", SqlDbType.Int, 4, "TagID"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", SqlDbType.NVarChar, 100, "TagValue"); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", SqlDbType.Int, 4, "IsGoodBad"); + //是否保存无合格标志数据数据 + //thisParms[6] = new System.Data.SqlClient.SqlParameter("@IsCheck", IsCheck); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@测量位置", SqlDbType.NVarChar, 50, "测量位置"); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@测量项目", SqlDbType.NVarChar, 50, "测量项目"); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@工位号", opName); //为了给J07MA020 保留四位精度而设置 + thisParms[9] = new System.Data.SqlClient.SqlParameter("@理论值", SqlDbType.NVarChar, 50, "理论值"); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@上限值", SqlDbType.NVarChar, 50, "上限值"); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@下限值", SqlDbType.NVarChar, 50, "下限值"); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@测量单位", SqlDbType.NVarChar, 50, "测量单位"); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@列位置", SqlDbType.Int, 4, "列位置"); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@变量排序", SqlDbType.Int, 4, "变量排序"); + //table.Columns.Add("TagID", typeof(System.Int32)); + //table.Columns.Add("TagValue", typeof(System.String)); + //table.Columns.Add("IsGoodBad", typeof(System.Int32)); + //table.Columns.Add("测量位置", typeof(System.String)); + //table.Columns.Add("测量项目", typeof(System.String)); + //table.Columns.Add("工位号", typeof(System.String)); + //table.Columns.Add("理论值", typeof(System.String)); + //table.Columns.Add("上限值", typeof(System.String)); + //table.Columns.Add("下限值", typeof(System.String)); + //table.Columns.Add("测量单位", typeof(System.String)); + //table.Columns.Add("列位置", typeof(System.Int32)); + //table.Columns.Add("变量排序", typeof(System.Int32)); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, dt); + } + /// + /// 测量数据合格_手动拧紧_增加 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert(int engineTypeID, string engineType, string engineID, string tagValue, int isGoodBad, string opName, string partPallet, int tagID, int tagID_CF, string MaxValue, string MinValue) + { + string procedureName; + procedureName = "测量数据合格_手动拧紧_增加"; + SqlParameter[] thisParms = new SqlParameter[11]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineType", engineType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", tagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@托盘编号", partPallet); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@TagID", tagID); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID_CF); + thisParms[9] = new System.Data.SqlClient.SqlParameter("@上限值", MaxValue); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@下限值", MinValue); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 测量数据合格索引_增加_电芯 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_IndexInsert_cell(string EngineID, string tagID, string EngineType, int EngineTypeID, string opName, int isGoodBad, string PartPalletCode, out int Id_tagCF) + { + string procedureName; + procedureName = "测量数据合格索引_增加_电芯"; + Id_tagCF = 0; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", tagID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[7].Direction = ParameterDirection.Output; + + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString()); + return true; + } + return false; + } + /// + /// 测量数据合格_增加_电芯 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_Insert_cell(int Id_tagCF, int engineTypeID, string engineID, string opName, DataTable dt, bool IsCheck = false) + { + string procedureName; + procedureName = "测量数据合格_增加_电芯"; + SqlParameter[] thisParms = new SqlParameter[15]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", SqlDbType.Int, 4, "TagID"); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", SqlDbType.NVarChar, 100, "TagValue"); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", SqlDbType.Int, 4, "IsGoodBad"); + //是否保存无合格标志数据数据 + //thisParms[6] = new System.Data.SqlClient.SqlParameter("@IsCheck", IsCheck); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@测量位置", SqlDbType.NVarChar, 50, "测量位置"); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@测量项目", SqlDbType.NVarChar, 50, "测量项目"); + thisParms[8] = new System.Data.SqlClient.SqlParameter("@工位号", opName); //为了给J07MA020 保留四位精度而设置 + thisParms[9] = new System.Data.SqlClient.SqlParameter("@理论值", SqlDbType.NVarChar, 50, "理论值"); + thisParms[10] = new System.Data.SqlClient.SqlParameter("@上限值", SqlDbType.NVarChar, 50, "上限值"); + thisParms[11] = new System.Data.SqlClient.SqlParameter("@下限值", SqlDbType.NVarChar, 50, "下限值"); + thisParms[12] = new System.Data.SqlClient.SqlParameter("@测量单位", SqlDbType.NVarChar, 50, "测量单位"); + thisParms[13] = new System.Data.SqlClient.SqlParameter("@列位置", SqlDbType.Int, 4, "列位置"); + thisParms[14] = new System.Data.SqlClient.SqlParameter("@变量排序", SqlDbType.Int, 4, "变量排序"); + //table.Columns.Add("TagID", typeof(System.Int32)); + //table.Columns.Add("TagValue", typeof(System.String)); + //table.Columns.Add("IsGoodBad", typeof(System.Int32)); + //table.Columns.Add("测量位置", typeof(System.String)); + //table.Columns.Add("测量项目", typeof(System.String)); + //table.Columns.Add("工位号", typeof(System.String)); + //table.Columns.Add("理论值", typeof(System.String)); + //table.Columns.Add("上限值", typeof(System.String)); + //table.Columns.Add("下限值", typeof(System.String)); + //table.Columns.Add("测量单位", typeof(System.String)); + //table.Columns.Add("列位置", typeof(System.Int32)); + //table.Columns.Add("变量排序", typeof(System.Int32)); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, dt); + } + + /// + /// MES_装配数据_零部件追溯_增加 + /// + /// + /// + /// + public static bool Material_Insert(string opName, int m_ConfirmOkGo) + { + string produceName = "MES_装配数据_零部件追溯_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@放行方式", m_ConfirmOkGo); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 测量数据发动机在线状态_增加数据 + /// + /// + /// + static public void WorkStartInsert_JZ(string opName, string engineID, int isOK) + { + string procedureName; + procedureName = "测量数据发动机在线状态_增加数据_JZ"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@是否合格", isOK.ToString()); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 测量数据发动机在线状态_增加数据 + /// + /// + /// + static public void WorkStartInsert(string opName, int isOK) + { + string procedureName; + procedureName = "测量数据发动机在线状态_增加数据"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否合格", isOK.ToString()); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + /// + /// 接口_IOT接口_报工记录_增加 + /// + /// + public static void IOT_Data_UpLode_Res_Save(string opName, string OrderID, string EngineID,string ReqType,bool reqIsOk,string ResText) + { + string produceName = "接口_IOT接口_报工记录_增加"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@订单号", OrderID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@报工类型", ReqType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@报工结果", reqIsOk); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@结果报文", ResText); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + + /// + /// CallWebApi_FactoryMes_NGRecordSave + /// + /// + public static void CallWebApi_FactoryMes_NGRecordSave(string InterfaceName, int AID, string InterfaceUrl, string ReqText, string ResText) + { + string produceName = "CallWebApi_FactoryMes_NGRecordSave"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@接口名称", InterfaceName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@AID", AID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@接口地址", InterfaceUrl); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@请求内容", ReqText); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@响应内容", ResText); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 生产计划_派工订单_工件追溯_工位完工 + /// + /// + /// + /// + public static bool WorkOrderOpWorkOver(string opName, string EngineID, string OrderFrom) + { + string produceName = "生产计划_派工订单_工件追溯_工位完工"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 生产计划_派工订单_工件追溯_工位完工 + /// + /// + /// + /// + public static bool SaveQualityInterfaceData(string opName, string EngineID) + { + string produceName = "接口_质量数据_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 数据表 + /// + /// + static public DataTable BuildDataTables_WWW() + { + DataTable table; + DataColumnCollection columns; + table = new DataTable(); + columns = table.Columns; + table.Columns.Add("TagID", typeof(System.String)); + table.Columns.Add("TagValue", typeof(System.String)); + table.Columns.Add("IsGoodBad", typeof(System.Int32)); + table.Columns.Add("测量位置", typeof(System.String)); + table.Columns.Add("测量项目", typeof(System.String)); + table.Columns.Add("工位号", typeof(System.String)); + table.Columns.Add("理论值", typeof(System.String)); + table.Columns.Add("上限值", typeof(System.String)); + table.Columns.Add("下限值", typeof(System.String)); + table.Columns.Add("测量单位", typeof(System.String)); + table.Columns.Add("列位置", typeof(System.Int32)); + table.Columns.Add("变量排序", typeof(System.Int32)); + + return table; + } + + static public DataTable GetMobyTableByOpName(string opName) + { + DataTable dt; + string procedureName; + procedureName = "北汽福田工位状态监控MOBY_工位_查询"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + return dt; + } + + /// + /// 生产计划_派工订单_工件追溯_工件下线 + /// + /// + /// + /// + public static bool WorkOrderOpWorkOutLine(string EngineID, string OrderFrom) + { + string produceName = "生产计划_派工订单_工件追溯_工件下线"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工件编号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + + /// + /// XD_提前上料记录_获取 + /// + /// + /// + public static DataTable Get_ReqEarlyFeedingData(string opName) + { + DataTable dt = new DataTable(); + string produceName = "XD_提前上料记录_获取"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + + /// + /// + /// + /// + /// + /// + /// + public static bool Location_MIS_MOBY_Insert(string opName, string tagType, string tagValue) + { + string produceName = "XD_库位Moby_增加"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@库位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@变量类型", tagType); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@变量值", tagValue); + + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + public static DataTable GetEngineType_Order(string opName) + { + DataTable dt = new DataTable(); + string produceName = "生产计划_派工订单_申请上线"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + return dt; + } + return dt; + } + + public static DataTable GetEngineType_Order(string opName, string Program_No, out int EngineTypeID, out string EngineType, out string EngineID, out string OrderForm, out int isCheckOk, out int planCount, out int haveUplaodCount, out int remainingQuantity, out string msg) + { + DataTable dt = new DataTable(); + isCheckOk = 2; + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + OrderForm = ""; + planCount = 0; + haveUplaodCount = 0; + remainingQuantity = 0; + msg = ""; + string produceName = "平芝_生产上线_判断机型订单是否匹配_分线"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + //thisParms[1] = new System.Data.SqlClient.SqlParameter("@PLC_机型代码", Program_No); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + EngineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); + EngineType = dt.Rows[0]["机型"].ToString(); + EngineID = dt.Rows[0]["变速箱总成号"].ToString(); + OrderForm = dt.Rows[0]["订单号"].ToString(); + isCheckOk = Convert.ToInt32(dt.Rows[0]["是否匹配"]); + planCount = Convert.ToInt32(dt.Rows[0]["计划上料数量"]); + haveUplaodCount = Convert.ToInt32(dt.Rows[0]["已上料数量"]); + remainingQuantity = Convert.ToInt32(dt.Rows[0]["待上料数量"]); + msg = dt.Rows[0]["msg"].ToString(); + return dt; + } + } + return dt; + } + + /// + /// 29 工位具体零件合格标志 + /// + /// + static public string GetQualityData_GoodBad_String(bool[] QualityData_GoodBad) + { + string str; + str = ""; + if (QualityData_GoodBad != null) + { + + for (int i = 0; i < QualityData_GoodBad.Length; i++) + { + str = str + (Convert.ToInt32(QualityData_GoodBad[i])).ToString() + "|"; + } + + } + return str; + + } + + /// + /// 返回非标准real + /// + /// + /// + static public string GetNoNormalReal(object vDataValue) + { + try + { + string real_a; + string real_b; + string groupValueString; + int length; + + //int real_b_Int; + + length = ((System.Array)(vDataValue)).Length; + groupValueString = ""; + if (length != 2) + return "0.0"; + + real_a = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(0))).ToString(); + real_b = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(1))).ToString("00"); + groupValueString = real_a + "." + real_b; + return groupValueString; + } + catch + { + ////ApplicationLog.WriteLog(err, "GetNoNormalReal"); + return "0.0"; + + } + } + + /// + /// 测量数据工位_监控系统_MOBY_查询_PDC + /// + /// + /// + /// + public static void Moby_Select_PDC(string EngineID, out string OrderForm, out string EngineType, out int EngineTypeCode) + { + DataTable dt = new DataTable(); + OrderForm = ""; + EngineType = ""; + EngineTypeCode = 0; + try + { + string procedureName; + procedureName = "测量数据工位_监控系统_MOBY_查询_PDC"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + if (dt.Rows.Count > 0) + { + OrderForm = dt.Rows[0]["订单号"].ToString(); + EngineType = dt.Rows[0]["产品型号"].ToString(); + EngineTypeCode = Convert.ToInt32(dt.Rows[0]["机型代码"].ToString()); + } + } + catch + { + OrderForm = ""; + EngineType = ""; + EngineTypeCode = 0; + } + } + + /// + /// 基本数据_工作日历_班次产量查询_Web页面显示_初始化查询 + /// + /// + /// + /// + public static void InitOpNameOuputCount(string opName, out int outputValue, out int nowOutputValue, + out int opNameBeatValue, out int NowOpNameBeatValue, out int classNumber) + { + outputValue = 0;//工位产量 + nowOutputValue = 0;//在线产量 + opNameBeatValue = 0;//工位节拍 + NowOpNameBeatValue = 0;//在线节拍 + classNumber = 0;//班次 + try + { + string procedureName; + procedureName = "Web页面显示_计划产量初始化查询"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位产量", SqlDbType.Int, 4, "工位产量"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工位节拍", SqlDbType.Int, 4, "工位节拍"); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@在线产量", SqlDbType.Int, 4, "在线产量"); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@在线节拍", SqlDbType.Int, 4, "在线节拍"); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@班次代码", SqlDbType.Int, 4, "班次代码"); + thisParms[5].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null && thisParms[3].Value != null && thisParms[4].Value != null && thisParms[5].Value != null) + { + outputValue = Convert.ToInt32(thisParms[1].Value); + opNameBeatValue = Convert.ToInt32(thisParms[2].Value); + nowOutputValue = Convert.ToInt32(thisParms[3].Value); + NowOpNameBeatValue = Convert.ToInt32(thisParms[4].Value); + classNumber = Convert.ToInt32(thisParms[5].Value); + } + } + catch + { + outputValue = 0; + opNameBeatValue = 0; + nowOutputValue = 0; + NowOpNameBeatValue = 0; + classNumber = 0; + } + } + + static public void GetImageFile(string opName, int engineTypeID, out byte[] pic) + { + string sql; + DataTable dt; + pic = null; + sql = "exec 电子看板_工位名称与产品型号产品图片_查询 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + if (dt != null) + { + if (dt.Rows.Count > 0) + { + pic = (byte[])dt.Rows[0]["产品图片"]; + } + } + } + + /// + /// 电子看板_工位机型_质量数据测量位置_查询_工作顺序 + /// + /// 工位号 + /// 产品型号代码 + /// + static public bool ShaftPositionSelect(string opNum, int EngineTypeID, out DataTable dt) + { + string procedureName = "电子看板_工位机型_质量数据测量位置_临时表_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opNum); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@产品型号代码", EngineTypeID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + + /// + /// 测量数据合格_查询 + /// + /// + /// + /// + /// + static public bool QualitySelect(string opName, string engineID, out DataTable dt) + { + string procedureName = "测量数据合格_查询"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", engineID); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 生产计划_派工订单_查询_工位执行_完工判断 + /// + /// + /// + /// + /// + public static void Select_OrderFormList_OrderComplete(string opName, out int isCompleted, out int num_plan, out int num_complete) + { + isCompleted = 0;//订单数量是否完全上线 + num_plan = 0;//计划数量 + num_complete = 0;//上线数量 + try + { + string procedureName; + procedureName = "生产计划_派工订单_查询_工位执行_完工判断"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@ISCOMPLETE", SqlDbType.Int, 4, "ISCOMPLETE"); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@NUM_PLAN", SqlDbType.Int, 4, "NUM_PLAN"); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@NUM_COMPLETE", SqlDbType.Int, 4, "NUM_COMPLETE"); + thisParms[3].Direction = ParameterDirection.Output; + + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + if (thisParms[1].Value != null && thisParms[2].Value != null && thisParms[3].Value != null) + { + isCompleted = Convert.ToInt32(thisParms[1].Value); + num_plan = Convert.ToInt32(thisParms[2].Value); + num_complete = Convert.ToInt32(thisParms[3].Value); + } + } + catch + { + isCompleted = 0; + num_plan = 0; + num_complete = 0; + } + } + /// + /// 生产计划_派工订单_查询_工位执行 + /// + /// 工位号 + /// + static public void OrderFormList_Select(string opName, out DataTable dt) + { + dt = null; + string sql = "exec 生产计划_派工订单_查询_工位执行 '" + opName + "'"; + DataAccess.ExecuteDataTable(sql, out dt); + } + /// + /// MES界面显示_弹窗消息_查询 + /// + /// + /// + /// + public static bool ShowWindowNotice(string opname, out DataTable dt) + { + string procedureName = "MES界面显示_弹窗消息_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + + /// + /// MES界面显示_消息滚动_查询 + /// + /// + /// + /// + public static bool ShowLEDNotice(string opname, out DataTable dt) + { + string procedureName = "MES界面显示_消息滚动_查询"; + SqlParameter[] sqlParameters = new SqlParameter[1]; + sqlParameters[0] = new System.Data.SqlClient.SqlParameter("@工位号", opname); + return DataAccess.ExecuteStoredProcedure(procedureName, ref sqlParameters, out dt); + } + /// + /// 电子看板_工位机型_物料检测测量位置_查询_物料检测 + /// + /// + /// + /// + static public bool MaterialCheckSelect(string opName, out DataTable dt) + { + string procedureName = "电子看板_工位机型_物料检测测量位置_查询_物料检测"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + /// + /// 电芯进站 离站 + /// + /// + /// + /// + public static bool Cell_CheckDataAdd(string opName, string EngineID, string operationTime, int isOK) + { + string produceName = "测量数据合格_增加数据_电芯"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@操作时间", operationTime); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@合格标志", isOK); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + public static bool Cell_PassStation(string opName, string EngineID, string operationTime, int passType, int isOK = 1) + { + string produceName = "测量数据发动机在线状态_增加数据_电芯"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@操作时间", operationTime); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", isOK); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@过站类型", passType); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 报警接口记录 存储 + /// 关机(0)/开机(1)/报警(2)/故障(3) 运行(4) 待机(5) + /// 注意事项:当设备状态发生变化时,给表里插入一条数据。状态时间字段精确到年月日时分秒。当状态没变化时,不用重复去存数据,不同的故障告警,认为是不同的状态,当前如果是报警1,先存一条报警1,如果一直是报警1,就不用重复存报警1,当又产生了报警2时,需要给表里再存一条报警2。场景如下: + ////1.开机后,状态先存一条开机,3秒后,再继续存一条待机 + ////2.设备运行后,存一条运行 + ////3.有故障1时,存一条故障,内容为故障1 + ////4.有故障2时,存一条故障,内容为故障2 + ////5.故障1解除后,先存一条运行,如果还有故障2, 继续再存一条故障,内容为故障2 + ////6.故障2解除后,存一条运行或者待机(看设备具体是运行还是待机状态) + /// + /// 工位号 + /// 状态代码 + /// 故障代码 如状态为故障/报警,记录故障/报警代码。 + /// 故障名称 如状态为故障/报警,记录故障/报警名称 + /// 故障说明 如状态为故障/报警,记录故障/报警说明。 + /// 备注 + /// + public static bool errorPortSave(string opName, string DeviceStatus, string MalfunctionCode = null, string MalfunctionName = null, string Malfunctionexplain = null, string Remark = null, int? alarmRemove = null) + { + string produceName = "接口_工位运行状态_增加"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@状态代码", DeviceStatus); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@故障代码", MalfunctionCode); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@故障名称", MalfunctionName); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@故障说明", Malfunctionexplain); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@备注", Remark); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@alarmRemove", (object)alarmRemove ?? DBNull.Value); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + + /// + /// 工位运行状态 存储 + /// + /// + /// + /// + public static bool WorkRunStatusSave(string opName, int toolPowered, int toolStart, float energy) + { + string produceName = "接口_工位使用情况_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@机床上电", toolPowered); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@循环开始", toolStart); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@能耗", energy); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + + /// + /// MES界面显示_弹窗消息_增加 + /// + /// + /// + /// + public static bool Web_Notice_Insert(string opName, string notice) + { + string produceName = "MES界面显示_弹窗消息_增加"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@Notice", notice); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 基本数据_工作日历_班次产量查询_New + /// + /// + /// 在线产量 + /// 在线节拍 + static public void OpNameCount_New(string opName, out int opNameCount, out int opNameCountTime) + { + opNameCount = 0; + opNameCountTime = 0; + string procedureName; + procedureName = "基本数据_工作日历_班次产量查询_New"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@在线产量", 0); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@在线节拍", 0); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + opNameCount = Convert.ToInt32(thisParms[1].Value); + opNameCountTime = Convert.ToInt32(thisParms[2].Value); + } + } + /// + /// 基本数据_工作日历_班次产量查询_New + /// + /// + /// 在线产量 + /// 在线节拍 + static public void OpNameCount_BQ(string opName, out int opNameCount, out int opNameCountTime) + { + opNameCount = 0; + opNameCountTime = 0; + string procedureName; + procedureName = "基本数据_工作日历_班次产量查询_北汽"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@在线产量", 0); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@在线节拍", 0); + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms)) + { + opNameCount = Convert.ToInt32(thisParms[1].Value); + opNameCountTime = Convert.ToInt32(thisParms[2].Value); + } + } + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_增加 + /// + /// + /// + public static bool MesServer_ShaftPosition_EngineTypeOver(string opName) + { + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_增加"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况 + /// + /// + /// + /// + /// + /// + public static bool MesServer_ShaftPosition_Select_FinishResult(string opName, out int workGroupIndex, out string BoltCode, out bool sn_WorkingStepIsOver, out bool isHaveNg) + { + workGroupIndex = 0; + BoltCode = ""; + sn_WorkingStepIsOver = true; + isHaveNg = false; + + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@组号", SqlDbType.Int, 4); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@套筒号", SqlDbType.NVarChar, 50); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[4].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + workGroupIndex = Convert.ToInt32(thisParms[1].Value); + BoltCode = thisParms[2].Value.ToString(); + sn_WorkingStepIsOver = Convert.ToBoolean(thisParms[3].Value); + isHaveNg = Convert.ToBoolean(thisParms[3].Value); + return true; + } + return false; + } + + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_修改 + /// + /// + /// + /// + /// + /// + public static bool MesServer_ShaftPosition_Update(string opName, int workGroupIndex, int IsOK, out bool IsFinish) + { + IsFinish = true; + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_修改"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@组号", workGroupIndex); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@合格标志", IsOK); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[3].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + IsFinish = Convert.ToBoolean(thisParms[3].Value); + return true; + } + return false; + } + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况 + /// + /// 工位号 + /// 拧紧序号 + /// 套筒号 + /// 工步属性 + /// 是否全部完成 + /// + public static bool MesServer_ShaftPosition_Select_FinishResult(string opName, out int ProcessCode, out int BoltCode, out int workStepProperty, out bool sn_WorkingStepIsOver, out bool isHaveNg) + { + BoltCode = 0; + ProcessCode = 512; + workStepProperty = 0; + sn_WorkingStepIsOver = true; + isHaveNg = false; + + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_查询_完成情况"; + SqlParameter[] thisParms = new SqlParameter[6]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@拧紧序号", SqlDbType.Int, 4); + thisParms[1].Direction = ParameterDirection.Output; + thisParms[2] = new System.Data.SqlClient.SqlParameter("@套筒号", SqlDbType.Int, 4); + thisParms[2].Direction = ParameterDirection.Output; + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工步属性", SqlDbType.Int, 4); + thisParms[3].Direction = ParameterDirection.Output; + thisParms[4] = new System.Data.SqlClient.SqlParameter("@是否全部完成", SqlDbType.Int, 4); + thisParms[4].Direction = ParameterDirection.Output; + thisParms[5] = new System.Data.SqlClient.SqlParameter("@是否存在不合格", SqlDbType.Int, 4); + thisParms[5].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + ProcessCode = Convert.ToInt32(thisParms[1].Value); + BoltCode = Convert.ToInt32(thisParms[2].Value); + workStepProperty = Convert.ToInt32(thisParms[3].Value); + sn_WorkingStepIsOver = Convert.ToBoolean(thisParms[4].Value); + isHaveNg = Convert.ToBoolean(thisParms[5].Value); + return true; + } + return false; + } + + + /// + /// 电子看板_工位机型_质量数据测量位置_临时表_修改_重新拧紧 + /// + /// 工位号 + /// 拧紧序号 + /// + public static bool MesServer_ShaftPosition_FixAllow_Again(string opName, int ProcessCode) + { + string produceName = "电子看板_工位机型_质量数据测量位置_临时表_修改_重新拧紧"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@组号", ProcessCode); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms)) + { + return true; + } + return false; + } + + /// + /// 测量数据项目 + /// 用于B5A项目 + /// + /// + public static DataTable BaseData_tagTable_QualityData_Item_B5A() + { + DataTable dt; + string sql; + sql = "SELECT TagID,0 as TagValue,TagName,工位号,数据来源,TagTypeID,TagLong,列位置,测量位置,变量类型代码,测量项目,TagAdr,TagAdrDemo,变量特点,变量排序 FROM [MES_基本变量_原始数据] " + + " where (TagID <> 0 ) and " + + " ((变量类型代码 = 9) " + + " or (变量类型代码 = 10) " + + " or (变量类型代码 = 11) " + + " or (变量类型代码 = 80) " + + " or (变量类型代码 = 101) " + + " or (变量类型代码 = 102) " + + + " or (变量类型代码 = 78) " + + " or (变量类型代码 = 79) " + + " or (变量类型代码 = 41) " + + " or (变量类型代码 = 51) " + + " or (变量类型代码 = 8) " + + " or (变量类型代码 = 21) " + + + " or (变量类型代码 = 105)) " + + " and (是否启用 = 1)"; + + DataAccess.ExecuteDataTable(sql, out dt); + return dt; + } + + /// + /// 测量数据合格索引_分线数据_删除 + /// + /// + /// + /// + public static bool BaseData_tagTable_QualityData_B5A_SubTable_Delete + (string engineID, string opName) + { + string procedureName; + procedureName = "测量数据合格索引_分线数据_删除"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// MES_装配数据_零部件追溯_增加_不合格 + /// + /// + /// + /// + public static bool Material_Insert_NG(string opName, int m_ConfirmOkGo) + { + string produceName = "MES_装配数据_零部件追溯_增加_不合格"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@放行方式", m_ConfirmOkGo); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + /// + /// 测量数据发动机在线状态_查询_是否已工作 + /// + /// + /// 新零件号(机型) + /// + public static DataTable EngineIsTwoWork(string opName, string OrderForm, string EngineID) + { + DataTable dt = new DataTable(); + string produceName = "测量数据发动机在线状态_查询_是否已工作"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderForm); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@总成号", EngineID); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + + /// + /// 测量数据发动机在线状态_增加数据 + /// + /// + /// + static public DataTable CheckAllFinish(string opName, string EngineID, int type) + { + string procedureName; + DataTable dt = new DataTable(); + procedureName = "测量数据工位_测试工位状态_修改"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@发动机号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@type", type); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + return dt; + } + + + + + + + + + + + + + + + + + + /// + /// 报警工位记录表_新增 + /// + /// + /// + /// + /// + /// + static public void Alarm_Insert2(int TagID, string opName, string Text, int Status, string errType) + { + //@TagID , + //@工位号, + // @报警内容, + // @报警类型, + // @报警状态 + string procedureName; + procedureName = "报警工位记录表_新增"; + SqlParameter[] thisParms = new SqlParameter[5]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@TagID", TagID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@报警内容", Text); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@报警类型", errType); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@报警状态", Status); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + /// + /// 报警工位记录表_MOBY_查询 + /// + public static void Alarm_Moby_Search(out DataTable dt) + { + string procedureName; + procedureName = "报警工位记录表_MOBY_查询"; + SqlParameter[] thisParms = new SqlParameter[0]; + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt); + } + + /// + /// 生产计划_派工订单_配送信息_验证记录_校验 + /// + /// + /// + public static DataTable Get_MaterialsScanOverRes(string opName, string order, string engineID, string materialsCode) + { + DataTable dt = new DataTable(); + string produceName = "生产计划_派工订单_配送信息_验证记录_校验"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@订单号", order); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工件编号", engineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@物料编码", materialsCode); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + return dt; + } + + /// + /// 开完工 + /// + /// + /// + /// + /// 1 开工 2 完工 3 重置(用不到) + public static void OpWork_StartOrOver(string OpName,string EngineID,string OrderFrom,int Type) + { + string procedureName; + procedureName = "生产计划_派工订单_工位状态_开完工"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@制造编号", OrderFrom); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@间隔编号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@Type", Type); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out DataTable dt); + } + + /// + /// [电子看板_工序内容_转入临时] + /// + /// + /// + public static bool ProcessDataToTemp(string opName, int EngineTypeID, string OrderForm, string EngineID) + { + string produceName = "电子看板_工序内容_转入临时"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@机型代码", EngineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@工件编号", OrderForm); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", EngineID); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.MES.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.MES.cs new file mode 100644 index 0000000..f62ac3f --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.MES.cs @@ -0,0 +1,163 @@ +using DataLinkMesWork1; + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; + +namespace MisDataFunDll +{ + public partial class MisDataFun + { + static object locker = new object(); + /// + ///引用程序集Hashtable + /// + public static Hashtable Hashtable_assembly = new Hashtable(); + public static Hashtable hashtable_MesServerCode = new Hashtable(); + public static Hashtable hashtable_MesDll = new Hashtable(); + public static Hashtable hashtable_TagTypeTagName = new Hashtable(); + public static Hashtable hashtable_TagName = new Hashtable(); + + /// + /// + /// + /// 变量名称对应的变量类型代码 + /// 变量类型代码对应的变量名称 + public static void GetBaseData_tagTable_TagName(out Hashtable hashtable_TagName, out Hashtable hashtable_TagTypeTagName) + { + hashtable_TagName = new Hashtable(); + hashtable_TagTypeTagName = new Hashtable(); + + string tagName; + string tagTypeCode; + DataTable dt;//GetMesServerCodeFromMIS + dt = BaseData_tagTable_TagName(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + tagName = dt.Rows[i]["TagName"].ToString(); + tagTypeCode = dt.Rows[i]["变量类型代码"].ToString(); + if (!hashtable_TagName.Contains(tagName)) + { + hashtable_TagName.Add(tagName, tagTypeCode); + } + if (!hashtable_TagTypeTagName.Contains(tagTypeCode)) + { + hashtable_TagTypeTagName.Add(tagTypeCode, tagName); + } + } + } + } + + public static void GetMesServerCodeAndMesDll(out Hashtable hashtable_MesServerCode, out Hashtable hashtable_MesDll) + { + hashtable_MesServerCode = new Hashtable(); + hashtable_MesDll = new Hashtable(); + + string OpName; + string MesServerCode; + string MesDll; + DataTable dt;//GetMesServerCodeFromMIS + dt = GetMesServerCodeFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + MesServerCode = dt.Rows[i]["MesServerCode"].ToString(); + MesDll = dt.Rows[i]["MesDll"].ToString(); + if (!hashtable_MesDll.Contains(OpName)) + { + hashtable_MesDll.Add(OpName, MesDll); + } + if (!hashtable_MesServerCode.Contains(OpName)) + { + hashtable_MesServerCode.Add(OpName, MesServerCode); + } + } + } + } + + + /// + /// MesServerFunction + /// + /// + /// + /// + public static void TransferInfToMES(object text) + { + try + { + string recData = text.ToString(); + List dataArray = GetCmdStringList(recData); + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + string mesServerdllName; + //获得工位对应的 dll + if (!GetMesServerDllNameByOpName(out mesServerdllName, m_OpName)) return; + if (mesServerdllName == null) return; + if (mesServerdllName.Length < 1) return; + + string ResultOK = ""; + object[] Paramsters = new object[1]; + Paramsters[0] = text; + + System.Reflection.Assembly assembly = null; + + bool IsOK = Hashtable_assembly.ContainsKey(mesServerdllName); + if (IsOK) + { + assembly = (System.Reflection.Assembly)Hashtable_assembly[mesServerdllName]; + } + else + { + assembly = System.Reflection.Assembly.Load(mesServerdllName); + if (assembly == null) + { + return; + } + Hashtable_assembly.Add(mesServerdllName, assembly); + } + ResultOK = Reflection.ReflectionMethod(assembly, "MesServerFunctions", "FunctionMES", "FunWork", Paramsters); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "TransferInf"); + } + + } + /// + /// 获得工位对应的 dll + /// + /// + /// + /// + private static bool GetMesServerDllNameByOpName(out string mesServerdllName, string opName) + { + try + { + mesServerdllName = hashtable_MesDll[opName].ToString(); + return true; + } + catch + { + mesServerdllName = ""; + return false; + } + } + + + + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.ShaftPositionData.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.ShaftPositionData.cs new file mode 100644 index 0000000..563c988 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.ShaftPositionData.cs @@ -0,0 +1,156 @@ +using DataLinkMesWork1; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MisDataFunDll +{ + public partial class ShaftPosition + { + /// + /// 测量数据合格_电子看板_质量数据_临时表_增加_返修工位 + /// @EngineID nvarchar(50)=null, + /// @EngineType nvarchar(50)=null, + /// @EngineTypeID int = null, + /// @工位号 nvarchar(50)=null, + /// @工位号返修工位 nvarchar(50)=null, + /// @订单号 nvarchar(50)=null, + /// @合格标志 int + /// + /// 工件号 + /// 机型 + /// 机型代码 + /// 工位号(被返修的工位号) + /// 工位号返修工位 + /// 订单号 + /// 合格标志 + static public void ShaftPosition_Data_OpNameRepair_Insert(string engineID, string engineType, int engineTypeID, string opName, string opNameRepair, string orderForm, int isOK) + { + string procedureName; + procedureName = "测量数据合格_电子看板_质量数据_临时表_增加_返修工位"; + SqlParameter[] thisParmsSql = new SqlParameter[7]; + thisParmsSql[0] = new SqlParameter("@EngineID", engineID); + thisParmsSql[1] = new SqlParameter("@EngineType", engineType); + thisParmsSql[2] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[3] = new SqlParameter("@工位号", opName); + thisParmsSql[4] = new SqlParameter("@工位号返修工位", opNameRepair); + thisParmsSql[5] = new SqlParameter("@订单号", orderForm); + thisParmsSql[6] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// 测量数据合格_电子看板_质量数据_临时表_增加 + /// @EngineID nvarchar(50)=null, + /// @EngineType nvarchar(50)=null, + /// @EngineTypeID int = null, + /// @工位号 nvarchar(50)=null, + /// @订单号 nvarchar(50)=null, + /// @合格标志 int + /// + /// 工件号 + /// 机型 + /// 机型代码 + /// 工位号 + /// 订单号 + /// 合格标志 + static public void ShaftPosition_Data_Insert(string engineID, string engineType, int engineTypeID, string opName, string orderForm, int isOK) + { + string procedureName; + procedureName = "测量数据合格_电子看板_质量数据_临时表_增加"; + SqlParameter[] thisParmsSql = new SqlParameter[6]; + thisParmsSql[0] = new SqlParameter("@EngineID", engineID); + thisParmsSql[1] = new SqlParameter("@EngineType", engineType); + thisParmsSql[2] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[3] = new SqlParameter("@工位号", opName); + thisParmsSql[4] = new SqlParameter("@订单号", orderForm); + thisParmsSql[5] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + static public void ShaftPosition_Data_Insert_RepairOpName(string opName, int shaftStep, string engineID, string engineType, int engineTypeID, int orderBy, string tagValue, int isOK) + { + string procedureName; + procedureName = "电子看板_质量数据_临时表_增加_备用拧紧工位"; + SqlParameter[] thisParmsSql = new SqlParameter[8]; + thisParmsSql[0] = new SqlParameter("@工位号", opName); + thisParmsSql[1] = new SqlParameter("@序号", shaftStep); + thisParmsSql[2] = new SqlParameter("@EngineID", engineID); + thisParmsSql[3] = new SqlParameter("@EngineType", engineType); + thisParmsSql[4] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[5] = new SqlParameter("@变量排序", orderBy); + thisParmsSql[6] = new SqlParameter("@测量值", tagValue); + thisParmsSql[7] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// 电子看板_质量数据_临时表_增加 + /// + /// 工位号 + /// 序号 + /// 工件号 + /// 机型 + /// 机型代码 + /// 变量代码 + /// 变量值 + /// 合格标志 + static public void ShaftPosition_Data_Insert(string opName, int shaftStep, string engineID, string engineType, int engineTypeID, int tagID, string tagValue, int isOK) + { + string procedureName; + procedureName = "电子看板_质量数据_临时表_增加"; + SqlParameter[] thisParmsSql = new SqlParameter[8]; + thisParmsSql[0] = new SqlParameter("@工位号", opName); + thisParmsSql[1] = new SqlParameter("@序号", shaftStep); + thisParmsSql[2] = new SqlParameter("@EngineID", engineID); + thisParmsSql[3] = new SqlParameter("@EngineType", engineType); + thisParmsSql[4] = new SqlParameter("@EngineTypeID", engineTypeID); + thisParmsSql[5] = new SqlParameter("@TagID", tagID); + thisParmsSql[6] = new SqlParameter("@测量值", tagValue); + thisParmsSql[7] = new SqlParameter("@合格标志", isOK); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + /// + /// 电子看板_工位机型_质量数据测量位置_查询_工作顺序 + /// + /// + /// + /// + static public void ShaftPosition_Select_WorkingStep(string opName, int engineTypeID, out DataTable dt) + { + dt = null; + + string sql = "exec 电子看板_工位机型_质量数据测量位置_查询_工作顺序 '" + opName + "'," + engineTypeID.ToString(); + DataAccess.ExecuteDataTable(sql, out dt); + } + + /// + /// 电子看板_质量数据_临时表_删除 + /// + /// 工位号 + /// 列位置 + /// EngineID + static public void ShaftPosition_Data_Delete(string opName, int shaftStep, string engineID) + { + string procedureName; + procedureName = "电子看板_质量数据_临时表_删除"; + SqlParameter[] thisParmsSql = new SqlParameter[3]; + thisParmsSql[0] = new SqlParameter("@工位号", opName); + thisParmsSql[1] = new SqlParameter("@列位置", shaftStep); + thisParmsSql[2] = new SqlParameter("@EngineID", engineID); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParmsSql); + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.TagTypeCodeID.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.TagTypeCodeID.cs new file mode 100644 index 0000000..ad1531b --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/MisDataFun.TagTypeCodeID.cs @@ -0,0 +1,462 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +///1 X WorkStart 2 工件到位(PLC) 工件到位。托盘到达工位,并且托盘上有工件。 +///2 X RepairPartStatusPLC 3 RepairPartStatusPLC 备用 +///3 STRING RepairPathString 4 RepairPathString "工位返修字符串(121211112222111),前2位是西门子字符串格式,第一位是总长度,第二位是实际长度" +///4 X EngineTypeGetOverMES 5 传递机型(MES) MES传递总成信息给PLC(上线工位) +///5 X PartPalletGoOver 6 PartPalletGoOver 上线工位。0:正常工作;1:空托盘放行,PLC读取到此标志不走申请上线逻辑。 +///6 X MaterialVerifyOver 7 MaterialVerifyOver MES保存完质量数据,物料数据等与PLC信号交互完成后通知PLC,所以工步都完成,才可以放行工件,正常工作时工件放行的必要条件。 +///7 X FalseGo 8 FalseGo 按MES界面[不合格放行]按钮,MES发送此信号。操作者判断工件不合格,通知设备,按不合格方式放行工件,工件流转到返修下线工位后,返修下线。MES工作完成MES0.3=1,MES合格放行MES0.5=0,MES0.4=1 +///8 INT EngineTypeID 9 EngineTypeID MES发动机机型标志(必须PLC) +///9 STRING EngineID 10 EngineID MES发动机编号(必须PLC) +///10 STRING EngineType 11 机型(MES) MES发动机机型(必须PLC) +///11 X PartPalletStatus 13 PartPalletStatus MES激发变量托盘到位离开(必须PLC) +///12 X HeartBeatPLC 14 HeartBeatPLC 心跳处理:PLC收到MES心跳信号后,PLC延时5秒后,数值取反再写回PLC,写回PLC开始计时,如果5秒钟MES无反馈报通讯故障。 +///13 X HeartBeatMIS 15 HeartBeatMIS 间隔时间5S,心跳处理。收到PLC心跳信号后,MES按原值回写。PLC收到MES信号后延时5秒,取反写入,以此循环。 +///14 X TargetTimeRead 16 TargetTimeRead MES允许可读工位运行时间 +///15 Int MachineTargetTime 17 MachineTargetTime 目标运行时间 +///16 Int MachineActualTime 18 MachineActualTime 实际运行时间 +///17 X MesRead 19 允许保存(PLC) 质量数据可以读数据 +///18 X MesReadOver 20 保存完成(MES) MES保存完数据(必须MIS) +///19 INT QualityMask 21 合格标志(PLC) 质量数据工位合格标志0:没有工作;1:合格 ;2 :不合格(必须PLC) +///20 B PalletInfo 22 PalletInfo 0空托盘,1合格件,2不合格件 +///21 INT RepairStatusPLC 23 RepairStatusPLC 0正常件,1返修件 +///22 INT OrderNo 24 订单号(MES) 订单号(MES) +///23 X StorageNo 25 库位号(MES) 库位号(MES) +///24 X AllowPass 26 允许放行(MES) 允许放行 +///25 X PartLoadFinish 27 PartLoadFinish PartLoadFinish +///26 X Reserved_7 28 Reserved_7 备用 +///27 X Reserved_8 29 Reserved_8 备用 +///28 X Reserved_9 30 Reserved_9 备用 +///29 X Reserved_10 31 Reserved_10 备用 +///30 X Reserved_11 32 Reserved_11 备用 +///31 X Reserved_12 33 Reserved_12 备用 +///32 X Reserved_13 34 Reserved_13 备用 +///33 X Reserved_14 35 Reserved_14 备用 +///34 Int PLCSPareint1 36 PLCSPareint1 备用 +///35 Int PLCSPareint2 37 PLCSPareint2 备用 +///36 Int PLCSPareint3 38 PLCSPareint3 备用 +///37 STRING PLCSarestring1 39 PLCSarestring1 备用 +///38 STRING PLCSarestring2 40 PLCSarestring2 备用 +///39 STRING MarkID 42 MarkID 机体打标号(MES)前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 +///40 X PartLoad 43 PartLoad 上线工位,PLC向MES申请总成编号。收到该信号后,MES将机型标志(DBB22 ~23)、总成号(DBB24 ~63)、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型(DBX0.1)”通知PLC。 +///41 X EngineTypeGetOverPLC 44 传递机型(PLC) PLC将机型标志(DBB50…51)、工件编号(DBB52…101)、产品型号(DBB102…187)、托盘编号(DBB188…189)准备完毕后,通知MES。 +///42 X PartLoadOK 48 PartLoadOK 备用 +///43 X Reserved_18 49 Reserved_18 备用 +///44 X PalletDown 50 PalletDown 暂时保留,项目未使用 +///45 X ConfirmOkGo 51 ConfirmOkGo 按MES界面[合格放行]按钮,MES发送此信号。操作者判断工件合格,通知设备,工件按合格方式放行工件。MES工作完成MES0.3=1,MES合格放行MES0.5=1,MES0.4=0 +///46 X ResetDevice 52 ResetDevice 针对手动工位,无HMI,需要复位设备在MES页面操作。 +///47 X UnloadCompleted 53 UnloadCompleted 暂时保留,项目未使用 +///48 X MachineTime_ReadOver 54 MachineTime_ReadOver 备用 +///49 X Reserved_19 58 Reserved_19 备用 +///50 X FixOK 59 FixOK 手动拧紧工位,单工步螺栓拧紧完成,通知PC读取数据。 +///51 X Reserved_21 61 Reserved_21 备用 +///52 X Reserved_22 62 Reserved_22 备用 +///53 X Reserved_23 63 Reserved_23 备用 +///54 X Reserved_24 64 Reserved_24 备用 +///55 X Reserved_25 65 Reserved_25 备用 +///56 X FixAllow 66 FixAllow "设备工作的必须信号,对于有物料验证的工位,MES验证完成给出此信号,对于无物料验证工位,MES直接给出此信号。" +///57 X FixOver 67 FixOver 用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。 +///58 X MatchingCompleted 68 MatchingCompleted 分线上总线,匹配成功是1;不成功是0。 +///59 X Match 69 Match 分线上总线,匹配成功是1;不成功是0。 +///60 X Reserved_2 70 Reserved_2 备用 +///61 X IsAutoGetEngineID 71 IsAutoGetEngineID 自动手动申请工件编号。0是自动方式;1:手动方式。暂时保留,生成流水号方式是在数据库中实现的 +///62 X RepairUplineMES 72 RepairUplineMES 上线清空MOBY(针对上线工位):通知PLC从新开始申请上线流程 +///63 INT EngineTypeID_MES 73 机型代码(MES) MES发动机机型标志(必须MES) +///64 STRING EngineID_MES 74 工件编号(MES) MES发动机编号(必须MES) +///65 STRING EngineType_MES 75 EngineType_MES MES发动机机型(必须MES) +///66 X Reserved_20 76 Reserved_20 备用 +///67 INT ProcessCode 77 ProcessCode 手动拧紧工位:由MES通知PLC拧紧序号 +///68 B OnLineState 79 OnLineState 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线:0正常状态,实现正常功能。1离线:设备脱离MES工作,进入不交互模式。 +///69 INT PartPalletCode 80 托盘号(MES) 托盘编号(B5A) +///70 INT BoltCode 88 BoltCode 手动拧紧工位:指导PLC所用套筒 +///71 INT RepairStatus 93 RepairStatus "0正常件,1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径" +///72 DInt Reserved_15 110 Reserved_15 备用 +///73 DInt Reserved_16 111 Reserved_16 备用 +///74 B Reserved_17 112 Reserved_17 备用 +///75 INT SPareint1 113 SPareint1 备用int1 +///76 INT SPareint2 114 SPareint2 备用int2 +///77 INT SPareint3 115 SPareint3 备用int3 +///78 STRING Sparestring1 116 Sparestring1 备用字符串1 +///79 STRING Sparestring2 117 Sparestring2 备用字符串2 +///80 X MachineStatusPutOn 1000 机床上电(PLC) 机床上电(必须PLC) +///81 X MachineStatusWorkOn 1001 循环开始(PLC) 循环开始(必须PLC) +///82 X MachineStatusAlarm 1002 设备报警(PLC) 机床故障(必须PLC) +///83 X MachineStatusNoPart 1003 MachineStatusNoPart 上料无件(必须PLC) +///84 X MachineStatusBlock 1004 MachineStatusBlock 下料堵塞(必须PLC) + + +namespace MisDataFunDll +{ + /// + /// 这是变量类型代码的配置,几乎是不变的 + /// 请不要随意修改,为了保证变量版本同一,并且方便维护,请联系发行人修改! + /// 请注意,此修改为全局修改! + /// + public enum EnumTagTypeCodeID + { + /// + /// 工件到位(PLC) + /// 变量类型:Bool + /// 解释:托盘到达工位,并且托盘上有工件。 + /// + WorkStart = 2, + /// + /// + /// + RepairPartStatusPLC = 3, + /// + /// 工位返修字符串 + /// 变量类型:String + /// 解释:工位返修字符串 + /// + RepairPathString = 4, + /// + /// 传递机型(MES) + /// 变量类型:Bool + /// 解释:MES传递总成信息给PLC(上线工位) + /// + EngineTypeGetOverMES = 5, + /// + /// + /// + PartPalletGoOver = 6, + /// + /// + /// + MaterialVerifyOver = 7, + /// + /// + /// + FalseGo = 8, + /// + /// + /// + EngineTypeID = 9, + /// + /// + /// + EngineID = 10, + /// + /// 机型(MES) + /// 变量类型:String + /// + EngineType = 11, + /// + /// + /// + PartPalletStatus = 13, + /// + /// + /// + HeartBeatPLC = 14, + /// + /// + /// + HeartBeatMIS = 15, + /// + /// + /// + TargetTimeRead = 16, + /// + /// + /// + MachineTargetTime = 17, + /// + /// + /// + MachineActualTime = 18, + /// + /// 允许保存(PLC) + /// 变量类型:Bool + /// + MesRead = 19, + /// + /// 保存完成(MES) + /// 变量类型:Bool + /// + MesReadOver = 20, + /// + /// 合格标志(PLC) + /// 变量类型:Int + /// + QualityMask = 21, + /// + /// + /// + PalletInfo = 22, + /// + /// + /// + RepairStatusPLC = 23, + /// + /// 订单号(MES) + /// 变量类型:Int + /// + OrderNo = 24, + /// + /// 库位号(MES) + /// 变量类型:Bool + /// + StorageNo = 25, + /// + /// 允许放行(MES) + /// 变量类型:Bool + /// + AllowPass = 26, + /// + /// + /// + PartLoadFinish = 27, + /// + /// + /// + Reserved_7 = 28, + /// + /// + /// + Reserved_8 = 29, + /// + /// + /// + Reserved_9 = 30, + /// + /// + /// + Reserved_10 = 31, + /// + /// + /// + Reserved_11 = 32, + /// + /// + /// + Reserved_12 = 33, + /// + /// + /// + Reserved_13 = 34, + /// + /// + /// + Reserved_14 = 35, + /// + /// + /// + PLCSPareint1 = 36, + /// + /// + /// + PLCSPareint2 = 37, + /// + /// + /// + PLCSPareint3 = 38, + /// + /// 订单号(PLC) + /// + OrderFormPLC = 39, + /// + /// + /// + PLCSarestring2 = 40, + /// + /// + /// + MarkID = 42, + /// + /// + /// + PartLoad = 43, + /// + /// 传递机型(PLC) + /// 变量类型:Bool + /// + EngineTypeGetOverPLC = 44, + /// + /// + /// + PartLoadOK = 48, + /// + /// + /// + Reserved_18 = 49, + /// + /// + /// + PalletDown = 50, + /// + /// + /// + ConfirmOkGo = 51, + /// + /// + /// + ResetDevice = 52, + /// + /// + /// + UnloadCompleted = 53, + /// + /// + /// + MachineTime_ReadOver = 54, + /// + /// + /// + Reserved_19 = 58, + /// + /// + /// + FixOK = 59, + /// + /// + /// + Reserved_21 = 61, + /// + /// + /// + Reserved_22 = 62, + /// + /// + /// + Reserved_23 = 63, + /// + /// + /// + Reserved_24 = 64, + /// + /// + /// + Reserved_25 = 65, + /// + /// + /// + FixAllow = 66, + /// + /// + /// + FixOver = 67, + /// + /// + /// + MatchingCompleted = 68, + /// + /// + /// + Match = 69, + /// + /// + /// + Reserved_2 = 70, + /// + /// + /// + IsAutoGetEngineID = 71, + /// + /// + /// + RepairUplineMES = 72, + /// + /// 机型代码(MES) + /// 变量类型:Int + /// + EngineTypeID_MES = 73, + /// + /// 工件编号(MES) + /// 变量类型:String + /// + EngineID_MES = 74, + /// + /// + /// + EngineType_MES = 75, + /// + /// + /// + Reserved_20 = 76, + /// + /// + /// + ProcessCode = 77, + /// + /// + /// + OnLineState = 79, + /// + /// 托盘号(MES) + /// 变量类型:Int + /// + PartPalletCode = 80, + /// + /// + /// + BoltCode = 88, + /// + /// + /// + RepairStatus = 93, + /// + /// + /// + Reserved_15 = 110, + /// + /// + /// + Reserved_16 = 111, + /// + /// + /// + Reserved_17 = 112, + /// + /// + /// + SPareint1 = 113, + /// + /// + /// + SPareint2 = 114, + /// + /// + /// + /// + /// MES订单号 + /// + OrdeFormMES = 116, + /// + /// + /// + Sparestring2 = 117, + /// + /// 机床上电(PLC) + /// 变量类型:Bool + /// + MachineStatusPutOn = 1000, + /// + /// 循环开始(PLC) + /// 变量类型:Bool + /// + MachineStatusWorkOn = 1001, + /// + /// 设备报警(PLC) + /// 变量类型:Bool + /// + MachineStatusAlarm = 1002, + /// + /// 上料无件(PLC) + /// 变量类型:Bool + /// + MachineStatusNoPart = 1003, + /// + /// 下料堵塞(PLC) + /// 变量类型:Bool + /// + MachineStatusBlock = 1004, + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/Reflection.cs b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/Reflection.cs new file mode 100644 index 0000000..d7bd835 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/14MisDataFunctionDB/Reflection.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using System.Web; +using System.ComponentModel; + +namespace MisDataFunDll +{ + /// + /// + /// + public class Reflection + { + /// + /// 通过反射调用动态连接库方法 + /// + /// 程序集(DLL) + /// 命名空间名称,如果无命名空间写“” + /// 类名 + /// 方法名 + /// 函数参数数组 + static public string ReflectionMethod(Assembly assembly, string Namespace, string Classname, string Method, object[] Paramsters) + { + try + { + + Type t; + //类 + if (Namespace == "") + { + t = assembly.GetType(Classname); + } + else + { + t = assembly.GetType(Namespace + "." + Classname); + } + if (t == null) + { + return "类不存在"; + } + ////方法 + MethodInfo mi = t.GetMethod(Method); //获取方法 + if (mi == null) + { + return "方法不存在"; + } + ParameterInfo[] paramsInfo = mi.GetParameters(); + for (int i = 0; i < paramsInfo.Length; i++) + { + Type tType = paramsInfo[i].ParameterType; + //改变参数类型 + Paramsters[i]= SD_ChanageType(Paramsters[i],tType); + } + /// 建一个实例化的类 + object instanceObject = Activator.CreateInstance(t); + mi.Invoke(instanceObject, Paramsters); + return "ok"; + } + catch(Exception err) + { + return err.ToString(); + + } + + } + /// + /// + /// + /// + /// + /// + public static object SD_ChanageType(object value, Type convertsionType) + { + //判断convertsionType类型是否为泛型,因为nullable是泛型类, + if (convertsionType.IsGenericType && + //判断convertsionType是否为nullable泛型类 + convertsionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) + { + if (value == null || value.ToString().Length == 0) + { + return null; + } + + //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 + NullableConverter nullableConverter = new NullableConverter(convertsionType); + //将convertsionType转换为nullable对的基础基元类型 + convertsionType = nullableConverter.UnderlyingType; + } + return Convert.ChangeType(value, convertsionType); + } + } +} \ No newline at end of file diff --git a/Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs b/Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs new file mode 100644 index 0000000..8418da8 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/LoadTagTypeCodeID.cs @@ -0,0 +1,128 @@ +//using BasicData; +//using MesWork; +//using OpcBasic; +using MesServerWork; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static MesServerWork.MIS_BASE; + +namespace MesDataFunction +{ + public class LoadTagTypeCodeID + { + + + public static void Load(string path) + { + MIS_BASE.hashtable_TagType = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeTagName = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_MesTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_WebTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeDataType = new NameValueCollection(); + + var dt = NPOITest.ExeclHelper.ExcelToDataTable(path, "变量类型代码", true); + for (int i = 0; i < dt.Rows.Count; i++) + { + //序号 变量类型 TagTypeDataType TagName 变量类型代码 TagTypeChange MesTagTypeChange WebTagTypeChange 信号点名称 变量类型名称 + + var TagTypeDataType = dt.Rows[i]["TagTypeDataType"].ToString(); + var TagName = dt.Rows[i]["TagName"].ToString(); + var 变量类型代码 = dt.Rows[i]["变量类型代码"].ToString(); + var TagTypeChange = dt.Rows[i]["TagTypeChange"].ToString(); + var WebTagTypeChange = dt.Rows[i]["WebTagTypeChange"].ToString(); + var MesTagTypeChange = dt.Rows[i]["MesTagTypeChange"].ToString(); + + //OpcOperation.hashtable_TagType.Add(TagName, 变量类型代码); + //OpcOperation.hashtable_TagTypeTagName.Add(变量类型代码, TagName); + //OpcOperation.hashtable_TagTypeChange.Add(TagName, TagTypeChange); + //OpcOperation.hashtable_MesTagTypeChange.Add(TagName, MesTagTypeChange); + //OpcOperation.hashtable_WebTagTypeChange.Add(TagName, WebTagTypeChange); + //OpcOperation.hashtable_TagTypeDataType.Add(变量类型代码, TagTypeDataType); + if (!MIS_BASE.hashtable_TagType.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagType.Add(TagName, 变量类型代码); + if (!MIS_BASE.hashtable_TagTypeTagName.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeTagName.Add(变量类型代码, TagName); + if (!MIS_BASE.hashtable_TagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagTypeChange.Add(TagName, TagTypeChange); + if (!MIS_BASE.hashtable_MesTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_MesTagTypeChange.Add(TagName, MesTagTypeChange); + if (!MIS_BASE.hashtable_WebTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_WebTagTypeChange.Add(TagName, WebTagTypeChange); + if (!MIS_BASE.hashtable_TagTypeDataType.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeDataType.Add(变量类型代码, TagTypeDataType); + } + HashtableList.hashtable_TagTypeTagName_Temp = new Hashtable(); + foreach (string key in MIS_BASE.hashtable_TagTypeTagName.Keys) + { + HashtableList.hashtable_TagTypeTagName_Temp.Add(key, MIS_BASE.hashtable_TagTypeTagName[key]); + } + HashtableList.hashtable_TagTypeDataType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagTypeDataType.Keys) + { + HashtableList.hashtable_TagTypeDataType_Temp.Add(key, MIS_BASE.hashtable_TagTypeDataType[key]); + } + HashtableList.hashtable_TagType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagType.Keys) + { + HashtableList.hashtable_TagType_Temp.Add(key, MIS_BASE.hashtable_TagType[key]); + } + } + + public static void Load(DataTable dt) + { + MIS_BASE.hashtable_TagType = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeTagName = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_MesTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_WebTagTypeChange = new NameValueCollection(); + MIS_BASE.hashtable_TagTypeDataType = new NameValueCollection(); + + for (int i = 0; i < dt.Rows.Count; i++) + { + //序号 变量类型 TagTypeDataType TagName 变量类型代码 TagTypeChange MesTagTypeChange WebTagTypeChange 信号点名称 变量类型名称 + var TagTypeDataType = dt.Rows[i]["TagTypeDataType"].ToString(); + var TagName = dt.Rows[i]["TagName"].ToString(); + var 变量类型代码 = dt.Rows[i]["变量类型代码"].ToString(); + var TagTypeChange = dt.Rows[i]["TagTypeChange"].ToString(); + var WebTagTypeChange = dt.Rows[i]["WebTagTypeChange"].ToString(); + var MesTagTypeChange = dt.Rows[i]["MesTagTypeChange"].ToString(); + if (!MIS_BASE.hashtable_TagType.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagType.Add(TagName, 变量类型代码); + if (!MIS_BASE.hashtable_TagTypeTagName.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeTagName.Add(变量类型代码, TagName); + if (!MIS_BASE.hashtable_TagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_TagTypeChange.Add(TagName, TagTypeChange); + if (!MIS_BASE.hashtable_MesTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_MesTagTypeChange.Add(TagName, MesTagTypeChange); + if (!MIS_BASE.hashtable_WebTagTypeChange.AllKeys.Contains(TagName)) + MIS_BASE.hashtable_WebTagTypeChange.Add(TagName, WebTagTypeChange); + if (!MIS_BASE.hashtable_TagTypeDataType.AllKeys.Contains(变量类型代码)) + MIS_BASE.hashtable_TagTypeDataType.Add(变量类型代码, TagTypeDataType); + } + HashtableList.hashtable_TagTypeTagName_Temp = new Hashtable(); + foreach (string key in MIS_BASE.hashtable_TagTypeTagName.Keys) + { + HashtableList.hashtable_TagTypeTagName_Temp.Add(key, MIS_BASE.hashtable_TagTypeTagName[key]); + } + HashtableList.hashtable_TagTypeDataType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagTypeDataType.Keys) + { + HashtableList.hashtable_TagTypeDataType_Temp.Add(key, MIS_BASE.hashtable_TagTypeDataType[key]); + } + HashtableList.hashtable_TagType_Temp = new NameValueCollection(); + foreach (string key in MIS_BASE.hashtable_TagType.Keys) + { + HashtableList.hashtable_TagType_Temp.Add(key, MIS_BASE.hashtable_TagType[key]); + } + } + + } + +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs new file mode 100644 index 0000000..e4cc6aa --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/InitTagValueListData.cs @@ -0,0 +1,83 @@ +//using DataLinkMesWork; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +//using SystemFramework; + +namespace MesServerWork +{ + public class InitTagValueListData + { + public InitTagValueListData() + { + DataTable dt = ReadMesServerData(); + + InitMesReadTagKey(); + initAllItemValue(dt); + } + + DataTable ReadMesServerData() + { + return null;// MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 监控属性代码 = '{1}'").CopyToDataTable(); + } + + void InitMesReadTagKey() + { + DataTable dt = null;// MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 变量类型代码=19 and 监控属性代码 = '{1}'").CopyToDataTable(); ; + + for (int i = 0; i < dt.Rows.Count; i++) + { + if (MesReadTagKey_Hash.ContainsKey(dt.Rows[i]["工位号"].ToString())) + { + MesReadTagKey_Hash[dt.Rows[i]["工位号"].ToString()] = dt.Rows[i]["TagID"].ToString(); + } + else + { + MesReadTagKey_Hash.Add(dt.Rows[i]["工位号"].ToString(), dt.Rows[i]["TagID"].ToString()); + } + + } + + } + void initAllItemValue(DataTable dt) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + if (ItemValue_Hash.ContainsKey(dt.Rows[i]["TagID"])) + { + if (Convert.ToInt32(dt.Rows[i]["列位置"]) != 0) + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString() + "(" + dt.Rows[i]["列位置"].ToString() + ")"; + } + else + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString(); + } + + } + else + { + if (Convert.ToInt32(dt.Rows[i]["列位置"]) != 0) + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString() + "(" + dt.Rows[i]["列位置"].ToString() + ")"; + } + else + { + ItemValue_Hash[dt.Rows[i]["TagID"]] = dt.Rows[i]["测量项目"].ToString(); + } + } + + } + + + } + + + public static Hashtable MesReadTagKey_Hash = new Hashtable(); + public static Hashtable ItemValue_Hash = new Hashtable(); + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs new file mode 100644 index 0000000..1df2dfe --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Barcode.cs @@ -0,0 +1,95 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerBarcode = new object(); + + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + static public void Barcode(object e) + { + lock (lockerBarcode) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + + + //获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //此处逻辑有问题 需要考虑到批次扫描 提示PLC未传递机型的情况 + if (EngineGetOver_PLC_NextWorkStep && IsSuccess) + { + if (IsAllowWork == 1) + { + BaseDataSystemMES.Material_Insert(OpName, 1); + + //if (!BaseDataSystemMES.QualityVerifyStatusOutline(OpName, out AlarmStr)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, OpName); + // return; + //} + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + else + { + AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + } + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs new file mode 100644 index 0000000..26b9cfa --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.ConfirmOkGo.cs @@ -0,0 +1,47 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerConfirmOkGo = new object(); + + static public void ConfirmOkGo(object e) + { + lock (lockerConfirmOkGo) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + + //BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs new file mode 100644 index 0000000..670819c --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.EngineTypeGetOver_PLC_Work.cs @@ -0,0 +1,139 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerEngineTypeGetOver_PLC_Work = new object(); + + + static public void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + lock (lockerEngineTypeGetOver_PLC_Work) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + //string OrderForm = "";//订单号 + DataTable dt; + + if (EngineTypeID <= 0) + { + AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + //第一步,查询订单号,保存机型、机型代码、总成号、托盘号、订单号到数据库 + BaseDataSystemMES.GetEngineID_Select(OpName, EngineID, out dt); + if (dt != null && dt.Rows.Count > 0) + { + OrderForm = Convert.ToString(dt.Rows[0]["订单号"]); + } + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, OrderForm, EngineTypeID, EngineType, EngineID, PartPallet_Code, 0, 0, ""); + SaveMobyMessage(OpName, EngineTypeID, EngineType, EngineID, OrderForm); + + //第二步,将零件信息转移到零件_临时表中(本地BOM与订单BOM的选择显示关系) + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + //通知web显示 + Sendmessage("5123", "1111", OpName); + MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 + MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + if (MES_QualityMask == 2) + { + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + SendInfomation("NgGO", "1", OpName);//显示不合格标志 + return; + } + + + //第三步,用于工件离开后完工数量统计及工件编号追溯 + BaseDataSystemMES.MaterialPush_EngineIDStatus_Insert(OpName);//更新订单产量 + + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + + + } + + /// + /// 保存MOBY信息 + /// + /// + /// + /// + /// + static private void SaveMobyMessage(string OpName, int engineTypeID, string engineType, string engineID, string orderForm) + { + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineTypeID[OpName] = engineTypeID; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineType.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineType[OpName] = engineType; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineID[OpName] = engineID; + } + if (MIS_BASE.hashtable_EngineGetOver_OrderForm.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_OrderForm[OpName] = orderForm; + } + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + static private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs new file mode 100644 index 0000000..92ee314 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.FalseGO.cs @@ -0,0 +1,48 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerFalseGO = new object(); + + + static public void FalseGO(object e) + { + lock (lockerConfirmOkGo) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + //总合格标志2(不合格) + + //BaseDataSystemMES.Material_Insert_NG(OpName, 2); + + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs new file mode 100644 index 0000000..fc78eb6 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.Material_Insert.cs @@ -0,0 +1,59 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerMaterial_Insert = new object(); + + static public void Material_Insert(string OpName) + { + lock (lockerMaterial_Insert) + { + try + { + //int tagValue = Convert.ToInt32(msgEvent.TagValue); + int IsAllowWork; + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (EngineGetOver_PLC_NextWorkStep&&IsAllowWork == 1) + { + BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs new file mode 100644 index 0000000..260cd1a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.MesReadOver.cs @@ -0,0 +1,66 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerMesReadOver = new object(); + + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + static public void MesReadOver(object e) + { + lock (lockerMesReadOver) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + var tagValue = msgEvent.TagValue.ToString(); + + if (tagValue == "1" | tagValue.ToLower() == "true") + { + int qualityMask; + MIS_BASE.Read_QualityMask(OpName, out qualityMask); + + SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);//发给Web页面显示质量数据 + + if (qualityMask == 1)//全部OK,给出合格放行 + { + //如果存在线外扫描工位,根据扫描条码绑定线外数据 需要时解除禁用 + //BaseDataSystemMES.TransLaunchDataByMainMaterial(OpName, EngineType, EngineID, EngineTypeID); + + //如果存在线外排队工位,根据排队编号绑定线外数据 需要时解除禁用 + ////BaseDataSystemMES.MailLineAndSubLineData_InsertByEngineID_Subline(OpName,EngineID, EngineTypeID, EngineType); + + MIS_BASE.Write_ConfirmOkGo(OpName, true); + //MIS_BASE.Write_FalseGO(OpName, false); + } + else + { + //MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FalseGO(OpName, true); + } + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:MesReadOver"); + } + } + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs new file mode 100644 index 0000000..92bfe0a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.SendMessage.cs @@ -0,0 +1,162 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + + /// + /// 发送提示消息 + /// + /// + static private void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + BaseDataSystemMES.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice|" + opname + "|" + "1"; + MIS_BASE.asyncSendMessage(SendMessage); + } + + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + static public string SendInfomation(string Command, string Value, string OpName) + { + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + return AsyncSendMessage(SendMessage); + } + + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + static private string AsyncSendMessage(string Message) + { + return MIS_BASE.asyncSendMessage(Message); + } + + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + static void Sendmessage(string MessageNumm, string Value, string OpName) + { + for (int i = 0; i < MessageNumm.Length; i++) + { + Sendmessage(MessageNumm[i], Value[i].ToString(), OpName); + + } + } + /// + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + static string Sendmessage(char Num, string Value, string OpName) + { + string SendMessage; + string result = ""; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '3': + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '4': + //4订单完工模块刷新完成数量 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '8'://清除MES生成编号 + + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + } + return result; + } + ///// + ///// 向WEB发送信息(value为字符串) + ///// + ///// 消息种类 + ///// 消息内容 + ///// 工位号 + //string SendInfomation(string Command, string Value, string OpName) + //{ + // string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + // return AsyncSendMessage(SendMessage); + //} + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + AsyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:SendActuallyCount"); + } + } + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs new file mode 100644 index 0000000..e472489 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WebSubmit.cs @@ -0,0 +1,282 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using System.Threading; +using bizFacade; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerWebSubmit = new object(); + + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + static public void WebSubmit(object e) + { + lock (lockerWebSubmit) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //删除不合格放行记录 + //修改托盘状态 + //Update_PalletStatus(OpName, 1, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 3, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 2, false); + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName, 0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + + default: break; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + static public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + static private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + Sendmessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + static private void InitializeSingalToWeb(string Opname) + { + + //工件到位 DBX0.1 + bool S_WorkStart; + bool S_FixAllow; + bool S_EngineGetOver; + bool S_MaterialVerifyOver; + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + + + if (S_WorkStart == true) + { + SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + + if (S_EngineGetOver == true) + { + + SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + Sendmessage("5123", "1111", Opname); + } + if (S_FixAllow == true) + { + SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + if (S_MaterialVerifyOver == true) + { + SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs new file mode 100644 index 0000000..ec1d4c4 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Functions.WorkStart.cs @@ -0,0 +1,45 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +////using bizFacade; +using System.Collections.Specialized; +//using MesWork; +//using SystemFramework; +using System.Threading; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + static object lockerWorkStart = new object(); + + + + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + static private void WorkStart(object e) + { + lock (lockerWorkStart) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs new file mode 100644 index 0000000..bc3387a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.TagID.cs @@ -0,0 +1,805 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +using MisDataFunDll; +//using MesWork; + + +namespace MesServerWork +{ + public partial class MIS_BASE // : Form + { + /// + /// 全部数据列表 + /// + public static DataTable BasicDataTagValue; + /// + /// MES_基本数据_测量范围 + /// + public static DataTable BasicDataTagValueUpDown; + /// + /// 是否通过监控系统保存数据 + /// 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + /// + static public Hashtable hashtable_tagTable_OpName_SaveData; + /// + /// 变量代码与列位置 + /// + static public Hashtable hashtable_tagTable_TagID_TagOrderBy; + /// + /// 变量代码与变量排序 + /// + static public Hashtable hashtable_tagTable_TagID_TagItemOrderBy; + /// + /// 变量代码与变量特点 + /// 0:没定义1:工位合格标志2:需要合格标志的测量数据3:每个工位的合格标志4:物料5:IQA码6:压装数据7:压装合格标志8:(自动拧紧)工位合格标志 + /// + static public Hashtable hashtable_tagTable_TagID_TagProperty; + /// + /// 发动机类型转换表 + /// SELECT ID,发动机机型代码 FROM MES_计划BOM_发动机型号代码 + /// + public static Hashtable hashtable_EngineTypeID; + + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// (5分线上线 总线)(6分线上线 分线) + /// + public static Hashtable hashtableOpName_OpType; + /// + /// 工位号与大屏幕代码 + /// 对应LED大屏幕(1,2,3,4) + /// + public static Hashtable hashtableOpName_LedID; + /// + /// 大屏幕显示产量端口(41104) + /// + public static Hashtable hashtableOpName_LedID_Port; + + /// + /// 大屏幕显示Andon大屏幕代码 1 + /// + public static Hashtable hashtableOpName_AndonID; + + /// + /// 大屏幕显示Andon端口 (41105) + /// + public static Hashtable hashtableOpName_AndonID_Port; + + + /// + /// 是否有打印机(0,1) + /// + public static Hashtable hashtableOpName_IsPrinter; + + /// + /// 打印机通讯端口 + /// + public static Hashtable hashtableOpName_IsPrinter_Port; + + + + /// + /// 工位号与目标循环时间 + /// + public static Hashtable hashtableOpName_TargetTime; + /// + /// 工位号与线体类型 + /// + public static Hashtable hashtableOpName_LineType; + /// + /// 是否有工位计算机 + /// + public static Hashtable hashtableOpName_IsHaveComputer; + /// + /// 变量名称 + /// + public static Hashtable hashtableTagID_TagName; + /// + /// 工位号 + /// + public static Hashtable hashtableTagID_OpName; + /// + /// 数据来源 + /// + public static Hashtable hashtableTagID_OpNameFrom; + + /// + /// 工位名称 + /// + static Hashtable hashtableTagID_OpName_Name; + /// + /// 测量位置 + /// + public static Hashtable hashtableTagID_ShaftID; + /// + /// 测量项目 + /// + public static Hashtable hashtableTagID_ItemVale; + /// + /// 变量代码与变量类型 + /// + public static Hashtable hashtable_tagTable_TagID_TagTypeID_All; + + + + /// + ///工位号与机床状态 + /// [测量数据机床状态] + /// + public static Hashtable m_MachineStatus_OpName; + /// + ///工位号与工件离开 1->0 =0 无工件或工件离开 + ///工位号与工件到位 0->1 =1 有工件或工件到达 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_WorkStart_OpName; + + /// + ///工位号与工件到位时间 + ///工位号与工件到位 0->1 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_WorkStart_OpName_Time; + + /// + ///工位号与工件到位时间 + ///工位号与工件到位 0->1,零件运动方向 + /// + public static Hashtable m_WorkStart_OpName_PartMoveDirection; + + + /// + ///工位号与发动机号 + /// + public static Hashtable m_EngineTrace_OpName; + /// + ///工位号与发动机号_时间 + /// + public static Hashtable m_EngineTrace_OpName_Time; + /// + ///工位号与合格标志 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_QualityMask_OpName; + + /// + ///工位号与机型 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_EngineNumberType_OpName; + /// + ///工位号与发动机号 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_EngineNumber_OpName; + + /// + ///工位号与订单号 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_OrderForm_OpName; + /// + ///工位号与操作者工号 + ///[测量数据发动机在线状态] + /// + public static Hashtable m_OperatorCode_OpName; + + + /// + /// 测量合格标志 + /// 全部测量数据的测量工位 + /// 全部测量数据的测量工位的数据来源 + /// 全部测量数据的测量工位的数据来源的测量变量 + /// + public static Hashtable hashtable_QualityData_GoodBad_MIS_OpName; + /// + /// 列位置 + /// + public static Hashtable hashtable_QualityData_GoodBad_Index; + + /// + /// MesServerCode + /// + public static Hashtable hashtable_MesServerCode; + /// + /// MesDll + /// + public static Hashtable hashtable_MesDll; + /// + /// 各个工位是否允许工作 + /// + public static Hashtable hashtable_IsAllowWork; + + /// + /// 返修工位是否需要强制合格放行 + /// //20141104 ljl + /// + public static Hashtable hashtable_IsConfirmOkGo; + + + /// + /// 工步属性哈西表 + /// + public static Hashtable hashtable_workStepProperty; + + /// + /// 工作顺序哈西表 + /// + public static Hashtable hashtable_WorkGroupIndex; + + /// + /// 返修工位哈西表 + /// + public static Hashtable hashtable_OpNameRepair; + + /// + /// 记录工件到位的发动机机型代码 + /// + public static Hashtable hashtable_EngineGetOver_EngineTypeID; + /// + /// 记录工件到位的发动机机型 + /// + public static Hashtable hashtable_EngineGetOver_EngineType; + /// + /// 记录工件到位的发动机号 + /// + public static Hashtable hashtable_EngineGetOver_EngineID; + /// + /// 记录工件到位的订单号 + /// + public static Hashtable hashtable_EngineGetOver_OrderForm; + + /// + /// 拧紧/压装过程中的合格标志 + /// + public static Hashtable hashtable_QualityMesRead; + + + /// + /// 物料检测哈希表 + /// + public static Hashtable hashtable_CheckMaterial; + + /// + /// 托盘状态哈希表 + /// + public static Hashtable hashtable_PalletInfo; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床上电开始时间 + ///机床上电产生 0->1 + ///机床上电解除 1->0 + /// + public static Hashtable m_MachineStatusPutOn_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位循环开始 开始时间 + ///循环开始产生 0->1 + ///循环开始解除 1->0 + /// + public static Hashtable m_MachineStatusWorkOn_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床故障开始时间 + ///机床故障产生 0->1 + ///机床故障解除 1->0 + /// + public static Hashtable m_MachineStatusAlarm_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位上料无件开始时间 + ///上料无件产生 0->1 + ///上料无件解除 1->0 + /// + public static Hashtable m_MachineStatusNoPart_OpName_Time; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位下料堵塞开始时间 + ///下料堵塞产生 0->1 + ///下料堵塞解除 1->0 + /// + public static Hashtable m_MachineStatusBlock_OpName_Time; + + /// + ///工位号与托盘离开 1->0 + ///工位号与托盘到位 0->1 + ///[测量数据_监控系统_托盘到位] + /// + public static Hashtable m_PartPalletStatus_OpName; + /// + ///工位号与托盘离开 1->0 + ///工位号与托盘到位 0->1 + ///[测量数据_监控系统_托盘到位] + /// + public static Hashtable m_PartPalletStatus_OpName_Time; + /// + /// 托盘到位(1)托盘离开(0) (DBX101.7)(13) + /// + /// + /// + + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床上电开始时间 + ///机床上电产生 0->1 + ///机床上电解除 1->0 + /// + public static Hashtable m_MachineStatusPutOn_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位循环开始 开始时间 + ///循环开始产生 0->1 + ///循环开始解除 1->0 + /// + public static Hashtable m_MachineStatusWorkOn_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位机床故障开始时间 + ///机床故障产生 0->1 + ///机床故障解除 1->0 + /// + public static Hashtable m_MachineStatusAlarm_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位上料无件开始时间 + ///上料无件产生 0->1 + ///上料无件解除 1->0 + /// + public static Hashtable m_MachineStatusNoPart_OpName; + /// + ///[测量数据机床状态_分拆统计] + ///各个工位下料堵塞开始时间 + ///下料堵塞产生 0->1 + ///下料堵塞解除 1->0 + /// + public static Hashtable m_MachineStatusBlock_OpName; + + public static NameValueCollection hashtable_TagTypeDataType ; + public static NameValueCollection hashtable_TagType; + /// + /// 托盘代码(DBB86)(80) + /// + /// + /// + + /// + /// 创建MesServerCode哈西表 + /// + static public void InitHashtable_MesServerCode() + { + hashtable_MesServerCode = new Hashtable(); + hashtable_IsAllowWork = new Hashtable(); + hashtable_WorkGroupIndex = new Hashtable(); + hashtable_EngineGetOver_EngineTypeID = new Hashtable(); + hashtable_EngineGetOver_EngineType = new Hashtable(); + hashtable_EngineGetOver_EngineID = new Hashtable(); + hashtable_EngineGetOver_OrderForm = new Hashtable(); + hashtable_QualityMesRead = new Hashtable(); + hashtable_CheckMaterial = new Hashtable(); + hashtable_PalletInfo = new Hashtable(); + hashtable_IsConfirmOkGo = new Hashtable(); + hashtable_MesDll = new Hashtable(); + + string OpName; + string MesServerCode; + string MesDll; + string workStepProperty; + string OpNameRepair; + DataTable dt; + dt = MisDataFun.GetMesServerCodeFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + MesServerCode = dt.Rows[i]["MesServerCode"].ToString(); + MesDll = dt.Rows[i]["MesDll"].ToString(); + hashtable_MesDll.Add(OpName, MesDll); + hashtable_MesServerCode.Add(OpName, MesServerCode); + hashtable_IsAllowWork.Add(OpName, 1); + hashtable_IsConfirmOkGo.Add(OpName, 0);//20141104 ljl + hashtable_PalletInfo.Add(OpName, 0);//20141104 ljl + hashtable_WorkGroupIndex.Add(OpName, 1); + hashtable_EngineGetOver_EngineTypeID.Add(OpName, 0); + hashtable_EngineGetOver_EngineType.Add(OpName, ""); + hashtable_EngineGetOver_EngineID.Add(OpName, ""); + hashtable_EngineGetOver_OrderForm.Add(OpName, ""); + hashtable_QualityMesRead.Add(OpName, 0); + hashtable_CheckMaterial.Add(OpName, new bool[16]); + } + } + HashtableList.hashtable_MesServerCode_Temp = hashtable_MesServerCode; + HashtableList.hashtable_MesDll_Temp = hashtable_MesDll; + + HashtableList.hashtable_EngineGetOver_EngineID_Temp = hashtable_EngineGetOver_EngineID; + HashtableList.hashtable_EngineGetOver_EngineTypeID_Temp = hashtable_EngineGetOver_EngineTypeID; + HashtableList.hashtable_EngineGetOver_EngineType_Temp = hashtable_EngineGetOver_EngineType; + HashtableList.hashtable_EngineGetOver_OrderForm_Temp = hashtable_EngineGetOver_OrderForm; + + //初始化工步属性 + hashtable_workStepProperty = new Hashtable(); + dt = MisDataFun.GetworkStepPropertyFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + workStepProperty = dt.Rows[i]["工步属性"].ToString(); + hashtable_workStepProperty.Add(OpName, workStepProperty); + } + } + + //返修工位 + hashtable_OpNameRepair = new Hashtable(); + dt = MisDataFun.GetOpNameRepairFromMIS(); + if (dt != null) + { + for (int i = 0; i < dt.Rows.Count; i++) + { + OpName = dt.Rows[i]["工位号"].ToString(); + OpNameRepair = dt.Rows[i]["返修工位号"].ToString(); + hashtable_OpNameRepair.Add(OpName, OpNameRepair); + } + } + + HashtableList.hashtable_OpNameRepair_Temp = hashtable_OpNameRepair; + HashtableList.hashtable_workStepProperty_Temp = hashtable_workStepProperty; + HashtableList.hashtable_QualityMesRead_Temp = hashtable_QualityMesRead; + HashtableList.hashtable_IsAllowWork_Temp = hashtable_IsAllowWork; + HashtableList.hashtable_WorkGroupIndex_Temp = hashtable_WorkGroupIndex; + + + + } + + + /// + /// 创建合格标志哈西表 + /// + private static void InitHashtable_QualityData_GoodBad() + { + //列位置 + string index; + // + int tagID; + DataTable dt ; + dt = MisDataFun.BaseData_tagTable_All_B5A(); + + hashtable_QualityData_GoodBad_Index = new Hashtable(); + for (int i = 0; i < dt.Rows.Count; i++) + { + tagID = Convert.ToInt32(dt.Rows[i]["TagID"]); + index = (dt.Rows[i]["列位置"]).ToString(); + hashtable_QualityData_GoodBad_Index.Add(tagID, index); + } + + hashtable_EngineTypeID = new Hashtable(); + dt = MisDataFun.BaseData_tagTable_QualityData_EngineTypeID(); + for (int i = 0; i < dt.Rows.Count; i++) + { + tagID = Convert.ToInt32(dt.Rows[i]["发动机机型代码"]); + index = (dt.Rows[i]["ID"]).ToString(); + hashtable_EngineTypeID.Add(tagID, index); + } + //工位号 + DataTable dt_OpName; + //工位号数据来源 + DataTable dt_OpNameFrom; + //数据来源对应的TagID + DataTable dt_OpNameTagID; + string opName; + string opNameFrom; + hashtable_QualityData_GoodBad_MIS_OpName = new Hashtable(); + // 测量合格标志 + // 全部测量数据的测量工位的数据来源 + Hashtable hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom; + + // 测量合格标志 + // 全部测量数据的测量工位的数据来源的测量变量 + Hashtable hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID; + dt_OpName = MisDataFun.BaseData_tagTable_QualityData_GoodBad_MIS_OpName_B5A(); + if (dt_OpName != null) + { + //有不合格标志的测量工位 + for (int i = 0; i < dt_OpName.Rows.Count; i++) + { + //有不合格标志的测量工位 对应的 数据来源工位号 + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom = new Hashtable(); + opName = dt_OpName.Rows[i]["工位号"].ToString(); + dt_OpNameFrom = MisDataFun.BaseData_tagTable_QualityData_GoodBad_MIS_OpName(opName); + if (dt_OpNameFrom != null) + { + for (int j = 0; j < dt_OpNameFrom.Rows.Count; j++) + { + opNameFrom = dt_OpNameFrom.Rows[j]["数据来源"].ToString(); + dt_OpNameTagID = MisDataFun.BaseData_tagTable_QualityData_GoodBad_MIS_OpName(opName, opNameFrom); + // + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID = new Hashtable(); + if (dt_OpNameTagID != null) + { + for (int k = 0; k < dt_OpNameTagID.Rows.Count; k++) + { + tagID = Convert.ToInt32(dt_OpNameTagID.Rows[k]["TagID"]); + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID.Add(tagID, tagID); + } + } + tagID = Convert.ToInt32(dt_OpNameFrom.Rows[j]["TagID"]); + //全部测量数据的测量工位的数据来源的测量变量 + hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom.Add(tagID, hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom_TagID); + } + } + hashtable_QualityData_GoodBad_MIS_OpName.Add(opName, hashtable_QualityData_GoodBad_MIS_OpName_OpNameFrom); + } + } + } + + + public static NameValueCollection hashtable_TagTypeID_OpName_ToTagID; + + /// + /// 变量代码与其他字段的对应关系 + /// + public static void InitHashtableTagID() + { + //变量代码 + string tagID; + //变量名称 + string tagName; + //工位号 + string opNmae; + //测量位置 + string shaftID; + //测量项目 + string itemVale; + //变量排序 + int tagItemOrderBy; + //变量特点 + // 0:没定义1:工位合格标志2:需要合格标志的测量数据3:每个工位的合格标志4:物料5:IQA码6:压装数据7:压装合格标志8:(自动拧紧)工位合格标志 + int tagProperty; + //列位置 + int tagOrderBy; + InitHashtable_QualityData_GoodBad(); + //MesServerCode哈希表创建 + InitHashtable_MesServerCode(); + //列位置 + hashtable_tagTable_TagID_TagOrderBy = new Hashtable(); + // 变量代码与变量排序 + hashtable_tagTable_TagID_TagItemOrderBy = new Hashtable(); + // 变量代码与变量特点 + // 0:没定义1:工位合格标志2:需要合格标志的测量数据3:每个工位的合格标志4:物料5:IQA码6:压装数据7:压装合格标志8:(自动拧紧)工位合格标志 + hashtable_tagTable_TagID_TagProperty = new Hashtable(); + hashtable_tagTable_OpName_SaveData = new Hashtable(); + //工位号与机床状态 + //[测量数据发动机在线状态] + m_MachineStatus_OpName = new Hashtable(); + ////工位号与工件离开 0 + ////工位号与工件到位 1 + ////[测量数据发动机在线状态] + //m_WorkStart_OpName = new Hashtable(); + ////工位号与工件到位时间 + ////工位号与工件到位 0->1 + ////[测量数据发动机在线状态] + //m_WorkStart_OpName_Time = new Hashtable(); + //工位号与发动机号 + //[测量数据发动机在线状态] + m_EngineTrace_OpName = new Hashtable(); + m_EngineTrace_OpName_Time = new Hashtable(); + //工位号与合格标志 + //[测量数据发动机在线状态] + m_QualityMask_OpName = new Hashtable(); + //工位号与目标循环时间 + hashtableOpName_TargetTime = new Hashtable(); + //工位号与线体类型 + hashtableOpName_LineType = new Hashtable(); + //是否有工位计算机 + hashtableOpName_IsHaveComputer = new Hashtable(); + + //工位号与机型 + //[测量数据发动机在线状态] + m_EngineNumberType_OpName = new Hashtable(); + //工位号与发动机号 + //[测量数据发动机在线状态] + m_EngineNumber_OpName = new Hashtable(); + //工位号与订单号 + //[测量数据发动机在线状态] + m_OrderForm_OpName = new Hashtable(); + //工位号与操作者工号 + //[测量数据发动机在线状态] + m_OperatorCode_OpName = new Hashtable(); + + + // + // 变量名称 + // + hashtableTagID_TagName = new Hashtable(); + // + // 工位号 + // + hashtableTagID_OpName = new Hashtable(); + // + // 数据来源 + // + hashtableTagID_OpNameFrom = new Hashtable(); + // + // 工位名称 + // + hashtableTagID_OpName_Name = new Hashtable(); + // + // 测量位置 + // + hashtableTagID_ShaftID = new Hashtable(); + // + // 测量项目 + // + hashtableTagID_ItemVale = new Hashtable(); + + hashtable_tagTable_TagID_TagTypeID_All = new Hashtable(); + + // 工位号与工位上下线类型 + // (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + // (5 分线上线 总线) (6 分线上线 总线) + hashtableOpName_OpType = new Hashtable(); + // 工位号与大屏幕代码 + // 对应LED大屏幕(1,2,3,4) + hashtableOpName_LedID = new Hashtable(); + + + + + // 大屏幕显示产量端口(41104) + hashtableOpName_LedID_Port = new Hashtable(); + // 大屏幕显示Andon大屏幕代码 1 + hashtableOpName_AndonID = new Hashtable(); + // 大屏幕显示Andon端口 (41105) + hashtableOpName_AndonID_Port = new Hashtable(); + // 是否有打印机(0,1) + hashtableOpName_IsPrinter = new Hashtable(); + // 打印机通讯端口 (缸盖打印机 41101) (发动机上线打印机 41102) (发动机下线打印机 41103) + hashtableOpName_IsPrinter_Port = new Hashtable(); + + m_WorkStart_OpName_Time = new Hashtable(); + m_WorkStart_OpName = new Hashtable(); + + + m_MachineStatusPutOn_OpName_Time = new Hashtable(); + m_MachineStatusPutOn_OpName = new Hashtable(); + m_MachineStatusWorkOn_OpName_Time = new Hashtable(); + m_MachineStatusWorkOn_OpName = new Hashtable(); + m_MachineStatusAlarm_OpName_Time = new Hashtable(); + m_MachineStatusAlarm_OpName = new Hashtable(); + m_MachineStatusNoPart_OpName_Time = new Hashtable(); + m_MachineStatusNoPart_OpName = new Hashtable(); + m_MachineStatusBlock_OpName_Time = new Hashtable(); + m_MachineStatusBlock_OpName = new Hashtable(); + + + + + m_WorkStart_OpName_PartMoveDirection = new Hashtable(); + m_PartPalletStatus_OpName_Time = new Hashtable(); + m_PartPalletStatus_OpName = new Hashtable(); + + hashtable_TagTypeID_OpName_ToTagID = new NameValueCollection(); + + + + DataTable dt; + DateTime dateTime; + dateTime = DateTime.Now; + dt = MisDataFun.BaseData_tagTable_All(); + + //变量类型代码 + int TagTypeID; + for (int i = 0; i < dt.Rows.Count; i++) + { + tagID = dt.Rows[i]["TagID"].ToString (); + tagName = Convert.ToString(dt.Rows[i]["TagName"]); + opNmae = Convert.ToString(dt.Rows[i]["工位号"]); + shaftID = Convert.ToString(dt.Rows[i]["测量位置"]); + itemVale = Convert.ToString(dt.Rows[i]["测量项目"]); + TagTypeID = Convert.ToInt32(dt.Rows[i]["变量类型代码"]); + tagItemOrderBy = Convert.ToInt32(dt.Rows[i]["变量排序"]); + tagProperty = Convert.ToInt32(dt.Rows[i]["变量特点"]); + tagOrderBy = Convert.ToInt32(dt.Rows[i]["列位置"]); + + hashtableTagID_TagName.Add(tagID, tagName); + hashtableTagID_OpName.Add(tagID, opNmae); + hashtableTagID_ShaftID.Add(tagID, shaftID); + hashtableTagID_ItemVale.Add(tagID, itemVale);//列位置 + hashtable_tagTable_TagID_TagTypeID_All.Add(tagID, TagTypeID); + hashtable_tagTable_TagID_TagItemOrderBy.Add(tagID, tagItemOrderBy); + hashtable_tagTable_TagID_TagProperty.Add(tagID, tagProperty); + hashtable_tagTable_TagID_TagOrderBy.Add(tagID, tagOrderBy); + + + } + dt = MisDataFun.BaseData_tagTable_OpName(); + for (int i = 0; i < dt.Rows.Count; i++) + { + //是否通过监控系统保存数据 + // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + hashtable_tagTable_OpName_SaveData.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["是否通过监控系统保存数据"])); + + hashtableOpName_TargetTime.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToString(dt.Rows[i]["目标循环时间"])); + hashtableOpName_LineType.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToString(dt.Rows[i]["线体类型"])); + hashtableOpName_IsHaveComputer.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToString(dt.Rows[i]["是否有工位计算机"])); + //用于LED显示 + // [MES_计划BOM_工位与名称] + // 工位上下线类型 + //(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + hashtableOpName_OpType.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["工位上下线类型"])); + hashtableOpName_LedID.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕代码"])); + m_WorkStart_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_WorkStart_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + + + m_MachineStatusPutOn_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusPutOn_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusWorkOn_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusWorkOn_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusAlarm_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusAlarm_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusNoPart_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusNoPart_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + m_MachineStatusBlock_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_MachineStatusBlock_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + + + + m_WorkStart_OpName_PartMoveDirection.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + + + m_PartPalletStatus_OpName_Time.Add(Convert.ToString(dt.Rows[i]["工位号"]), dateTime); + m_PartPalletStatus_OpName.Add(Convert.ToString(dt.Rows[i]["工位号"]), 0); + try + { + hashtableOpName_LedID_Port.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕显示产量端口"])); + } + catch { } + try + { + hashtableOpName_AndonID.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕显示Andon大屏幕代码"])); + } + catch { } + try + { + hashtableOpName_AndonID_Port.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["大屏幕显示Andon端口"])); + } + catch { } + try { hashtableOpName_IsPrinter.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["是否有打印机"])); } + catch { } + try + { + hashtableOpName_IsPrinter_Port.Add(Convert.ToString(dt.Rows[i]["工位号"]), Convert.ToInt32(dt.Rows[i]["打印机通讯端口"])); + } + catch { } + } + + + //20170310 CLB新加 + dt = MisDataFun.BaseData_tagTable_OpcServerMES_ALL_CF(); + for (int i = 0; i < dt.Rows.Count; i++) + { + try + { + hashtable_TagTypeID_OpName_ToTagID.Add(Convert.ToString(dt.Rows[i]["工位号"]) + "_" + Convert.ToString(dt.Rows[i]["变量类型代码"]), Convert.ToString(dt.Rows[i]["TagID"])); + //hashtable_TagTypeID_OpName_ToTagID; + } + catch(Exception err) + { + + } + } + + + + + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.cs new file mode 100644 index 0000000..19cfd3a --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Hashtable.cs @@ -0,0 +1,91 @@ +using System; +using System.Data; +using System.Collections; + +using System.Windows.Forms; +//using bizFacade; +using System.Collections.Specialized; +using MisDataFunDll; +//using MesWork; + + +namespace MesServerWork +{ + public partial class MIS_BASE // : Form + { + public class HashtableList + { + /// + /// MesServerCode + /// + static public Hashtable hashtable_MesServerCode_Temp; + /// + /// MesDll + /// + static public Hashtable hashtable_MesDll_Temp; + static public NameValueCollection hashtable_TagTypeDataType_Temp; + static public NameValueCollection hashtable_TagType_Temp; + static public Hashtable hashtable_TagTypeTagName_Temp; + + static public Hashtable hashtable_EngineGetOver_EngineTypeID_Temp; + static public Hashtable hashtable_EngineGetOver_EngineType_Temp; + static public Hashtable hashtable_EngineGetOver_EngineID_Temp; + static public Hashtable hashtable_EngineGetOver_OrderForm_Temp; + + static public Hashtable hashtable_OpNameRepair_Temp; + + static public Hashtable hashtable_WorkGroupIndex_Temp; + static public Hashtable hashtable_workStepProperty_Temp; + static public Hashtable hashtable_QualityMesRead_Temp; + static public Hashtable hashtable_IsAllowWork_Temp; + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + static public Hashtable hashtableOpName_OpType_Temp; + + static public Hashtable hashtable_tagTable_OpName_SaveData_Temp; + + + public Hashtable hashtable_tagTable_OpName_SaveData; + + + /// + /// + /// 工位号与工位上下线类型 + /// (0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + /// 5 分线上线(总线) 6 分线上线(分线) + /// + public Hashtable hashtableOpName_OpType; + public Hashtable hashtable_IsAllowWork; + public Hashtable hashtable_QualityMesRead; + public Hashtable hashtable_workStepProperty; + public Hashtable hashtable_OpNameRepair; + /// + /// MesServerCode + /// + public Hashtable hashtable_MesServerCode; + public Hashtable hashtable_TagTypeTagName; + + /// + /// MesDll + /// + public Hashtable hashtable_MesDll; + public NameValueCollection hashtable_TagTypeDataType; + public NameValueCollection hashtable_TagType; + + + public Hashtable hashtable_EngineGetOver_EngineTypeID; + public Hashtable hashtable_EngineGetOver_EngineType; + public Hashtable hashtable_EngineGetOver_EngineID; + public Hashtable hashtable_EngineGetOver_OrderForm; + + public Hashtable hashtable_WorkGroupIndex; + + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + } + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs new file mode 100644 index 0000000..61d5684 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.Machine.ServicePlan.cs @@ -0,0 +1,98 @@ +using System; +using System.Data; +using System.Windows.Forms; +//using bizFacade; +//using DataLinkMesWork; +//using SystemFramework; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + /// + /// 设备保养计划 + /// + /// + /// + /// + public delegate void MachinePlan_Invoke(string OpName, string MachineType, string PlanID); + /// + /// 设备保养计划 + /// + public MachinePlan_Invoke machinePlan_Invoke; + /// + /// 设备保养 + /// + /// + /// 设备保养类型 + /// 工作日历流水号 + public void MachinePlan(string OpName, string MachineType, string PlanID) + { + try + { + string SendMessage; + SendMessage = "MES|MachinePlan|" + OpName + "|" + MachineType + "&" + PlanID; + asyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "MachinePlan"); + } + } + + /// + /// 设备保养计划Timer + /// + private Timer timer_Machine; + /// + /// 初始化设备保养计划 + /// + public void InitMachinePlan(MachinePlan_Invoke machinePlan_Invoke) + { + this.machinePlan_Invoke = machinePlan_Invoke; + timer_Machine = new Timer(); + timer_Machine.Interval = 60000;//每隔一分钟查询一次 + timer_Machine.Tick += new EventHandler(timer_Machine_Tick); + timer_Machine.Start(); + } + + /// + /// 分钟调度 + /// + /// + /// + private void timer_Machine_Tick(object sender, EventArgs e) + { + try + { + //if (ApplicationConfig.Is_MachinePlan == 1) + //{ + // DataTable dt; + // string opName; + // string machineType;//保养类型代码 + // string planID;//工作日历流水号 + // BaseDataSystemMES.MachinePlan_Select(out dt); + // if (dt != null) + // { + // if (dt.Rows.Count > 0) + // { + // for (int i = 0; i < dt.Rows.Count; i++) + // { + // opName = dt.Rows[i]["工位号"].ToString(); + // machineType = dt.Rows[i]["保养类型代码"].ToString(); + // planID = dt.Rows[i]["工作日历流水号"].ToString(); + // BaseDataSystemMES.Rolling_news_Add(opName, opName + "工位有设备保养计划,请相关人员进行保养!!!"); + // BeginInvoke(machinePlan_Invoke, new object[] { opName, machineType, planID }); + // } + // } + // } + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "timer_Machine_Tick"); + } + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs new file mode 100644 index 0000000..f768d82 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Read.cs @@ -0,0 +1,1196 @@ + +using MisDataFunDll; +using System; +using SystemFramework; +//using SystemFramework; +//using bizFacade; + +namespace MesServerWork +{ + + public partial class MIS_BASE + { + + + /// + /// 通过TagTypeName读取PLC数据 + /// + /// + /// + static private void Read_TagValueByTagTypeName(string cmd, string opName, out string tagValue) + { + tagValue = "-1"; + int tagTypeID; + try + { + tagTypeID = Convert.ToInt32(MIS_BASE.hashtable_TagType[cmd]); + string msg = "MES|" + tagTypeID.ToString() + "|" + opName + "|" + tagValue; + //tagValue = ChatService.MesReadWhisperMessage(msg); + MIS_BASE.ReadTagValue(tagTypeID, opName, out tagValue); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeName_FUNC;工位号:" + opName + ";命令:" + cmd + ";值:" + tagValue); + } + + } + + /// + /// 通过TagID读取对应值 + /// + /// + /// + public static void Read_TagValueByTagID(string TagID, out object tagValue) + { + tagValue = "0"; + try + { + tagValue = MIS_BASE.ReadPLC(TagID).ToString(); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagID_FUNC"); + } + } + + /// + /// 根据变量类型代码、工位号获得对应值 + /// + /// + /// + /// + public static void Read_TagValueByTagTypeID(int tagTypeID, string opName, out string tagValueStr) + { + tagValueStr = "-1"; + + try + { + MIS_BASE.ReadTagValue(tagTypeID, opName, out tagValueStr); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeID_FUNC"); + } + } + + /// + /// 根据变量类型代码、工位号获得对应值 + /// + /// + /// + /// + public static void Read_TagValueByTagTypeID(int tagTypeID, string opName, out object tagValueStr) + { + tagValueStr = "-1"; + + try + { + tagValueStr = MIS_BASE.ReadPLC(tagTypeID, opName); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeID_FUNC"); + } + } + /// + /// 根据变量类型代码、工位号获得对应值 + /// + /// + /// + /// + public static string Read_TagValueByTagTypeID(int tagTypeID, string opName) + { + string tagValueStr = "-1"; + try + { + MIS_BASE.ReadTagValue(tagTypeID, opName, out tagValueStr); + + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "Read_TagValueByTagTypeID_FUNC"); + } + return tagValueStr; + } + + /// + /// 读取数据通过(TagTypeName&opName) + /// + /// + /// + public static void Read_TagTypeName(string cmd, string opName, out string tagValueStr) + { + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + } + + /// + /// 读取数据通过(TagTypeID&opName) + /// + /// + /// + public static void Read_TagTypeID(int tagTypeID, string opName, out string tagValueStr) + { + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + } + + + + + + + /// + /// 订单号(string)(25) + /// + /// + /// + public static void Read_OrderForm(string opName, out string tagValue) + { + int tagTypeID = 39; + tagValue = ""; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValue); + } + /// + /// 总成编号(string)(26) + /// + /// + /// + public static void Read_AssemblyCode(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "AssemblyCode"; + Read_TagValueByTagTypeName(cmd, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 配方号1(dint)(27) + /// + /// + /// + public static void Read_Recipe1(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe1"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + /// + /// 配方号2(dint)(28) + /// + /// + /// + public static void Read_Recipe2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 订单号(string)(116) + /// + /// + /// + public static void Read_OrderForm_MES(string opName, out string tagValue) + { + int tagTypeID = 116; + tagValue = ""; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 总成编号(string)(62) + /// + /// + /// + public static void Read_AssemblyCode_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "AssemblyCode_MES"; + Read_TagValueByTagTypeName(cmd, opName, out tagValue); + //tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + /// + /// 配方号1(dint)(63) + /// + /// + /// + public static void Read_Recipe1_MES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe1_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + /// + /// 配方号2(dint)(64) + /// + /// + /// + public static void Read_Recipe2_MES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Recipe2_MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 匹配结果(DBX3.4)(69) + /// 匹配是否成功 + /// + /// + /// + public static void Read_MatchSuccess(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Match"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 是否匹配(DBX3.3)(68) + /// + /// + /// + public static void Read_MatchingCompleted(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "MatchingCompleted"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// MES保存完数据(必须MIS)(X102.2)(20) + /// + /// + /// + public static void Read_MesReadOver(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 20; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 发动机到位(X0.1)(2) + /// + /// + /// + public static void Read_WorkStart(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 2; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + /// + /// 发动机机型标志(INT4)(9) + /// + public static void Read_EngineTypeID(string opName, out int tagValue) + { + int tagTypeID = 9; + tagValue = 0; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + /// + /// 发动机ID(STRING6.38)(10) + /// + public static void Read_EngineID(string opName, out string tagValue) + { + int tagTypeID = 10; + tagValue = ""; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = tagValueStr; + } + //public static void Read_OrderForm(string opName, out string tagValue) + //{ + // tagValue = ""; + // string tagTypeID = "39"; + // string tagValueStr; + // tagValueStr = DtWebApi.ReadWritePLC.ReadPLC(tagTypeID, opName).ToString(); + // tagValue = tagValueStr; + //} + /// + /// 发动机型号(STRING46.38)(11) + /// + public static void Read_EngineType(string opName, out string tagValue) + { + int tagTypeID = 11; + tagValue = ""; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = tagValueStr; + + } + + /// + /// 工位直通(X101.6)(1006) + /// + public static void Read_PartGoOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartGoOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 托盘到位(1)托盘离开(0) (DBX101.5)(13) + /// + public static void Read_PartPalletStatus(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PartPalletStatus"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + /// + /// 加工时间变量目标时间 (DINT 106)(17) + /// + public static void Read_MachineTime_TargetTime(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "TargetTime"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + /// + /// 加工时间变量实际时间 (DINT 110)(18) + /// + public static void Read_MachineTime_ActualTime(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "ActualTime"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 质量数据总成合格标志(INT104)(21) + /// + public static void Read_QualityMask(string opName, out int tagValue) + { + tagValue = 0; + int tagTypeID = 21; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + if (tagValueStr == "1" | tagValueStr.ToLower () == "true") + { + tagValueStr = "1"; + } + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 机体流向标志(1 BYTE): + /// 0普通工位: + /// 1:上线(发动机上线); + /// 2:下线(发动机下线);(INT114)(41) + /// + public static void Read_PartMoveDirection(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartMoveDirection"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + + /// + /// 强制MES(X103.0)(78) + /// + public static void Read_Mes_MustTest(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "IsMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + /// + /// 工位三种状态:在线、离线、屏蔽(0,1,2)(DBB116)(79) + /// + public static void Read_OnLineState(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "OnLineState"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 变量类型代码=44 CF0.4 + /// PLC向MES传递机型,机型代码,零件编号完成,通知PLC。 + /// 机型可读 + /// + /// + /// + public static void Read_EngineGetOver_PLC(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 44; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// X100.2允许保存质量数据(19) + /// + /// + /// + public static void Read_QualityData_Read_CF(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 19; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt64(tagValueStr)); + + } + + /// + /// MES向PLC传递机型(DBX2.1)(5) + /// + /// + /// + public static void Read_EngineTypeGetOver_MES(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 5; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// X2.3 工作完成(7) + /// + /// + /// + public static void Read_MaterialVerifyOver(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 7; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 申请上线(DBX0.3)(43) + /// + /// + /// + public static void Read_PartLoad(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 43; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 上线完成(DBX0.3)(48) + /// + /// + /// + public static void Read_PartLoad_OK(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PartLoadOK"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 合格放行(51) + /// + /// + /// + public static void Read_ConfirmOkGo(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "ConfirmOkGo"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 拧紧结束(DBX1.1)(59) + /// + /// + /// + public static void Read_FixOK(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FixOK"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 蘑菇按钮(DBX1.3)(61) + /// + /// + /// + public static void Read_NextPushButton(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "NextPushButton"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 允许拧紧(DBX3.1)(66) + /// + /// + /// + public static void Read_FixAllow(string opName, out bool tagValue) + { + tagValue = false; + int tagTypeID = 66; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 拧紧结束确认(DBX3.2)(67) + /// + /// + /// + public static void Read_FixOver(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FixOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + ///返修上线,在上线工位,MES依据工件情况,设定为返修件,PLC见到MES设定为1后,将返修标志写入到DBX0.2为1 + ///MES设定完返修返修上线后,MES清空该信号 + ///DBX3.7(72) + /// + /// + /// + public static void Read_RepairUpline_MES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "RepairUplineMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + + /// + /// 匹配结果(DBX3.4)(69) + /// + /// + /// + public static void Read_Match(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Match"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 发动机机型代码(DBB404)(73)[false] + /// + /// + /// + public static void Read_EngineTypeID_MES(string opName, out int EngineTypeID) + { + int tagTypeID = 73; + EngineTypeID = 0; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + EngineTypeID = Convert.ToInt32(tagValueStr); + + } + + /// + /// 发动机机型(DBB446)(75) + /// + /// + /// + public static void Read_EngineType_MES(string opName, out string EngineType) + { + int tagTypeID = 75; + EngineType = ""; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + EngineType = tagValueStr; + + } + + /// + /// 发动机号(DBB406)(74) + /// + /// + /// + public static void Read_EngineID_MES(string opName, out string EngineID) + { + int tagTypeID = 74; + EngineID = ""; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + EngineID = tagValueStr; + + } + + /// + /// 拧紧序号(77) + /// + /// + /// + public static void Read_ProcessCode(string opName, out int tagValue) + { + int tagTypeID = 77; + tagValue = 0; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// 套筒号、子程序代码子程序(DBB26)(2025)[false] + /// + /// + /// + public static void Read_BoltCode(string opName, out int tagValue) + { + int tagTypeID = 88; + tagValue = 0; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// 托盘代码(DBB86)(80) + /// + public static void Read_PalletCode(string opName, out int tagValue) + { + int tagTypeID = 80; + tagValue = 0; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + /// + /// 获得机型,零件编号,机型代码,托盘号,(从PLC) + /// + /// + /// + /// + /// + /// + public static void GetEngineTypeFromPLC(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code,out string OrderForm) + { + Read_EngineTypeID(opName,out EngineTypeID); + Read_EngineType(opName, out EngineType); + Read_EngineID(opName, out EngineID); + Read_OrderForm(opName, out OrderForm); + Read_PalletCode(opName, out PartPallet_Code); + } + /// + /// /// 获得机型,零件编号,机型代码,托盘号,(从MES) + /// + /// + /// + /// + /// + /// + public static void GetEngineTypeFromPLC_MES(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out string OrderForm) + { + Read_EngineTypeID_MES(opName, out EngineTypeID); + Read_EngineType_MES(opName, out EngineType); + Read_EngineID_MES(opName, out EngineID); + Read_OrderForm_MES(opName, out OrderForm); + } + + /// + /// 获得机型,零件编号,机型代码,托盘号,(从DB) + /// + /// + /// + /// + /// + /// + public static void GetEngineTypeFromDB(string opName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code) + { + string orderForm = ""; + int isRepair = 0; + string repairCode = ""; + string palletCode = "0"; + string EngineTypeString = ""; + MisDataFun.Moby_Select(opName, + out orderForm, out EngineTypeID, out EngineType, + out EngineID, out palletCode, out isRepair, out repairCode, out EngineTypeString); + PartPallet_Code = Convert.ToInt32(palletCode); + } + + /// + /// 0:不修改;1:可以修改。(上线工位)通知PLC。(DBX1.2)(76) + /// + /// + /// + public static void Read_PartPalletCode_PLC_ToMES(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletCodePLCToMES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 通知写入托盘号(DBX3.5)(70) + /// + /// + /// + public static void Read_PartPalletCode_PLC(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletCodePLC"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 变量类型代码=86,打印第一行(机型),用于线首打印机。STRING 486 .38 + /// + /// + /// + public static void Read_PrintBarCode1_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "PrintBarCode1MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = tagValueStr; + + } + + /// + /// 变量类型代码=87,打印第二行(流水号),用于线首打印机。STRING 526 .38 + /// + /// + /// + public static void Read_PrintBarCode2_MES(string opName, out string tagValue) + { + tagValue = ""; + string cmd = "PrintBarCode2MES"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = tagValueStr; + + } + + + /// + /// 上线工位。0:正常工作;1:空托盘放行(DBX2.2)(6) + /// + /// + /// + public static void Read_PartPalletGoOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartPalletGoOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 自动手动申请工件编号,0是自动方式;1:手动方式。切换时,(DBX2.1)(71) + /// + /// + /// + public static void Read_IsAutoGetEngineID(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "IsAutoGetEngineID"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 正常拧紧时选择(DBX100.3)(81) + /// + /// + /// + public static void Read_Normal(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "Normal"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 备用拧紧时选择(DBX100.4)(82) + /// + /// + /// + public static void Read_UnNormal(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "UnNormal"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 允许拧紧2(DBX100.5)(83) + /// + /// + /// + public static void Read_FixAllow_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "FixAllow2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 拧紧结束2(DBX100.6)(84) + /// + /// + /// + public static void Read_FixOK_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "FixOK2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 拧紧结束确认2(DBX100.7)(85) + /// + /// + /// + public static void Read_FixOver_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "FixOver2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 拧紧顺序2(DBX101.7)(1007) + /// MES通知PLC开始拧紧顺序(0为其他位,1为第一位置)(必须MES) + /// + /// + /// + public static void Read_WriteShaft_2(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "WriteShaft2"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + + /// + /// 返修上线(DBX2.6)(52) + /// + /// + /// + public static void Read_PartLoadFinish(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartLoadFinish"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 返修上线后,PLC确认(DBX1.0)(58) + /// + /// + /// + public static void Read_PartLoadOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PartLoadOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 变量类型代码=22,读取托盘信息 DBW126 + /// + /// + /// + public static void Read_PalletInfo(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PalletInfo"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + } + + /// + /// 变量类型代码=23,读取托盘信息 DBW194 + /// + /// + /// + public static void Read_RepairStatus_PLC(string opName, out int tagValue) + { + int tagTypeID = 23; + tagValue = 0; + string cmd = "RepairStatusPLC"; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// PLC将MOBY信息成功写入到了对应的DB,然后通知MES(DBX1.5)(63) + /// + /// + /// + public static void Read_PalletMobyReadOver(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "PalletMobyReadOver"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + + /// + /// 在线返修状态(DBX4.0)(91) + /// + /// + /// + public static void Read_OnlineRepair(string opName, out int tagValue) + { + tagValue = 0; + string cmd = "OnlineRepair"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToInt32(tagValueStr); + + } + + /// + /// 离线返修状态(DBX4.1)(92) + /// + /// + /// + public static void Read_OutLineRepair(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "OutLineRepair"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// MES通知PLC修改托盘状态成功(DBX4.2)(93) + /// + /// + /// + public static void Read_UpdatePalletOK(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "UpdatePalletOK"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + + /// + /// MES向PLC要求申请下线(DBX0.7)(50) + /// + /// + /// + public static void Read_PalletDown(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "PalletDown"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + + /// + /// 物料检测(99) + /// + /// + /// + public static void Read_CheckMaterial(string opName, out object tagValue) + { + tagValue = new bool[16]; + string cmd = "CheckMaterial"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 备用功能是否启用(95) + /// + /// + /// + public static void Read_BakOpNameIsWork(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "BakOpNameIsWork"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + + /// + /// 质量呼叫(DBX301.2)(2011) + /// + /// + /// + public static void Read_QualityCall(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "QualityCall"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + /// + /// 物料呼叫(DBX301.3)(2012) + /// + /// + /// + public static void Read_MaterialCall(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "MaterialCall"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + + } + + /// + /// 故障呼叫(DBX301.4)(2013) + /// + /// + /// + public static void Read_FaultCall(string opName, out bool tagValue) + { + tagValue = false; + string cmd = "FaultCall"; + string tagValueStr; + Read_TagValueByTagTypeName(cmd, opName, out tagValueStr); + tagValue = Convert.ToBoolean(Convert.ToInt32(tagValueStr)); + } + + public static void Read_PartScanCode(int tagTypeID, string opName, out string tagValue) + { + tagValue = ""; + string tagValueStr; + Read_TagValueByTagTypeID(tagTypeID, opName, out tagValueStr); + tagValue = tagValueStr; + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs new file mode 100644 index 0000000..7d1826b --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.OpcServerMIS.Write.cs @@ -0,0 +1,574 @@ +using System; +//using SystemFramework; + + +namespace MesServerWork +{ + + public partial class MIS_BASE + { + + + //static public void WritePLC(int tagType, string opName, object tagValue) + //{ + // Write_TagTypeID(tagType, opName, tagValue); + //} + /// + /// + /// + /// + public delegate void DemoHandler(object sender, DeviceDriver_BasicData.CustomeEvetnArgs e); + /// + /// + /// + public static event DemoHandler OPCTagDataDemo; + + /// + /// 根据tagType,工位号写入PLC对应值 + /// + /// + /// + static private void Write_TagValueByTagTypeName(string cmd, string opName,object tagValue) + { + int tagTypeID = 0; + string msg; + try + { + tagTypeID = Convert.ToInt32(MIS_BASE.hashtable_TagType[cmd]); + MIS_BASE.WriteTagValue(tagTypeID, opName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Write_TagValueByTagTypeName_FUNC"); + } + + } + + /// + /// 根据TagTypeID,工位号写入PLC对应值 + /// + /// + /// + static public void Write_TagValueByTagTypeID(int tagTypeID, string opName, object tagValue) + { + string msg; + object tagValueOb; + object newTagValue= tagValue; + try + { + MIS_BASE.WriteTagValue(tagTypeID, opName, tagValue); + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Write_TagValueByTagTypeID_FUNC"); + } + + } + + /// + /// 通过TagID写入PLC数据 + /// + /// + /// + public static void Write_TagID(string TagID, object tagValue) + { + try + { + MIS_BASE.WritePLC(TagID, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Write_TagValueByTagID_FUNC"); + } + } + + + /// + /// 清空MES信号 MES传递机型(5) 允许工作(66) 合格放行(51) 不合格放行(8) 拧紧结束(67) 工作完成(7) 保存完成(20) 加工时间保存完成(54) 匹配完成(68) 默认false + /// + /// + /// + public static void Write_ClearMesMoby(string opName) + { + MIS_BASE.Write_EngineTypeGetOver_MES(opName, false); + MIS_BASE.Write_FixAllow(opName, false); + MIS_BASE.Write_ConfirmOkGo(opName, false); + MIS_BASE.Write_FalseGO(opName, false); + MIS_BASE.Write_FixOver(opName, false); + MIS_BASE.Write_MesWorkFinish(opName, false); + MIS_BASE.Write_MesReadOver(opName, false); + MIS_BASE.Write_MachineTime_ReadOver(opName, false); + MIS_BASE.Write_MatchingCompleted(opName, false); + } + + + /// + /// 订单号(string)(25) + /// + /// + /// + public static void Write_OrderForm(string opName, string tagValue) + { + string cmd = "OrderForm"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 总成编号(string)(26) + /// + /// + /// + public static void Write_AssemblyCode(string opName, string tagValue) + { + string cmd = "AssemblyCode"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号1(dint)(27) + /// + /// + /// + public static void Write_Recipe1(string opName, int tagValue) + { + string cmd = "Recipe1"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号2(dint)(28) + /// + /// + /// + public static void Write_Recipe2(string opName, int tagValue) + { + tagValue = 0; + string cmd = "Recipe2"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + + /// + /// 总成编号(string)(62) + /// + /// + /// + public static void Write_AssemblyCode_MES(string opName, string tagValue) + { + + string cmd = "AssemblyCode_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号1(dint)(63) + /// + /// + /// + public static void Write_Recipe1_MES(string opName, int tagValue) + { + string cmd = "Recipe1_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + /// + /// 配方号2(dint)(64) + /// + /// + /// + public static void Write_Recipe2_MES(string opName, int tagValue) + { + string cmd = "Recipe2_MES"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + /// + /// 各个工位返修状态(4) + /// + /// + /// + public static void Write_RepairPathString(string opName, string tagValue) + { + string cmd = "RepairPathString"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + /// + /// 加工时间保存完数据 DBX102.1 (54) + /// + /// + /// + public static void Write_MachineTime_ReadOver(string opName, bool tagValue) + { + + int tagTypeID = 54; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 工位三种状态:在线、离线、屏蔽(0,1,2)(DBB116)(79) + /// + /// + /// + public static void Write_OnLineState(string opName, int tagValue) + { + string cmd = "OnLineState"; + Write_TagValueByTagTypeName(cmd, opName,Convert .ToInt16 ( tagValue)); + } + + /// + /// 托盘编号(PLC)(80) + /// + /// + /// + public static void Write_PalletCode(string opName, int tagValue) + { + string cmd = "PartPalletCode"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// MES向PLC传递机型(5) + /// + /// + /// + public static void Write_EngineTypeGetOver_MES(string opName, bool tagValue) + { + int tagTypeID = 5; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// PLC向MES传递机型(44) + /// + /// + /// + public static void Write_EngineTypeGetOver_PLC(string opName, bool tagValue) + { + string cmd = "EngineTypeGetOverPLC"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// PLC向MES质量数据可以读 允许保存(19) DBX587.0 + /// + /// + /// + public static void Write_MesRead_PLC(string opName, bool tagValue) + { + string cmd = "MesRead"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + + /// + /// 工件到位 + /// + /// + /// + public static void Write_WorkStart(string opName, bool tagValue) + { + string cmd = "WorkStart"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + /// 拧紧结束确认(67) + /// + /// + /// + public static void Write_FixOver(string opName, bool tagValue) + { + + int tagTypeID = 67; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + ///返修上线,在上线工位,MES依据工件情况,设定为返修件,PLC见到MES设定为1后,将返修标志写入到DBX0.2为1 + ///MES设定完返修返修上线后,MES清空该信号 + ///DBX3.7(72) + /// + /// + /// + public static void Write_RepairUpline_MES(string opName, bool tagValue) + { + int tagTypeID = 72; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 匹配完成(68) + /// + /// + /// + public static void Write_MatchingCompleted(string opName, bool tagValue) + { + int tagTypeID = 68; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + + + + /// + /// 匹配结果(69) + /// + /// + /// + public static void Write_Match(string opName, bool tagValue) + { + int tagTypeID = 69; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + + } + + /// + /// 空托盘放行(DBX2.2)(6) + /// + /// + /// + public static void Write_PartPalletGoOver(string opName, int tagValue) + { + int tagTypeID = 6; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + + /// + /// 自动手动申请工件编号,0是自动方式;1:手动方式。切换时,(DBX2.1)(71) + /// + /// + /// + public static void Write_IsAutoGetEngineID(string opName, int tagValue) + { + string cmd = "IsAutoGetEngineID"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + + /// + /// 正常拧紧时选择(DBX100.3)(81) + /// + /// + /// + public static void Write_Normal(string opName, int tagValue) + { + string cmd = "Normal"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + /// + /// 备用拧紧时选择(DBX100.4)(82) + /// + /// + /// + public static void Write_UnNormal(string opName, int tagValue) + { + string cmd = "UnNormal"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// 变量类型代码=52,复位设备(MES)DBX0.6 + /// 通知PLC复位设备 + /// + /// + /// + public static void Write_ResetDevice(string opName, bool tagValue) + { + string cmd = "PartLoadFinish"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + /// + ///托盘状态(22) + /// + /// + /// + public static void Write_PalletInfo(string opName, int tagValue) + { + string cmd = "PalletInfo"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + /// + /// 返修标志(93) + /// + /// + /// + public static void Write_RepairStatusMES(string opName, int tagValue) + { + string cmd = "RepairStatusMES"; + Write_TagValueByTagTypeName(cmd, opName, Convert.ToInt16(tagValue)); + } + + /// + /// MES通知PLC修改托盘状态成功 + /// + /// + /// + public static void Write_UpdatePalletOK(string opName, bool tagValue) + { + string cmd = "UpdatePalletOK"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + + #region MES交互区写值 + + /// + /// 工作完成(7)(MES) + /// + /// + /// + public static void Write_MesWorkFinish(string opName, bool tagValue) + { + int tagTypeID = 7; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + /// + /// 合格方式放行(51)(MES) + /// + /// + /// + public static void Write_ConfirmOkGo(string opName, bool tagValue) + { + int tagTypeID = 51; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 允许拧紧(66)(MES) + /// + /// + /// + public static void Write_FixAllow(string opName, bool tagValue) + { + int tagTypeID = 66; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 不合格放行(8) + /// + /// + /// + public static void Write_FalseGO(string opName, bool tagValue) + { + int tagTypeID = 8; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 拧紧序号(77) + /// + /// + /// + public static void Write_ProcessCode(string opName, int tagValue) + { + int tagTypeID = 77; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + + /// + /// 套筒号(88) + /// + /// + /// + public static void Write_BoltCode(string opName, int tagValue) + { + int tagTypeID = 88; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + /// + /// MES保存完数据(必须MIS)(X102.2)(20) + /// + /// + /// + public static void Write_MesReadOver(string opName, bool tagValue) + { + int tagTypeID = 20; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + /// + /// 工作完成(7) + /// + /// + /// + public static void Write_MaterialVerifyOver(string opName, bool tagValue) + { + string cmd = "MaterialVerifyOver"; + Write_TagValueByTagTypeName(cmd, opName, tagValue); + } + public static void Write_TagTypeID(int tagTypeID, string opName, object tagValue) + { + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 变量类型代码=73,机型代码。DBB404~405 机型标志 + /// + /// + /// + public static void Write_EngineTypeID_MES(string opName, int tagValue) + { + int tagTypeID = 73; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + public static void Write_OpNameIsOk(string opName,int qualityMask) + { + + // -99 是复位 + if (qualityMask == -99) + { + Write_TagValueByTagTypeID(51, opName, false); + Write_TagValueByTagTypeID(8, opName, false); + } + else if(qualityMask == 1) + { + // 51 合格放行 + Write_TagValueByTagTypeID(51, opName, true); + } + else + { + // 8 不合格放行 + Write_TagValueByTagTypeID(8, opName, true); + } + } + + /// + /// 变量类型代码=74,零件编号。DBB406~445 发动机编号 + /// + /// + /// + public static void Write_EngineID_MES(string opName, string tagValue) + { + int tagTypeID = 74; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + /// + /// 变量类型代码=75,零件机型。DBB446~485 发动机机型 + /// + /// + /// + public static void Write_EngineType_MES(string opName, string tagValue) + { + int tagTypeID = 75; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + /// + /// 订单号(string)(116) + /// + /// + /// + public static void Write_OrderForm_MES(string opName, string tagValue) + { + int tagTypeID = 116; + Write_TagValueByTagTypeID(tagTypeID, opName, tagValue); + } + + #endregion + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs new file mode 100644 index 0000000..92dbfdf --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS.QualityData.Read.cs @@ -0,0 +1,75 @@ +using System; +using System.Data; +using System.Collections; +using MisDataFunDll; + +namespace MesServerWork +{ + public partial class MIS_BASE + { + + /// + /// 读取质量数据 + /// + /// + public static void ReadPLC_Sync_ValueList(string opName, out Hashtable valueList) + { + valueList = null; + ReadPLCData(opName, out valueList); + } + /// + /// 根据工位号 同步读取数据 + /// + /// 工位号 + /// PLC仅仅值列表 + private static void ReadPLCData(string opName, out Hashtable valueList) + { + valueList = new Hashtable(); + + System.Data.DataTable dt; + dt = MisDataFun.BaseData_tagTable_QualityData_Item_B5A(); + + object tagValueStr = "0"; + for (int i = 0; i < dt.Rows.Count; i++) + { + if (opName == dt.Rows[i]["工位号"].ToString()) + { + + DeviceDriver_BasicData.CustomeEvetnArgs qualityDataType; + qualityDataType = new DeviceDriver_BasicData.CustomeEvetnArgs(); + + qualityDataType.TagID = dt.Rows[i]["TagID"].ToString (); + qualityDataType.TagTypeID = Convert.ToInt32(dt.Rows[i]["TagTypeID"]);//变量类型 + qualityDataType.OpName = opName;// + qualityDataType.IsGoodBad = 192;// + qualityDataType.TagQuality = 192;// + qualityDataType.TagValueType = Convert.ToInt32(dt.Rows[i]["变量类型代码"]); + qualityDataType.TagOrderBy = Convert.ToInt32(dt.Rows[i]["列位置"]); + qualityDataType.TagItemOrderBy = Convert.ToInt32(dt.Rows[i]["变量排序"]); + qualityDataType.TagProperty = Convert.ToInt32(dt.Rows[i]["变量特点"]); ;//变量特点 + + MIS_BASE.Read_TagValueByTagID(qualityDataType.TagID.ToString(), out tagValueStr); + + if (Convert.ToInt32(qualityDataType.TagTypeID) == 18) + { + qualityDataType.TagValue = Convert.ToInt32(tagValueStr);//变量值 + } + else + { + qualityDataType.TagValue = tagValueStr;//变量值 + } + valueList.Add(qualityDataType.TagID, qualityDataType); + } + } + } + } + + public class QualityDataSaveList + { + public Hashtable valuList; + public DataTable BasicDataTagValue; + public DataTable BasicDataTagValueUpDown; + public Hashtable hashtable_EngineTypeID; + public Hashtable hashtable_tagTable_OpName_SaveData; + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs new file mode 100644 index 0000000..bd2012d --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesDataFunction/MIS_BASE.cs @@ -0,0 +1,341 @@ +using BasicData; + +using MesWork; +using Newtonsoft.Json; +using NPOI.Util; +using OpcBasic; +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Net.Http; +using System.Runtime.Remoting.Messaging; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerWork +{ + + /* +HeartBeatMIS 15 +EngineTypeGetOverMES 5 +PartPalletGoOver 6 +MaterialVerifyOver 7 +FalseGo 8 +ConfirmOkGo 51 +PartLoadFinish 52 +UnloadCompleted 53 +MachineTime_ReadOver 54 +FixAllow 66 +FixOver 67 +MatchingCompleted 68 +Match 69 +Reserved_1 70 +IsAutoGetEngineID 71 +RepairUplineMES 72 +ProcessCode 77 +BoltCode 88 +RepairStatus 93 +Reserved_3 24 +Reserved_4 25 +Reserved_5 26 +Reserved_6 27 +Reserved_7 28 +Reserved_8 29 +Reserved_9 30 +Reserved_10 31 +Reserved_11 32 +Reserved_12 33 +Reserved_13 34 +Reserved_14 35 +MesReadOver 20 +Reserved_15 110 +Reserved_16 111 +Reserved_17 112 +OnLineState 79 +EngineTypeID_MES 73 +EngineID_MES 74 +EngineType_MES 75 +MarkID 42 +RepairPathString 4 +SPareint1 113 +SPareint2 114 +SPareint3 115 +Sparestring1 116 +Sparestring2 117 +HeartBeatPLC 14 +WorkStart 2 +RepairPartStatusPLC 3 +PartLoad 43 +EngineTypeGetOverPLC 44 +PartLoadOK 48 +Reserved_18 49 +PalletDown 50 +Reserved_19 58 +FixOK 59 +Reserved_20 76 +Reserved_21 61 +Reserved_22 62 +Reserved_23 63 +Reserved_24 64 +Reserved_25 65 +EngineTypeID 9 +EngineID 10 +EngineType 11 +PartPalletCode 80 +PalletInfo 22 +MesRead 19 +PutOn 1000 +WorkOn 1001 +Alarm 1002 +NoPart 1003 +Block 1004 +PartPalletStatus 13 +TargetTimeRead 16 +QualityMask 21 +RepairStatusPLC 23 +MachineTargetTime 17 +MachineActualTime 18 +PLCSPareint1 36 +PLCSPareint2 37 +PLCSPareint3 38 +PLCSarestring1 39 +PLCSarestring2 40 + */ + + + + public partial class MIS_BASE + { + + + /// + ///引用程序集Hashtable + /// + public static Hashtable Hashtable_assembly = new Hashtable(); + /// + /// + /// + static public NameValueCollection hashtable_TagTypeTagName = null; + + /// + /// + /// + static public NameValueCollection hashtable_TagTypeChange = null; + /// + /// + /// + static public NameValueCollection hashtable_WebTagTypeChange = null; + /// + /// + /// + static public NameValueCollection hashtable_MesTagTypeChange = null; + /// + /// + /// + static readonly object l = new object(); + /// + /// + /// + /// + /// + /// + public static object ReadPLC(int tagTypeCodeID, string opName) + { + try + { + return PlcLinkForm.ReadPLC(tagTypeCodeID, opName); + + } + catch { return "-3"; } + } + /// + /// + /// + /// + /// + private static object ReadPLC(string tagID) + { + return PlcLinkForm.ReadPLC(tagID); + } + /// + /// 20230218 + /// 按组读质量数据,返回带合格标志的质量数据列表 + /// + /// + /// + public static Hashtable ReadPLC_Sync_DataList_MesRead_ByOnlyDataGroup(string opName) + { + lock (l) + { + + var tagValues = GetDbAndMaxLengthByOpNameByBytes(opName); + + var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value); + + TagFormat tagFormatTemp; + int tagIndex = 1; + int isOK = 0; + + Hashtable ht = new Hashtable(); + + + foreach (KeyValuePair _cd in keyValues) + { + if (_cd.Key.ToString()[0].ToString() == "7") + { + tagFormatTemp = (TagFormat)_cd.Value; + if (tagIndex % 3 == 1) + { + isOK = Convert.ToInt32(tagFormatTemp.TagValue); + } + else if (tagIndex % 3 == 2) + { + var TF = (TagFormat)_cd.Value; + + QualityDataType qualityDataType; + qualityDataType = GetQualityDataType(TF); + qualityDataType.isGoodBad = isOK; + ht.Add(qualityDataType.tagID, qualityDataType); + } + else if (tagIndex % 3 == 0) + { + var TF = (TagFormat)_cd.Value; + + QualityDataType qualityDataType; + qualityDataType = GetQualityDataType(TF); + qualityDataType.isGoodBad = isOK; + ht.Add(qualityDataType.tagID, qualityDataType); + } + + tagIndex++; + } + //Console.WriteLine($"key:{kv.Key} value:{kv.Value}"); + } + return ht; + } + } + + public static ConcurrentDictionary GetDbAndMaxLengthByOpNameByBytes(string opName) + { + string tagStartAdr = ""; + ushort tagAdrListMaxLength = 0; + PlcLinkForm.GetDbAndMaxLengthByOpName(opName, out tagStartAdr, out tagAdrListMaxLength); + var tagAdrListTagFormat = PlcLinkForm.ReadQualityDataList(opName, tagStartAdr, tagAdrListMaxLength); + return tagAdrListTagFormat; + } + + + public static BasicData.QualityDataType GetQualityDataType(TagFormat TF) + { + QualityDataType qualityDataType; + + qualityDataType = new QualityDataType(); + + qualityDataType.tagID = TF.TagID; + qualityDataType.tagTypeID = TF.TagTypeID;//变量类型 + qualityDataType.opName = TF.OpName; + qualityDataType.tagQuality = TF.Code; + qualityDataType.tagValueType = TF.TagTypeCodeID; + int.TryParse(TF.TagOrderBy, out int TagOrderBy); + qualityDataType.tagOrderBy = TagOrderBy; + int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy); + qualityDataType.tagItemOrderBy = TagItemOrderBy; + qualityDataType.tagProperty = Convert.ToInt32( TF.TagProperty);//变量特点 + qualityDataType.tagValue = TF.TagValue;//变量值 + + return qualityDataType; + } + /// + /// + /// + /// + /// + /// + private static void ReadTagValue(int tagTypeCodeID, string opName, out string tagValue) + { + tagValue = "0"; + try + { + var tagValueObj = PlcLinkForm.ReadPLC(tagTypeCodeID, opName); + var type = tagValueObj.GetType().Name.ToLower(); + if (type == "bool" | type == "boolean") + { + var val = tagValueObj.ToString().ToLower(); + + if (val == "true") + { + tagValue = "1"; + } + } + else + { + tagValue = tagValueObj.ToString(); + } + } + catch { } + } + + /// + /// + /// + /// + /// + /// + private static bool WritePLC(string tagID, object tagValue) + { + return PlcLinkForm.WritePLC(tagID, tagValue); + } + /// + /// + /// + /// + /// + /// + /// + public static bool WritePLC(int tagTypeCodeID, string opName, object tagValue) + { + return PlcLinkForm.WritePLC(tagTypeCodeID, opName, tagValue); + } + /// + /// + /// + /// + /// + /// + /// + private static bool WriteTagValue(int tagTypeCodeID, string opName, object tagValue) + { + return PlcLinkForm.WritePLC(tagTypeCodeID, opName, tagValue); + } + + public static ConcurrentDictionary ReadPLC_OpName(string opName) + { + try + { + string tagStartAdr = ""; + ushort tagAdrListMaxLength = 0; + PlcLinkForm.GetDbAndMaxLengthByOpName(opName, out tagStartAdr, out tagAdrListMaxLength); + var tagAdrListTagFormat0 = PlcLinkForm.ReadQualityDataList(opName, tagStartAdr, tagAdrListMaxLength); + + var pp = JsonConvert.SerializeObject(tagAdrListTagFormat0); + var tagAdrListTagFormat = JsonConvert.DeserializeObject>(pp); + + + return tagAdrListTagFormat; + } + catch (Exception err) + { + return null; + + } + + } + + } + + + +} diff --git a/Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs b/Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs new file mode 100644 index 0000000..68db1b0 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MesWorkPlc.cs @@ -0,0 +1,41 @@ + +using MesWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class MesWorkPlc: PlcLinkForm + { + + public static Action D_OPCTagData_TagDataOnChangeMIS = null; + + /// + /// 监控数据的所有变化,从这里产生 + /// + /// + /// + public override void OPCTagData_TagDataOnChangeMIS(object sender, DeviceDriver_BasicData.CustomeEvetnArgs e) + { + Console.WriteLine($"【【{e.TagName}【【{e.TagValueBefore}->{e.TagValue}【【{e.TagKeepTime}"); + + if (D_OPCTagData_TagDataOnChangeMIS != null) + D_OPCTagData_TagDataOnChangeMIS(e); + // OPCTagData_TagDataOnChange(sender, e); + } + + /// + /// 定时触发,检测PLC在线状态,周期:3 s + /// + /// + /// + public override void PlcStateEvent(object sender, DeviceDriver_BasicData.PlcStateEvetnArgs eState) + { + + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs new file mode 100644 index 0000000..75d41ea --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/Heartbeat.cs @@ -0,0 +1,25 @@ +//using bizFacade; +using System; +using System.Collections; +using System.Data; +//using SystemFramework; + +namespace MisDataFunction +{ + partial class Function + { + + private static void Heartbeat(string opName, string tagValue) + { + if (tagValue == "1") + { + Write_TagValueByTagTypeID(15, opName, true); + } + else + { + Write_TagValueByTagTypeID(15, opName, false); + } + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs new file mode 100644 index 0000000..904c975 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MIS.Interface.cs @@ -0,0 +1,326 @@ + +using bizFacade; +using DoWhatPlc; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +//using SystemFramework; + +namespace MisDataFunction +{ + public partial class Function: MIS_BASE + { + + + + /// + /// 处理MIS逻辑 TagName 变量类型代码 变量类型名称 + /// WorkStart 2 工件到位。托盘到达工位,并且托盘上有工件。 + ///RepairPartStatusPLC 3 备用 + ///RepairPathString 4 工位返修字符串(121211112222111),前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 + ///EngineTypeGetOverMES 5 MES传递总成信息给PLC(上线工位) + ///PartPalletGoOver 6 上线工位。0:正常工作;1:空托盘放行,PLC读取到此标志不走申请上线逻辑。 + ///MaterialVerifyOver 7 MES保存完质量数据,物料数据等与PLC信号交互完成后通知PLC,所以工步都完成,才可以放行工件,正常工作时工件放行的必要条件。 + ///FalseGo 8 按MES界面[不合格放行] 按钮,MES发送此信号。操作者判断工件不合格,通知设备,按不合格方式放行工件,工件流转到返修下线工位后,返修下线。MES工作完成MES0.3=1,MES合格放行MES0.5=0,MES0.4=1 + ///EngineTypeID 9 MES发动机机型标志(必须PLC) + ///EngineID 10 MES发动机编号(必须PLC) + ///EngineType 11 MES发动机机型(必须PLC) + ///PartPalletStatus 13 MES激发变量托盘到位离开(必须PLC) + ///HeartBeatPLC 14 心跳处理:PLC收到MES心跳信号后,PLC延时5秒后,数值取反再写回PLC,写回PLC开始计时,如果5秒钟MES无反馈报通讯故障。 + ///HeartBeatMIS 15 间隔时间5S,心跳处理。收到PLC心跳信号后,MES按原值回写。PLC收到MES信号后延时5秒,取反写入,以此循环。 + ///TargetTimeRead 16 MES允许可读工位运行时间 + ///MachineTargetTime 17 目标运行时间 + ///MachineActualTime 18 实际运行时间 + ///MesRead 19 质量数据可以读数据 + ///MesReadOver 20 MES保存完数据(必须MIS) + ///QualityMask 21 质量数据工位合格标志0:没有工作;1:合格 ;2 :不合格(必须PLC) + ///PalletInfo 22 0空托盘,1合格件,2不合格件 + ///RepairStatusPLC 23 0正常件,1返修件 + ///Reserved_3 24 备用 + ///Reserved_4 25 备用 + ///Reserved_5 26 备用 + ///Reserved_6 27 备用 + ///Reserved_7 28 备用 + ///Reserved_8 29 备用 + ///Reserved_9 30 备用 + ///Reserved_10 31 备用 + ///Reserved_11 32 备用 + ///Reserved_12 33 备用 + ///Reserved_13 34 备用 + ///Reserved_14 35 备用 + ///PLCSPareint1 36 备用 + ///PLCSPareint2 37 备用 + ///PLCSPareint3 38 备用 + ///PLCSarestring1 39 备用 + ///PLCSarestring2 40 备用 + ///MarkID 42 机体打标号(MES)前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 + ///PartLoad 43 上线工位,PLC向MES申请总成编号。收到该信号后,MES将机型标志(DBB22 ~23)、总成号(DBB24 ~63)、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型(DBX0.1)”通知PLC。 + ///EngineTypeGetOverPLC 44 PLC将机型标志(DBB50…51)、工件编号(DBB52…101)、产品型号(DBB102…187)、托盘编号(DBB188…189)准备完毕后,通知MES。 + ///PartLoadOK 48 备用 + ///Reserved_18 49 备用 + ///PalletDown 50 暂时保留,项目未使用 + ///ConfirmOkGo 51 按MES界面[合格放行] 按钮,MES发送此信号。操作者判断工件合格,通知设备,工件按合格方式放行工件。MES工作完成MES0.3=1,MES合格放行MES0.5=1,MES0.4=0 + ///ResetDevice 52 针对手动工位,无HMI,需要复位设备在MES页面操作。 + ///UnloadCompleted 53 暂时保留,项目未使用 + ///MachineTime_ReadOver 54 备用 + ///Reserved_19 58 备用 + ///FixOK 59 手动拧紧工位,单工步螺栓拧紧完成,通知PC读取数据。 + ///Reserved_21 61 备用 + ///Reserved_22 62 备用 + ///Reserved_23 63 备用 + ///Reserved_24 64 备用 + ///Reserved_25 65 备用 + ///FixAllow 66 设备工作的必须信号,对于有物料验证的工位,MES验证完成给出此信号,对于无物料验证工位,MES直接给出此信号。 + ///FixOver 67 用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。 + ///MatchingCompleted 68 分线上总线,匹配成功是1;不成功是0。 + ///Match 69 分线上总线,匹配成功是1;不成功是0。 + ///Reserved_2 70 备用 + ///IsAutoGetEngineID 71 自动手动申请工件编号。0是自动方式;1:手动方式。暂时保留,生成流水号方式是在数据库中实现的 + ///RepairUplineMES 72 上线清空MOBY(针对上线工位):通知PLC从新开始申请上线流程 + ///EngineTypeID_MES 73 MES发动机机型标志(必须MES) + ///EngineID_MES 74 MES发动机编号(必须MES) + ///EngineType_MES 75 MES发动机机型(必须MES) + ///Reserved_20 76 备用 + ///ProcessCode 77 手动拧紧工位:由MES通知PLC拧紧序号 + ///OnLineState 79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线:0正常状态,实现正常功能。1离线:设备脱离MES工作,进入不交互模式。 + ///PartPalletCode 80 托盘编号(B5A) + ///BoltCode 88 手动拧紧工位:指导PLC所用套筒 + ///RepairStatus 93 0正常件,1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径 + ///Reserved_15 110 备用 + ///Reserved_16 111 备用 + ///Reserved_17 112 备用 + ///SPareint1 113 备用int1 + ///SPareint2 114 备用int2 + ///SPareint3 115 备用int3 + ///Sparestring1 116 备用字符串1 + ///Sparestring2 117 备用字符串2 + ///MachineStatusPutOn 1000 机床上电(必须PLC) + ///MachineStatusWorkOn 1001 循环开始(必须PLC) + ///MachineStatusAlarm 1002 机床故障(必须PLC) + ///MachineStatusNoPart 1003 上料无件(必须PLC) + ///MachineStatusBlock 1004 下料堵塞(必须PLC) + ///Alarm 103 设备报警 + /// + /// + public static void MIS_Funtion(object e) + { + try + { + + string recData = e.ToString(); + string[] dataArray = recData.Split('|'); + if (dataArray.Length != 4) + return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.ReturnValueString rv = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + //Console.WriteLine($"【【{rv.TagID}【【【【{ rv.TagKeepTime}"); + + int tagType; + string opName; + string tagValue; + int tagid; + DoWhatPlc.ReturnValueString msgEvent = rv; + if (msgEvent.TagValue == null) return; + tagType = Convert.ToInt32(msgEvent.TagTypeID); + opName = msgEvent.OpName.ToString(); + tagid = Convert.ToInt32(msgEvent.TagID); + + + //int tagType; + //string opName; + //string tagValue; + //int tagid; + //DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + //if (msgEvent.TagValue == null) return; + //tagType = Convert.ToInt32(msgEvent.TagType); + //opName = msgEvent.OpName.ToString(); + //tagid = Convert.ToInt32(msgEvent.TagKey); + switch (Convert.ToInt32(msgEvent.TagTypeCodeID)) + { + case 11: + switch (msgEvent.TagValue.ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + break; + default: + tagValue = msgEvent.TagValue.ToString(); + break; + } + ///根据信号处理逻辑 + switch (tagType) + { + case 19: + //允许保存 + MesRead(opName, tagValue, tagid); + break; + case 14: + //心跳 + Heartbeat(opName, tagValue); + break; + case 44://PLC传递机型过后 才允许保存过站信息,否则不允许保存 + //if (tagValue == "1") + //{ + // IsEngTypeGetOver_Write(opName, true); + + // EngineData Enginedata = new EngineData(DtWebApi.ReadWritePLC.ReadPLC("10", opName).ToString(), Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("80", opName))); + // //EngineData Enginedata = new EngineData(MesDataFunction.OpcOperation.ReadPLC(10, opName).ToString(), Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(80, opName))); + // //保存产品编号、托盘号 保存过站信息用 + // EngineData_Hash_Write(opName, Enginedata); + //} + break; + case 2://工件到位 + WorkStart( rv); + + + //WorkStart(opName, tagValue); + break; + case 51: + if (hashtableOpName_IsHaveComputer[opName].ToString() == "1") + { + SaveProductLeaveData(opName, 1); + } + + break; + case 8: + if (hashtableOpName_IsHaveComputer[opName].ToString() == "1") + { + SaveProductLeaveData(opName, 2); + } + break; + case 103: + + Alarm_Insert(rv); + + break; + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + } + } + private static void Alarm_Insert(ReturnValueString rv) + { + string TagID; + string opName; + string tagTypeID; + int TagValue; + + DateTime alarmStartTime; + DateTime alarmEndTime; + int TimeDiff; + string TagOrderBy; + string Text1; + string Text2; + TagID = rv.TagID; + tagTypeID = rv.TagTypeID; + opName = rv.OpName; + TagValue = Convert.ToInt32( rv.TagValue); + + alarmStartTime = Convert.ToDateTime( rv.TimeStampBefore); + alarmEndTime = Convert.ToDateTime( rv.TimeStamp); + TimeDiff = Convert.ToInt32(rv.TagKeepTime); + TagOrderBy = rv.TagOrderBy; + Text1 = rv.ItemName; + Text2 = rv.ShaftID; + + BaseDataSystemMES.Alarm_Insert(TagID, tagTypeID, opName, TagValue, + alarmStartTime, alarmEndTime, TimeDiff, Text1, Text2, TagOrderBy); + } + private static void WorkStart(ReturnValueString rv) + { + + + + var ro = rv.ReturnValueToObject(); + + string opName = ro.OpName; + DateTime arrivedTime = ro.TimeStampBefore; + DateTime leavedTime = ro.TimeStamp; + int TimeDiff = ro.TagKeepTime; + int targetTime = 0; + string isPass = ""; + + int QualityMark=0; + string tagValue="0"; + switch (ro.TagValue.ToString().ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + //if (ro.TagValue.ToString() == "0") + //{ + // //Write_TagTypeID(5, opName, false);//MES传递机型 + // //Write_TagTypeID(66, opName, false);//允许工作 + // //Write_TagTypeID(51, opName, false);//合格放行 + // //Write_TagTypeID(8, opName, false);//不合格放行 + // //Write_TagTypeID(7, opName, false);//工作完成 + // //Write_TagTypeID(20, opName, false);//保存完成 + + // //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); + // //if (Convert.ToInt32(isHaveComputer) == 0)//自动工位 读合格标志 + // //{ + // // if (IsEngTypeGetOver_Read(opName)) + // // { + // // //PLC未传递机型 不保存过站信息 + // // SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("21", opName))); + // // //SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(21, opName))); + // // } + + // //} + + // ////清空信号 + // ////m_WorkStart_OpName[opName] = 0;//清空工件到位标志 + // ////通知WEB更新产量 + // //SendActuallyCount(opName, 0); + //} + + QualityMark = Convert.ToInt32(ReadPLC(21, opName)); + + if (QualityMark == 1) + { + isPass = "1"; + } + else + { + isPass = "0"; + } + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(opName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code,out OrderForm); + + //EngineData Enginedata = (EngineData)EngineData_Hash_Read(opName); + BaseDataSystemMES.WorkStartInsert_AutoWorkStation(opName, EngineID, PartPallet_Code, arrivedTime, leavedTime, TimeDiff, targetTime, null, isPass, 0); + + } + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs new file mode 100644 index 0000000..f716152 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/MesRead.cs @@ -0,0 +1,465 @@ +//using BasicData; +using bizFacade; +using DoWhatPlc; +using Newtonsoft.Json; +//using bizFacade; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +//using SystemFramework; + +namespace MisDataFunction +{ + partial class Function + { + /// + /// 获取质量数据Hashtable + /// + /// + /// + //static public Hashtable ReadPLC_Sync_DataList_MesRead(string opName) + //{ + // return (Hashtable)MesDataFunction.OpcOperation.ReadPLC_Sync_DataList_MesRead(opName); + //} + static object lockerReadPLC_Sync_DataList_MesRead1 = new object(); + public static void ReadPLC_Sync_DataList_MesRead(string opName, out Hashtable valueList, out DataTable BasicDataTagValue, out DataTable BasicDataTagValueUpDown, out Hashtable hashtable_EngineTypeID, out Hashtable hashtable_tagTable_OpName_SaveData) + { + //QualityDataSaveList QualityDataType + valueList = new Hashtable(); + //var qualityDataSaveList = DtWebApi.SaveData.ReadPLC_Sync_DataList_MesRead(opName); + var qualityDataSaveList = MesServerWork.MIS_BASE.ReadPLC_Sync_DataList_MesRead(opName); + foreach (DictionaryEntry de in qualityDataSaveList.valuList) + { + valueList.Add(de.Key, JsonConvert.DeserializeObject(de.Value.ToString())); + } + BasicDataTagValue = qualityDataSaveList.BasicDataTagValue; + BasicDataTagValueUpDown = qualityDataSaveList.BasicDataTagValueUpDown; + hashtable_EngineTypeID = qualityDataSaveList.hashtable_EngineTypeID; + hashtable_tagTable_OpName_SaveData = qualityDataSaveList.hashtable_tagTable_OpName_SaveData; + } + public static Hashtable ReadPLC_Sync_DataList_MesRead(string opName) + { + lock (lockerReadPLC_Sync_DataList_MesRead1) + { + Hashtable ht = new Hashtable(); + var cd = ReadPLC_GroupData(opName); + //var cd = PlcLinkForm.ReadPLC_GroupData(opName); + + foreach (var _cd in cd) + { + var tagID = Convert.ToInt32(_cd.TagID); + var TF =_cd.TF; + + QualityDataType qualityDataType; + qualityDataType = new QualityDataType(); + + qualityDataType.tagID = TF.TagID; + qualityDataType.tagTypeID = TF.TagTypeID;//变量类型 + qualityDataType.opName = opName; + qualityDataType.isGoodBad = 192; + int.TryParse(TF.TagQuality, out int TagQuality); + qualityDataType.tagQuality = TagQuality; + qualityDataType.tagValueType = TF.TagTypeCodeID; + int.TryParse(TF.TagOrderBy, out int TagOrderBy); + qualityDataType.tagOrderBy = TagOrderBy; + int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy); + qualityDataType.tagItemOrderBy = TagItemOrderBy; + qualityDataType.tagProperty = TF.TagProperty;//变量特点 + qualityDataType.tagValue = TF.TagValue;//变量值 + + ht.Add(tagID, qualityDataType); + } + return ht; + } + + } + + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private static void MesRead(string opName, string tagValue, int tagid) + { + if (tagValue == "0") + { + Write_TagValueByTagTypeID(20, opName, false); + } + else + { + SaveQualityData(opName, Convert.ToInt32(tagValue), tagid); + } + } + + private static void SaveQualityData(string opName, int tagValue, int tagID) + { + try + { + int id_tagCF; + int qualityMask = 0; + int engineTypeID = 0; + string engineID = ""; + string engineType = ""; + string engineTraceCode = ""; + string engineCap = ""; + string partPallet = ""; + DataTable dt_WWW; + dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); + Hashtable valueList; + //valueList = ReadPLC_Sync_DataList_MesRead(opName); + ReadPLC_Sync_DataList_MesRead(opName, out valueList, out BasicDataTagValue, out BasicDataTagValueUpDown, out hashtable_EngineTypeID, out hashtable_tagTable_OpName_SaveData); + valueList = GetQualityData_GoodBad_Values(valueList); + int mes_MustTest = 0; + int onLineState = 0; + int partMoveDirection = 0; + int pressIsOK = 0; + int pressIsNoOK = 0; + BaseDataSystemMES.GetQualityDataTable_B5A(valueList, opName, BasicDataTagValue, + BasicDataTagValueUpDown, + out dt_WWW,//数据列表 + out qualityMask,//工位合格标志 + out engineTypeID,//发动机类型代码 + out engineID,//发动机编号 + out engineType, //发动机型号 + out partPallet,//托盘编号 + out engineTraceCode, //发动机条码 + out engineCap,//缸盖号, + hashtable_EngineTypeID,//发动机类型转换表 + out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); + + + + + // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) + { + DateTime lastupdatetime = DateTime.Now; + + BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); + BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); + + } + Write_TagValueByTagTypeID(20, opName, true); + #region + //string orderForm = ""; + //string operatorCode = ""; + //int shiftCode = 1; + //DateTime arrivedTime; + //DateTime leavedTime; + //int TimeDiff; + //int targetTime = 0; + //string lineType = ""; + //string isPass; + //int machineWorkOn = 0; + //int arrivedOrLeaved = 2; + //int cartColorOpName = 0; + //int cartColorConfirm = 0; + //// int partMoveDirection; + //int partGoOver = 0; + //if (qualityMask == 1) + //{ + // isPass = "PASS"; + //} + //else + //{ + // isPass = "FAIL"; + //} + + ////工位上下线类型 + ////(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + //int OpNameUpDownType; + //OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); + //arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; + //leavedTime = DateTime.Now; + //TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); + + //lineType = hashtableOpName_LineType[opName].ToString(); + + //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); + ////isHaveComputer = MIS_BASE.hashtable_tagTable_OpName_SaveData[opName].ToString(); + ////有计算机的工位,通过工位计算机保存[测量数据发动机在线状态]。 + //if (Convert.ToInt32(isHaveComputer) == 0) + //{ + // //1->0 工件离开 工件刚刚离开 + // if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) + // { + + // //[测量数据发动机在线状态] + // QualityDataSystem.WorkStartInsert + // (opName, orderForm, engineTypeID, engineType, engineID, partPallet.ToString(), operatorCode, shiftCode, + // arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, machineWorkOn, + // arrivedOrLeaved, cartColorOpName, cartColorConfirm, partMoveDirection, partGoOver, mes_MustTest, onLineState, OpNameUpDownType); + // } + //} + #endregion + } + catch (Exception err) + { + Write_TagValueByTagTypeID(20, opName, true); + ////ApplicationLog.WriteLog(err, err.Message); + } + + } + public static void SaveQualityData_Mes(string opName, int tagID) + { + try + { + int id_tagCF; + int qualityMask = 0; + int engineTypeID = 0; + string engineID = ""; + string engineType = ""; + string engineTraceCode = ""; + string engineCap = ""; + string partPallet = ""; + DataTable dt_WWW; + dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); + Hashtable valueList; + valueList = ReadPLC_Sync_DataList_MesRead(opName); + valueList = GetQualityData_GoodBad_Values(valueList); + int mes_MustTest = 0; + int onLineState = 0; + int partMoveDirection = 0; + int pressIsOK = 0; + int pressIsNoOK = 0; + BaseDataSystemMES.GetQualityDataTable_B5A(valueList, opName, BasicDataTagValue, + BasicDataTagValueUpDown, + out dt_WWW,//数据列表 + out qualityMask,//工位合格标志 + out engineTypeID,//发动机类型代码 + out engineID,//发动机编号 + out engineType, //发动机型号 + out partPallet,//托盘编号 + out engineTraceCode, //发动机条码 + out engineCap,//缸盖号, + hashtable_EngineTypeID,//发动机类型转换表 + out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); + // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 + if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) + { + DateTime lastupdatetime = DateTime.Now; + BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); + //BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); + + } + + + } + catch (Exception err) + { + Write_TagValueByTagTypeID(20, opName, true); + ////ApplicationLog.WriteLog(err, err.Message); + } + + } + + /// + /// 确定合格标志 + /// + /// + /// + static public Hashtable GetQualityData_GoodBad_Values(Hashtable valuList) + { + try + { + Hashtable valuList_Temp; + valuList_Temp = (Hashtable)valuList.Clone(); + int[] value_GoodBad_New = new int[128]; + int tagID; + QualityDataType value; + //1:获得合格标志 + foreach (DictionaryEntry de in valuList) //ht为一个Hashtable实例 + { + tagID = Convert.ToInt32(de.Key); + value = (QualityDataType)de.Value; + + //拧紧数据合格标志 + if (value.tagProperty == 1) + { + if (value.tagTypeID == 8203) + { + value_GoodBad_New = (int[])value.tagValue; + break; + } + else + { + value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); + } + } + //拧紧数据合格标志 + if (value.tagProperty == 8) + { + if (value.tagTypeID == 8203) + { + value_GoodBad_New = (int[])value.tagValue; + break; + } + else + { + value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); + } + } + //压装数据合格标志 + if (value.tagProperty == 7) + { + value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); + } + } + //将合格标志赋予每个变量 + foreach (DictionaryEntry de in valuList) //ht为一个Hashtable实例 + { + tagID = Convert.ToInt32(de.Key); + value = (QualityDataType)de.Value; + //201706061720新加 + if (value .tagTypeID ==11) + { + if (value.tagValue.ToString ()=="False") + { + value.tagValue ="0"; + } + else + { + value.tagValue = "1"; + } + valuList_Temp[tagID] = value; + //value.tagValue = Convert.ToInt32(value.tagValue); + } + + + //测量变量 + if (value.tagProperty == 2 || value.tagProperty == 6) + { + try + { + if (value_GoodBad_New != null) + { + value.isGoodBad = Convert.ToInt32(value_GoodBad_New[value.tagOrderBy - 1]); + valuList_Temp[tagID] = value; + } + else + { + value.isGoodBad = 0; + valuList_Temp[tagID] = value; + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + } + + + + } + return valuList_Temp; + } + catch//转换出了故障时 + { + return valuList; + } + } + + + + /// + /// 制定工位PLC是否传递过机型 (默认不传递机型不保存过站信息) + /// + static Hashtable EngTypeGetOver = new Hashtable(); + + static Hashtable EngineData_Hash = new Hashtable(); //保存 + + public static void IsEngTypeGetOver_Write(string OpName, bool value) + { + if (EngTypeGetOver.ContainsKey(OpName)) + { + EngTypeGetOver[OpName] = value; + } + else + { + EngTypeGetOver.Add(OpName, value); + } + } + + + public static bool IsEngTypeGetOver_Read(string OpName) + { + if (EngTypeGetOver.ContainsKey(OpName)) + { + return Convert.ToBoolean(EngTypeGetOver[OpName]); + } + else + { + return true; + } + } + + public static void EngineData_Hash_Write(string OpName, object value) + { + if (EngineData_Hash.ContainsKey(OpName)) + { + EngineData_Hash[OpName] = value; + + } + else + { + EngineData_Hash.Add(OpName, value); + } + } + + public static object EngineData_Hash_Read(string OpName) + { + if (EngineData_Hash.ContainsKey(OpName)) + { + return EngineData_Hash[OpName]; + } + else + { + return null; + } + + } + + + private DataTable ChangeQualificationMark(DataTable dt) + { + var dtNew = dt.Copy(); + for (int i = 0; i < dt.Rows.Count; i++) + { + var 变量排序 = dt.Rows[i]["变量排序"].ToString(); + if (变量排序 == "0") + { + + } + } + + + return dtNew; + } + + + + + } + struct EngineData + { + public EngineData(string engineID, int pallet) + { + EngineID = engineID; + Pallet = pallet; + } + + public string EngineID;//工件编号 + //public string EngineType; + //public int EngineTypeID; + public int Pallet;//托盘号 + + } + + + + + + +} diff --git a/Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs new file mode 100644 index 0000000..0ab46b5 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/MisDataFunction/WorkStart.cs @@ -0,0 +1,236 @@ +//using BasicData; +using bizFacade; +//using DataBaseAccess; +//using bizFacade; +using DataLinkMesWork; +using MesServerWork; +using System; +using System.Collections; +using System.Data; +using System.Data.SqlClient; +//using SystemFramework; + +namespace MisDataFunction +{ + partial class Function + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private static void WorkStart(string opName, string tagValue) + { + try + { + //工位没有工件,或工件刚刚离开 工件离开工位后,清空该工位的发动机号 + if (tagValue == "0") + { + Write_TagValueByTagTypeID(5, opName, false);//MES传递机型 + Write_TagValueByTagTypeID(66, opName, false);//允许工作 + Write_TagValueByTagTypeID(51, opName, false);//合格放行 + Write_TagValueByTagTypeID(8, opName, false);//不合格放行 + Write_TagValueByTagTypeID(7, opName, false);//工作完成 + Write_TagValueByTagTypeID(20, opName, false);//保存完成 + + //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); + //if (Convert.ToInt32(isHaveComputer) == 0)//自动工位 读合格标志 + { + if (IsEngTypeGetOver_Read(opName)) + { + //PLC未传递机型 不保存过站信息 + SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(Read_TagValueByTagTypeID(21, opName))); + //SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(21, opName))); + } + + } + + //清空信号 + //m_WorkStart_OpName[opName] = 0;//清空工件到位标志 + //通知WEB更新产量 + SendActuallyCount(opName,0); + } + else + { + //保存工件到达数据 + //m_WorkStart_OpName_Time[opName] = DateTime.Now; + //m_WorkStart_OpName[opName] = 1; + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + } + /// + /// 保存过站信息 (数据库读机型信息) + /// + /// + /// + static void SaveProductLeaveData(string opName, int QualityMark) + { + try + { + if (!IsEngTypeGetOver_Read(opName)) + { + //PLC未传递机型 不保存过站信息 + return; + } + IsEngTypeGetOver_Write(opName, false);//清空传递机型标志 + + DateTime arrivedTime; + DateTime leavedTime; + int TimeDiff; + int targetTime = 0; + string lineType = ""; + string isPass; + if (QualityMark == 1) + { + isPass = "PASS"; + } + else + { + isPass = "FAIL"; + } + //工位上下线类型 + //(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + int OpNameUpDownType; + OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); + arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; + leavedTime = DateTime.Now; + TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); + lineType = hashtableOpName_LineType[opName].ToString(); + + //1->0 工件离开 工件刚刚离开 + //if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) + //{ + // WorkStartInsert(opName, arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, OpNameUpDownType); + //} + //通知WEB更新产量 + SendActuallyCount(opName, 0); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + + + } + /// + /// 保存过站信息 (数据库读机型信息) + /// + /// + /// + static void SaveProductLeaveData_AutoWorkStation(string opName, int QualityMark) + { + try + { + if (!IsEngTypeGetOver_Read(opName)) + { + //PLC未传递机型 不保存过站信息 + return; + } + IsEngTypeGetOver_Write(opName, false);//清空传递机型标志 + + DateTime arrivedTime; + DateTime leavedTime; + int TimeDiff; + int targetTime = 0; + string lineType = ""; + string isPass; + if (QualityMark == 1) + { + isPass = "PASS"; + } + else + { + isPass = "FAIL"; + } + //工位上下线类型 + //(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) + int OpNameUpDownType; + //OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); + // arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; + leavedTime = DateTime.Now; + //TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); + //lineType = hashtableOpName_LineType[opName].ToString(); + + //1->0 工件离开 工件刚刚离开 + //if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) + //{ + // //查询工件编号、托盘号 + //EngineData Enginedata = (EngineData)EngineData_Hash_Read(opName); + //WorkStartInsert_AutoWorkStation(opName, Enginedata.EngineID, Enginedata.Pallet, arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, OpNameUpDownType); + //} + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, err.Message); + + } + + + } + + /// + /// 测量数据发动机在线状态_增加数据 + /// + /// + /// + /// + /// + /// + /// + static public void WorkStartInsert(string opName, DateTime arrivedTime, DateTime leavedTime, int TimeDiff, int Target, string lineType, string isPass, int OpNameUpDownType) + { + string procedureName; + procedureName = "测量数据发动机在线状态_增加数据"; + SqlParameter[] thisParms = new SqlParameter[8]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@目标时间", Target); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@线体类型", lineType); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@是否合格", isPass); + thisParms[7] = new System.Data.SqlClient.SqlParameter("@工位上下线类型", OpNameUpDownType); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + static void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + + MIS_BASE.asyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function01:SendActuallyCount"); + } + } + } + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs b/Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..057bcf1 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MesDataFunction")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MesDataFunction")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("90e76fb4-646d-45e2-95db-0b8ab4e465d6")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Common/09MesDataFunction/MesDataFunction/ToPrinter/PP.cs b/Common/09MesDataFunction/MesDataFunction/ToPrinter/PP.cs new file mode 100644 index 0000000..a861074 --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/ToPrinter/PP.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class PP + { + + public static string ConnectionString_MES { get; set; } + public static string PrintURL { get; set; } + public static int IsDemoMesServer { get; set; } + + + + + + + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/ToPrinter/PrintTo.cs b/Common/09MesDataFunction/MesDataFunction/ToPrinter/PrintTo.cs new file mode 100644 index 0000000..7e3d91d --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/ToPrinter/PrintTo.cs @@ -0,0 +1,65 @@ +using MesWork; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class PrintTo + { + + /// + /// + /// + /// + public static bool Print(bool isSinglePrint,string url,string[] strArray) + { + if (PP.IsDemoMesServer == 1) + { + var list = new List(); + foreach (string str in strArray) + { + var printStr = str; + if (isSinglePrint) + { + printStr = str.Replace("^XB", ""); + } + list.Add(printStr); + } + + File.WriteAllText($"PrintContent_{DateTime .Now.ToString ("yyyy_MM_dd_HH_mm_ss")}.print", string.Join (" ", list)); + + return true; + } + + + var sucess = false; + try + { + var client = new System.Net.Sockets.TcpClient(); + client.Connect(url.Split(':')[0], Convert.ToInt32(url.Split(':')[1])); + + foreach (string str in strArray) + { + var printStr = str; + if (isSinglePrint) + { + printStr = str.Replace("^XB", ""); + } + client.Client.Send(System.Text.Encoding.ASCII.GetBytes(printStr)); + } + client.Close(); + + sucess = true; + } + catch (Exception err) { } + + return sucess; + } + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/ToPrinter/Print_Sql.cs b/Common/09MesDataFunction/MesDataFunction/ToPrinter/Print_Sql.cs new file mode 100644 index 0000000..69fb29d --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/ToPrinter/Print_Sql.cs @@ -0,0 +1,80 @@ +using MesDataFunction; +using MesWork; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class Print_Sql + { + + + public static bool Select_Print_Template(out DataTable dt_Print_Template) + { + /* +SELECT [IDG],[TemplateName],[TemplateContent],[DefSelect],[UpdateTime] FROM [OL_Repair_Print_Template] + */ + + bool success = false; + var sql = +@" +SELECT [IDG],[TemplateName],[DefSelect],[UpdateTime] FROM [OL_Repair_Print_Template] +ORDER BY [UpdateTime] +"; + success = DataLinkMesWork.SQLCommon.ExecuteDataTable(sql, PP.ConnectionString_MES, out DataTable dt, out string err2); + dt_Print_Template = dt; + return success; + + } + + public static bool Select_Print_TemplateStr(string IDG, out string templateStr) + { + /* +SELECT [IDG],[TemplateName],[TemplateContent],[DefSelect],[UpdateTime] FROM [OL_Repair_Print_Template] + */ + templateStr = ""; + bool success = false; + var sql = + $" DECLARE @IDG nvarchar(50) = '{IDG}'" + +@" +SELECT [TemplateContent] FROM [OL_Repair_Print_Template] +WHERE [IDG] = @IDG +"; + success = DataLinkMesWork.SQLCommon.ExecuteDataTable(sql, PP.ConnectionString_MES, out DataTable dt, out string err2); + if (dt.Rows.Count > 0) + { + templateStr = dt.Rows[0]["TemplateContent"].ToString(); + } + return success; + + } + + public static bool Select_Print_Template_Def(out string templateStr) + { + /* +SELECT [IDG],[TemplateName],[TemplateContent],[DefSelect],[UpdateTime] FROM [OL_Repair_Print_Template] + */ + templateStr = ""; + bool success = false; + var sql = +@" +SELECT top 1 [TemplateContent] FROM [OL_Repair_Print_Template] +WHERE [DefSelect]= 'True' +"; + success = DataLinkMesWork.SQLCommon.ExecuteDataTable(sql, PP.ConnectionString_MES, out DataTable dt, out string err2); + if (dt.Rows.Count > 0) + { + templateStr = dt.Rows[0]["TemplateContent"].ToString(); + } + return success; + + } + + + } +} diff --git a/Common/09MesDataFunction/MesDataFunction/ToPrinter/PrinterCommandCenter.cs b/Common/09MesDataFunction/MesDataFunction/ToPrinter/PrinterCommandCenter.cs new file mode 100644 index 0000000..9b83dcc --- /dev/null +++ b/Common/09MesDataFunction/MesDataFunction/ToPrinter/PrinterCommandCenter.cs @@ -0,0 +1,33 @@ +using MesWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesDataFunction +{ + public class PrinterCommandCenter + { + + public static bool PrintToPrinter(string code) + { + bool success = false; + + Print_Sql.Select_Print_Template_Def(out string templateStr); + var printContent = Template_Make_Zpl(templateStr, code); + + PrintTo.Print(true, PP.PrintURL, new string[] { printContent }); + + return success; + } + + + public static string Template_Make_Zpl(string templateStr,string TowCode) + { + return templateStr.Replace("@TowCode", TowCode); + } + + + } +} diff --git a/Common/MyLog4Net/00_MyLog4Net.csproj b/Common/MyLog4Net/00_MyLog4Net.csproj new file mode 100644 index 0000000..1c1c6ad --- /dev/null +++ b/Common/MyLog4Net/00_MyLog4Net.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {1DC48C83-1842-4DE8-ACAF-26E1E7F7C58F} + Library + Properties + MyLog4Net + MyLog4Net + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\log4net.2.0.14\lib\net45\log4net.dll + + + + + + + + + + + + + + + + + + + + + Always + + + + \ No newline at end of file diff --git a/Common/MyLog4Net/MyLogEventArgs.cs b/Common/MyLog4Net/MyLogEventArgs.cs new file mode 100644 index 0000000..a913363 --- /dev/null +++ b/Common/MyLog4Net/MyLogEventArgs.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MyLog4Net +{ + public class MyLogEventArgs : EventArgs + { + public string Message { get; set; } + public string Module { get; set; } + } +} diff --git a/Common/MyLog4Net/MyLogHelper.cs b/Common/MyLog4Net/MyLogHelper.cs new file mode 100644 index 0000000..cb446e4 --- /dev/null +++ b/Common/MyLog4Net/MyLogHelper.cs @@ -0,0 +1,65 @@ +using log4net; +using System; + +namespace MyLog4Net +{ + public class MyLogHelper + { + public delegate void MyLogEventHandler(object sender, MyLogEventArgs e); + public static event MyLogEventHandler LogCommit; + + /// + /// 普通日志 + /// + /// 日志内容 + public static void Info(string module, string message) + { + ILog log = LogManager.GetLogger(module); + if (log.IsInfoEnabled) + { + log.Info(message); + + var e = new MyLogEventArgs(); + e.Module = module; + e.Message = message; + LogCommit?.Invoke(null, e); + } + } + /// + /// 错误日志带异常 + /// + /// 错误日志 + public static void Error(string module, string message, Exception ex) + { + ILog log = LogManager.GetLogger(module); + if (log.IsErrorEnabled) + { + log.Error(message, ex); + + var e = new MyLogEventArgs(); + e.Module = module; + e.Message = message; + LogCommit?.Invoke(null, e); + } + } + + /// + /// 错误日志不带异常 + /// + /// 错误日志 + public static void Error(string module, string message) + { + ILog log = LogManager.GetLogger(module); + if (log.IsErrorEnabled) + { + log.Error(message); + + var e = new MyLogEventArgs(); + e.Module = module; + e.Message = message; + LogCommit?.Invoke(null, e); + } + } + } + +} diff --git a/Common/MyLog4Net/Properties/AssemblyInfo.cs b/Common/MyLog4Net/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1228254 --- /dev/null +++ b/Common/MyLog4Net/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Log4Net")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Log4Net")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1dc48c83-1842-4de8-acaf-26e1e7f7c58f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] diff --git a/Common/MyLog4Net/log4net.config b/Common/MyLog4Net/log4net.config new file mode 100644 index 0000000..92f4d40 --- /dev/null +++ b/Common/MyLog4Net/log4net.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/MyLog4Net/packages.config b/Common/MyLog4Net/packages.config new file mode 100644 index 0000000..a0798f9 --- /dev/null +++ b/Common/MyLog4Net/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/MES基础数据.xlsx b/MES基础数据.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..274018144995489904946243579168d5829f4d79 GIT binary patch literal 140111 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%0DM@G%#l~Q6}{~vY5*e@B@fkN|8twXV$s<9 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 TgX<*O0_su9nUghfAt!4wz_j#;U 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 DZ}w&U literal 0 HcmV?d00001 diff --git a/Mes32X32.ico b/Mes32X32.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec465b232715999d0ff00139a6887cb4b0185d36 GIT binary patch literal 4286 zcmb8xduUc=9KiACb(*HxH1kr3zM6^J#mzykT5b!$>_SnPnHq%(MfU>TACXCEQgqR@ zrbebk2|^KqRuHZPTTu#bMo1F&NYVmunT`>j=V2o2Zf!~s{Ih@3?>jPobf;Z{72*#Dm?Pr!@#0p{}$_TYI8Lnjo88uDYsd*^m2X5wqa zJ{_TKtas2I)_(voej{c3>i2{32(}=8Z+^>Bi*EQ|9^7|H-o3%q{2gQ4-iC*9Kb&vh z$6O1=kMA7wp12JwaTvDe_m0)Ga2{`hbw=YT+Kiv>Sn_RWu9bKJ z`{2CTm#;7twr^a=Xc4Z#+c1aA;rqVW4fmP%O84LO@f3!m#d_nJ^_`nRcogel%-7*N z%S(~}maB2TLEJ~@P<9=E*hWrzPlRZQHp%rX8E+%fA{I+Ylg*p3Ai;w*Ty>=eB#_df&pi zZ&!RPSr_hsES|vUID+GFKdgagR{H#l=TC;`#Pr_o=ph_Yl(k9~kT8EB=>< z?Kzg?U_8$QWBYB3_|3lc46xpG7}LD^<6dk-jDL*s0*r*QtQ(ukUz2C%lEq9Eji1!D z4fC_!TX0PqV=qo1#*WuhJUfVwF%g4cyh3?Y^St2vTiI`L9zKKZJ9mG;7%`q#&o%qr z{JCv^hh?}K-I33Qt8EvHZ=H)U86P43zabsd^?V?CKY^>~gL`x*+;i!=mi=3_3D3ea z*>zbcegn^6#va(G=Iyu+UAK>6C_EG5SebWU+yeW&8*z=rcH;clMm@YwufJF?eKq$l zF$dLfZ>HDNVD4Q@j)8ys%*R{?U>ZKaFKC`ij8Q1QYik#l!gf6`Y}2+KyWS{C?uT(* zjLrB0voIR@Jh@tbILvV)9K-ZliSfDmk+>O3)JkF}&-2Q>N z+%uhXCqu{`4xxHOmrxq|m1Q#h#-Mag&weFM<@Mq5iuzDqQD26t@=^1v%d=g|noypt zE6Zf-Dl8$N*k&|rl~T7a+1h|67_SnPnHq%(MfU>TACXCEQgqR@ zrbebk2|^KqRuHZPTTu#bMo1F&NYVmunT`>j=V2o2Zf!~s{Ih@3?>jPobf;Z{72*#Dm?Pr!@#0p{}$_TYI8Lnjo88uDYsd*^m2X5wqa zJ{_TKtas2I)_(voej{c3>i2{32(}=8Z+^>Bi*EQ|9^7|H-o3%q{2gQ4-iC*9Kb&vh z$6O1=kMA7wp12JwaTvDe_m0)Ga2{`hbw=YT+Kiv>Sn_RWu9bKJ z`{2CTm#;7twr^a=Xc4Z#+c1aA;rqVW4fmP%O84LO@f3!m#d_nJ^_`nRcogel%-7*N z%S(~}maB2TLEJ~@P<9=E*hWrzPlRZQHp%rX8E+%fA{I+Ylg*p3Ai;w*Ty>=eB#_df&pi zZ&!RPSr_hsES|vUID+GFKdgagR{H#l=TC;`#Pr_o=ph_Yl(k9~kT8EB=>< z?Kzg?U_8$QWBYB3_|3lc46xpG7}LD^<6dk-jDL*s0*r*QtQ(ukUz2C%lEq9Eji1!D z4fC_!TX0PqV=qo1#*WuhJUfVwF%g4cyh3?Y^St2vTiI`L9zKKZJ9mG;7%`q#&o%qr z{JCv^hh?}K-I33Qt8EvHZ=H)U86P43zabsd^?V?CKY^>~gL`x*+;i!=mi=3_3D3ea z*>zbcegn^6#va(G=Iyu+UAK>6C_EG5SebWU+yeW&8*z=rcH;clMm@YwufJF?eKq$l zF$dLfZ>HDNVD4Q@j)8ys%*R{?U>ZKaFKC`ij8Q1QYik#l!gf6`Y}2+KyWS{C?uT(* zjLrB0voIR@Jh@tbILvV)9K-ZliSfDmk+>O3)JkF}&-2Q>N z+%uhXCqu{`4xxHOmrxq|m1Q#h#-Mag&weFM<@Mq5iuzDqQD26t@=^1v%d=g|noypt zE6Zf-Dl8$N*k&|rl~T7a+1h|67 + /// 必需的设计器变量。 + ///

+ private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MesServerMisDataFun)); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.ToolStripMenuItem_PlcDebug = new System.Windows.Forms.ToolStripMenuItem(); + this.帮助ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.版本信息ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.关于迈思ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.webApi调试ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.textBox_WEB_TO_MES = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox_PLC_TO_MES = new System.Windows.Forms.TextBox(); + this.panel8 = new System.Windows.Forms.Panel(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); + this.button14 = new System.Windows.Forms.Button(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.button15 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.button16 = new System.Windows.Forms.Button(); + this.label7 = new System.Windows.Forms.Label(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.textBox_MES_TO_WEB = new System.Windows.Forms.TextBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.checkBox_PLC_TO_MES = new System.Windows.Forms.CheckBox(); + this.button_PLC_TO_MES_Clear = new System.Windows.Forms.Button(); + this.button_PLC_TO_MES_Big = new System.Windows.Forms.Button(); + this.button_PLC_TO_MES_Small = new System.Windows.Forms.Button(); + this.panel3 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.dataGridView_CheckOpName = new System.Windows.Forms.DataGridView(); + this.选择 = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.工位号 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.checkBox__MES_TO_WEB = new System.Windows.Forms.CheckBox(); + this.button_MES_TO_WEB_Clear = new System.Windows.Forms.Button(); + this.button_MES_TO_WEB_Small = new System.Windows.Forms.Button(); + this.button_MES_TO_WEB_Big = new System.Windows.Forms.Button(); + this.panel4 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.button_WEB_TO_MES_Big = new System.Windows.Forms.Button(); + this.button_WEB_TO_MES_Small = new System.Windows.Forms.Button(); + this.checkBox_WEB_TO_MES = new System.Windows.Forms.CheckBox(); + this.button_WEB_TO_MES_Clear = new System.Windows.Forms.Button(); + this.panel5 = new System.Windows.Forms.Panel(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.textBox_MqttText = new System.Windows.Forms.TextBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel(); + this.panel6 = new System.Windows.Forms.Panel(); + this.button_SaveData = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.comboBox_OpNameList = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.button_ToWEB = new System.Windows.Forms.Button(); + this.button_WebToMES = new System.Windows.Forms.Button(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader10 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.panel7 = new System.Windows.Forms.Panel(); + this.dgv_OpName = new System.Windows.Forms.DataGridView(); + this.OpCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.OpName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.MesDll = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLC = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.PLC代码 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.button20 = new System.Windows.Forms.Button(); + this.MesEngineDataWritePlc = new System.Windows.Forms.Button(); + this.button18 = new System.Windows.Forms.Button(); + this.textBox1_EngineID = new System.Windows.Forms.TextBox(); + this.textBox2_EngineTypeID = new System.Windows.Forms.TextBox(); + this.textBox3_palletCode = new System.Windows.Forms.TextBox(); + this.button17 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.panel_Signal_Conf = new System.Windows.Forms.Panel(); + this.pb_OnLine_Print = new System.Windows.Forms.PictureBox(); + this.label28 = new System.Windows.Forms.Label(); + this.pb_OnLine_SQL = new System.Windows.Forms.PictureBox(); + this.label14 = new System.Windows.Forms.Label(); + this.pb_OnLine_MQTT = new System.Windows.Forms.PictureBox(); + this.label15 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txt_PLC_39 = new System.Windows.Forms.TextBox(); + this.txt_PLC_11 = new System.Windows.Forms.TextBox(); + this.txt_PLC_10 = new System.Windows.Forms.TextBox(); + this.txt_PLC_9 = new System.Windows.Forms.TextBox(); + this.txt_Interval = new System.Windows.Forms.TextBox(); + this.cb_F5 = new System.Windows.Forms.CheckBox(); + this.label27 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.btn_PLC_59 = new System.Windows.Forms.Button(); + this.btn_PLC_2 = new System.Windows.Forms.Button(); + this.btn_PLC_43 = new System.Windows.Forms.Button(); + this.btn_PLC_1002 = new System.Windows.Forms.Button(); + this.btn_MES_5 = new System.Windows.Forms.Button(); + this.btn_PLC_1001 = new System.Windows.Forms.Button(); + this.btn_PLC_44 = new System.Windows.Forms.Button(); + this.btn_PLC_1000 = new System.Windows.Forms.Button(); + this.btn_MES_66 = new System.Windows.Forms.Button(); + this.btn_MES_7 = new System.Windows.Forms.Button(); + this.btn_PLC_19 = new System.Windows.Forms.Button(); + this.btn_MES_20 = new System.Windows.Forms.Button(); + this.label13 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.richTextBox1_mqtt = new System.Windows.Forms.RichTextBox(); + this.timer_Status = new System.Windows.Forms.Timer(this.components); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel_RunningStatu = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel_RunningStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel_StartTime = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel_RunTime = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel_WorkStationNum = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel_Version = new System.Windows.Forms.ToolStripStatusLabel(); + this.menuStrip1.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.panel8.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.panel1.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.panel3.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView_CheckOpName)).BeginInit(); + this.panel4.SuspendLayout(); + this.tableLayoutPanel4.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel2.SuspendLayout(); + this.tableLayoutPanel5.SuspendLayout(); + this.panel6.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.panel7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_OpName)).BeginInit(); + this.groupBox4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pb_OnLine_Print)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pb_OnLine_SQL)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pb_OnLine_MQTT)).BeginInit(); + this.groupBox2.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.GripMargin = new System.Windows.Forms.Padding(2, 2, 0, 2); + this.menuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24); + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ToolStripMenuItem_PlcDebug, + this.帮助ToolStripMenuItem, + this.webApi调试ToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(6, 3, 0, 3); + this.menuStrip1.Size = new System.Drawing.Size(1580, 34); + this.menuStrip1.TabIndex = 2; + this.menuStrip1.Text = "menuStrip1"; + // + // ToolStripMenuItem_PlcDebug + // + this.ToolStripMenuItem_PlcDebug.Name = "ToolStripMenuItem_PlcDebug"; + this.ToolStripMenuItem_PlcDebug.Size = new System.Drawing.Size(130, 28); + this.ToolStripMenuItem_PlcDebug.Text = "PLC信号调试"; + this.ToolStripMenuItem_PlcDebug.Click += new System.EventHandler(this.ToolStripMenuItem_PlcDebug_Click); + // + // 帮助ToolStripMenuItem + // + this.帮助ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.版本信息ToolStripMenuItem, + this.关于迈思ToolStripMenuItem}); + this.帮助ToolStripMenuItem.Name = "帮助ToolStripMenuItem"; + this.帮助ToolStripMenuItem.Size = new System.Drawing.Size(62, 28); + this.帮助ToolStripMenuItem.Text = "帮助"; + // + // 版本信息ToolStripMenuItem + // + this.版本信息ToolStripMenuItem.Name = "版本信息ToolStripMenuItem"; + this.版本信息ToolStripMenuItem.Size = new System.Drawing.Size(182, 34); + this.版本信息ToolStripMenuItem.Text = "版本信息"; + this.版本信息ToolStripMenuItem.Click += new System.EventHandler(this.版本信息ToolStripMenuItem_Click); + // + // 关于迈思ToolStripMenuItem + // + this.关于迈思ToolStripMenuItem.Name = "关于迈思ToolStripMenuItem"; + this.关于迈思ToolStripMenuItem.Size = new System.Drawing.Size(182, 34); + this.关于迈思ToolStripMenuItem.Text = "关于迈思"; + this.关于迈思ToolStripMenuItem.Click += new System.EventHandler(this.关于迈思ToolStripMenuItem_Click); + // + // webApi调试ToolStripMenuItem + // + this.webApi调试ToolStripMenuItem.Name = "webApi调试ToolStripMenuItem"; + this.webApi调试ToolStripMenuItem.Size = new System.Drawing.Size(132, 28); + this.webApi调试ToolStripMenuItem.Text = "WebApi调试"; + this.webApi调试ToolStripMenuItem.Click += new System.EventHandler(this.webAPI接口测试ToolStripMenuItem_Click); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 300F)); + this.tableLayoutPanel1.Controls.Add(this.groupBox5, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.groupBox1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.groupBox3, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.panel3, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.panel4, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.panel5, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.panel2, 0, 3); + this.tableLayoutPanel1.Location = new System.Drawing.Point(501, 478); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(885, 512); + this.tableLayoutPanel1.TabIndex = 3; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.textBox_WEB_TO_MES); + this.groupBox5.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox5.Location = new System.Drawing.Point(3, 258); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(579, 96); + this.groupBox5.TabIndex = 4; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "页面发送到MES系统信息"; + // + // textBox_WEB_TO_MES + // + this.textBox_WEB_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox_WEB_TO_MES.Location = new System.Drawing.Point(3, 24); + this.textBox_WEB_TO_MES.Multiline = true; + this.textBox_WEB_TO_MES.Name = "textBox_WEB_TO_MES"; + this.textBox_WEB_TO_MES.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox_WEB_TO_MES.Size = new System.Drawing.Size(573, 69); + this.textBox_WEB_TO_MES.TabIndex = 1; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.textBox_PLC_TO_MES); + this.groupBox1.Controls.Add(this.panel8); + this.groupBox1.Location = new System.Drawing.Point(3, 3); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(579, 96); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "设备PLC信号"; + // + // textBox_PLC_TO_MES + // + this.textBox_PLC_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox_PLC_TO_MES.Location = new System.Drawing.Point(3, 24); + this.textBox_PLC_TO_MES.Multiline = true; + this.textBox_PLC_TO_MES.Name = "textBox_PLC_TO_MES"; + this.textBox_PLC_TO_MES.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox_PLC_TO_MES.Size = new System.Drawing.Size(573, 69); + this.textBox_PLC_TO_MES.TabIndex = 0; + // + // panel8 + // + this.panel8.Controls.Add(this.button4); + this.panel8.Controls.Add(this.button5); + this.panel8.Controls.Add(this.button6); + this.panel8.Controls.Add(this.button7); + this.panel8.Controls.Add(this.button8); + this.panel8.Controls.Add(this.button9); + this.panel8.Controls.Add(this.button10); + this.panel8.Controls.Add(this.button11); + this.panel8.Controls.Add(this.button12); + this.panel8.Controls.Add(this.button13); + this.panel8.Controls.Add(this.button14); + this.panel8.Controls.Add(this.checkBox1); + this.panel8.Controls.Add(this.checkBox2); + this.panel8.Controls.Add(this.button15); + this.panel8.Controls.Add(this.label6); + this.panel8.Controls.Add(this.button16); + this.panel8.Controls.Add(this.label7); + this.panel8.Controls.Add(this.richTextBox1); + this.panel8.Location = new System.Drawing.Point(-490, -396); + this.panel8.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(1558, 969); + this.panel8.TabIndex = 5; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(765, 460); + this.button4.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(112, 34); + this.button4.TabIndex = 1479; + this.button4.Text = "工作完成M"; + this.button4.UseVisualStyleBackColor = true; + // + // button5 + // + this.button5.Location = new System.Drawing.Point(765, 420); + this.button5.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(112, 34); + this.button5.TabIndex = 1479; + this.button5.Text = "工作完成M"; + this.button5.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(765, 376); + this.button6.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(112, 34); + this.button6.TabIndex = 1478; + this.button6.Text = "工作完成M"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.workOverMES_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(765, 333); + this.button7.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(112, 34); + this.button7.TabIndex = 1478; + this.button7.Text = "保存完成M"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.saveOverMES_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(765, 290); + this.button8.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(112, 34); + this.button8.TabIndex = 1478; + this.button8.Text = "允许保存P"; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.allowSavePLC_Click); + // + // button9 + // + this.button9.Location = new System.Drawing.Point(764, 246); + this.button9.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(112, 34); + this.button9.TabIndex = 1478; + this.button9.Text = "允许工作M"; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.allowWorkMES_Click); + // + // button10 + // + this.button10.Location = new System.Drawing.Point(764, 202); + this.button10.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(112, 34); + this.button10.TabIndex = 1478; + this.button10.Text = "传递机型P"; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.EngineGetOverPLC_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(764, 159); + this.button11.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(112, 34); + this.button11.TabIndex = 1478; + this.button11.Text = "传递机型M"; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.EngineGetOverMES_Click); + // + // button12 + // + this.button12.Location = new System.Drawing.Point(765, 116); + this.button12.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(112, 34); + this.button12.TabIndex = 1478; + this.button12.Text = "申请上线P"; + this.button12.UseVisualStyleBackColor = true; + this.button12.Click += new System.EventHandler(this.PartLoadPLC_Click); + // + // button13 + // + this.button13.Location = new System.Drawing.Point(764, 72); + this.button13.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(112, 34); + this.button13.TabIndex = 1478; + this.button13.Text = "工件到位P"; + this.button13.UseVisualStyleBackColor = true; + this.button13.Click += new System.EventHandler(this.WorkStartPLC_Click); + // + // button14 + // + this.button14.Location = new System.Drawing.Point(1054, 9); + this.button14.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button14.Name = "button14"; + this.button14.Size = new System.Drawing.Size(237, 58); + this.button14.TabIndex = 1477; + this.button14.Text = "初始化报警"; + this.button14.UseVisualStyleBackColor = true; + this.button14.Click += new System.EventHandler(this.button2_Click); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(16, 40); + this.checkBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(106, 22); + this.checkBox1.TabIndex = 1475; + this.checkBox1.Text = "质量数据"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Location = new System.Drawing.Point(16, 10); + this.checkBox2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(106, 22); + this.checkBox2.TabIndex = 1476; + this.checkBox2.Text = "监控数据"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // button15 + // + this.button15.Location = new System.Drawing.Point(1300, 9); + this.button15.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button15.Name = "button15"; + this.button15.Size = new System.Drawing.Size(242, 58); + this.button15.TabIndex = 4; + this.button15.Text = "MQTT服务状态"; + this.button15.UseVisualStyleBackColor = true; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label6.Location = new System.Drawing.Point(136, 10); + this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(98, 18); + this.label6.TabIndex = 1471; + this.label6.Text = "工位编号:"; + // + // button16 + // + this.button16.Location = new System.Drawing.Point(280, 28); + this.button16.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button16.Name = "button16"; + this.button16.Size = new System.Drawing.Size(93, 39); + this.button16.TabIndex = 1474; + this.button16.Text = "读取数据"; + this.button16.UseVisualStyleBackColor = true; + this.button16.Click += new System.EventHandler(this.button_ReadData_Click); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(900, 40); + this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(44, 18); + this.label7.TabIndex = 1; + this.label7.Text = "日志"; + // + // richTextBox1 + // + this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.richTextBox1.Location = new System.Drawing.Point(886, 70); + this.richTextBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.ReadOnly = true; + this.richTextBox1.Size = new System.Drawing.Size(654, 900); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = ""; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.textBox_MES_TO_WEB); + this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox3.Location = new System.Drawing.Point(3, 105); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(579, 147); + this.groupBox3.TabIndex = 2; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "MES系统发送到页面信息"; + // + // textBox_MES_TO_WEB + // + this.textBox_MES_TO_WEB.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox_MES_TO_WEB.Location = new System.Drawing.Point(3, 24); + this.textBox_MES_TO_WEB.Multiline = true; + this.textBox_MES_TO_WEB.Name = "textBox_MES_TO_WEB"; + this.textBox_MES_TO_WEB.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox_MES_TO_WEB.Size = new System.Drawing.Size(573, 120); + this.textBox_MES_TO_WEB.TabIndex = 1; + // + // panel1 + // + this.panel1.Controls.Add(this.tableLayoutPanel3); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(588, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(294, 96); + this.panel1.TabIndex = 10; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 4; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel3.Controls.Add(this.checkBox_PLC_TO_MES, 0, 0); + this.tableLayoutPanel3.Controls.Add(this.button_PLC_TO_MES_Clear, 3, 0); + this.tableLayoutPanel3.Controls.Add(this.button_PLC_TO_MES_Big, 2, 0); + this.tableLayoutPanel3.Controls.Add(this.button_PLC_TO_MES_Small, 1, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 2; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(294, 96); + this.tableLayoutPanel3.TabIndex = 3; + // + // checkBox_PLC_TO_MES + // + this.checkBox_PLC_TO_MES.AutoSize = true; + this.checkBox_PLC_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill; + this.checkBox_PLC_TO_MES.Location = new System.Drawing.Point(3, 3); + this.checkBox_PLC_TO_MES.Name = "checkBox_PLC_TO_MES"; + this.checkBox_PLC_TO_MES.Size = new System.Drawing.Size(82, 33); + this.checkBox_PLC_TO_MES.TabIndex = 0; + this.checkBox_PLC_TO_MES.Text = "监控"; + this.checkBox_PLC_TO_MES.UseVisualStyleBackColor = true; + // + // button_PLC_TO_MES_Clear + // + this.button_PLC_TO_MES_Clear.Dock = System.Windows.Forms.DockStyle.Fill; + this.button_PLC_TO_MES_Clear.Location = new System.Drawing.Point(207, 3); + this.button_PLC_TO_MES_Clear.Name = "button_PLC_TO_MES_Clear"; + this.button_PLC_TO_MES_Clear.Size = new System.Drawing.Size(84, 33); + this.button_PLC_TO_MES_Clear.TabIndex = 1; + this.button_PLC_TO_MES_Clear.Text = "清空"; + this.button_PLC_TO_MES_Clear.UseVisualStyleBackColor = true; + // + // button_PLC_TO_MES_Big + // + this.button_PLC_TO_MES_Big.Location = new System.Drawing.Point(149, 3); + this.button_PLC_TO_MES_Big.Name = "button_PLC_TO_MES_Big"; + this.button_PLC_TO_MES_Big.Size = new System.Drawing.Size(51, 30); + this.button_PLC_TO_MES_Big.TabIndex = 2; + this.button_PLC_TO_MES_Big.Text = "+"; + this.button_PLC_TO_MES_Big.UseVisualStyleBackColor = true; + // + // button_PLC_TO_MES_Small + // + this.button_PLC_TO_MES_Small.Location = new System.Drawing.Point(91, 3); + this.button_PLC_TO_MES_Small.Name = "button_PLC_TO_MES_Small"; + this.button_PLC_TO_MES_Small.Size = new System.Drawing.Size(51, 30); + this.button_PLC_TO_MES_Small.TabIndex = 2; + this.button_PLC_TO_MES_Small.Text = "-"; + this.button_PLC_TO_MES_Small.UseVisualStyleBackColor = true; + // + // panel3 + // + this.panel3.Controls.Add(this.tableLayoutPanel2); + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Location = new System.Drawing.Point(588, 105); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(294, 147); + this.panel3.TabIndex = 12; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 4; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel2.Controls.Add(this.dataGridView_CheckOpName, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.checkBox__MES_TO_WEB, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.button_MES_TO_WEB_Clear, 3, 0); + this.tableLayoutPanel2.Controls.Add(this.button_MES_TO_WEB_Small, 1, 0); + this.tableLayoutPanel2.Controls.Add(this.button_MES_TO_WEB_Big, 2, 0); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(294, 147); + this.tableLayoutPanel2.TabIndex = 1; + // + // dataGridView_CheckOpName + // + this.dataGridView_CheckOpName.AllowUserToAddRows = false; + this.dataGridView_CheckOpName.AllowUserToDeleteRows = false; + this.dataGridView_CheckOpName.AllowUserToResizeColumns = false; + this.dataGridView_CheckOpName.AllowUserToResizeRows = false; + this.dataGridView_CheckOpName.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView_CheckOpName.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.选择, + this.工位号}); + this.tableLayoutPanel2.SetColumnSpan(this.dataGridView_CheckOpName, 4); + this.dataGridView_CheckOpName.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView_CheckOpName.Location = new System.Drawing.Point(3, 42); + this.dataGridView_CheckOpName.MultiSelect = false; + this.dataGridView_CheckOpName.Name = "dataGridView_CheckOpName"; + this.dataGridView_CheckOpName.RowHeadersVisible = false; + this.dataGridView_CheckOpName.RowHeadersWidth = 62; + this.dataGridView_CheckOpName.RowTemplate.Height = 30; + this.dataGridView_CheckOpName.Size = new System.Drawing.Size(288, 102); + this.dataGridView_CheckOpName.TabIndex = 3; + // + // 选择 + // + this.选择.DataPropertyName = "选择"; + this.选择.HeaderText = "选择"; + this.选择.MinimumWidth = 8; + this.选择.Name = "选择"; + this.选择.Width = 60; + // + // 工位号 + // + this.工位号.DataPropertyName = "工位号"; + this.工位号.HeaderText = "工位号"; + this.工位号.MinimumWidth = 8; + this.工位号.Name = "工位号"; + this.工位号.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.工位号.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.工位号.Width = 218; + // + // checkBox__MES_TO_WEB + // + this.checkBox__MES_TO_WEB.AutoSize = true; + this.checkBox__MES_TO_WEB.Dock = System.Windows.Forms.DockStyle.Fill; + this.checkBox__MES_TO_WEB.Location = new System.Drawing.Point(3, 3); + this.checkBox__MES_TO_WEB.Name = "checkBox__MES_TO_WEB"; + this.checkBox__MES_TO_WEB.Size = new System.Drawing.Size(82, 33); + this.checkBox__MES_TO_WEB.TabIndex = 0; + this.checkBox__MES_TO_WEB.Text = "监控"; + this.checkBox__MES_TO_WEB.UseVisualStyleBackColor = true; + // + // button_MES_TO_WEB_Clear + // + this.button_MES_TO_WEB_Clear.Dock = System.Windows.Forms.DockStyle.Fill; + this.button_MES_TO_WEB_Clear.Location = new System.Drawing.Point(207, 3); + this.button_MES_TO_WEB_Clear.Name = "button_MES_TO_WEB_Clear"; + this.button_MES_TO_WEB_Clear.Size = new System.Drawing.Size(84, 33); + this.button_MES_TO_WEB_Clear.TabIndex = 2; + this.button_MES_TO_WEB_Clear.Text = "清空"; + this.button_MES_TO_WEB_Clear.UseVisualStyleBackColor = true; + // + // button_MES_TO_WEB_Small + // + this.button_MES_TO_WEB_Small.Location = new System.Drawing.Point(91, 3); + this.button_MES_TO_WEB_Small.Name = "button_MES_TO_WEB_Small"; + this.button_MES_TO_WEB_Small.Size = new System.Drawing.Size(51, 30); + this.button_MES_TO_WEB_Small.TabIndex = 4; + this.button_MES_TO_WEB_Small.Text = "-"; + this.button_MES_TO_WEB_Small.UseVisualStyleBackColor = true; + // + // button_MES_TO_WEB_Big + // + this.button_MES_TO_WEB_Big.Location = new System.Drawing.Point(149, 3); + this.button_MES_TO_WEB_Big.Name = "button_MES_TO_WEB_Big"; + this.button_MES_TO_WEB_Big.Size = new System.Drawing.Size(51, 30); + this.button_MES_TO_WEB_Big.TabIndex = 4; + this.button_MES_TO_WEB_Big.Text = "+"; + this.button_MES_TO_WEB_Big.UseVisualStyleBackColor = true; + // + // panel4 + // + this.panel4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel4.Controls.Add(this.tableLayoutPanel4); + this.panel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel4.Location = new System.Drawing.Point(588, 258); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(294, 96); + this.panel4.TabIndex = 13; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.ColumnCount = 4; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel4.Controls.Add(this.button_WEB_TO_MES_Big, 2, 0); + this.tableLayoutPanel4.Controls.Add(this.button_WEB_TO_MES_Small, 1, 0); + this.tableLayoutPanel4.Controls.Add(this.checkBox_WEB_TO_MES, 0, 0); + this.tableLayoutPanel4.Controls.Add(this.button_WEB_TO_MES_Clear, 3, 0); + this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 2; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel4.Size = new System.Drawing.Size(292, 94); + this.tableLayoutPanel4.TabIndex = 0; + // + // button_WEB_TO_MES_Big + // + this.button_WEB_TO_MES_Big.Location = new System.Drawing.Point(148, 3); + this.button_WEB_TO_MES_Big.Name = "button_WEB_TO_MES_Big"; + this.button_WEB_TO_MES_Big.Size = new System.Drawing.Size(51, 30); + this.button_WEB_TO_MES_Big.TabIndex = 6; + this.button_WEB_TO_MES_Big.Text = "+"; + this.button_WEB_TO_MES_Big.UseVisualStyleBackColor = true; + // + // button_WEB_TO_MES_Small + // + this.button_WEB_TO_MES_Small.Location = new System.Drawing.Point(90, 3); + this.button_WEB_TO_MES_Small.Name = "button_WEB_TO_MES_Small"; + this.button_WEB_TO_MES_Small.Size = new System.Drawing.Size(51, 30); + this.button_WEB_TO_MES_Small.TabIndex = 5; + this.button_WEB_TO_MES_Small.Text = "-"; + this.button_WEB_TO_MES_Small.UseVisualStyleBackColor = true; + // + // checkBox_WEB_TO_MES + // + this.checkBox_WEB_TO_MES.AutoSize = true; + this.checkBox_WEB_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill; + this.checkBox_WEB_TO_MES.Location = new System.Drawing.Point(3, 3); + this.checkBox_WEB_TO_MES.Name = "checkBox_WEB_TO_MES"; + this.checkBox_WEB_TO_MES.Size = new System.Drawing.Size(81, 33); + this.checkBox_WEB_TO_MES.TabIndex = 0; + this.checkBox_WEB_TO_MES.Text = "监控"; + this.checkBox_WEB_TO_MES.UseVisualStyleBackColor = true; + // + // button_WEB_TO_MES_Clear + // + this.button_WEB_TO_MES_Clear.Dock = System.Windows.Forms.DockStyle.Fill; + this.button_WEB_TO_MES_Clear.Location = new System.Drawing.Point(206, 3); + this.button_WEB_TO_MES_Clear.Name = "button_WEB_TO_MES_Clear"; + this.button_WEB_TO_MES_Clear.Size = new System.Drawing.Size(83, 33); + this.button_WEB_TO_MES_Clear.TabIndex = 1; + this.button_WEB_TO_MES_Clear.Text = "清空"; + this.button_WEB_TO_MES_Clear.UseVisualStyleBackColor = true; + // + // panel5 + // + this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel5.Controls.Add(this.comboBox1); + this.panel5.Controls.Add(this.textBox_MqttText); + this.panel5.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel5.Location = new System.Drawing.Point(589, 360); + this.panel5.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(292, 149); + this.panel5.TabIndex = 14; + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(4, 9); + this.comboBox1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(280, 26); + this.comboBox1.TabIndex = 4; + // + // textBox_MqttText + // + this.textBox_MqttText.Location = new System.Drawing.Point(4, 48); + this.textBox_MqttText.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.textBox_MqttText.Multiline = true; + this.textBox_MqttText.Name = "textBox_MqttText"; + this.textBox_MqttText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox_MqttText.Size = new System.Drawing.Size(277, 139); + this.textBox_MqttText.TabIndex = 15; + // + // panel2 + // + this.panel2.Controls.Add(this.tableLayoutPanel5); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(4, 360); + this.panel2.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(577, 149); + this.panel2.TabIndex = 15; + // + // tableLayoutPanel5 + // + this.tableLayoutPanel5.ColumnCount = 2; + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 300F)); + this.tableLayoutPanel5.Controls.Add(this.panel6, 1, 0); + this.tableLayoutPanel5.Controls.Add(this.tabControl1, 0, 0); + this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel5.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tableLayoutPanel5.Name = "tableLayoutPanel5"; + this.tableLayoutPanel5.RowCount = 1; + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel5.Size = new System.Drawing.Size(577, 149); + this.tableLayoutPanel5.TabIndex = 0; + // + // panel6 + // + this.panel6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel6.Controls.Add(this.button_SaveData); + this.panel6.Controls.Add(this.label1); + this.panel6.Controls.Add(this.label3); + this.panel6.Controls.Add(this.comboBox_OpNameList); + this.panel6.Controls.Add(this.label2); + this.panel6.Controls.Add(this.button_ToWEB); + this.panel6.Controls.Add(this.button_WebToMES); + this.panel6.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel6.Location = new System.Drawing.Point(281, 3); + this.panel6.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(292, 143); + this.panel6.TabIndex = 0; + // + // button_SaveData + // + this.button_SaveData.Location = new System.Drawing.Point(20, 142); + this.button_SaveData.Name = "button_SaveData"; + this.button_SaveData.Size = new System.Drawing.Size(84, 27); + this.button_SaveData.TabIndex = 4; + this.button_SaveData.Text = "保存质量数据"; + this.button_SaveData.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 9); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 18); + this.label1.TabIndex = 2; + this.label1.Text = "工位号"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(94, 93); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(188, 18); + this.label3.TabIndex = 3; + this.label3.Text = "WEB|CMD|OpName|Walue"; + // + // comboBox_OpNameList + // + this.comboBox_OpNameList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox_OpNameList.FormattingEnabled = true; + this.comboBox_OpNameList.Location = new System.Drawing.Point(76, 3); + this.comboBox_OpNameList.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.comboBox_OpNameList.Name = "comboBox_OpNameList"; + this.comboBox_OpNameList.Size = new System.Drawing.Size(208, 26); + this.comboBox_OpNameList.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(94, 51); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(188, 18); + this.label2.TabIndex = 3; + this.label2.Text = "MES|CMD|OpName|Walue"; + // + // button_ToWEB + // + this.button_ToWEB.Location = new System.Drawing.Point(8, 45); + this.button_ToWEB.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.button_ToWEB.Name = "button_ToWEB"; + this.button_ToWEB.Size = new System.Drawing.Size(78, 33); + this.button_ToWEB.TabIndex = 0; + this.button_ToWEB.Text = "到页面"; + this.button_ToWEB.UseVisualStyleBackColor = true; + // + // button_WebToMES + // + this.button_WebToMES.Location = new System.Drawing.Point(9, 87); + this.button_WebToMES.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.button_WebToMES.Name = "button_WebToMES"; + this.button_WebToMES.Size = new System.Drawing.Size(76, 33); + this.button_WebToMES.TabIndex = 0; + this.button_WebToMES.Text = "到业务"; + this.button_WebToMES.UseVisualStyleBackColor = true; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage6); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage3); + this.tabControl1.Controls.Add(this.tabPage4); + this.tabControl1.Controls.Add(this.tabPage5); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(4, 3); + this.tabControl1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(269, 143); + this.tabControl1.TabIndex = 1; + // + // tabPage6 + // + this.tabPage6.Location = new System.Drawing.Point(4, 28); + this.tabPage6.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.Size = new System.Drawing.Size(261, 111); + this.tabPage6.TabIndex = 5; + this.tabPage6.Text = "订单信息"; + this.tabPage6.UseVisualStyleBackColor = true; + // + // tabPage1 + // + this.tabPage1.Location = new System.Drawing.Point(4, 28); + this.tabPage1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage1.Size = new System.Drawing.Size(259, 110); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "产品信息"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // tabPage2 + // + this.tabPage2.Location = new System.Drawing.Point(4, 28); + this.tabPage2.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage2.Size = new System.Drawing.Size(259, 110); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "工步信息"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // tabPage3 + // + this.tabPage3.Location = new System.Drawing.Point(4, 28); + this.tabPage3.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(259, 110); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "物料信息"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // tabPage4 + // + this.tabPage4.Location = new System.Drawing.Point(4, 28); + this.tabPage4.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Size = new System.Drawing.Size(259, 110); + this.tabPage4.TabIndex = 3; + this.tabPage4.Text = "操作图片"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // tabPage5 + // + this.tabPage5.Location = new System.Drawing.Point(4, 28); + this.tabPage5.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.Size = new System.Drawing.Size(259, 110); + this.tabPage5.TabIndex = 4; + this.tabPage5.Text = "PLC信号"; + this.tabPage5.UseVisualStyleBackColor = true; + // + // columnHeader6 + // + this.columnHeader6.Text = "TagID"; + this.columnHeader6.Width = 70; + // + // columnHeader7 + // + this.columnHeader7.Text = "测量项目"; + this.columnHeader7.Width = 130; + // + // columnHeader8 + // + this.columnHeader8.Text = "值"; + this.columnHeader8.Width = 100; + // + // columnHeader9 + // + this.columnHeader9.Text = "工位号"; + this.columnHeader9.Width = 70; + // + // columnHeader10 + // + this.columnHeader10.Text = "地址"; + this.columnHeader10.Width = 100; + // + // panel7 + // + this.panel7.Controls.Add(this.dgv_OpName); + this.panel7.Controls.Add(this.groupBox4); + this.panel7.Controls.Add(this.panel_Signal_Conf); + this.panel7.Controls.Add(this.pb_OnLine_Print); + this.panel7.Controls.Add(this.label28); + this.panel7.Controls.Add(this.pb_OnLine_SQL); + this.panel7.Controls.Add(this.label14); + this.panel7.Controls.Add(this.pb_OnLine_MQTT); + this.panel7.Controls.Add(this.label15); + this.panel7.Controls.Add(this.groupBox2); + this.panel7.Controls.Add(this.label13); + this.panel7.Controls.Add(this.button2); + this.panel7.Controls.Add(this.label4); + this.panel7.Controls.Add(this.richTextBox1_mqtt); + this.panel7.Location = new System.Drawing.Point(14, 42); + this.panel7.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(1558, 956); + this.panel7.TabIndex = 5; + // + // dgv_OpName + // + this.dgv_OpName.AllowUserToAddRows = false; + this.dgv_OpName.AllowUserToDeleteRows = false; + this.dgv_OpName.BackgroundColor = System.Drawing.SystemColors.ControlLightLight; + this.dgv_OpName.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgv_OpName.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.OpCode, + this.OpName, + this.MesDll, + this.PLC, + this.PLC代码}); + this.dgv_OpName.Location = new System.Drawing.Point(16, 99); + this.dgv_OpName.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dgv_OpName.Name = "dgv_OpName"; + this.dgv_OpName.ReadOnly = true; + this.dgv_OpName.RowHeadersVisible = false; + this.dgv_OpName.RowHeadersWidth = 62; + this.dgv_OpName.RowTemplate.Height = 23; + this.dgv_OpName.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv_OpName.Size = new System.Drawing.Size(314, 837); + this.dgv_OpName.TabIndex = 1488; + this.dgv_OpName.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_OpName_CellClick); + // + // OpCode + // + this.OpCode.DataPropertyName = "工位号"; + this.OpCode.HeaderText = "工位号"; + this.OpCode.MinimumWidth = 8; + this.OpCode.Name = "OpCode"; + this.OpCode.ReadOnly = true; + this.OpCode.Width = 80; + // + // OpName + // + this.OpName.DataPropertyName = "工位名称"; + this.OpName.HeaderText = "工位名称"; + this.OpName.MinimumWidth = 8; + this.OpName.Name = "OpName"; + this.OpName.ReadOnly = true; + this.OpName.Width = 120; + // + // MesDll + // + this.MesDll.DataPropertyName = "MesDll"; + this.MesDll.HeaderText = "MesDll"; + this.MesDll.MinimumWidth = 8; + this.MesDll.Name = "MesDll"; + this.MesDll.ReadOnly = true; + this.MesDll.Width = 90; + // + // PLC + // + this.PLC.DataPropertyName = "PLC"; + this.PLC.HeaderText = "PLC"; + this.PLC.MinimumWidth = 8; + this.PLC.Name = "PLC"; + this.PLC.ReadOnly = true; + this.PLC.Width = 150; + // + // PLC代码 + // + this.PLC代码.DataPropertyName = "PLC代码"; + this.PLC代码.HeaderText = "PLC代码"; + this.PLC代码.MinimumWidth = 8; + this.PLC代码.Name = "PLC代码"; + this.PLC代码.ReadOnly = true; + this.PLC代码.Width = 150; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.label11); + this.groupBox4.Controls.Add(this.label10); + this.groupBox4.Controls.Add(this.label12); + this.groupBox4.Controls.Add(this.button20); + this.groupBox4.Controls.Add(this.MesEngineDataWritePlc); + this.groupBox4.Controls.Add(this.button18); + this.groupBox4.Controls.Add(this.textBox1_EngineID); + this.groupBox4.Controls.Add(this.textBox2_EngineTypeID); + this.groupBox4.Controls.Add(this.textBox3_palletCode); + this.groupBox4.Controls.Add(this.button17); + this.groupBox4.Controls.Add(this.button1); + this.groupBox4.Location = new System.Drawing.Point(945, 477); + this.groupBox4.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox4.Size = new System.Drawing.Size(514, 324); + this.groupBox4.TabIndex = 1487; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "调试写入"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label11.Location = new System.Drawing.Point(20, 32); + this.label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(98, 18); + this.label11.TabIndex = 1471; + this.label11.Text = "机型代码:"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label10.Location = new System.Drawing.Point(20, 72); + this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(98, 18); + this.label10.TabIndex = 1471; + this.label10.Text = "产品编号:"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label12.Location = new System.Drawing.Point(20, 112); + this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(98, 18); + this.label12.TabIndex = 1471; + this.label12.Text = "托盘编号:"; + // + // button20 + // + this.button20.Location = new System.Drawing.Point(382, 56); + this.button20.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button20.Name = "button20"; + this.button20.Size = new System.Drawing.Size(117, 51); + this.button20.TabIndex = 1478; + this.button20.Text = "打印机测试"; + this.button20.UseVisualStyleBackColor = true; + this.button20.Click += new System.EventHandler(this.button20_Click); + // + // MesEngineDataWritePlc + // + this.MesEngineDataWritePlc.Location = new System.Drawing.Point(12, 184); + this.MesEngineDataWritePlc.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MesEngineDataWritePlc.Name = "MesEngineDataWritePlc"; + this.MesEngineDataWritePlc.Size = new System.Drawing.Size(170, 34); + this.MesEngineDataWritePlc.TabIndex = 1478; + this.MesEngineDataWritePlc.Text = "MES信息回写PLC"; + this.MesEngineDataWritePlc.UseVisualStyleBackColor = true; + this.MesEngineDataWritePlc.Click += new System.EventHandler(this.MesEngineDataWritePlc_Click); + // + // button18 + // + this.button18.Location = new System.Drawing.Point(9, 147); + this.button18.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button18.Name = "button18"; + this.button18.Size = new System.Drawing.Size(172, 28); + this.button18.TabIndex = 1478; + this.button18.Text = "上述写入PLC"; + this.button18.UseVisualStyleBackColor = true; + this.button18.Click += new System.EventHandler(this.button18_Click); + // + // textBox1_EngineID + // + this.textBox1_EngineID.Location = new System.Drawing.Point(126, 68); + this.textBox1_EngineID.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.textBox1_EngineID.Name = "textBox1_EngineID"; + this.textBox1_EngineID.Size = new System.Drawing.Size(247, 28); + this.textBox1_EngineID.TabIndex = 1480; + this.textBox1_EngineID.Text = "001MBE0700000Q1590100001"; + // + // textBox2_EngineTypeID + // + this.textBox2_EngineTypeID.Location = new System.Drawing.Point(126, 21); + this.textBox2_EngineTypeID.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.textBox2_EngineTypeID.Name = "textBox2_EngineTypeID"; + this.textBox2_EngineTypeID.Size = new System.Drawing.Size(247, 28); + this.textBox2_EngineTypeID.TabIndex = 1480; + this.textBox2_EngineTypeID.Text = "1"; + // + // textBox3_palletCode + // + this.textBox3_palletCode.Location = new System.Drawing.Point(124, 108); + this.textBox3_palletCode.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.textBox3_palletCode.Name = "textBox3_palletCode"; + this.textBox3_palletCode.Size = new System.Drawing.Size(248, 28); + this.textBox3_palletCode.TabIndex = 1480; + this.textBox3_palletCode.Text = "12"; + // + // button17 + // + this.button17.Location = new System.Drawing.Point(9, 267); + this.button17.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button17.Name = "button17"; + this.button17.Size = new System.Drawing.Size(158, 48); + this.button17.TabIndex = 1478; + this.button17.Text = "模拟写入RFID"; + this.button17.UseVisualStyleBackColor = true; + this.button17.Click += new System.EventHandler(this.button17_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(176, 267); + this.button1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(158, 48); + this.button1.TabIndex = 1478; + this.button1.Text = "模拟写入电芯码"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // panel_Signal_Conf + // + this.panel_Signal_Conf.Location = new System.Drawing.Point(1256, 20); + this.panel_Signal_Conf.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.panel_Signal_Conf.Name = "panel_Signal_Conf"; + this.panel_Signal_Conf.Size = new System.Drawing.Size(62, 75); + this.panel_Signal_Conf.TabIndex = 1486; + this.panel_Signal_Conf.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.panel_Signal_Conf_MouseDoubleClick); + // + // pb_OnLine_Print + // + this.pb_OnLine_Print.Image = global::MisDataFun.Properties.Resources.断开状态; + this.pb_OnLine_Print.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.pb_OnLine_Print.Location = new System.Drawing.Point(1336, 20); + this.pb_OnLine_Print.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.pb_OnLine_Print.Name = "pb_OnLine_Print"; + this.pb_OnLine_Print.Size = new System.Drawing.Size(57, 52); + this.pb_OnLine_Print.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pb_OnLine_Print.TabIndex = 1485; + this.pb_OnLine_Print.TabStop = false; + this.pb_OnLine_Print.Visible = false; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label28.Location = new System.Drawing.Point(1336, 76); + this.label28.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(62, 18); + this.label28.TabIndex = 1484; + this.label28.Text = "打印机"; + this.label28.UseMnemonic = false; + this.label28.Visible = false; + // + // pb_OnLine_SQL + // + this.pb_OnLine_SQL.Image = global::MisDataFun.Properties.Resources.断开状态; + this.pb_OnLine_SQL.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.pb_OnLine_SQL.Location = new System.Drawing.Point(1407, 20); + this.pb_OnLine_SQL.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.pb_OnLine_SQL.Name = "pb_OnLine_SQL"; + this.pb_OnLine_SQL.Size = new System.Drawing.Size(57, 52); + this.pb_OnLine_SQL.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pb_OnLine_SQL.TabIndex = 1485; + this.pb_OnLine_SQL.TabStop = false; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label14.Location = new System.Drawing.Point(1407, 76); + this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(62, 18); + this.label14.TabIndex = 1484; + this.label14.Text = "服务器"; + // + // pb_OnLine_MQTT + // + this.pb_OnLine_MQTT.Image = global::MisDataFun.Properties.Resources.断开状态; + this.pb_OnLine_MQTT.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.pb_OnLine_MQTT.Location = new System.Drawing.Point(1478, 20); + this.pb_OnLine_MQTT.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.pb_OnLine_MQTT.Name = "pb_OnLine_MQTT"; + this.pb_OnLine_MQTT.Size = new System.Drawing.Size(57, 52); + this.pb_OnLine_MQTT.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pb_OnLine_MQTT.TabIndex = 1483; + this.pb_OnLine_MQTT.TabStop = false; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label15.Location = new System.Drawing.Point(1485, 76); + this.label15.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(44, 18); + this.label15.TabIndex = 1482; + this.label15.Text = "MQTT"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.txt_PLC_39); + this.groupBox2.Controls.Add(this.txt_PLC_11); + this.groupBox2.Controls.Add(this.txt_PLC_10); + this.groupBox2.Controls.Add(this.txt_PLC_9); + this.groupBox2.Controls.Add(this.txt_Interval); + this.groupBox2.Controls.Add(this.cb_F5); + this.groupBox2.Controls.Add(this.label27); + this.groupBox2.Controls.Add(this.label26); + this.groupBox2.Controls.Add(this.label25); + this.groupBox2.Controls.Add(this.label24); + this.groupBox2.Controls.Add(this.btn_PLC_59); + this.groupBox2.Controls.Add(this.btn_PLC_2); + this.groupBox2.Controls.Add(this.btn_PLC_43); + this.groupBox2.Controls.Add(this.btn_PLC_1002); + this.groupBox2.Controls.Add(this.btn_MES_5); + this.groupBox2.Controls.Add(this.btn_PLC_1001); + this.groupBox2.Controls.Add(this.btn_PLC_44); + this.groupBox2.Controls.Add(this.btn_PLC_1000); + this.groupBox2.Controls.Add(this.btn_MES_66); + this.groupBox2.Controls.Add(this.btn_MES_7); + this.groupBox2.Controls.Add(this.btn_PLC_19); + this.groupBox2.Controls.Add(this.btn_MES_20); + this.groupBox2.Location = new System.Drawing.Point(339, 99); + this.groupBox2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupBox2.Size = new System.Drawing.Size(597, 846); + this.groupBox2.TabIndex = 1481; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "监控和调试"; + // + // txt_PLC_39 + // + this.txt_PLC_39.Location = new System.Drawing.Point(234, 220); + this.txt_PLC_39.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txt_PLC_39.Name = "txt_PLC_39"; + this.txt_PLC_39.Size = new System.Drawing.Size(346, 28); + this.txt_PLC_39.TabIndex = 1484; + // + // txt_PLC_11 + // + this.txt_PLC_11.Location = new System.Drawing.Point(234, 180); + this.txt_PLC_11.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txt_PLC_11.Name = "txt_PLC_11"; + this.txt_PLC_11.Size = new System.Drawing.Size(346, 28); + this.txt_PLC_11.TabIndex = 1484; + // + // txt_PLC_10 + // + this.txt_PLC_10.Location = new System.Drawing.Point(234, 144); + this.txt_PLC_10.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txt_PLC_10.Name = "txt_PLC_10"; + this.txt_PLC_10.Size = new System.Drawing.Size(346, 28); + this.txt_PLC_10.TabIndex = 1484; + // + // txt_PLC_9 + // + this.txt_PLC_9.Location = new System.Drawing.Point(234, 110); + this.txt_PLC_9.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txt_PLC_9.Name = "txt_PLC_9"; + this.txt_PLC_9.Size = new System.Drawing.Size(346, 28); + this.txt_PLC_9.TabIndex = 1484; + // + // txt_Interval + // + this.txt_Interval.Location = new System.Drawing.Point(12, 39); + this.txt_Interval.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txt_Interval.Name = "txt_Interval"; + this.txt_Interval.Size = new System.Drawing.Size(98, 28); + this.txt_Interval.TabIndex = 1483; + this.txt_Interval.Text = "100"; + // + // cb_F5 + // + this.cb_F5.AutoSize = true; + this.cb_F5.Location = new System.Drawing.Point(122, 45); + this.cb_F5.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cb_F5.Name = "cb_F5"; + this.cb_F5.Size = new System.Drawing.Size(106, 22); + this.cb_F5.TabIndex = 1482; + this.cb_F5.Text = "刷新状态"; + this.cb_F5.UseVisualStyleBackColor = true; + this.cb_F5.CheckedChanged += new System.EventHandler(this.cb_F5_CheckedChanged); + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(9, 224); + this.label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(179, 18); + this.label27.TabIndex = 1481; + this.label27.Text = "工单号(39)PLC 600"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(9, 183); + this.label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(197, 18); + this.label26.TabIndex = 1481; + this.label26.Text = "产品型号(11)PLC 544"; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(9, 147); + this.label25.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(197, 18); + this.label25.TabIndex = 1481; + this.label25.Text = "总成编号(10)PLC 504"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(9, 112); + this.label24.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(188, 18); + this.label24.TabIndex = 1481; + this.label24.Text = "机型代码(9)PLC 502"; + // + // btn_PLC_59 + // + this.btn_PLC_59.Location = new System.Drawing.Point(297, 594); + this.btn_PLC_59.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_59.Name = "btn_PLC_59"; + this.btn_PLC_59.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_59.TabIndex = 1479; + this.btn_PLC_59.Text = "拧紧完成(59)PLC 501.1"; + this.btn_PLC_59.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_59.UseVisualStyleBackColor = true; + this.btn_PLC_59.Click += new System.EventHandler(this.button19_Click); + // + // btn_PLC_2 + // + this.btn_PLC_2.Location = new System.Drawing.Point(12, 482); + this.btn_PLC_2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_2.Name = "btn_PLC_2"; + this.btn_PLC_2.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_2.TabIndex = 1478; + this.btn_PLC_2.Text = "工件到位(2)PLC 500.1"; + this.btn_PLC_2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_2.UseVisualStyleBackColor = true; + this.btn_PLC_2.Click += new System.EventHandler(this.WorkStartPLC_Click); + // + // btn_PLC_43 + // + this.btn_PLC_43.Location = new System.Drawing.Point(12, 525); + this.btn_PLC_43.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_43.Name = "btn_PLC_43"; + this.btn_PLC_43.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_43.TabIndex = 1478; + this.btn_PLC_43.Text = "申请上线(43)PLC 500.3"; + this.btn_PLC_43.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_43.UseVisualStyleBackColor = true; + this.btn_PLC_43.Click += new System.EventHandler(this.PartLoadPLC_Click); + // + // btn_PLC_1002 + // + this.btn_PLC_1002.Location = new System.Drawing.Point(297, 558); + this.btn_PLC_1002.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_1002.Name = "btn_PLC_1002"; + this.btn_PLC_1002.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_1002.TabIndex = 1479; + this.btn_PLC_1002.Text = "机床故障(1002)PLC 587.3"; + this.btn_PLC_1002.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_1002.UseVisualStyleBackColor = true; + this.btn_PLC_1002.Click += new System.EventHandler(this.toolErrorPLC_Click); + // + // btn_MES_5 + // + this.btn_MES_5.Location = new System.Drawing.Point(12, 573); + this.btn_MES_5.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_MES_5.Name = "btn_MES_5"; + this.btn_MES_5.Size = new System.Drawing.Size(261, 34); + this.btn_MES_5.TabIndex = 1478; + this.btn_MES_5.Text = "传递机型(5)MES 0.1"; + this.btn_MES_5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_MES_5.UseVisualStyleBackColor = true; + this.btn_MES_5.Click += new System.EventHandler(this.EngineGetOverMES_Click); + // + // btn_PLC_1001 + // + this.btn_PLC_1001.Location = new System.Drawing.Point(297, 520); + this.btn_PLC_1001.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_1001.Name = "btn_PLC_1001"; + this.btn_PLC_1001.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_1001.TabIndex = 1479; + this.btn_PLC_1001.Text = "循环开始(1001)PLC 587.2"; + this.btn_PLC_1001.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_1001.UseVisualStyleBackColor = true; + this.btn_PLC_1001.Click += new System.EventHandler(this.toolStartPLC_Click); + // + // btn_PLC_44 + // + this.btn_PLC_44.Location = new System.Drawing.Point(12, 618); + this.btn_PLC_44.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_44.Name = "btn_PLC_44"; + this.btn_PLC_44.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_44.TabIndex = 1478; + this.btn_PLC_44.Text = "传递机型(44)PLC 500.4"; + this.btn_PLC_44.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_44.UseVisualStyleBackColor = true; + this.btn_PLC_44.Click += new System.EventHandler(this.EngineGetOverPLC_Click); + // + // btn_PLC_1000 + // + this.btn_PLC_1000.Location = new System.Drawing.Point(297, 484); + this.btn_PLC_1000.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_1000.Name = "btn_PLC_1000"; + this.btn_PLC_1000.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_1000.TabIndex = 1479; + this.btn_PLC_1000.Text = "机床上电(1000)PLC 587.1"; + this.btn_PLC_1000.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_1000.UseVisualStyleBackColor = true; + this.btn_PLC_1000.Click += new System.EventHandler(this.toolPoweredPLC_Click); + // + // btn_MES_66 + // + this.btn_MES_66.Location = new System.Drawing.Point(12, 660); + this.btn_MES_66.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_MES_66.Name = "btn_MES_66"; + this.btn_MES_66.Size = new System.Drawing.Size(261, 34); + this.btn_MES_66.TabIndex = 1478; + this.btn_MES_66.Text = "允许工作(66)MES 1.1"; + this.btn_MES_66.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_MES_66.UseVisualStyleBackColor = true; + this.btn_MES_66.Click += new System.EventHandler(this.allowWorkMES_Click); + // + // btn_MES_7 + // + this.btn_MES_7.Location = new System.Drawing.Point(12, 788); + this.btn_MES_7.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_MES_7.Name = "btn_MES_7"; + this.btn_MES_7.Size = new System.Drawing.Size(261, 34); + this.btn_MES_7.TabIndex = 1478; + this.btn_MES_7.Text = "工作完成(7)MES 0.3"; + this.btn_MES_7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_MES_7.UseVisualStyleBackColor = true; + this.btn_MES_7.Click += new System.EventHandler(this.workOverMES_Click); + // + // btn_PLC_19 + // + this.btn_PLC_19.Location = new System.Drawing.Point(12, 700); + this.btn_PLC_19.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_PLC_19.Name = "btn_PLC_19"; + this.btn_PLC_19.Size = new System.Drawing.Size(261, 34); + this.btn_PLC_19.TabIndex = 1478; + this.btn_PLC_19.Text = "允许保存(19)PLC 587.0"; + this.btn_PLC_19.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_PLC_19.UseVisualStyleBackColor = true; + this.btn_PLC_19.Click += new System.EventHandler(this.allowSavePLC_Click); + // + // btn_MES_20 + // + this.btn_MES_20.Location = new System.Drawing.Point(12, 744); + this.btn_MES_20.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btn_MES_20.Name = "btn_MES_20"; + this.btn_MES_20.Size = new System.Drawing.Size(261, 34); + this.btn_MES_20.TabIndex = 1478; + this.btn_MES_20.Text = "保存完成(20)MES 11.3"; + this.btn_MES_20.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btn_MES_20.UseVisualStyleBackColor = true; + this.btn_MES_20.Click += new System.EventHandler(this.saveOverMES_Click); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("宋体", 26F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label13.Location = new System.Drawing.Point(566, 8); + this.label13.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(502, 52); + this.label13.TabIndex = 1; + this.label13.Text = "GIS126数据采集程序"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(945, 816); + this.button2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(182, 58); + this.button2.TabIndex = 1477; + this.button2.Text = "初始化报警"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(900, 40); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(44, 18); + this.label4.TabIndex = 1; + this.label4.Text = "日志"; + // + // richTextBox1_mqtt + // + this.richTextBox1_mqtt.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.richTextBox1_mqtt.Location = new System.Drawing.Point(945, 112); + this.richTextBox1_mqtt.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.richTextBox1_mqtt.Name = "richTextBox1_mqtt"; + this.richTextBox1_mqtt.ReadOnly = true; + this.richTextBox1_mqtt.Size = new System.Drawing.Size(601, 358); + this.richTextBox1_mqtt.TabIndex = 0; + this.richTextBox1_mqtt.Text = ""; + // + // timer_Status + // + this.timer_Status.Enabled = true; + this.timer_Status.Interval = 1000; + this.timer_Status.Tick += new System.EventHandler(this.timer_Status_Tick); + // + // statusStrip1 + // + this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel_RunningStatu, + this.toolStripStatusLabel_RunningStatus, + this.toolStripStatusLabel2, + this.toolStripStatusLabel_StartTime, + this.toolStripStatusLabel3, + this.toolStripStatusLabel_RunTime, + this.toolStripStatusLabel1, + this.toolStripStatusLabel_WorkStationNum, + this.toolStripStatusLabel4, + this.toolStripStatusLabel_Version}); + this.statusStrip1.Location = new System.Drawing.Point(0, 1019); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Padding = new System.Windows.Forms.Padding(2, 0, 21, 0); + this.statusStrip1.Size = new System.Drawing.Size(1580, 35); + this.statusStrip1.TabIndex = 1479; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabel_RunningStatu + // + this.toolStripStatusLabel_RunningStatu.Name = "toolStripStatusLabel_RunningStatu"; + this.toolStripStatusLabel_RunningStatu.Size = new System.Drawing.Size(100, 28); + this.toolStripStatusLabel_RunningStatu.Text = "运行状态:"; + // + // toolStripStatusLabel_RunningStatus + // + this.toolStripStatusLabel_RunningStatus.ActiveLinkColor = System.Drawing.Color.Red; + this.toolStripStatusLabel_RunningStatus.AutoSize = false; + this.toolStripStatusLabel_RunningStatus.BackColor = System.Drawing.Color.Yellow; + this.toolStripStatusLabel_RunningStatus.Name = "toolStripStatusLabel_RunningStatus"; + this.toolStripStatusLabel_RunningStatus.Size = new System.Drawing.Size(62, 28); + this.toolStripStatusLabel_RunningStatus.Text = "变量模拟"; + // + // toolStripStatusLabel2 + // + this.toolStripStatusLabel2.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; + this.toolStripStatusLabel2.Name = "toolStripStatusLabel2"; + this.toolStripStatusLabel2.Size = new System.Drawing.Size(104, 28); + this.toolStripStatusLabel2.Text = "启动时间:"; + // + // toolStripStatusLabel_StartTime + // + this.toolStripStatusLabel_StartTime.AutoSize = false; + this.toolStripStatusLabel_StartTime.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; + this.toolStripStatusLabel_StartTime.Name = "toolStripStatusLabel_StartTime"; + this.toolStripStatusLabel_StartTime.Size = new System.Drawing.Size(130, 28); + this.toolStripStatusLabel_StartTime.Text = "2018/08/08 08:08:08"; + // + // toolStripStatusLabel3 + // + this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; + this.toolStripStatusLabel3.Size = new System.Drawing.Size(100, 28); + this.toolStripStatusLabel3.Text = "运行时长:"; + // + // toolStripStatusLabel_RunTime + // + this.toolStripStatusLabel_RunTime.AutoSize = false; + this.toolStripStatusLabel_RunTime.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; + this.toolStripStatusLabel_RunTime.Name = "toolStripStatusLabel_RunTime"; + this.toolStripStatusLabel_RunTime.Size = new System.Drawing.Size(145, 28); + this.toolStripStatusLabel_RunTime.Text = "0天0小时0分0秒"; + this.toolStripStatusLabel_RunTime.Click += new System.EventHandler(this.toolStripStatusLabel_RunTime_Click); + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Size = new System.Drawing.Size(100, 28); + this.toolStripStatusLabel1.Text = "工位数量:"; + // + // toolStripStatusLabel_WorkStationNum + // + this.toolStripStatusLabel_WorkStationNum.AutoSize = false; + this.toolStripStatusLabel_WorkStationNum.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; + this.toolStripStatusLabel_WorkStationNum.Name = "toolStripStatusLabel_WorkStationNum"; + this.toolStripStatusLabel_WorkStationNum.Size = new System.Drawing.Size(35, 28); + this.toolStripStatusLabel_WorkStationNum.Text = "100"; + // + // toolStripStatusLabel4 + // + this.toolStripStatusLabel4.Name = "toolStripStatusLabel4"; + this.toolStripStatusLabel4.Size = new System.Drawing.Size(64, 28); + this.toolStripStatusLabel4.Text = "版本:"; + // + // toolStripStatusLabel_Version + // + this.toolStripStatusLabel_Version.Name = "toolStripStatusLabel_Version"; + this.toolStripStatusLabel_Version.Size = new System.Drawing.Size(62, 28); + this.toolStripStatusLabel_Version.Text = "8.6.12"; + // + // MesServerMisDataFun + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1580, 1054); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.panel7); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.menuStrip1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.MaximumSize = new System.Drawing.Size(2857, 1559); + this.MinimumSize = new System.Drawing.Size(1458, 1013); + this.Name = "MesServerMisDataFun"; + this.Text = "MesServer Function V2025-07-20--1150"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MisDataFun_FormClosing); + this.Load += new System.EventHandler(this.SaveData_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.tableLayoutPanel1.ResumeLayout(false); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel8.ResumeLayout(false); + this.panel8.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.panel1.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.tableLayoutPanel3.PerformLayout(); + this.panel3.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView_CheckOpName)).EndInit(); + this.panel4.ResumeLayout(false); + this.tableLayoutPanel4.ResumeLayout(false); + this.tableLayoutPanel4.PerformLayout(); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + this.panel2.ResumeLayout(false); + this.tableLayoutPanel5.ResumeLayout(false); + this.panel6.ResumeLayout(false); + this.panel6.PerformLayout(); + this.tabControl1.ResumeLayout(false); + this.panel7.ResumeLayout(false); + this.panel7.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgv_OpName)).EndInit(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pb_OnLine_Print)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pb_OnLine_SQL)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pb_OnLine_MQTT)).EndInit(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox_PLC_TO_MES; + private System.Windows.Forms.Button button_WEB_TO_MES_Clear; + private System.Windows.Forms.CheckBox checkBox_WEB_TO_MES; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox textBox_MES_TO_WEB; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox textBox_WEB_TO_MES; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.CheckBox checkBox_PLC_TO_MES; + private System.Windows.Forms.Button button_PLC_TO_MES_Clear; + private System.Windows.Forms.Button button_PLC_TO_MES_Big; + private System.Windows.Forms.Button button_PLC_TO_MES_Small; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.DataGridView dataGridView_CheckOpName; + private System.Windows.Forms.DataGridViewCheckBoxColumn 选择; + private System.Windows.Forms.DataGridViewTextBoxColumn 工位号; + private System.Windows.Forms.CheckBox checkBox__MES_TO_WEB; + private System.Windows.Forms.Button button_MES_TO_WEB_Clear; + private System.Windows.Forms.Button button_MES_TO_WEB_Small; + private System.Windows.Forms.Button button_MES_TO_WEB_Big; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; + private System.Windows.Forms.Button button_WEB_TO_MES_Big; + private System.Windows.Forms.Button button_WEB_TO_MES_Small; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Button button_WebToMES; + private System.Windows.Forms.Button button_ToWEB; + private System.Windows.Forms.TextBox textBox_MqttText; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox_OpNameList; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem_PlcDebug; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.TabPage tabPage6; + private System.Windows.Forms.Button button_SaveData; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.RichTextBox richTextBox1_mqtt; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Timer timer_Status; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_RunningStatu; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_RunningStatus; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_StartTime; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_RunTime; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_WorkStationNum; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_Version; + private System.Windows.Forms.ToolStripMenuItem 帮助ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem 版本信息ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem 关于迈思ToolStripMenuItem; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button btn_PLC_2; + private System.Windows.Forms.Button btn_MES_5; + private System.Windows.Forms.Button btn_MES_7; + private System.Windows.Forms.Button btn_MES_20; + private System.Windows.Forms.Button btn_PLC_19; + private System.Windows.Forms.Button btn_MES_66; + private System.Windows.Forms.Button btn_PLC_44; + private System.Windows.Forms.Button btn_PLC_43; + private System.Windows.Forms.Button btn_PLC_1001; + private System.Windows.Forms.Button btn_PLC_1000; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button12; + private System.Windows.Forms.Button button13; + private System.Windows.Forms.Button button14; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.Button button15; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.ColumnHeader columnHeader9; + private System.Windows.Forms.ColumnHeader columnHeader10; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Button button16; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.Button btn_PLC_1002; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button17; + private System.Windows.Forms.TextBox textBox3_palletCode; + private System.Windows.Forms.TextBox textBox2_EngineTypeID; + private System.Windows.Forms.TextBox textBox1_EngineID; + private System.Windows.Forms.Button button18; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button btn_PLC_59; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.PictureBox pb_OnLine_SQL; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.PictureBox pb_OnLine_MQTT; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.TextBox txt_Interval; + private System.Windows.Forms.CheckBox cb_F5; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.TextBox txt_PLC_9; + private System.Windows.Forms.TextBox txt_PLC_11; + private System.Windows.Forms.TextBox txt_PLC_10; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.TextBox txt_PLC_39; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Panel panel_Signal_Conf; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.PictureBox pb_OnLine_Print; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.Button button20; + private System.Windows.Forms.DataGridView dgv_OpName; + private System.Windows.Forms.Button MesEngineDataWritePlc; + private System.Windows.Forms.DataGridViewTextBoxColumn OpCode; + private System.Windows.Forms.DataGridViewTextBoxColumn OpName; + private System.Windows.Forms.DataGridViewTextBoxColumn MesDll; + private System.Windows.Forms.DataGridViewTextBoxColumn PLC; + private System.Windows.Forms.DataGridViewTextBoxColumn PLC代码; + private System.Windows.Forms.ToolStripMenuItem webApi调试ToolStripMenuItem; + } +} + diff --git a/MisDataFun/MisDataFun/MisDataFun.cs b/MisDataFun/MisDataFun/MisDataFun.cs new file mode 100644 index 0000000..4010851 --- /dev/null +++ b/MisDataFun/MisDataFun/MisDataFun.cs @@ -0,0 +1,1036 @@ +using DataLinkMesWork; +using MesDataFunction; +using MesServerWork; +using MesWork.PLC; +using MQTTnet; +using MQTTnet.Client.Connecting; +using MQTTnet.Client.Disconnecting; +using MQTTnet.Client.Receiving; +using MQTTnet.Extensions.ManagedClient; +using Newtonsoft.Json; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data.SqlClient; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; +using SystemFramework; +using System.IO; +using System.Net; +using System.Text; +using MesServerFunctions; +using System.Threading.Tasks; +using MesWork; +using System.Drawing; +using MES_SIGNAL_CONF; +using SlMesDbIterface; +using System.Net.NetworkInformation; +using ExternalDataSync; +using OpcBasic; +using System.Collections.Concurrent; +using MisDataFunDll; +using System.Linq; + +namespace MisDataSaveDate +{ + /// + /// + /// + public partial class MesServerMisDataFun : Form + { + public static string WebSvrUrlPort = ConfigurationManager.AppSettings["Url_WebApi"]; + public static int IsWriteMonitorLog = Convert.ToInt32(ConfigurationManager.AppSettings["IsWriteMonitorLog"]); + public static string OnlineCheckDataUrl = ConfigurationManager.AppSettings["OnlineCheckDataUrl"].ToString(); + public static string ConnectionString_MES = ConfigurationManager.AppSettings["ConnectionString_MES"]; + public static int IsDemoMesServer = Convert.ToInt32(ConfigurationManager.AppSettings["IsDemoMesServer"]); + public static string IsRecordTagStatus = ConfigurationManager.AppSettings["IsRecordTagStatus"]; + public static string BasicDataTableFile = ConfigurationManager.AppSettings["BasicDataTableFile"]; + public static string PrintURL = ConfigurationManager.AppSettings["PrintURL"]; + public static int webApiPort = Convert.ToInt32(ConfigurationManager.AppSettings["WebSvrPort"]); + public static string webapi_MesIP = ConfigurationManager.AppSettings["Webapi_MesIP"]; + + static Hashtable hashtableTopicList = new Hashtable(); + + static bool OnLineMqtt = false; + static bool OnLine_SQL = false; + static bool OnLine_Mes = false; + static bool OnLine_Mes_Cache = false; + static bool OnLine_Print = false; + static bool IsLoopReadShow = false; + + /// + /// 允许使用附加功能的变量,只有在系统开始加载Tag时,才允许读取PLC数据 + /// + public static bool AllowLoad; + /// + /// + /// + MesWork.OpcForm opcForm = null; + /// + /// + /// + public static string WorkStationNum_Now; + /// + /// + /// + DateTime StartTime; + + public static Color color_Faw = Color.FromArgb(0, 44, 101);//蓝色,大众:0,44,101 + + public static Color color_Good = Color.FromArgb(132, 185, 235);//浅蓝,自定义 + public static Color color_Wait = Color.FromArgb(240, 230, 140);//淡黄,显示等待状态 + public static Color color_Bad = SystemColors.ActiveBorder;//灰色,显示操作过程 + public static Color color_Control = SystemColors.Control;//控件默认颜色 + public static Color color_Grey = Color.FromArgb(192, 192, 192);//灰色,Table底色 + + public static Color color_Green = Color.FromArgb(22, 161, 136);//绿色 + public static Color color_Yellow = Color.FromArgb(246, 227, 74);//黄色 + public static Color color_Red = Color.FromArgb(255, 0, 0);//红色 + + [STAThread] + static void Main() + { + new System.Threading.Mutex(true, "MES_PZ126_DLQ", out bool bCanRun); + if (!bCanRun) + { + MessageBox.Show("MES中控程序 已经在运行!不可重复启动!"); + return; + } + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + //new MES_CONF().ShowDialog(); + + Application.Run(new MesServerMisDataFun()); + } + + + + public MesServerMisDataFun() + { + InitializeComponent(); + Control.CheckForIllegalCrossThreadCalls = false; + Never_Know.Hello_You_All_Never_Know = Hello_You_All_Never_Know; + + PP.ConnectionString_MES = ConnectionString_MES; + PP.PrintURL = PrintURL; + PP.IsDemoMesServer = IsDemoMesServer; + ApplicationConfig.ConnectionString_MES = ConnectionString_MES; + + CommunicationCheckOnLine(); + MisData01(); + Init_dataGridView_CheckOpName(); + MIS_BASE.InitHashtable_MesServerCode(); + InitMesSerVerCode(); + } + public void MisData01() + { + var dt_Signal = MisDataFunDll.MisDataFun.dt_Signal(); + var dt_Device = MisDataFunDll.MisDataFun.dt_Device(); + var dt_TagTypeDataType = MisDataFunDll.MisDataFun.dt_TagTypeDataType(); + + var sql = + $" SELECT [工位号],[工位名称],[PLC],[PLC代码],[MesDll]" + + $" FROM [MES_计划BOM_工位与名称] WHERE [是否启用MES] = 1" + + $" ORDER BY [工位号]"; + SqlOperation.ExecuteSql(sql, out DataTable dt_SqlOp, out string errorSqlOp); + dgv_OpName.DataSource = dt_SqlOp; + + var mp = new MesWorkPlc(); + + StartTime = Convert.ToDateTime(toolStripStatusLabel_StartTime.Text = DateTime.Now.ToString()); + Runtime_Thread(); + + if (mp.LoadOPCData(dt_Signal, dt_Device, IsDemoMesServer, IsWriteMonitorLog, true, false, out string error)) + { + MesDataFunction.LoadTagTypeCodeID.Load(dt_TagTypeDataType); + + //查询出“全部原始基本数据列表” + var drs = MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 变量类型代码=101 or 变量类型代码 = 102 or 变量类型代码 = 105"); + if (drs.Length > 1) + { + MIS_BASE.BasicDataTagValue = MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 变量类型代码=101 or 变量类型代码 = 102 or 变量类型代码 = 105").CopyToDataTable(); + if (MIS_BASE.BasicDataTagValue.Columns.Contains("上限值")) + { + MIS_BASE.BasicDataTagValue.Columns["上限值"].ColumnName = "值上限"; + } + if (MIS_BASE.BasicDataTagValue.Columns.Contains("下限值")) + { + MIS_BASE.BasicDataTagValue.Columns["下限值"].ColumnName = "值下限"; + } + } + + // BasicDataTagValue = MesWork.PlcLinkForm.dt_BasicData.Select($"是否启用 = 1 and 监控属性代码 = '{DataLinkMesWork.ApplicationConfig.MES_Code.ToString()}'").CopyToDataTable(); + //查询出“MES_基本数据_测量范围” + MesServerWork.MIS_BASE.BasicDataTagValueUpDown = MesWork.PlcLinkForm.dt_BasicData; + if (MesServerWork.MIS_BASE.BasicDataTagValueUpDown.Columns.Contains("上限值")) + { + MesServerWork.MIS_BASE.BasicDataTagValueUpDown.Columns["上限值"].ColumnName = "值上限"; + } + if (MesServerWork.MIS_BASE.BasicDataTagValueUpDown.Columns.Contains("下限值")) + { + MesServerWork.MIS_BASE.BasicDataTagValueUpDown.Columns["下限值"].ColumnName = "值下限"; + } + // 模拟时,写入质量数据 + if (IsDemoMesServer == 1) + { + InitBasicDataTagValue(); + } + + // 变量代码与其他字段的对应关系 + MesServerWork.MIS_BASE.InitHashtableTagID(); + toolStripStatusLabel_WorkStationNum.Text = MesWork.PlcLinkForm.opNameList.Count.ToString(); + + AllowLoad = true; + if (IsDemoMesServer == 1) + { + toolStripStatusLabel_RunningStatus.Text = "变量模拟"; + toolStripStatusLabel_RunningStatus.BackColor = System.Drawing.Color.Yellow; + } + else + { + toolStripStatusLabel_RunningStatus.Text = "PLC"; + toolStripStatusLabel_RunningStatus.BackColor = System.Drawing.Color.Green; + } + MesWorkPlc.D_OPCTagData_TagDataOnChangeMIS-= OPCTagData_TagDataOnChange; + MesWorkPlc.D_OPCTagData_TagDataOnChangeMIS+= OPCTagData_TagDataOnChange; + } + } + + + + public static async Task NetState_MES() + { + Ping ping = new Ping(); + try + { + PingReply reply = await ping.SendPingAsync(webapi_MesIP); + + if (reply.Status == IPStatus.Success) + { + OnLine_Mes = true; + } + else + { + OnLine_Mes = false; + } + } + catch + { + OnLine_Mes = false; + } + } + + /// + /// 获得Function调用信息 + /// + private void InitMesSerVerCode() + { + MisDataFunDll.MisDataFun.GetMesServerCodeAndMesDll(out MisDataFunDll.MisDataFun.hashtable_MesServerCode, out MisDataFunDll.MisDataFun.hashtable_MesDll); + MisDataFunDll.MisDataFun.GetBaseData_tagTable_TagName(out MisDataFunDll.MisDataFun.hashtable_TagName, out MisDataFunDll.MisDataFun.hashtable_TagTypeTagName); + + FuntionMesRead.GetAlarmInit(); + } + + public void SaveData_Load(object sender, EventArgs e) + { + MyLog4Net.MyLogHelper.LogCommit += MyLogHelper_LogCommit; + MqttLink(); + Thread.Sleep(200); + MesWorkPlc.StartServer(); //开启监控服务 + new TaskFactory().StartNew(delegate () + { + DataTable dt; + MisDataFunDll.MisDataFun.Alarm_Moby_Search(out dt); + DataTable dt1 = MisDataFunDll.MisDataFun.GetCheckOpName(); + for (int i = 0; i < dt1.Rows.Count; i++) + { + string opName = dt1.Rows[i]["工位号"].ToString(); + FuntionMesRead.Alarm_Insert_Init(opName); + } + }); + } + /// + /// 模拟时,写入质量数据 + /// + private void InitBasicDataTagValue() + { + string tagID; + double tagValue; + //写工位总合格标志 变量类型代码=21 + for (int i = 0; i < MesWork.PlcLinkForm.dt_BasicData.Rows.Count; i++) + { + if (MesWork.PlcLinkForm.dt_BasicData.Rows[i]["变量类型代码"].ToString() == "21") + { + tagID = MesWork.PlcLinkForm.dt_BasicData.Rows[i]["TagID"].ToString(); + MesServerWork.MIS_BASE.Write_TagID(tagID, 1); + } + } + if (MesServerWork.MIS_BASE.BasicDataTagValue != null) + { + for (int i = 0; i < MesServerWork.MIS_BASE.BasicDataTagValue.Rows.Count; i++) + { + try + { + switch (Convert.ToInt32(MesServerWork.MIS_BASE.BasicDataTagValue.Rows[i]["变量排序"])) + { + + case 0: + tagID = MesServerWork.MIS_BASE.BasicDataTagValue.Rows[i]["TagID"].ToString(); + MesServerWork.MIS_BASE.Write_TagID(tagID, 1); + break; + case 1: + case 2: + case 3: + tagID = MesServerWork.MIS_BASE.BasicDataTagValue.Rows[i]["TagID"].ToString(); + tagValue = Convert.ToDouble(MesServerWork.MIS_BASE.BasicDataTagValue.Rows[i]["列位置"]) * 100 + + Convert.ToDouble(MesServerWork.MIS_BASE.BasicDataTagValue.Rows[i]["变量排序"]) / 100; + MesServerWork.MIS_BASE.Write_TagID(tagID, tagValue); + break; + + } + } + catch { } + + } + } + + } + + + private void Init_dataGridView_CheckOpName() + { + try + { + var dt1 = MisDataFunDll.MisDataFun.GetCheckOpName(); + comboBox_OpNameList.DataSource = dt1; + comboBox_OpNameList.ValueMember = "工位号"; + comboBox_OpNameList.DisplayMember = "工位号"; + } + catch (Exception ex) { } + } + + + #region mqtt相关 + private async Task MqttLink() + { + List TopicFilterList = new List(); + string url; + //string topicMqttTargetTopicPLC; + //string topicMqttTargetTopicTagTypeCodeID; + string TopicList; + string[] TopicListFunItems; + string[] TopicListItems; + url = ConfigurationManager.AppSettings["MqttUrl"]; + TopicList = ConfigurationManager.AppSettings["TopicList"]; + TopicListItems = TopicList.Split('|'); + for (int i = 0; i < TopicListItems.Length; i++) + { + TopicListFunItems = TopicListItems[i].Split(','); + hashtableTopicList.Add(TopicListFunItems[0], TopicListFunItems[1]); + } + + await Mqtt.StartAsync(); + + foreach (var topic in TopicListItems) + { + TopicListFunItems = topic.Split(','); + + Mqtt.mqttClient.SubscribeAsync(new MqttTopicFilter { Topic = TopicListFunItems[0] }); + } + Mqtt.mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnSubscriberConnected); + Mqtt.mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnSubscriberDisconnected); + Mqtt.mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); + + } + private string Hello_You_All_Never_Know(string[] args) + { + return Guid.NewGuid().ToString() + Guid.NewGuid().ToString(); + //return string.Empty; + } + /// + /// + /// + /// + private void OnSubscriberConnected(MqttClientConnectedEventArgs x) + { + MyLog4Net.MyLogHelper.Info("Mqtt:", "Mqtt连接成功!"); + OnLineMqtt = true; + } + /// + /// + /// + /// + private void OnSubscriberDisconnected(MqttClientDisconnectedEventArgs x) + { + try + { + MyLog4Net.MyLogHelper.Error("Mqtt:", "Mqtt断开连接!Reason:" + x.Reason); + OnLineMqtt = false; + } + catch (Exception err) + { + } + } + /// + /// + /// + /// + public void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs x) + { + ThreadPool.QueueUserWorkItem(MIS_Funtion_WEB, x); + } + #endregion + + /// + /// mqtt 接收web和barcode数据 + /// + /// + public void MIS_Funtion_WEB(object e) + { + try + { + MqttApplicationMessageReceivedEventArgs x = (MqttApplicationMessageReceivedEventArgs)e; + var rec = x.ApplicationMessage.ConvertPayloadToString(); + MisDataFunDll.MisDataFun.TransferInfToMES(rec); + } + catch (Exception ex) + { + //MIS_Funtion(topicFunItem, "Exception:" + ex.Message); + } + } + /// + /// 接收内部PLC数据变化 + /// + /// + public void MIS_Funtion_PLC(object e) + { + var rec = e.ToString(); + try + { + MisDataFunDll.MisDataFun.TransferInfToMES(rec); + } + catch (Exception ex) + { + //MIS_Funtion(topicFunItem, "Exception:" + ex.Message);A + } + } + + + static public void TagTypeCodeID_Insert(string opName, string TagTypeCodeID, string TagID, string TagValue, DateTime arrivedTime, DateTime leavedTime, int TimeDiff) + { + string procedureName; + procedureName = "测量数据设备状态日志_增加数据"; + SqlParameter[] thisParms = new SqlParameter[7]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@信号类型代码", TagTypeCodeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@TagID", TagID); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue); + thisParms[4] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime); + thisParms[5] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime); + thisParms[6] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff); + DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); + } + + private void MisDataFun_FormClosing(object sender, FormClosingEventArgs e) + { + if (MessageBox.Show("您确认要退出MES程序吗?该操作会停止MES进行数据处理!", "", MessageBoxButtons.OKCancel) == DialogResult.OK) + { + Process.GetCurrentProcess().Kill(); + } + else + { + e.Cancel = true; + } + } + + private void timer_Status_Tick(object sender, EventArgs e) + { + timer_Status.Enabled = false; + Show_OnLineState(); + + if (!AllowLoad) return; + Runtime_Thread(); + + timer_Status.Enabled = true; + } + + private void Show_OnLineState() + { + OnLineState_C(pb_OnLine_Print, OnLine_Print); + OnLineState_C(pb_OnLine_SQL, OnLine_SQL); + OnLineState_C(pb_OnLine_MQTT, OnLineMqtt); + } + private void CommunicationCheckOnLine() + { + + new Thread(new ThreadStart(delegate () + { + while (true) + { + try + { + OnLine_SQL = DataLinkMesWork.SQLCommon.ExecuteDataTable("select getdate()", ConnectionString_MES, out DataTable dt, out string err); + } + catch (Exception) { } + Thread.Sleep(5000); + } + })) + { IsBackground = true }.Start(); + + // 通过IP判断 目标地址是否联通 + //new Thread(new ThreadStart(delegate () + //{ + // var ip = PrintURL.Split(':')[0]; + // while (true) + // { + // try + // { + // OnLine_Print = new System.Net.NetworkInformation.Ping().Send(ip).Status == System.Net.NetworkInformation.IPStatus.Success; + // } + // catch (Exception) { } + // Thread.Sleep(5000); + // } + //})) + //{ IsBackground = true }.Start(); + + } + private void OnLineState_C(PictureBox pb, bool onLine) + { + pb.Image = onLine ? global::MisDataFun.Properties.Resources.连接状态 + : global::MisDataFun.Properties.Resources.断开状态; + } + private void MyLogHelper_LogCommit(object sender, MyLog4Net.MyLogEventArgs e) + { + var module = e.Module; + var message = e.Message; + + var log = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " " + module + " " + message + "\r\n"; + if (this.InvokeRequired) + { + this.Invoke(new Action(() => + { + this.richTextBox1_mqtt.AppendText(log); + this.richTextBox1_mqtt.Focus(); + })); + } + else + { + this.richTextBox1_mqtt.AppendText(log); + this.richTextBox1_mqtt.Focus(); + } + + } + + public void OPCTagData_TagDataOnChange(DeviceDriver_BasicData. CustomeEvetnArgs e) + { + + // 处理MES业务 Function + ThreadPool.QueueUserWorkItem(TagData_MisData_TagDataOnChangeCustomeEvetnArgs, e); + // 设备状态日志 + ThreadPool.QueueUserWorkItem(TagTypeCodeID_TagDataOnChange, e); + //发送通讯服务器 MES web界面显示用 加工位号 + ThreadPool.QueueUserWorkItem(TransferInfToWebServer, e); + } + /// + /// 发送信号变化到function + /// + /// + private void TagData_MisData_TagDataOnChangeCustomeEvetnArgs(object msgEvent) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs e = (DeviceDriver_BasicData.CustomeEvetnArgs)msgEvent; + string OpName = e.OpName.ToString();//工位号 + string MesCode = e.TagType.ToString();//变量类型代码 + object tagValue = e.TagValue;//变量(0或者1) + string TagTypeCodeID = e.TagTypeCodeID.ToString();//变量类型代码 + string TagID = e.TagID.ToString(); + string cmd = ""; + cmd = MIS_BASE.hashtable_TagTypeTagName[MesCode]; + string mesServerdllName; + + mesServerdllName = GetMesServeDllByOpName(OpName); + string fun = "fun_" + cmd; + int mesServerCode; + mesServerCode = GetMesServerCodeByOpName(OpName); + string rvMsg = Newtonsoft.Json.JsonConvert.SerializeObject(e); + + string msg; + if (cmd == null) + { + cmd = MesCode; + msg = $"PLC|{cmd}|{OpName}|{rvMsg}"; + } + else + { + msg = $"PLC|{cmd}|{OpName}|{rvMsg}"; + } + try + { + if (TagTypeCodeID == "14") + { + MIS_BASE.Write_TagValueByTagTypeID(15, OpName, tagValue); + return; + } + if (TagTypeCodeID == "103") + { + DataRow errDt = FuntionMesRead.Send_AlarmMsg(TagID, Convert.ToInt32(tagValue).ToString()); + } + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "TagData_Lable_TagDataOnChange"); + return; + } + MIS_Funtion_PLC(msg); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "TagData_Lable_TagDataOnChange"); + } + } + + /// + /// 根据工位号获取MesServerCode + /// + /// + /// + private static int GetMesServerCodeByOpName(string OpName) + { + try + { + if (MesServerWork.MIS_BASE.hashtable_MesServerCode.ContainsKey(OpName)) + { + return Convert.ToInt32(MesServerWork.MIS_BASE.hashtable_MesServerCode[OpName]); + } + return 0; + } + catch + { + return 0; + } + } + /// + /// 根据工位号获取MesServerDll + /// + /// + /// + private static string GetMesServeDllByOpName(string OpName) + { + try + { + if (MesServerWork.MIS_BASE.hashtable_MesDll.ContainsKey(OpName)) + { + return MesServerWork.MIS_BASE.hashtable_MesDll[OpName].ToString(); + } + return ""; + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "GetMesServeDllByOpName"); + return ""; + } + } + /// + /// 数据库记录信号变化 + /// + /// + private void TagTypeCodeID_TagDataOnChange(object msgEvent) + { + if (IsRecordTagStatus != "1") return; + + try + { + DeviceDriver_BasicData.CustomeEvetnArgs e = (DeviceDriver_BasicData.CustomeEvetnArgs)msgEvent; + + string tagValue; + if (e.TagValue == null) return; + + switch (e.TagValue.ToString().ToLower()) + { + case "1": + case "true": + tagValue = "1"; + break; + default: + tagValue = "0"; + break; + } + + string TagTypeCodeID; + string opName; + string TagID; + string TagValue; + DateTime arrivedTime; + DateTime leavedTime; + int TimeDiff; + opName = e.OpName.ToString(); + TagValue = tagValue; + TagTypeCodeID = e.TagTypeCodeID.ToString(); + TagID = e.TagID.ToString(); + leavedTime = Convert.ToDateTime(e.TimeStamp); + arrivedTime = Convert.ToDateTime(e.TimeStampBefore); + TimeDiff = Convert.ToInt32(e.TagKeepTime); + + if (TagTypeCodeID != "14" && TagTypeCodeID != "15") + { + TagTypeCodeID_Insert(opName, TagTypeCodeID, TagID, TagValue, arrivedTime, leavedTime, TimeDiff); + } + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "TagTypeCodeID_TagDataOnChange"); + } + + } + /// + /// 向MES通讯服务器发送消息 + /// + /// + private void TransferInfToWebServer(object msg1) + { + int tagType; + string opName; + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)msg1; + //e值不能为空 + if (msgEvent.TagValue == null) return; + tagType = Convert.ToInt32(msgEvent.TagType); + opName = msgEvent.OpName.ToString(); + + if (!MesServerWork.MIS_BASE.m_WorkStart_OpName.ContainsKey(opName)) return; //当前系统是否存在该工位 + + string cmd; + string tagValue; + string msgSvr; + try + { + switch (Convert.ToInt32(msgEvent.TagValueType)) + { + case 11: + tagValue = (Convert.ToInt32(msgEvent.TagValue)).ToString(); + break; + default: + tagValue = msgEvent.TagValue.ToString(); + break; + } + cmd = MIS_BASE.hashtable_TagTypeTagName[tagType.ToString()]; + if (Convert.ToInt32(MIS_BASE.hashtable_WebTagTypeChange[cmd]) == 0 && MIS_BASE.hashtable_WebTagTypeChange[cmd] != null) return; + + if (cmd != "" && cmd != null) + { + msgSvr = "MES|" + cmd + "|" + opName + "|" + tagValue; + } + else + { + return; + } + //MES web界面显示用 + MIS_SendMessage.asyncSendMessageQos0(msgSvr); + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, "TransferInfToWebServer"); + } + } + + private void button_ReadData_Click(object sender, EventArgs e) + { + + } + + + private void ToolStripMenuItem_PlcDebug_Click(object sender, EventArgs e) + { + if (opcForm != null) + { + opcForm.Close(); + opcForm.Dispose(); + opcForm = null; + } + + opcForm = new MesWork.OpcForm(IsDemoMesServer); + opcForm.Show(); + } + /// + /// 关于迈思按钮 + /// + /// + /// + private void 关于迈思ToolStripMenuItem_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start("http://www.meswork.com"); + } + /// + /// 版本信息按钮 + /// + /// + /// + private void 版本信息ToolStripMenuItem_Click(object sender, EventArgs e) + { + VersionsInformation VersionForm = new VersionsInformation(); + VersionForm.ShowDialog(); + } + + private void button2_Click(object sender, EventArgs e) + { + FuntionMesRead.GetAlarmInit(); + MyLog4Net.MyLogHelper.Info($"报警更新:", "报警信息更新完成!"); + } + + private void WritePLCBoolData_Click(int TagTypeCodeId) + { + string OpName = WorkStationNum_Now; + string tagValue = MIS_BASE.Read_TagValueByTagTypeID(TagTypeCodeId, OpName).ToString(); + bool tagValueBool = false; + if (tagValue.ToLower() == "true" || tagValue == "1") + { + tagValueBool = false; + } + else + { + tagValueBool = true; + } + + MIS_BASE.Write_TagValueByTagTypeID(TagTypeCodeId, OpName, tagValueBool); + } + private void WorkStartPLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(2); + } + + private void PartLoadPLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(43); + } + + private void EngineGetOverMES_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(5); + } + + private void EngineGetOverPLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(44); + } + + private void allowWorkMES_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(66); + } + + private void allowSavePLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(19); + } + + private void saveOverMES_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(20); + } + + private void workOverMES_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(7); + } + + private void toolPoweredPLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(1000); + } + + private void toolStartPLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(1001); + } + + private void toolErrorPLC_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(1002); + } + + private void button1_Click(object sender, EventArgs e) + { + MIS_BASE.Write_TagValueByTagTypeID(200, WorkStationNum_Now, "001MBE0700000QF3D0000001"); + MIS_BASE.Write_TagValueByTagTypeID(201, WorkStationNum_Now, "001MBE0700000QF3D0000002"); + MIS_BASE.Write_TagValueByTagTypeID(202, WorkStationNum_Now, "001MBE0700000QF3D0000003"); + MIS_BASE.Write_TagValueByTagTypeID(203, WorkStationNum_Now, "001MBE0700000QF3D0000004"); + MIS_BASE.Write_TagValueByTagTypeID(204, WorkStationNum_Now, "001MBE0700000QF3D0000005"); + MIS_BASE.Write_TagValueByTagTypeID(205, WorkStationNum_Now, "001MBE0700000QF3D0000006"); + MIS_BASE.Write_TagValueByTagTypeID(206, WorkStationNum_Now, "001MBE0700000QF3D0000007"); + MIS_BASE.Write_TagValueByTagTypeID(207, WorkStationNum_Now, "001MBE0700000QF3D0000008"); + } + + private void button17_Click(object sender, EventArgs e) + { + MIS_BASE.Read_EngineID_MES(WorkStationNum_Now, out string EngineID_MES); + MIS_BASE.Read_EngineTypeID_MES(WorkStationNum_Now, out int EngineTypeID_MES); + MIS_BASE.Write_TagValueByTagTypeID(10, WorkStationNum_Now, EngineID_MES); + MIS_BASE.Write_TagValueByTagTypeID(9, WorkStationNum_Now, EngineTypeID_MES); + MIS_BASE.Write_TagValueByTagTypeID(80, WorkStationNum_Now, 12); + } + + private void button18_Click(object sender, EventArgs e) + { + string EngineID = textBox1_EngineID.Text; + string EngineTypeID = textBox2_EngineTypeID.Text; + string palletCode = textBox3_palletCode.Text; + + MIS_BASE.Write_TagValueByTagTypeID(10, WorkStationNum_Now, EngineID); + MIS_BASE.Write_TagValueByTagTypeID(9, WorkStationNum_Now, EngineTypeID); + MIS_BASE.Write_TagValueByTagTypeID(80, WorkStationNum_Now, palletCode); + } + + private void button19_Click(object sender, EventArgs e) + { + WritePLCBoolData_Click(59); + } + + + /// + /// 界面上的开启时间 + /// + void Runtime_Thread() + { + try + { + DateTime Now = DateTime.Now; + TimeSpan x = Now.Subtract(StartTime); + toolStripStatusLabel_RunTime.Text = x.Days.ToString() + "天" + x.Hours.ToString("00") + "小时" + x.Minutes.ToString("00") + "分" + x.Seconds.ToString("00") + "秒"; + } + catch (Exception err) + { + ApplicationLog.WriteLog(err, err.Message); + } + } + + private void cb_F5_CheckedChanged(object sender, EventArgs e) + { + var interval = Convert.ToInt32(txt_Interval.Text); + + if (IsLoopReadShow = cb_F5.Checked) + { + var t = new Thread(new ParameterizedThreadStart(LoopReadShowTask)); + t.IsBackground = true; + t.Start(interval); + } + } + + private void toolStripStatusLabel_RunTime_Click(object sender, EventArgs e) + { + } + + public void LoopReadShowTask(object _interval) + { + var interval = (int)_interval; + while (true) + { + try + { + if (IsLoopReadShow == false) + { + return; + } + + ShowSignal(txt_PLC_9, WorkStationNum_Now); + ShowSignal(txt_PLC_10, WorkStationNum_Now); + ShowSignal(txt_PLC_11, WorkStationNum_Now); + ShowSignal(txt_PLC_39, WorkStationNum_Now); + + ShowSignal(btn_PLC_2, WorkStationNum_Now); + ShowSignal(btn_PLC_43, WorkStationNum_Now); + ShowSignal(btn_MES_5, WorkStationNum_Now); + + ShowSignal(btn_PLC_44, WorkStationNum_Now); + ShowSignal(btn_MES_66, WorkStationNum_Now); + + + ShowSignal(btn_PLC_19, WorkStationNum_Now); + ShowSignal(btn_MES_20, WorkStationNum_Now); + //ShowSignal(btn_MES_7, WorkStationNum_Now); + + ShowSignal(btn_PLC_1000, WorkStationNum_Now); + ShowSignal(btn_PLC_1001, WorkStationNum_Now); + ShowSignal(btn_PLC_1002, WorkStationNum_Now); + //ShowSignal(btn_PLC_59, WorkStationNum_Now); + + } + catch (Exception err) + { + } + Thread.Sleep(interval); + } + + } + + + public void ShowSignal(Control c,string opName) + { + var tagTypeCodeID = Convert.ToInt32(c.Name.Split('_')[2]); + if (c is TextBox) + { + try + { + c.Text = PlcLinkForm.ReadPLC(tagTypeCodeID, opName).ToString(); + + } + catch (Exception err) + { + c.Text = "不存在该信号!"; + } + } + if (c is Button) + { + try + { + c.BackColor = PlcLinkForm.ReadPLC(tagTypeCodeID, opName).ToString().ToLower() + .Replace("true", "1").Replace("false", "0") == "1" + ? color_Green : color_Bad; + } + catch (Exception err) + { + c.BackColor = color_Red; + } + } + + } + + private void panel_Signal_Conf_MouseDoubleClick(object sender, MouseEventArgs e) + { + new MES_CONF().ShowDialog(); + } + + private void button20_Click(object sender, EventArgs e) + { + PrinterCommandCenter.PrintToPrinter(textBox1_EngineID.Text); + } + + private void dgv_OpName_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex > -1) + { + if (AllowLoad) + { + WorkStationNum_Now = dgv_OpName.CurrentRow.Cells["OpCode"].Value.ToString(); + } + } + } + + private void webAPI接口测试ToolStripMenuItem_Click(object sender, EventArgs e) + { + } + + private void MesEngineDataWritePlc_Click(object sender, EventArgs e) + { + // 把工件编号、订单号、产品型号代码、产品型号 写入PLC + string OpName = WorkStationNum_Now; + MIS_BASE.WritePLC(9, OpName, MIS_BASE.ReadPLC(73, OpName)); // 机型标志 + MIS_BASE.WritePLC(11, OpName, MIS_BASE.ReadPLC(75, OpName)); // 产品型号 + MIS_BASE.WritePLC(39, OpName, MIS_BASE.ReadPLC(116, OpName)); // 订单号 + MIS_BASE.WritePLC(10, OpName, MIS_BASE.ReadPLC(74, OpName)); // 机型标志 + } + + } +} diff --git a/MisDataFun/MisDataFun/MisDataFun.csproj b/MisDataFun/MisDataFun/MisDataFun.csproj new file mode 100644 index 0000000..412834f --- /dev/null +++ b/MisDataFun/MisDataFun/MisDataFun.csproj @@ -0,0 +1,253 @@ + + + + + Debug + AnyCPU + {DD9131C7-BF40-45B0-827A-C5E46FC8A89E} + WinExe + MisDataFun + MisDataFun + v4.8 + 512 + true + true + + + + AnyCPU + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Mes32X32.ico + + + app.manifest + + + + Form + + + MES_CONF.cs + + + + Form + + + MisDataFun.cs + + + + + + + + + MES_CONF.cs + + + MisDataFun.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + ..\..\dll_common\BasicData.dll + + + ..\..\dll_common\BouncyCastle.Crypto.dll + + + False + ..\..\dll_common\ConLink.dll + + + ..\..\dll_common\ConLink19.dll + + + ..\..\dll_common\DataLinkMesWork.dll + + + False + ..\..\dll_common\ICSharpCode.SharpZipLib.dll + + + ..\..\dll_common\MesControl.dll + + + ..\..\dll_common\MesWork.DeviceDriver.dll + + + + ..\packages\Microsoft.Owin.4.2.2\lib\net45\Microsoft.Owin.dll + + + ..\..\dll_common\Monitor.MesWork.dll + + + ..\..\dll_common\MQTTnet.dll + + + ..\..\dll_common\MQTTnet.Extensions.ManagedClient.dll + + + ..\..\dll_common\Newtonsoft.Json.dll + + + False + ..\..\dll_common\NPOI.dll + + + False + ..\..\dll_common\NPOI.OOXML.dll + + + False + ..\..\dll_common\NPOI.OpenXml4Net.dll + + + False + ..\..\dll_common\NPOI.OpenXmlFormats.dll + + + ..\..\dll_common\Opc.Ua.Client.dll + + + ..\..\dll_common\Opc.Ua.Configuration.dll + + + ..\..\dll_common\Opc.Ua.Core.dll + + + ..\..\dll_common\OpcUaHelper.dll + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + + + + + + + + False + ..\..\dll_common\System.Net.Http.Formatting.dll + + + False + ..\..\dll_fun\System.Net.Security.dll + + + False + ..\..\dll_fun\System.Net.WebSockets.dll + + + False + ..\..\dll_fun\System.Net.WebSockets.Client.dll + + + False + ..\..\dll_fun\System.Security.Cryptography.Algorithms.dll + + + False + ..\..\dll_fun\System.Security.Cryptography.Encoding.dll + + + False + ..\..\dll_fun\System.Security.Cryptography.Primitives.dll + + + False + ..\..\dll_fun\System.Security.Cryptography.X509Certificates.dll + + + ..\..\dll_common\System.Web.Cors.dll + + + + ..\..\dll_common\System.Web.Http.dll + + + ..\..\dll_common\System.Web.Http.Cors.dll + + + ..\..\dll_common\System.Web.Http.SelfHost.dll + + + + + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 01-MesDataFunction + + + {1dc48c83-1842-4de8-acaf-26e1e7f7c58f} + 00_MyLog4Net + + + {b5a0baa3-c1a7-4aab-9486-2e650adaca7e} + Function1051 + + + {5fee5c91-8419-49ff-b2c2-47476f0b8c68} + Function1052 + + + {ca8a12c5-7bf0-4489-93fa-180b1c492bba} + Function1053 + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFun/MisDataFun/MisDataFun.resx b/MisDataFun/MisDataFun/MisDataFun.resx new file mode 100644 index 0000000..0b9bac2 --- /dev/null +++ b/MisDataFun/MisDataFun/MisDataFun.resx @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 22, 12 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 267, 7 + + + 137, 15 + + + 36 + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQIyAKEgMgChczIA + occyAKHqMgChmTIAoTwyAKEJMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQQyAKEvMgChdzIA + odYyAKH7MgCh/zIAof8yAKH/MgCh6jIAoacyAKFJMgChEjIAoQAyAKEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChADIAoQoyAKE+MgChkTIA + oeoyAKH+MgCh+TIAoe0yAKH+MgCh/zIAofwyAKH3MgCh/jIAofgyAKHBMgChZDIAoR4yAKEBMgChAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChATIAoRUyAKFcMgChujIA + ofEyAKH/MgCh9DIAobcyAKFPMgChfjIAof8yAKH/MgCh5TIAoVUyAKGLMgCh4jIAofwyAKH9MgCh2TIA + oYcyAKEoMgChBTIAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChAjIAoSYyAKF2MgCh0DIA + ofcyAKH+MgCh8zIAof8yAKGjMgChDTIAoQAyAKFpMgCh/zIAof8yAKHhMgChHjIAoQIyAKEiMgChbjIA + ocoyAKH3MgCh/jIAoeUyAKGfMgChQTIAoQsyAKEAAAAAAAAAAAAAAAAAMgChCDIAoUEyAKGXMgCh4jIA + of4yAKH/MgChzzIAoW0yAKFoMgCh+zIAoZcyAKEAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChADIA + oQAyAKEBMgChETIAoVAyAKGiMgCh8DIAof8yAKH0MgChuTIAoW0yAKEVMgChADIAoQAyAKG2MgCh7TIA + of8yAKHvMgCh7jIAofgyAKFLMgChADIAoTcyAKH1MgChlzIAoQAyAKEAMgChaTIAof8yAKH/MgCh4TIA + oR4yAKEAAAAAAAAAAAAAAAAAMgChADIAoQcyAKE4MgChijIAod8yAKH9MgCh+zIAoc4yAKFdMgChADIA + of8yAKHlMgChlDIAoToyAKGgMgCh7jIAoSwyAKEAMgChFzIAodgyAKGZMgChADIAoQAyAKFpMgCh/zIA + of8yAKHxMgChfDIAoSkyAKEBMgChAAAAAAAAAAAAAAAAADIAoQAyAKECMgChITIAoW8yAKG/MgCh/zIA + oZYyAKEAMgCh/zIAoZoyAKEBMgChADIAoZkyAKHSMgChEjIAoQAyAKEGMgChujIAoZoyAKEAMgChADIA + oWkyAKH/MgCh/zIAof0yAKH+MgCh4TIAoZIyAKFEMgChDjIAoQAyAKEAAAAAAAAAAAAAAAAAMgChADIA + oUIyAKH7MgChlzIAoQAyAKH/MgChlzIAoQAyAKEAMgChmjIAobMyAKEEMgChADIAoQAyAKGcMgChmzIA + oQAyAKEAMgChaTIAof8yAKH/MgCh4zIAoZYyAKHRMgCh+zIAofQyAKHDMgChZDIAoSIyAKEBMgChAAAA + AAAyAKEAMgChPzIAofsyAKGXMgChADIAof8yAKGXMgChADIAoQAyAKGaMgChiDIAoQAAAAAAMgChADIA + oYgyAKGaMgChADIAoQAyAKFpMgCh/zIAof8yAKHhMgChIDIAoRIyAKFeMgChqzIAoe0yAKH+MgCh3jIA + oYYyAKEqMgChADIAoQAyAKE/MgCh+zIAoZcyAKEAMgCh/zIAoZcyAKEAMgChADIAoZgyAKFtMgChAAAA + AAAyAKEAMgChXDIAoZQyAKEAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChADIAoQAyAKEGMgChMDIA + oX8yAKHTMgCh+jIAoWkyAKEAMgChADIAoT8yAKH7MgChlzIAoQAyAKH/MgChlzIAoQAyAKEAMgChlTIA + oWMyAKEAAAAAADIAoQAyAKE2MgChhTIAoQAyAKEAMgChaTIAof8yAKH/MgCh4TIAoR4yAKEAAAAAAAAA + AAAyAKEAMgChATIAoRUyAKFYMgChQDIAoQAyAKEAMgChPzIAofsyAKGXMgChADIAof8yAKGXMgChADIA + oQAyAKGLMgChQTIAoQAyAKEFMgChADIAoSMyAKF4MgChADIAoQAyAKFpMgCh/zIAof8yAKHhMgChHjIA + oQAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQAyAKEBMgChADIAoQAyAKE/MgCh+zIAoZcyAKEAMgCh/zIA + oZcyAKEAMgChADIAoXcyAKEkMgChBzIAoUIyAKEBMgChFjIAoWUyAKEBMgChADIAoWkyAKH/MgCh/zIA + oeEyAKEeMgChADIAoQAyAKE5MgChSTIAoQ8yAKEBMgChAAAAAAAAAAAAMgChADIAoT8yAKH7MgChlzIA + oQAyAKH/MgChlzIAoQAyAKECMgChWzIAoQ8yAKEVMgChhTIAoQoyAKEHMgChMzIAoQEyAKEAMgChaTIA + of8yAKH/MgCh4TIAoR4yAKEAMgChADIAoWkyAKH1MgChyzIAoX8yAKE4MgChBTIAoQAyAKEAMgChPzIA + ofsyAKGXMgChADIAof8yAKGXMgChADIAoQMyAKFZMgChCzIAoS4yAKHDMgChGjIAoQAAAAAAAAAAADIA + oQAyAKFpMgCh/zIAof8yAKHhMgChHjIAoQAyAKEAMgChLDIAoaEyAKHkMgCh/DIAoe8yAKGrMgChUzIA + oREyAKFBMgCh+zIAoZcyAKEAMgCh/zIAoZcyAKEAMgChBzIAoVAyAKEEMgChQTIAodoyAKEjMgChAAAA + AAAAAAAAMgChADIAoWkyAKH/MgCh/zIAoeEyAKEeMgChAAAAAAAyAKEAMgChBjIAoSAyAKFyMgChwjIA + ofMyAKH4MgCh0zIAobMyAKH9MgChljIAoQAyAKH/MgChlzIAoQAyAKEBMgChBDIAoQAyAKFKMgCh7jIA + oT0yAKEAAAAAADIAoQAyAKEAMgChbDIAof8yAKH/MgCh4TIAoR8yAKEAAAAAAAAAAAAAAAAAMgChADIA + oQEyAKELMgChRzIAoZYyAKHeMgCh/TIAof8yAKGWMgChADIAof8yAKGXMgChAAAAAAAAAAAAMgChADIA + oW0yAKH/MgChZDIAoQAyAKEEMgChHDIAoWAyAKHPMgCh/zIAof8yAKH3MgChkTIAoS8yAKELMgChADIA + oQAAAAAAAAAAAAAAAAAyAKEAMgChATIAoSAyAKF2MgCh/zIAoZYyAKEAMgCh/zIAoZcyAKEAAAAAADIA + oQAyAKEAMgChljIAof8yAKGeMgChOTIAoZEyAKHcMgCh+TIAof8yAKH/MgCh/zIAof8yAKH+MgCh6jIA + obgyAKFXMgChITIAoQEyAKEAAAAAAAAAAAAAAAAAMgChADIAoT8yAKH7MgChlzIAoQAyAKH/MgChlzIA + oQAAAAAAMgChADIAoQwyAKG9MgCh/zIAofMyAKHyMgCh/jIAof8yAKH/MgCh/zIAofoyAKH3MgCh/jIA + of8yAKH/MgCh/zIAofsyAKHbMgChmzIAoUwyAKENMgChATIAoQAyAKEAMgChPzIAofsyAKGXMgChADIA + of8yAKGXMgChATIAoRkyAKFbMgChsTIAofAyAKH/MgCh/zIAof8yAKH/MgCh/DIAoeYyAKGxMgChVTIA + oUIyAKGFMgCh1TIAofUyAKH/MgCh/zIAof8yAKH/MgCh9DIAocUyAKGDMgChMDIAoQYyAKE/MgCh+zIA + oZcyAKEAMgCh/zIAocEyAKGOMgCh2TIAofcyAKH/MgCh/zIAof8yAKH/MgCh7jIAobMyAKFwMgChJjIA + oQoyAKEAMgChADIAoQEyAKEXMgChTTIAoZsyAKHYMgCh/TIAof8yAKH/MgCh/zIAof4yAKHqMgChszIA + oZgyAKH+MgChljIAoQAyAKH/MgCh/zIAof8yAKH/MgCh/zIAof8yAKH0MgChyTIAoYEyAKE/MgChBzIA + oQAAAAAAMgChADIAoSIyAKF2MgChQjIAoRIyAKEAMgChATIAoR4yAKFjMgChrjIAoecyAKH9MgCh/zIA + of8yAKH/MgCh/zIAof8yAKGWMgChADIAof8yAKH/MgCh/zIAofkyAKHWMgChmjIAoUIyAKERMgChATIA + oQAyAKEGMgChFTIAoQMyAKEAMgChKDIAoZUyAKHHMgChxjIAoXcyAKE3MgChBzIAoQAyAKEGMgChKTIA + oXYyAKHDMgCh7jIAof4yAKH/MgCh/zIAoZYyAKEAMgChrjIAoeYyAKH+MgCh0zIAoVcyAKELMgChADIA + oQAyAKEAMgChADIAoVUyAKHAMgChkjIAoVYyAKEUMgChATIAoRYyAKFhMgChqzIAodUyAKGmMgChZTIA + oR8yAKEDMgChBDIAoS0yAKGiMgCh9DIAofUyAKHGMgChWTIAoQAyAKEGMgChKjIAoWsyAKHBMgCh3DIA + ocEyAKFwMgChJTIAoQYyAKEAMgChDDIAoTgyAKF/MgChyjIAocMyAKGUMgChMzIAoQsyAKEEMgChJjIA + oWUyAKG/MgCh0TIAoaYyAKGoMgCh1TIAodYyAKGNMgChQTIAoRAyAKEAMgChAAAAAAAyAKEAMgChADIA + oQ8yAKE8MgChkDIAoc8yAKHfMgChpDIAoVIyAKEcMgChADIAoQEyAKETMgChRzIAoZ8yAKHGMgChvzIA + oWQyAKEtMgChMzIAoY8yAKHvMgCh5zIAoa8yAKFcMgChHDIAoQMyAKEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADIAoQAyAKECMgChFTIAoVcyAKGaMgCh3DIAodEyAKGaMgChSDIAoQsyAKEAMgChATIA + oSUyAKGGMgCh6TIAofEyAKHhMgChtzIAoXAyAKErMgChBTIAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgChADIAoQIyAKElMgChXTIAobgyAKHbMgChxTIA + oYUyAKFbMgChqzIAodEyAKHLMgChhDIAoTsyAKELMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKEAMgChCzIA + oTcyAKGTMgCh0zIAofAyAKG2MgChWjIAoRcyAKEBMgChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/+Af//+AB//8AAD/8AAAP8AIAA8AGDABARg+AQEYD4ERGAPxMZgAcTOY + ADEzmDAxM5g8MTKIPzEgCDDxIAgwMSB4MAEgeDgBJHg+ATxAD8E8AAHxOAAAMQAAAAEAAwABABwgAQBE + BAEBwAABAEAAA+AAAA/4AAB//wAD///gD/8= + + + \ No newline at end of file diff --git a/MisDataFun/MisDataFun/Properties/AssemblyInfo.cs b/MisDataFun/MisDataFun/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d797f42 --- /dev/null +++ b/MisDataFun/MisDataFun/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MisDataSaveDate")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("大连迈思信息技术有限公司")] +[assembly: AssemblyProduct("MisDataSaveDate")] +[assembly: AssemblyCopyright("Copyright © 大连迈思信息技术有限公司 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("9aede061-8490-436a-b38b-9495dc908f19")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MisDataFun/MisDataFun/Properties/Resources.Designer.cs b/MisDataFun/MisDataFun/Properties/Resources.Designer.cs new file mode 100644 index 0000000..34e1c57 --- /dev/null +++ b/MisDataFun/MisDataFun/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MisDataFun.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MisDataFun.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 断开状态 { + get { + object obj = ResourceManager.GetObject("断开状态", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap 连接状态 { + get { + object obj = ResourceManager.GetObject("连接状态", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/MisDataFun/MisDataFun/Properties/Resources.resx b/MisDataFun/MisDataFun/Properties/Resources.resx new file mode 100644 index 0000000..19c6ed7 --- /dev/null +++ b/MisDataFun/MisDataFun/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\断开状态.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\连接状态.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/MisDataFun/MisDataFun/Properties/Settings.Designer.cs b/MisDataFun/MisDataFun/Properties/Settings.Designer.cs new file mode 100644 index 0000000..2e69221 --- /dev/null +++ b/MisDataFun/MisDataFun/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MesServerMisDataFun.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/MisDataFun/MisDataFun/Properties/Settings.settings b/MisDataFun/MisDataFun/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/MisDataFun/MisDataFun/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/MisDataFun/MisDataFun/Resources/断开状态.png b/MisDataFun/MisDataFun/Resources/断开状态.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae61896eee8d1bebdd65f65c41c0fdd78a0ac96 GIT binary patch literal 4941 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 Uul!inwg3PC07*qoM6N<$f<0{i82|tP literal 0 HcmV?d00001 diff --git a/MisDataFun/MisDataFun/app.manifest b/MisDataFun/MisDataFun/app.manifest new file mode 100644 index 0000000..75867c2 --- /dev/null +++ b/MisDataFun/MisDataFun/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MisDataFun/MisDataFun/jsconfig1.json b/MisDataFun/MisDataFun/jsconfig1.json new file mode 100644 index 0000000..afb797c --- /dev/null +++ b/MisDataFun/MisDataFun/jsconfig1.json @@ -0,0 +1,10 @@ +{ + "exclude": [ + "**/bin", + "**/bower_components", + "**/jspm_packages", + "**/node_modules", + "**/obj", + "**/platforms" + ] +} \ No newline at end of file diff --git a/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.Designer.cs b/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.Designer.cs new file mode 100644 index 0000000..4cd9051 --- /dev/null +++ b/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.Designer.cs @@ -0,0 +1,113 @@ +namespace MES_SIGNAL_CONF +{ + partial class MES_CONF + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.btn_ConfigToSql = new System.Windows.Forms.Button(); + this.label_ReadExcel = new System.Windows.Forms.Label(); + this.label_WriteSql = new System.Windows.Forms.Label(); + this.txt_Msg = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // btn_ConfigToSql + // + this.btn_ConfigToSql.Location = new System.Drawing.Point(487, 74); + this.btn_ConfigToSql.Name = "btn_ConfigToSql"; + this.btn_ConfigToSql.Size = new System.Drawing.Size(161, 36); + this.btn_ConfigToSql.TabIndex = 0; + this.btn_ConfigToSql.Text = "重新将配置写入数据库"; + this.btn_ConfigToSql.UseVisualStyleBackColor = true; + this.btn_ConfigToSql.Click += new System.EventHandler(this.btn_ConfigToSql_Click); + // + // label_ReadExcel + // + this.label_ReadExcel.AutoSize = true; + this.label_ReadExcel.Location = new System.Drawing.Point(12, 16); + this.label_ReadExcel.Name = "label_ReadExcel"; + this.label_ReadExcel.Size = new System.Drawing.Size(95, 12); + this.label_ReadExcel.TabIndex = 1; + this.label_ReadExcel.Text = "label_ReadExcel"; + // + // label_WriteSql + // + this.label_WriteSql.AutoSize = true; + this.label_WriteSql.Location = new System.Drawing.Point(12, 42); + this.label_WriteSql.Name = "label_WriteSql"; + this.label_WriteSql.Size = new System.Drawing.Size(89, 12); + this.label_WriteSql.TabIndex = 1; + this.label_WriteSql.Text = "label_WriteSql"; + // + // txt_Msg + // + this.txt_Msg.Location = new System.Drawing.Point(14, 116); + this.txt_Msg.Multiline = true; + this.txt_Msg.Name = "txt_Msg"; + this.txt_Msg.Size = new System.Drawing.Size(634, 316); + this.txt_Msg.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 70); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(335, 36); + this.label1.TabIndex = 3; + this.label1.Text = "使用到数据库的表:\r\n读取:MES_计划BOM_工位与名称([是否启用MES] = 1)\r\n写入:MES_基本变量_原始数据、MES_基本变量设备类型对应表"; + this.label1.Click += new System.EventHandler(this.label1_Click); + // + // MES_CONF + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(660, 437); + this.Controls.Add(this.label1); + this.Controls.Add(this.txt_Msg); + this.Controls.Add(this.label_WriteSql); + this.Controls.Add(this.label_ReadExcel); + this.Controls.Add(this.btn_ConfigToSql); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "MES_CONF"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "MES监控系统信号配置"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btn_ConfigToSql; + private System.Windows.Forms.Label label_ReadExcel; + private System.Windows.Forms.Label label_WriteSql; + private System.Windows.Forms.TextBox txt_Msg; + private System.Windows.Forms.Label label1; + } +} + diff --git a/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.cs b/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.cs new file mode 100644 index 0000000..b82a21e --- /dev/null +++ b/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.cs @@ -0,0 +1,421 @@ +using SlMesDbIterface; +using System; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Windows.Forms; +using static System.Configuration.ConfigurationManager; + +namespace MES_SIGNAL_CONF +{ + public partial class MES_CONF : Form + { + #region 构造函数与初始化 + + public MES_CONF() + { + InitializeComponent(); + InitializeLabels(); + } + + /// + /// 初始化界面标签 + /// + private void InitializeLabels() + { + label_ReadExcel.Text = $"读取位置:{MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile}"; + label_WriteSql.Text = $"写入位置:{MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES}"; + } + + #endregion + + #region 事件处理 + + /// + /// 配置导入到SQL按钮点击事件 + /// + private void btn_ConfigToSql_Click(object sender, EventArgs e) + { + try + { + WriteLog("========== 开始导入配置 =========="); + LoadOpcData(); + WriteLog("========== 导入配置完成 =========="); + } + catch (Exception ex) + { + WriteLog($"✗ 导入失败:{ex.Message}"); + MessageBox.Show($"配置导入失败!\n{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void label1_Click(object sender, EventArgs e) + { + // 预留事件 + } + + #endregion + + #region 主要业务逻辑 + + /// + /// 加载OPC数据并导入数据库 + /// + private void LoadOpcData() + { + // 1. 加载基础数据 + WriteLog("正在加载Excel数据..."); + var excelData = LoadExcelData(); + + // 2. 生成标签数据 + WriteLog("正在生成标签数据..."); + DataTable dtTag = GenerateTagData(excelData); + + excelData.DeviceTable.TableName = "MES_基本变量设备类型对应表"; + + // 3. 保存到数据库 + WriteLog("正在保存到数据库..."); + SaveToDatabase(dtTag, excelData.DeviceTable); + } + + /// + /// 从Excel加载所有基础数据 + /// + private ExcelDataModel LoadExcelData() + { + string excelFile = MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile; + + return new ExcelDataModel + { + StationTable = GetStationData(), + TagMesTable = LoadEnabledData(excelFile, "MES_基本变量原始数据"), + TagModelTable = LoadEnabledData(excelFile, "MES_信号表模板"), + //TagModelKwTable = LoadEnabledData(excelFile, "MES_信号表模板(库位)"), + DeviceTable = LoadEnabledData(excelFile, "设备类型对应表") + }; + } + + /// + /// 加载Excel启用数据 + /// + private DataTable LoadEnabledData(string excelFile, string sheetName) + { + var rawData = NPOITest.ExeclHelper.ExcelToDataTable(excelFile, sheetName, true); + var enabledRows = rawData.Select($"是否启用='1'"); + + return enabledRows.Length > 0 ? enabledRows.CopyToDataTable() : rawData.Clone(); + } + + /// + /// 生成标签数据 + /// + private DataTable GenerateTagData(ExcelDataModel excelData) + { + DataTable dtTag = excelData.TagModelTable.Clone(); + + // 分离库位工位和普通工位 + var stationData = SplitStationByType(excelData.StationTable, "1"); + //var stationKw = SplitStationByType(excelData.StationTable, "2"); + + // 处理普通工位 + WriteLog($"处理普通工位数据,共 {stationData.Rows.Count} 个工位"); + ProcessStations(stationData, excelData.TagModelTable, dtTag); + + //// 处理库位工位 + //WriteLog($"处理库位工位数据,共 {stationKw.Rows.Count} 个工位"); + //ProcessStations(stationKw, excelData.TagModelKwTable, dtTag); + + // 合并报警数据 + MergeAlarmData(dtTag); + + // 合并MES基本变量数据 + dtTag.Merge(excelData.TagMesTable); + + dtTag.TableName = "MES_基本变量_原始数据"; + + WriteLog($"标签数据生成完成,共 {dtTag.Rows.Count} 条记录"); + return dtTag; + } + + /// + /// 按线体类型分离工位数据 + /// + private DataTable SplitStationByType(DataTable stationTable, string lineType) + { + string filter = $"线体类型 = '{lineType}'"; + var rows = stationTable.Select(filter); + + return rows.Length > 0 ? rows.CopyToDataTable() : stationTable.Clone(); + } + + /// + /// 处理工位数据 + /// + private void ProcessStations(DataTable stations, DataTable tagModel, DataTable targetTag) + { + foreach (DataRow stationRow in stations.Rows) + { + var stationInfo = new StationInfo + { + 工位代码 = stationRow["工位代码"].ToString(), + 工位号 = stationRow["工位号"].ToString(), + 工位名称 = stationRow["工位名称"].ToString(), + PLC = stationRow["PLC"].ToString(), + PLC代码 = stationRow["PLC代码"].ToString() + }; + + DataTable tagCopy = tagModel.Copy(); + UpdateTagTableByStation(tagCopy, stationInfo); + targetTag.Merge(tagCopy); + } + } + + /// + /// 根据工位信息更新标签表 + /// + private void UpdateTagTableByStation(DataTable tagTable, StationInfo stationInfo) + { + foreach (DataRow row in tagTable.Rows) + { + // 更新TagID:将****替换为工位代码(补齐4位) + string tagId = row["TagID"].ToString(); + row["TagID"] = tagId.Replace("****", stationInfo.工位代码.PadLeft(4, '0')); + + // 更新工位相关信息 + row["工位号"] = stationInfo.工位号; + row["数据来源"] = stationInfo.工位名称; + row["IP"] = stationInfo.PLC; + row["DbName"] = stationInfo.PLC代码; + + // 更新监控组 + row["监控组"] = $"{row["监控组"]}_{stationInfo.工位号}"; + } + } + + /// + /// 合并报警数据 + /// + private void MergeAlarmData(DataTable targetTable) + { + try + { + GetAlarmTableData(out DataTable alarmTable); + if (alarmTable != null && alarmTable.Rows.Count > 0) + { + targetTable.Merge(alarmTable, false, MissingSchemaAction.Ignore); + WriteLog($"合并报警数据成功,共 {alarmTable.Rows.Count} 条记录"); + } + } + catch (DataException ex) + { + WriteLog($"⚠ 合并报警数据失败:{ex.Message}"); + throw; + } + } + + #endregion + + #region 数据库操作 + + /// + /// 使用事务安全保存数据到数据库 + /// + private void SaveToDatabase(DataTable tagTable, DataTable deviceTable) + { + using (SqlConnection conn = new SqlConnection(MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES)) + { + conn.Open(); + SqlTransaction transaction = conn.BeginTransaction(); + + try + { + // 1. 创建备份 + var backupTables = CreateBackupTables(conn, transaction, tagTable.TableName, deviceTable.TableName); + + // 2. 清空原表 + ClearTables(conn, transaction, tagTable.TableName, deviceTable.TableName); + + // 3. 批量插入新数据 + BulkInsertData(conn, transaction, tagTable); + BulkInsertData(conn, transaction, deviceTable); + + // 4. 提交事务 + transaction.Commit(); + WriteLog("✓ 所有操作成功完成,事务已提交"); + + // 5. 清理备份表 + CleanupBackupTables(conn, backupTables); + } + catch (Exception ex) + { + transaction.Rollback(); + WriteLog($"✗ 操作失败,事务已回滚:{ex.Message}"); + throw; + } + } + } + + /// + /// 创建备份表 + /// + private string[] CreateBackupTables(SqlConnection conn, SqlTransaction transaction, params string[] tableNames) + { + string[] backupTables = new string[tableNames.Length]; + + for (int i = 0; i < tableNames.Length; i++) + { + backupTables[i] = $"{tableNames[i]}_Backup_{DateTime.Now:yyyyMMddHHmmss}"; + ExecuteNonQuery(conn, transaction, $"SELECT * INTO [{backupTables[i]}] FROM [{tableNames[i]}]"); + WriteLog($"已创建备份表:{backupTables[i]}"); + } + + return backupTables; + } + + /// + /// 清空表数据 + /// + private void ClearTables(SqlConnection conn, SqlTransaction transaction, params string[] tableNames) + { + foreach (var tableName in tableNames) + { + ExecuteNonQuery(conn, transaction, $"DELETE FROM [{tableName}]"); + WriteLog($"清空数据库表:{tableName}"); + } + } + + /// + /// 批量插入数据 + /// + private void BulkInsertData(SqlConnection conn, SqlTransaction transaction, DataTable dataTable) + { + using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction)) + { + bulkCopy.DestinationTableName = dataTable.TableName; + bulkCopy.BatchSize = 1000; + bulkCopy.BulkCopyTimeout = 300; + bulkCopy.WriteToServer(dataTable); + WriteLog($"写入数据库表:{dataTable.TableName},共 {dataTable.Rows.Count} 条记录"); + } + } + + /// + /// 清理备份表 + /// + private void CleanupBackupTables(SqlConnection conn, string[] backupTables) + { + try + { + foreach (var backupTable in backupTables) + { + ExecuteNonQuery(conn, null, $"DROP TABLE [{backupTable}]"); + } + WriteLog("已清理备份表"); + } + catch (Exception ex) + { + WriteLog($"⚠ 清理备份表时出错(不影响主流程):{ex.Message}"); + } + } + + /// + /// 执行SQL命令 + /// + private void ExecuteNonQuery(SqlConnection conn, SqlTransaction transaction, string sql) + { + using (SqlCommand cmd = new SqlCommand(sql, conn, transaction)) + { + cmd.ExecuteNonQuery(); + } + } + + #endregion + + #region 数据查询 + + /// + /// 获取工位数据 + /// + private DataTable GetStationData() + { + string sql = @" + SELECT * + FROM [MES_计划BOM_工位与名称] + WHERE [是否启用MES] = 1 + ORDER BY [工位号]"; + + SqlOperation.ExecuteSql(sql, out DataTable dt, out string error); + + if (!string.IsNullOrEmpty(error)) + { + WriteLog($"⚠ 查询工位数据出错:{error}"); + } + + return dt ?? new DataTable(); + } + + /// + /// 获取报警表数据 + /// + private void GetAlarmTableData(out DataTable dt) + { + string sql = @" + SELECT * + FROM [MES_基本变量_原始数据] + WHERE [type] = 9 + ORDER BY [TagID]"; + + SqlOperation.ExecuteSql(sql, out dt, out string error); + + if (!string.IsNullOrEmpty(error)) + { + WriteLog($"⚠ 查询报警数据出错:{error}"); + } + } + + #endregion + + #region 辅助方法 + + /// + /// 写入日志 + /// + public void WriteLog(string msg) + { + string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + txt_Msg.Text += $"[{timestamp}] {msg}\r\n"; + txt_Msg.SelectionStart = txt_Msg.Text.Length; + txt_Msg.ScrollToCaret(); + } + + #endregion + + #region 内部数据模型 + + /// + /// Excel数据模型 + /// + private class ExcelDataModel + { + public DataTable StationTable { get; set; } + public DataTable TagMesTable { get; set; } + public DataTable TagModelTable { get; set; } + public DataTable TagModelKwTable { get; set; } + public DataTable DeviceTable { get; set; } + } + + /// + /// 工位信息模型 + /// + private class StationInfo + { + public string 工位代码 { get; set; } + public string 工位号 { get; set; } + public string 工位名称 { get; set; } + public string PLC { get; set; } + public string PLC代码 { get; set; } + } + + #endregion + } +} diff --git a/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.resx b/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/MisDataFun/MisDataFun/mes_signal_conf/MES_CONF.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MisDataFun/MisDataFun/mes_signal_conf/SqlOperation.cs b/MisDataFun/MisDataFun/mes_signal_conf/SqlOperation.cs new file mode 100644 index 0000000..47fb6ce --- /dev/null +++ b/MisDataFun/MisDataFun/mes_signal_conf/SqlOperation.cs @@ -0,0 +1,68 @@ +using System; +using System.Data; +using System.Data.SqlClient; + +namespace SlMesDbIterface +{ + public class SqlOperation + { + public static bool ExecuteStoredProcedure(string name, SqlParameter[] sqlParameters, out string errorMessage) + { + return DataLinkMesWork.SQLCommon.ExecuteStoredProcedure(name, MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, ref sqlParameters, out errorMessage); + } + public static bool ExecuteStoredProcedure(string name, SqlParameter[] sqlParameters, out DataTable dt, out string errorMessage) + { + return DataLinkMesWork.SQLCommon.ExecuteStoredProcedure(name, MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, ref sqlParameters, out dt, out errorMessage); + } + public static bool ExecuteStoredProcedure(string name, SqlParameter[] sqlParameters, out DataSet ds, out string errorMessage) + { + return DataLinkMesWork.SQLCommon.ExecuteStoredProcedure(name, MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, ref sqlParameters, out ds, out errorMessage); + } + public static bool ExecuteSql(string sql, out DataTable dt, out string errorMessage) + { + return DataLinkMesWork.SQLCommon.ExecuteSql(sql, MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, out dt, out errorMessage); + } + + public static bool ExecuteSql(string sql, out DataSet ds, out string errorMessage) + { + return DataLinkMesWork.SQLCommon.ExecuteDataset(sql, MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, out ds, out errorMessage); + } + + public static bool ExecuteSql(string sql, out string errorMessage) + { + return DataLinkMesWork.SQLCommon.ExecuteSql(sql, MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, out errorMessage); + } + + + /// + /// 通过SqlBulkCopy复制table数据到数据库 + /// + /// + public static bool SqlbulkcopyInsert(DataTable dt,out string ErrMsg) + { + bool success = false; + ErrMsg = ""; + try + { + // SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectString, SqlBulkCopyOptions.KeepIdentity);//删除自增ID插入原始数据 + SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES, SqlBulkCopyOptions.UseInternalTransaction);//批量事务处理 + sqlbulkcopy.DestinationTableName = dt.TableName;//数据库中的表名 + for (int i = 0; i < dt.Columns.Count; i++) + { + var columnName = dt.Columns[i].ColumnName.ToString(); + sqlbulkcopy.ColumnMappings.Add(columnName, columnName); + } + sqlbulkcopy.WriteToServer(dt); + success = true; + } + catch (Exception err) + { + ErrMsg=err.Message; + } + return success; + + } + + + } +} diff --git a/MisDataFun/MisDataFun/webApi/Analysis_MOM_Msg.cs b/MisDataFun/MisDataFun/webApi/Analysis_MOM_Msg.cs new file mode 100644 index 0000000..11ba6d8 --- /dev/null +++ b/MisDataFun/MisDataFun/webApi/Analysis_MOM_Msg.cs @@ -0,0 +1,386 @@ +using DataLinkMesWork1; +using MesServerWork; +using MisDataFunDll; +using MyLog4Net; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Net.Sockets; +using System.Reflection.Emit; +using System.Web.Http; + +namespace MisDataSaveDate +{ + public class Analysis_MOM_Msg + { + /// + /// UUID生成 + /// + /// + public static string UuidUtil() + { + string result = Guid.NewGuid().ToString(); + + return result; + } + + /// + /// 获取时间戳 + /// + /// + public static Int64 GetTimeStamp() + { + TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalSeconds); + } + /// + /// 接收检测数据 + /// + /// + /// + public static string OnlineCheckData(string url, [FromBody] JObject jobj) + { + var result = new msgResHeader(); + result.MsgId = ""; + result.Message = ""; + result.Code = "200"; + result.Data = ""; + + string errorMessage = ""; + string parentID = ""; + int AID = -1; + + if (jobj == null) + { + result.Code = "500"; + result.Message = "参数格式不正确!"; + string retString1 = JsonConvert.SerializeObject(result); + MyLogHelper.Info("接收检测数据_res", retString1); + return retString1; + } + int isError = 0; + string str = jobj.ToString(); + try + { + //存储日志 + var CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + //Event_MOM_Log_Insert,@创建时间,@内容 + var param = new SqlParameter[] { + new SqlParameter("@接口地址",url), + new SqlParameter("@接口类型",2), // 1. 主动调用接口 2. 被调用接口 + new SqlParameter("@请求内容",str), + new SqlParameter("@请求时间",CreateTime) + }; + DataLinkMesWork1.DataAccess.ExecuteStoredProcedure("接口_IOT接口交互日志_请求记录", ref param, out DataTable dt, out errorMessage); + + // 解析订单内容,存储数据库,根据实际业务来写 + OnlineCheckData onlineCheckData = JsonConvert.DeserializeObject(str); + if (onlineCheckData.MsgId == "") + { + throw new Exception("参数MsgId为空!"); + } + result.MsgId = onlineCheckData.MsgId; + if (onlineCheckData.OpCode == "") + { + throw new Exception("参数OpCode为空!"); + } + if (onlineCheckData.ProductionCode == "") + { + throw new Exception("参数ProductionCode为空!"); + } + string OpName = onlineCheckData.OpCode; + int Id_tagCF = 0; + SqlParameter[] param1 = new SqlParameter[6]; + param1[0] = new SqlParameter("@EngineID", onlineCheckData.ProductionCode); + param1[1] = new SqlParameter("@工位号", OpName); + param1[2] = new SqlParameter("@操作者工号", onlineCheckData.CheckPerson); + param1[3] = new SqlParameter("@扫码时间", onlineCheckData.ScanTime); + param1[4] = new SqlParameter("@合格标志", onlineCheckData.QualityMark); + param1[5] = new SqlParameter("@Id_tagCF", Id_tagCF); + param1[5].Direction = ParameterDirection.Output; + DataAccess.ExecuteStoredProcedure("测量数据合格索引_增加_测试设备", ref param1, out errorMessage); + if (errorMessage != "") + { + throw new Exception(errorMessage); + } + Id_tagCF = Convert.ToInt32(param1[5].Value.ToString()); + + List onlineCheckData_CheckDataList = onlineCheckData.CheckData; + + for (int i = 0; i < onlineCheckData_CheckDataList.Count; i++) + { + OnlineCheckData_CheckData onlineCheckData_CheckData = onlineCheckData_CheckDataList[i]; + + var param2 = new SqlParameter[] { + new SqlParameter("@Id_tagCF", Id_tagCF), + new SqlParameter("@EngineID", onlineCheckData.ProductionCode), + new SqlParameter("@TagID",onlineCheckData_CheckData.CheckCode), + new SqlParameter("@TagValue",onlineCheckData_CheckData.CheckValue), + new SqlParameter("@IsGoodBad",onlineCheckData_CheckData.QualityMark), + new SqlParameter("@工位号",OpName), + new SqlParameter("@理论值",onlineCheckData_CheckData.StandardValue), + new SqlParameter("@上限值",onlineCheckData_CheckData.MaxValue), + new SqlParameter("@下限值",onlineCheckData_CheckData.MinValue), + new SqlParameter("@测量项目",onlineCheckData_CheckData.CheckName), + new SqlParameter("@测量单位",onlineCheckData_CheckData.Unit), + }; + DataAccess.ExecuteStoredProcedure("测量数据合格_增加_测试设备", ref param2, out errorMessage); + if (errorMessage != "") + { + throw new Exception(errorMessage); + } + } + + // 查询PLC是否传递机型,保证工位有件,可以写保存完成和工作完成 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out bool tagValue); + if (tagValue) + { + // 电芯段OP040流程比较特殊,无PLC保存数据的流程,可以直接写完成。 + if (OpName == "OP040") + { + //通知PLC,MES保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + //通知PLC,MES工作完成 + MIS_BASE.Write_MesWorkFinish(OpName, true); + MisDataFunDll.MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "MES保存数据完成!"); + MisDataFunDll.MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "MES工作完成!"); + } + else + { + // 查看PLC是否完成流程,如果完成的话流程结束,否则的话要等PLC完成流程(即允许保存) + DataTable dt2 = MisDataFunDll.MisDataFun.CheckAllFinish(OpName, onlineCheckData.ProductionCode, 2); + string msg1 = "查询PLC流程出错"; + if (dt2 != null && dt2.Rows.Count > 0) + { + string result1 = dt2.Rows[0]["result"].ToString(); + msg1 = dt2.Rows[0]["msg"].ToString(); + + if (result1 == "1") //已完成 + { + //通知PLC,MES保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + //通知PLC,MES工作完成 + MIS_BASE.Write_MesWorkFinish(OpName, true); + MisDataFunDll. MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", msg1); + MisDataFunDll. MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "MES保存数据完成!"); + MisDataFunDll.MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "MES工作完成!"); + } + else + { + MisDataFunDll.MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", msg1); + } + } + else + { + MisDataFunDll.MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", msg1); + } + } + + } + } + catch (Exception err) + { + result.Code = "500"; + result.Message = err.Message; + MisDataFunDll.MisDataFun.LogRecording_OP("All", "ERROR", "MIS", err.Message); + } + string retString = JsonConvert.SerializeObject(result); + MyLogHelper.Info("接收检测数据_res", retString); + + return retString; + } + /// + /// 接收查询检测次数 + /// + /// + /// + public static string OnlineCheckDataCount(string url, [FromBody] JObject jobj) + { + var result = new msgResHeader2(); + result.MsgId = ""; + result.Message = ""; + result.Code = "200"; + result.Data = new checkCountData(); + result.Data.CheckCountOk = 0; + result.Data.CheckCountNg = 0; + string errorMessage = ""; + string parentID = ""; + int AID = -1; + + if (jobj == null) + { + result.Code = "500"; + result.Message = "参数格式不正确!"; + string retString1 = JsonConvert.SerializeObject(result); + MyLogHelper.Info("接收查询检测次数_res", retString1); + return retString1; + } + int isError = 0; + string str = jobj.ToString(); + try + { + //存储日志 + var CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + //Event_MOM_Log_Insert,@创建时间,@内容 + var param = new SqlParameter[] { + new SqlParameter("@接口地址",url), + new SqlParameter("@接口类型",2), // 1. 主动调用接口 2. 被调用接口 + new SqlParameter("@请求内容",str), + new SqlParameter("@请求时间",CreateTime) + }; + DataLinkMesWork1.DataAccess.ExecuteStoredProcedure("接口_IOT接口交互日志_请求记录", ref param, out DataTable dt, out errorMessage); + + // 解析订单内容,存储数据库,根据实际业务来写 + OnlineCheckData onlineCheckData = JsonConvert.DeserializeObject(str); + if (onlineCheckData.MsgId == "") + { + throw new Exception("参数MsgId为空!"); + } + result.MsgId = onlineCheckData.MsgId; + if (onlineCheckData.OpCode == "") + { + throw new Exception("参数OpCode为空!"); + } + if (onlineCheckData.ProductionCode == "") + { + throw new Exception("参数ProductionCode为空!"); + } + + SqlParameter[] param1 = new SqlParameter[2]; + param1[0] = new SqlParameter("@EngineID", onlineCheckData.ProductionCode); + param1[1] = new SqlParameter("@工位号", onlineCheckData.OpCode); + DataLinkMesWork1.DataAccess.ExecuteStoredProcedure("CATL_测量数据合格_查询测试次数_测试设备", ref param1, out DataTable dt1, out errorMessage); + if (errorMessage != "") + { + throw new Exception(errorMessage); + } + + if (dt1 != null && dt1.Rows.Count > 0) + { + result.Data.CheckCountOk = Convert.ToInt32(dt1.Rows[0]["OK"]); + result.Data.CheckCountNg = Convert.ToInt32(dt1.Rows[0]["NG"]); + } + + } + catch (Exception err) + { + result.Code = "500"; + result.Message = err.Message; + } + string retString = JsonConvert.SerializeObject(result); + MyLogHelper.Info("接收查询检测次数_res", retString); + return retString; + } + /// + /// 接收打印任务 + /// + /// + /// + public static string ReceivePrintTask(string url, [FromBody] JObject jobj) + { + var result = new msgResHeader(); + result.MsgId = ""; + result.Message = ""; + result.Code = "200"; + result.Data = ""; + + string errorMessage = ""; + string parentID = ""; + int AID = -1; + + if (jobj == null) + { + result.Code = "500"; + result.Message = "参数格式不正确!"; + string retString1 = JsonConvert.SerializeObject(result); + MyLogHelper.Info("接收打印任务_res", retString1); + return retString1; + } + + string str = jobj.ToString(); + try + { + //存储日志 + var CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + //Event_MOM_Log_Insert,@创建时间,@内容 + var param = new SqlParameter[] { + new SqlParameter("@接口地址",url), + new SqlParameter("@接口类型",2), // 1. 主动调用接口 2. 被调用接口 + new SqlParameter("@请求内容",str), + new SqlParameter("@请求时间",CreateTime) + }; + DataLinkMesWork1.DataAccess.ExecuteStoredProcedure("接口_IOT接口交互日志_请求记录", ref param, out DataTable dt, out errorMessage); + + // 解析订单内容,存储数据库,根据实际业务来写 + PrintTaskData printTaskData = JsonConvert.DeserializeObject(str); + if (printTaskData.printTemplete == "") + { + throw new Exception("参数printTemplete为空!"); + } + + if (printTaskData.productCode == "") + { + throw new Exception("参数productCode为空!"); + } + if (printTaskData.printDate == "") + { + throw new Exception("参数printDate为空!"); + } + string msg = $"MARK|{printTaskData.printTemplete}|{printTaskData.productCode},{printTaskData.printDate}"; + + // 连接打印机 + Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + try + { + //socket.Connect(MesWorkForm.MarkingMachine_Ip, int.Parse(MesWorkForm.MarkingMachine_Port)); + } + catch (Exception err) + { + throw new Exception("连接打印机失败:" + err.Message); + } + // 发送数据 + try + { + if (socket.Connected) + { + byte[] decBytes = System.Text.Encoding.UTF8.GetBytes(msg); + //socket.Send(decBytes); + socket.Send(decBytes, 0, decBytes.Length, SocketFlags.None); + } + else + { + throw new Exception("连接打印机失败"); + } + } + catch (Exception err) + { + throw new Exception("发送打印数据失败:" + err.Message); + } + // 关闭 + try + { + if (socket.Connected) + { + socket.Shutdown(SocketShutdown.Both); + socket.Close(100); + } + } + catch (Exception ex) + { + } + } + catch (Exception err) + { + result.Code = "500"; + result.Message = err.Message; + } + string retString = JsonConvert.SerializeObject(result); + MyLogHelper.Info("接收打印任务_res", retString); + return retString; + } + + } +} diff --git a/MisDataFun/MisDataFun/webApi/Controller/ipcControll.cs b/MisDataFun/MisDataFun/webApi/Controller/ipcControll.cs new file mode 100644 index 0000000..c144448 --- /dev/null +++ b/MisDataFun/MisDataFun/webApi/Controller/ipcControll.cs @@ -0,0 +1,54 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Web; +using System.Web.Http; +using System.Collections.Concurrent; +using Newtonsoft.Json.Linq; +using System.Runtime.Remoting.Messaging; + + +namespace MisDataSaveDate +{ + + public class IpcController : ApiController + { + readonly string headUrl = "Project/"; + + [HttpPost] + [Route("OnlineCheckData")] + public HttpResponseMessage ReceiveMomPlanData([FromBody] JObject jobj) + { + + return new HttpResponseMessage + { + Content = new StringContent(Analysis_MOM_Msg.OnlineCheckData(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json") + }; + } + + [HttpPost] + [Route("OnlineCheckDataCount")] + public HttpResponseMessage OnlineCheckDataCount([FromBody] JObject jobj) + { + + return new HttpResponseMessage + { + Content = new StringContent(Analysis_MOM_Msg.OnlineCheckDataCount(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json") + }; + } + [HttpPost] + [Route("ReceivePrintTask")] + public HttpResponseMessage ReceivePrintTask([FromBody] JObject jobj) + { + + return new HttpResponseMessage + { + Content = new StringContent(Analysis_MOM_Msg.ReceivePrintTask(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json") + }; + } + } +} diff --git a/MisDataFun/MisDataFun/webApi/InitServer.cs b/MisDataFun/MisDataFun/webApi/InitServer.cs new file mode 100644 index 0000000..7c2b03d --- /dev/null +++ b/MisDataFun/MisDataFun/webApi/InitServer.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Formatting; +using System.Net.Http.Headers; +using System.Web.Http; +using System.Web.Http.Cors; +using System.Web.Http.SelfHost; + +namespace MisDataSaveDate +{ + public class InitServer + { + HttpSelfHostConfiguration config = null; + HttpSelfHostServer server = null; + public InitServer(string Url_WebApi) + { + // var Url_WebApi = System.Configuration.ConfigurationManager.AppSettings["Url_WebApi"]; + Init(Url_WebApi); + } + public void Init(string url) + { + config = new HttpSelfHostConfiguration(url); + + // 启用跨域 + config.EnableCors(new EnableCorsAttribute("*", "*", "*")); + // 启用特性路由 + config.MapHttpAttributeRoutes(); + + //config.Routes.MapHttpRoute( + // name: "DefaultApi", + // routeTemplate: "api/{controller}/{id}", + // defaults: new { id = RouteParameter.Optional } + //); + + // 自定义路由匹配到action + config.Routes.MapHttpRoute( + name: "API Default", + routeTemplate: "api/{controller}/{action}/{id}", + defaults: new { id = RouteParameter.Optional } + ); + + + + server = new HttpSelfHostServer(config); + + server.OpenAsync().Wait(); + + + } + public class JsonContentNegotiator : IContentNegotiator + { + private readonly JsonMediaTypeFormatter _jsonFormatter; + + public JsonContentNegotiator(JsonMediaTypeFormatter formatter) + { + _jsonFormatter = formatter; + } + public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable formatters) + { + var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json")); + return result; + } + } + } +} diff --git a/MisDataFun/MisDataFun/webApi/OnlineCheckData.cs b/MisDataFun/MisDataFun/webApi/OnlineCheckData.cs new file mode 100644 index 0000000..7369a65 --- /dev/null +++ b/MisDataFun/MisDataFun/webApi/OnlineCheckData.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; + +namespace MisDataSaveDate +{ + /// + /// OnlineCheckData + /// + + public class OnlineCheckData + { + /// + /// MsgId + /// + public string MsgId { get; set; } = ""; + /// + /// OpCode + /// + public string OpCode { get; set; } = ""; + /// + /// ProductionCode + /// + public string ProductionCode { get; set; } = ""; + /// + /// CheckTime + /// + public string ScanTime { get; set; } = ""; + + /// + /// CheckPerson + /// + public string CheckPerson { get; set; } = ""; + + /// + /// QualityMark + /// + public int QualityMark { get; set; } = 1; + + public List CheckData { get; set; } = new List(); + } + + public class OnlineCheckData_CheckData + { + /// + /// CheckCode + /// + public string CheckCode { get; set; } = ""; + /// + /// CheckName + /// + public string CheckName { get; set; } = ""; + /// + /// ProductionCode + /// + public string Unit { get; set; } + /// + /// StandardValue + /// + public string StandardValue { get; set; } = ""; + /// + /// MinValue + /// + public string MinValue { get; set; } = ""; + /// + /// MaxValue + /// + public string MaxValue { get; set; } = ""; + /// + /// CheckValue + /// + public string CheckValue { get; set; } = ""; + /// + /// QualityMark + /// + public int QualityMark { get; set; } = 1; + } + public class PrintTaskData + { + /// string msg = $"MARK|{printTemplete}|{productCode},{printDate}"; + + /// + /// printTemplete + /// + public string printTemplete { get; set; } = ""; + /// + /// productCode + /// + public string productCode { get; set; } = ""; + /// + /// printDate + /// + public string printDate { get; set; } = ""; + + } + + + + +} diff --git a/MisDataFun/MisDataFun/webApi/msgResHeader.cs b/MisDataFun/MisDataFun/webApi/msgResHeader.cs new file mode 100644 index 0000000..f7cacc2 --- /dev/null +++ b/MisDataFun/MisDataFun/webApi/msgResHeader.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MisDataSaveDate +{ + public class msgResHeader + { + /// + /// 任务ID + /// + public string MsgId + { + get; + set; + } + /// + /// 返回结果 + /// + public string Code + { + get; + set; + } + /// + /// 返回消息 + /// + public string Message + { + get; + set; + } + /// + /// 返回数据 + /// + public string Data + { + get; + set; + } + } + public class msgResHeader2 + { + /// + /// 任务ID + /// + public string MsgId + { + get; + set; + } + /// + /// 返回结果 + /// + public string Code + { + get; + set; + } + /// + /// 返回消息 + /// + public string Message + { + get; + set; + } + /// + /// 返回数据 + /// + public checkCountData Data + { + get; + set; + } + } + + public class checkCountData + { + /// + /// 检测次数 + /// + public int CheckCountOk + { + get; + set; + } + /// + /// 检测次数 + /// + public int CheckCountNg + { + get; + set; + } + } + +} diff --git a/MisDataFunction/Function1051/DataAccess/DataAccess.cs b/MisDataFunction/Function1051/DataAccess/DataAccess.cs new file mode 100644 index 0000000..a7f91fa --- /dev/null +++ b/MisDataFunction/Function1051/DataAccess/DataAccess.cs @@ -0,0 +1,16 @@ + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1051/DataAccess/vssver2.scc b/MisDataFunction/Function1051/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..1083b3a712c174825929c9349a2b942d85272021 GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns-IO!nD3i!d-SGB7Z>0O?()dp`1tLXb? x7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?upg+54&V{&q8aWMmesh3>L007j9D}Dd~ literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1051/Db.cs b/MisDataFunction/Function1051/Db.cs new file mode 100644 index 0000000..a0f37b3 --- /dev/null +++ b/MisDataFunction/Function1051/Db.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + public class Db + { + + } +} diff --git a/MisDataFunction/Function1051/Function08.csproj.vspscc b/MisDataFunction/Function1051/Function08.csproj.vspscc new file mode 100644 index 0000000..82c6db2 --- /dev/null +++ b/MisDataFunction/Function1051/Function08.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function08" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1051/Function1051.csproj b/MisDataFunction/Function1051/Function1051.csproj new file mode 100644 index 0000000..f473946 --- /dev/null +++ b/MisDataFunction/Function1051/Function1051.csproj @@ -0,0 +1,137 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {B5A0BAA3-C1A7-4AAB-9486-2E650ADACA7E} + Library + Properties + Function1051 + Function1051 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + AnyCPU + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\dll_common\MesWork.DeviceDriver.dll + + + False + ..\..\dll_common\Newtonsoft.Json.dll + + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 01-MesDataFunction + + + {1dc48c83-1842-4de8-acaf-26e1e7f7c58f} + 00_MyLog4Net + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1051/MesServerFunction/Function1051.cs b/MisDataFunction/Function1051/MesServerFunction/Function1051.cs new file mode 100644 index 0000000..b330d7e --- /dev/null +++ b/MisDataFunction/Function1051/MesServerFunction/Function1051.cs @@ -0,0 +1,305 @@ +using MesServerWork; +using System.Collections.Generic; +using System.Threading; +using MisDataFunDll; + + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = MisDataFun.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string TagID = e.TagID.ToString(); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 申请上线 + case "43": + PartLoad(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + // PLC 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + //物料扫码完成 + case "49": + fun_MaterislaScanOver(e); + break; + // 写入托盘号后通知MES + case "48": + string write_Pallet_res; + MIS_BASE.Read_TagTypeID(48, m_OpName, out write_Pallet_res); + if (write_Pallet_res.ToLower() == "true" || write_Pallet_res.ToLower() == "1") + { + SendMessageFun.SendInfomation("writePallet", "1", m_OpName); + } + MIS_BASE.WritePLC(70, m_OpName, false); + break; + case "63": + fun_ReqEarlyFeeding(e); + break; + case "64": + fun_ReqTestResistor(e); + break; + } + break; + } + } + } + //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) + //{ + // //lock1 = new object(); + // //lock (lock1) + // { + // switch (e.TagTypeCodeID.ToString()) + // { + // //PLC 工件到位 + // case "2": + // fun_WorkStart(e); + // break; + // //PLC 允许保存质量数据 + // case "19": + // fun_MesRead(e); + // break; + // //MES 保存数据完成 + // case "20": + // fun_MesReadOver(e); + // break; + // //PLC 传递机型 + // case "44": + // fun_EngineTypeGetOverPLC(e); + // break; + // //MES 合格放行 + // case "51": + // fun_ConfirmOkGo(e); + // break; + // //MES 不合格放行 + // case "8": + // fun_FalseGo(e); + // break; + // //MES 扫描条码 + // case "Barcode": + // fun_Barcode(e); + // break; + // //WEB 处理页面传递过来的数据 + // case "WebSubmit": + // fun_WebSubmit(e); + // break; + // } + // } + + //} + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //2.MES判断是否扫描完成 + //3.若扫描完成,则MES给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + //// ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + + /// + /// 提前上料 + /// + /// + /// + public void fun_ReqEarlyFeeding(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ReqEarlyFeeding, e); + } + + /// + /// 请求测试电阻 调用电阻仪 + /// + /// + /// + public void fun_ReqTestResistor(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem( ReqTestResistor, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + + /// + /// 保存完成 20 + /// + /// + /// + public void fun_MesReadOver(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 物料扫码完成 + /// + public void fun_MaterislaScanOver(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MaterialsScanOver, e); + } + + /// + /// 保存完成 19 + /// + /// + /// + public void fun_MesRead(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + public int fun_SubLineLoadPartCountMatch() + { + return SubLineLoadPartCountMatch; + } + + + /// + /// MES系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(HeartBeatMES, e); + } + /// + /// PLC系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatPLC(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + //ThreadPool.QueueUserWorkItem(HeartBeatPLC, e); + } + } +} diff --git a/MisDataFunction/Function1051/MesServerFunction/vssver2.scc b/MisDataFunction/Function1051/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..775bb6c2cec5286a8a28841a87000cdadd7c9c9a GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns*0KNcIiiZC!RGB7Z>0cq9~9XZ#vUHCzK6@A~# wVwc2{L`*uhI5@SaEVW3_tu!yWBr`uxAI31S(D#MO!o(PWjCcbJz2ssB0KKUy>Hq)$ literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1051/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1051/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..3ab6a12 --- /dev/null +++ b/MisDataFunction/Function1051/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,285 @@ +using System; +using System.Data; +using System.Threading; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 分线上总线的数量 + /// + public static int SubLineLoadPartCount = 2; + /// + /// 分线上总线已经匹配的数量 + /// + public static int SubLineLoadPartCountMatch = 0; + /// + /// 正常逻辑工作 + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0) + { + string msg = "【" + OpName + "】" + "PLC传递机型为空!"; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + //初始化物料临时表 + //第二步,将零件信息转移到零件_临时表中(本地BOM与订单BOM的选择显示关系) + //BaseDataSystemMES.MesServer_Process_EngineTypeOver_BQ_FirstOP(OpName); + + // 记录一下开工 + MisDataFun.OpWork_StartOrOver(OpName, EngineID, OrderForm, 1); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(OpName); + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(OpName); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(OpName); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(OpName); + //第四步,获取是否允许工作 + MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + // 暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + } + + + /// + /// 保存MOBY信息 + /// + /// + /// + /// + /// + private void SaveMobyMessage(string OpName, int engineTypeID, string engineType, string engineID, string orderForm) + { + + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineTypeID[OpName] = engineTypeID; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineType.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineType[OpName] = engineType; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineID[OpName] = engineID; + } + if (MIS_BASE.hashtable_EngineGetOver_OrderForm.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_OrderForm[OpName] = orderForm; + } + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + + int isRepair; + int engineTypeID; + + string engineType = ""; + string engineID = ""; + string palletCode = ""; + string orderForm = ""; + string repairCode = ""; + //从监控系统中查询出本工位信息 + //BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + //out orderForm, out engineTypeID, out engineType, + //out engineID, out palletCode, out isRepair, out repairCode); + + //EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + /// + /// 正常匹配分线和总线 + /// + /// + /// 总线工件号 + /// 总线工件机型代码 + /// 总线工件机型 + private void Match(string opName, string engineID, int engineTypeID, string engineType, int PartPallet_Code) + { + try + { + bool m_EngineGetOver_PLC_SubLine; + int engineTypeID_SubLine; + int partPallet_Code_SubLine; + int PalletInfo = 1;//总线托盘状态 + + string opName_SubLine = "";//分线工件信息 + string engineID_SubLine; + string engineType_SubLine; + string AlarmStr; + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + //第一步:获取分线中间交互工位号 + if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName)) + { + opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString(); + } + if (opName_SubLine == "") + { + return; + } + + //第二步:获取分线传递机型信号 + MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine); + if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配 + + //第三步:判断合格标志 + MIS_BASE.Read_PalletInfo(opName_SubLine, out PalletInfo); + if (PalletInfo == 2) return; //若不合格则返回不进行匹配 + string OrderForm; + //第四步:获取分线的信息,匹配验证 + MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm); + //判断分线数据是否合格 + //if (!BaseDataSystemMES.QulityDataVerify(opName, engineID_SubLine, out AlarmStr) && !BaseDataSystemMES.QualityVerifyStatus_Hash_Read(opName)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, opName); + // return; + //} + + //if (engineTypeID_SubLine == engineTypeID) + //{ + // BaseDataSystemMES.SubLineLoadPartCountMatch_Select(opName, out SubLineLoadPartCountMatch); + // SubLineLoadPartCountMatch = SubLineLoadPartCountMatch + 1; + // BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch); + + + // BaseDataSystemMES.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移 + // MIS_BASE.Write_Match(opName, true);//匹配结果 + // MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成 + // if(SubLineLoadPartCountMatch== SubLineLoadPartCount) + // { + // MIS_BASE.Write_FixAllow(opName, true); + // SubLineLoadPartCountMatch = 0; + // BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch); + + // } + + // SendMessageFun.SendInfomation("MatchSuccess", "1", opName); + // SendMessageFun.SendMessage(opName, 1, "Match");//匹配结果 + //} + //else + //{ + // MIS_BASE.Write_Match(opName, false);//匹配结果 + // MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成//68:1、取消返修;2、匹配成功 自己监控发送 MES|MatchingCompleted + + // //发送匹配完成和匹配结果信息 + // SendMessageFun.AsyncSendMessage_Notice(opName,"匹配失败,工件型号不匹配!"); + // SendMessageFun.SendInfomation("MatchSuccess", "0", opName); + // SendMessageFun.SendMessage(opName, 0, "Match");//匹配结果 + //} + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog("Match:" + err.ToString()); + + } + } + + + + /// + /// 强制匹配分线和总线 + /// + /// + private void ForceMatch(string opName) + { + try + { + //bool m_EngineGetOver_PLC_SubLine; + //bool m_EngineGetOver_PLC; + + //int engineTypeID_SubLine; + //int engineTypeID; + //int partPallet_Code_SubLine; + //int partPallet_Code; + + //string opName_SubLine = "";//分线工件信息 + //string engineID_SubLine; + //string engineType_SubLine; + //string engineID; + //string engineType; + //if (MIS_BASE.hashtable_OpNameRepair == null) + //{ + // MIS_BASE.InitHashtable_MesServerCode(); + //} + ////获取分线中间交互工位号 + //if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName)) + //{ + // opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString(); + //} + //if (opName_SubLine == "") + //{ + // return; + //} + + //MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine);//1:读取分线工件到位的传递机型信号。 + + //if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配 + + //MIS_BASE.Read_EngineGetOver_PLC(opName, out m_EngineGetOver_PLC);//2:读取总线工件到位的传递机型信号。 + + //if (!m_EngineGetOver_PLC) return;//必须工件同时到位才能进行匹配 + //string OrderForm; + //MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm);//获取分线的信息 + //MIS_BASE.GetEngineTypeFromPLC(opName, out engineTypeID, out engineType, out engineID, out partPallet_Code, out OrderForm); + + //Mis.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移 + + //MIS_BASE.Write_Match(opName, true);//匹配结果 + //MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成 + + //SendMessageFun.SendInfomation("MatchSuccess", "1", opName);//界面显示匹配成功 + + //MIS_BASE.Write_FixAllow(opName, true);//允许PLC工作 + + ////发送匹配完成和匹配结果信息 + //sendmessage(opName, 1, "MatchingComplete");//匹配完成 + //sendmessage(opName, 1, "Match");//匹配结果 + } + catch + { + + } + } + } +} diff --git a/MisDataFunction/Function1051/Methods/vssver2.scc b/MisDataFunction/Function1051/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7b1a830e089fcd043adbe14655de6a47457f2ded GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns*}68{X`MHm>E85kHmfOJ~O$9qb7uKbKZz9*0$ zCl&Mcy0#0L?*-(0vZUPDRtw>)==)|CyCjw*V$!L_!Kp=MsYQBjrFqFEnfZD8FouDJ zzHe$tMt({$gKJ)TW?rg$YKcEkrBh;YYIuH8wq9~ELvU$QZe~eHKG68`)FhBds7rue KaB5x(hz$Uptv&Go literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1051/OpcServer/Barcode.cs b/MisDataFunction/Function1051/OpcServer/Barcode.cs new file mode 100644 index 0000000..d7549ae --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/Barcode.cs @@ -0,0 +1,236 @@ +using System; +using System.Threading; +using System.Xml.Linq; + +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockBarcode = new object(); + + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + lock(lockBarcode) + { + try + { + //DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + //string OpName = Convert.ToString(msgEvent.OpName); + ////+*************DbName***************** + //string DbName = Convert.ToString(msgEvent.OpName); + //string barcode = Convert.ToString(msgEvent.TagValue); + + //int EngineTypeID;//机型代码 + //string EngineType;//机型 + //string EngineID;//工件编号 + + //string OrderForm; + //int Recipe1; + //int Recipe2; + + //bool IsNotRepeatedNumber = false; + ////1:获得申请上线信息后,扫描条码才处理业务 + //bool ispartload; + ////(115) + //int PTO; + ////(118)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + //int NgearSwitch; + ////(119)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + //int RgearSwitch; + ////(120)0=不检测;1=检测。检测线上线工位扫描总成条码,根据BOM,查出 + //int SpeedSensor; + ////(121)例如:5S 400。检测线上线工位扫描总成条码,根据BOM,查出 + //string PartTypeMid; + ////(122) 0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + //int Tcu_V; + ////判断工件是否到位 + //MIS_BASE.Read_WorkStart(OpName, out ispartload); + //if (!ispartload) + //{ + // SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否到位(DBX500.1=1)"); + // return; + //} + ////判断设备是否申请上线 + //MIS_BASE.Read_PartLoad(OpName, out ispartload); + //if (!ispartload) + //{ + // SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否申请上线(DBX500.3=1)"); + // return; + //} + //// 判读条码是变速器序列号条码号还是物料号 小机型*日月年* 流水号(给起始号 + 数量) + //// 选小机型 从北汽福田BOM中选 得先维护BOM + //// 变速器序列号 '1333 050 062*16012023*30000001' + + ////扫描完变速器序列号条码号 true + //bool isGetOver_PLC = false; + ////判断上线工位,MES 是否将工件流水号、机型等信息已经写入到PLC了 + // MIS_BASE.Read_EngineGetOver_PLC(OpName, out isGetOver_PLC); + + ////如果工件流水号、机型等信息没有写入PLC,扫描的条码按工件流水号进行验证 + ////否则按装配物料进行验证 + //if (!isGetOver_PLC) + //{ + + // if (barcode.Split('*').Length > 2) + // { + // //2: 判断是否重号, 从数据库获得机型、机型代码等信息 + // string partSn = barcode; + // EngineID = barcode; + + // MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID_MES, EngineID); + + // //Db.GetEngineType( partSn, out EngineTypeID, out EngineType, out EngineID, out IsRepeatedNumber); + // //Db.GetEngineType( partSn, out EngineTypeID, out EngineType, out EngineID, out IsRepeatedNumber); + + // //IsRepeatedNumber true 不重号;false 重号; + // IsNotRepeatedNumber = BaseDataSystemMES.EngineTypeID_IsNotRepeatedNumber(partSn); + // if (IsNotRepeatedNumber) + // { + // BaseDataSystemMES.GetEngineTypeUpLoadOpName(partSn, OpName, out EngineTypeID, out EngineType, out OrderForm, out Recipe1, out Recipe2); + + // //MIS_BASE.Write_EngineID_MES(OpName, EngineID); + // //MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + // //MIS_BASE.Write_EngineType_MES(OpName, EngineType); + // //MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + + // BaseDataSystemMES.UpLoadPTO(EngineType, out PTO, out NgearSwitch, out RgearSwitch, out SpeedSensor, out PartTypeMid, out Tcu_V); + // //PTO + // MIS_BASE.WritePLC(115, OpName, PTO); + // //空挡开关检测 + // MIS_BASE.WritePLC(95, OpName, NgearSwitch); + // //倒挡开关检测 + // MIS_BASE.WritePLC(96, OpName, RgearSwitch); + // //里程表检测 + // MIS_BASE.WritePLC(97, OpName, SpeedSensor); + // //大机型扩展 + // MIS_BASE.WritePLC(98, OpName, PartTypeMid); + // //TCU + // MIS_BASE.WritePLC(122, OpName, Tcu_V); + // string tagStartAdr;//= "DB411.10"; + + // // 先查询配方号 根据工位号 去moby表查配方号 + // // 根据配方号 去配方表查配方数据 + // // 写入配方数据 + // BaseDataSystemMES.PLCRcipeCurrent(OpName, out byte[] bytes, out tagStartAdr); + // DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID("94", OpName, System.Text.Encoding.ASCII.GetString(bytes)); + // ////将产品信息写入PLC + // MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + // MIS_BASE.Write_EngineType_MES(OpName, EngineType); + // MIS_BASE.Write_EngineID_MES(OpName, EngineID); + // MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + // //写入到数据库的[北汽福田工位状态监控MOBY]表中 + // //MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString()); + // //MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType_MES, EngineType); + // MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID_MES, EngineID); + // //MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm_MES, OrderForm); + + + // // 工位号],[订单号],[产品型号代码],[变速器序列号],[发动机型号],[机型基本代码],[变速器总成号] ,[托盘号] + // // [产品型号代码_MES],[变速器序列号_MES],[发动机型号_MES] + // // [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位] + // // [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格] + // // [工号],[班次],[是否返修件],[合格放行],[不合格放行],[扫描条码] + + // //MisDataFun.OpName_MIS_MOBY_Insert(OpName, "产品型号代码_MES", EngineTypeID.ToString()); + // //MisDataFun.OpName_MIS_MOBY_Insert(OpName, "发动机型号_MES", EngineType); + + // MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); + + // //Thread.Sleep(5000); + // //MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + + // //等待PLC将数据写入RFID;写入PLC的DB块,通知MES验证RFID机型数据是否正确传递 + + // //通知web显示 + // SendMessage.ShowMoby(OpName); + // //SendMessageFun.SendMessage("1235", "1111", OpName); + // } + // else + // { + // SendMessageFun.SendInfomation("EngineIDRepeat", "partSn", OpName); + // } + // } + // else + // { + // SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号格式不正确,请确认!"); + + // } + //} + //else//验证物料 + //{ + // //物料号 + // { + // //读取PLC的传递机型信号 + // bool tagValue; + // MIS_BASE.Read_EngineGetOver_PLC(OpName, out tagValue); + // if (tagValue) + // { + // //验证物料 + // BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out bool IsSuccess); + // if (!IsSuccess)//???? + // { + // SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + // return; + // } + // else + // { + // SendMessageFun.SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + // } + // //判断物料是否验证完成 + // BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out int IsAllowWork); + + + // if (IsSuccess) + // { + // if (IsAllowWork == 1) + // { + // //移到允许保存信号中 + // //BaseDataSystemMES.Material_Insert(OpName, 1); + + // ////更新订单完工数量及物料 + // SendMessageFun.SendMessage("24", "11", OpName); + + // //物料验证完成,通知PLC允许工作,允许工作在保存完成时清空 + // MIS_BASE.Write_FixAllow(OpName, true); + // } + // else + // { + // SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + // } + // } + // else + // { + // SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + // } + // } + // else + // { + // SendMessage.AsyncSendMessage_Notice(OpName, "产品上线后,PLC获得变速器序列号后,再验证物料!"); + // } + + // } + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:Barcode"); + } + } + + } + + + } +} diff --git a/MisDataFunction/Function1051/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1051/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..cd25655 --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/EngineGetOver.cs @@ -0,0 +1,108 @@ +using System; +using System.Data; +using MesServerWork; +using MisDataFunDll; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockBarcodeEngineTypeGetOver = new object(); + + + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + lock(lockBarcodeEngineTypeGetOver) + { + + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + //判断PLC机型与MES机型是否一致 + if (tagValue == 1) + { + bool MesRead = false; + + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + string OrderForm_MES; + + MIS_BASE.Read_QualityData_Read_CF(OpName, out MesRead); + //第一步,判断允许保存和保存完成信号是否全部被清空,若未清空,则通知复位MES&PLC + if (MesRead) + { + //未能清空信号,请求复位 + string msg = "【" + OpName + "】" + "未能清空MesRead信号,请求复位!"; + SendMessageFun.SendInfomation("AskReset", "1", OpName); + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + return; + } + + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES); + + // 读取MES区数据 校验MES区数据是否符合 同时判断是否此工件已工作过,若已工作过则弹出弹窗提示 + if (EngineTypeID == EngineTypeID_MES & EngineID == EngineID_MES & EngineType == EngineType_MES & OrderForm == OrderForm_MES) + { + if (EngineTypeID == 0 || EngineID == "" || EngineType == "" || OrderForm == "") + { + string msg = "【" + OpName + "】" + "传递机型数据为空!"; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + return; + } + + + //写入到数据库的[北汽福田工位状态监控MOBY]表中 + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineTypeID, EngineTypeID.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineType, EngineType); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineID, EngineID); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.OrderForm, OrderForm); + + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + + // 将工序数据转入临时表中 + MisDataFun.ProcessDataToTemp(OpName, EngineTypeID_MES, OrderForm_MES, EngineID_MES); + SendMessageFun.SendMessage("5123", "11111", OpName); + } + else + { + string msg = "【" + OpName + "】" + "PLC与MES信息不一致!"; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + + } + else + { + MIS_BASE.Write_FixAllow(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:EngineTypeGetOver_PLC"); + } + } + + } + + + + } +} diff --git a/MisDataFunction/Function1051/OpcServer/MaterialsScanOver.cs b/MisDataFunction/Function1051/OpcServer/MaterialsScanOver.cs new file mode 100644 index 0000000..665afe9 --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/MaterialsScanOver.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Threading; +//using SystemFramework; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 物料扫码完成 + /// + /// + /// + private void MaterialsScanOver(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + + if (tagValue == 1) + { + MIS_BASE.GetEngineTypeFromPLC(OpName, out int EngineTypeID, out string EngineType, out string EngineID, out int PartPallet_Code, out string OrderForm); + string materialsCode = MIS_BASE.ReadPLC(40, OpName).ToString(); + var dt = MisDataFun.Get_MaterialsScanOverRes(OpName, OrderForm, EngineID, materialsCode); + int result = Convert.ToInt32(dt.Rows[0]["result"]); + if (result == 1) + { + MIS_BASE.WritePLC(95, OpName, 1); + } + else if (result == 2) + { + MIS_BASE.WritePLC(95, OpName, 2); + } + } + else + { + MIS_BASE.WritePLC(96, OpName, 0); // 提前上料位置 + MIS_BASE.WritePLC(33, OpName, false); // 允许提前上料 + MIS_BASE.Write_EngineID_MES(OpName, ""); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/MesRead.cs b/MisDataFunction/Function1051/OpcServer/MesRead.cs new file mode 100644 index 0000000..e401ccc --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/MesRead.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockMesRead = new object (); + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + try + { + int EngineTypeID; + string EngineType; + string EngineID; + int PartPallet_Code; + string OrderForm; + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + string OrderForm_MES; + + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int qualityMask; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID,out PartPallet_Code, out OrderForm); + + // 保存质量数据 + qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + + // 保存物料数据 + MisDataFun.Material_Insert(OpName, qualityMask); + + // 保存过站信息 + MisDataFun.OpWork_StartOrOver(OpName, EngineID, OrderForm, 2); + + // 存追溯表数据 同时质量数据存入 接口表 + //MisDataFun.WorkOrderOpWorkOver(OpName, EngineID, OrderForm); + + // 推送质量数据到MES的页面 + SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + + //对应手动工位的 + //MIS_BASE.Write_ConfirmOkGo(OpName, true); + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //统计在线产量,在线节拍 + SendMessage.SendActuallyCount(OpName, tagValue); + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/MesReadOver.cs b/MisDataFunction/Function1051/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..1b7206b --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/MesReadOver.cs @@ -0,0 +1,36 @@ +using System; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + try + { + //DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + //string OpName = Convert.ToString(msgEvent.OpName); + //int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //if (tagValue == 1) + //{ + + // BaseDataSystemMES.Material_Insert(OpName, tagValue); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/PartLoad.cs b/MisDataFunction/Function1051/OpcServer/PartLoad.cs new file mode 100644 index 0000000..6a2d31d --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/PartLoad.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Threading; +//using SystemFramework; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 申请上线(针对上线工位) + /// + /// + /// + private void PartLoad(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + + if (tagValue == 1) + { + // 读取当前选择的计划中的机型,写入PLC + // 获取订单的机型 + var OrderTD = MisDataFun.GetEngineType_Order(OpName); + if (OrderTD.Rows.Count > 0) + { + string OrderForm = OrderTD.Rows[0]["制造编号"].ToString(); + string EngineID = OrderTD.Rows[0]["间隔编号"].ToString(); + string EngineType = OrderTD.Rows[0]["间隔图号"].ToString(); + int EngineTypeID = Convert.ToInt32(OrderTD.Rows[0]["产品型号代码"]); + + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineType_MES, EngineType); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineID_MES, EngineID); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.OrderForm_MES, OrderForm); + + // 写入机型代码 (大机型) 机型 发动机号 订单号 + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + // MES传递机型 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); + } + else + { + string msg = "【" + OpName + "】" + "无可用生产计划 请确认!"; + // 判断到线体上有滞留工件 ,让去管理系统进行处理 + SendMessage.AsyncSendMessage_Notice(OpName, msg); + MyLog4Net.MyLogHelper.Error("PartLoad", msg); + return; + } + } + else + { + //上线工位清MES传递机型信号 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/ReqEarlyFeeding.cs b/MisDataFunction/Function1051/OpcServer/ReqEarlyFeeding.cs new file mode 100644 index 0000000..729f519 --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/ReqEarlyFeeding.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Threading; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 申请提前上料 + /// + /// + /// + private void ReqEarlyFeeding(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + + if (tagValue == 1) + { + var dt = MisDataFun.Get_ReqEarlyFeedingData(OpName); + int result = Convert.ToInt32(dt.Rows[0]["result"]); + string msg = dt.Rows[0]["msg"].ToString(); + int EngineTypeID = Convert.ToInt32(dt.Rows[0]["产品型号代码"]); + if (result == 1) + { + MIS_BASE.WritePLC(96, OpName, EngineTypeID); // 产品型号 + MIS_BASE.Write_EngineID_MES(OpName, dt.Rows[0]["工件编号"].ToString()); + int ReadEngineID = Convert.ToInt32(MIS_BASE.ReadPLC(96, OpName)); + if (EngineTypeID != ReadEngineID) + { + MyLog4Net.MyLogHelper.Error("ReqEarlyFeeding", $"写入提前上料机型{EngineTypeID.ToString()} 与 读取到的{ReadEngineID.ToString()}不一致"); + return; + } + if (EngineTypeID == 0 || ReadEngineID == 0) + { + MyLog4Net.MyLogHelper.Error("ReqEarlyFeeding", $"写入提前上料机型{EngineTypeID.ToString()} 与 读取到的{ReadEngineID.ToString()} 其中存在空值"); + return; + } + MIS_BASE.WritePLC(33, OpName, true); // 允许提前上料 + + } + else if (result == 2) + { + MIS_BASE.WritePLC(33, OpName, false); + string msg2 = "【" + OpName + "】" + msg; + MyLog4Net.MyLogHelper.Error("ReqEarlyFeeding", msg2); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + return; + } + } + else + { + MIS_BASE.WritePLC(96, OpName, 0); // 提前上料位置 + MIS_BASE.WritePLC(33, OpName, false); // 允许提前上料 + MIS_BASE.Write_EngineID_MES(OpName, ""); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/ReqTestResistor.cs b/MisDataFunction/Function1051/OpcServer/ReqTestResistor.cs new file mode 100644 index 0000000..7418852 --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/ReqTestResistor.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Net.Http; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using MesServerWork; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + private readonly object _lockObject = new object(); + private volatile bool _isTestOk = false; + private string _opName; + private const int DEFAULT_TIMEOUT = 7000; // 默认超时时间(毫秒) + private const int MAX_RETRY_COUNT = 10; // 最大重试次数 + private const int RESULT_LENGTH = 113; // 预期结果长度 + + /// + /// 电阻测试 + /// + private void ReqTestResistor(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + _opName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + TestResistor().GetAwaiter().GetResult(); + } + else + { + ResetPLCValues(); + } + } + catch (Exception err) + { + MyLog4Net.MyLogHelper.Error("电阻测试", $"测试过程发生错误: {err.Message}"); + ErrPLCValues(); + } + } + + /// + /// 执行电阻测试 + /// + private async Task TestResistor() + { + TcpClient tcpClient = null; + try + { + string IP = ConfigurationManager.AppSettings["ResistorDeviceIP_"+_opName]; + string Port = ConfigurationManager.AppSettings["ResistorDevicePort"]; + + using (tcpClient = new TcpClient()) + { + var connectTask = tcpClient.ConnectAsync(IP, Convert.ToInt32(Port)); + if (await Task.WhenAny(connectTask, Task.Delay(DEFAULT_TIMEOUT)) != connectTask) + { + throw new TimeoutException(_opName+"连接电阻仪超时"); + } + + if (tcpClient.Connected) + { + MyLog4Net.MyLogHelper.Info(_opName + "电阻测试", "电阻仪链接成功!"); + await SendCommand(tcpClient, "01 09 64 00 05 00 00 00 00 00 73"); + + await Task.Delay(DEFAULT_TIMEOUT); + + var readTask = Task.Run(() => Read(tcpClient)); + + int count = 0; + while (!_isTestOk && count < MAX_RETRY_COUNT) + { + await Task.Delay(1000); + await SendCommand(tcpClient, "03 01 04"); + count++; + } + + if (count >= MAX_RETRY_COUNT && !_isTestOk) + { + MyLog4Net.MyLogHelper.Error(_opName + "电阻测试", "测试超时,未收到有效结果"); + ErrPLCValues(); + } + } + } + } + catch (Exception ex) + { + MyLog4Net.MyLogHelper.Error(_opName + "电阻测试", $"测试过程发生错误: {ex.Message}"); + ErrPLCValues(); + } + finally + { + if (tcpClient != null) + { + tcpClient.Close(); + MyLog4Net.MyLogHelper.Info(_opName + "电阻测试", "电阻仪链接关闭"); + } + } + } + + private void ResetPLCValues() + { + lock (_lockObject) + { + MIS_BASE.WritePLC(202, _opName, 0); + MIS_BASE.WritePLC(203, _opName, 0); + MIS_BASE.WritePLC(204, _opName, 0); + MIS_BASE.WritePLC(34, _opName, false); + } + } + + private void ErrPLCValues() + { + lock (_lockObject) + { + MIS_BASE.WritePLC(202, _opName, 0); + MIS_BASE.WritePLC(203, _opName, 0); + MIS_BASE.WritePLC(204, _opName, 0); + MIS_BASE.WritePLC(34, _opName, true); + } + } + + /// + /// 发送命令到电阻仪 + /// + private async Task SendCommand(TcpClient tcpClient, string command) + { + try + { + // 将空格分隔的HEX字符串转换为字节数组 + string[] hexValues = command.Split(' '); + byte[] commandbyte = new byte[hexValues.Length]; + + for (int i = 0; i < hexValues.Length; i++) + { + commandbyte[i] = Convert.ToByte(hexValues[i], 16); + } + + // 发送HEX格式的数据 + await tcpClient.Client.SendAsync(new ArraySegment(commandbyte), SocketFlags.None); + + // 记录发送的命令 + MyLog4Net.MyLogHelper.Info(_opName + "电阻测试Send", $"发送命令: {command}"); + } + catch (Exception err) + { + MyLog4Net.MyLogHelper.Error(_opName + "电阻测试Send", $"发送命令失败: {err.Message}"); + throw; + } + } + + private void Read(TcpClient tcpClient) + { + try + { + while (!_isTestOk) + { + if (tcpClient != null && tcpClient.Connected) + { + byte[] byteCommand = new byte[1024]; + int icommand = tcpClient.Client.Receive(byteCommand); + string hexString = BitConverter.ToString(byteCommand, 0, icommand).Replace("-", " "); + + if (hexString.Length == RESULT_LENGTH) + { + DataAnalysis(hexString); + } + } + } + } + catch (Exception err) + { + MyLog4Net.MyLogHelper.Error(_opName + "电阻测试Read", err.Message); + } + } + + private void DataAnalysis(string hexString) + { + try + { + var byteArray = HexStringToByteArray(hexString.Replace(" ", "")); + var start = 2; + + var 状态 = BitConverter.ToInt32(byteArray.Skip(start + 0).Take(4).ToArray(), 0); + if (状态 != 2) return; + var 电压V = BitConverter.ToDouble(byteArray.Skip(start + 4).Take(8).ToArray(), 0); + var 电流A = BitConverter.ToDouble(byteArray.Skip(start + 12).Take(8).ToArray(), 0); + var 电阻uΩ = BitConverter.ToDouble(byteArray.Skip(start + 20).Take(8).ToArray(), 0) * 1000000; + var yyyy = BitConverter.ToUInt16(byteArray.Skip(start + 28).Take(2).ToArray(), 0); + var MM = byteArray[start + 30]; + var dd = byteArray[start + 31]; + var HH = byteArray[start + 32]; + var mm = byteArray[start + 33]; + var ss = byteArray[start + 34]; + var datetime = $"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}"; + + lock (_lockObject) + { + MIS_BASE.WritePLC(202, _opName, 电压V); + MIS_BASE.WritePLC(203, _opName, 电流A); + MIS_BASE.WritePLC(204, _opName, 电阻uΩ); + MIS_BASE.WritePLC(34, _opName, true); + _isTestOk = true; + } + + MyLog4Net.MyLogHelper.Info(_opName + "电阻测试", $"电阻结果写入完毕 【电压】{电压V}【电流】{电流A}【电阻】{电阻uΩ}"); + } + catch (Exception ex) + { + MyLog4Net.MyLogHelper.Error(_opName + "电阻测试DataAnalysis", $"数据分析错误: {ex.Message}"); + } + } + + public static byte[] HexStringToByteArray(string hex) + { + if (hex.Length % 2 != 0) + { + throw new ArgumentException("十六进制字符串长度必须是偶数"); + } + + byte[] bytes = new byte[hex.Length / 2]; + for (int i = 0; i < hex.Length; i += 2) + { + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + } + return bytes; + } + } +} \ No newline at end of file diff --git a/MisDataFunction/Function1051/OpcServer/WebSubmit.cs b/MisDataFunction/Function1051/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..71febbc --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/WebSubmit.cs @@ -0,0 +1,410 @@ +using System; +using MesServerWork; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +using MisDataFunDll; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + var msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string opName_SubLine = ""; + string engineID = "";//工件信息 + string[] dataArray = Content.Split('|'); + + if (dataArray.Length != 2) + return; + + + string m_Command = dataArray[0].ToString();//消息类型 + string m_Value = dataArray[1].ToString();//消息参数 + string[] m_Value_array = m_Value.Split('&');//消息参数数量 + int m_Value_length = m_Value_array.Length; //消息参数长度 + + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + DeviceDriver_BasicData.CustomeEvetnArgs _e = new DeviceDriver_BasicData.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + string msg; + bool bolVal; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //修改托盘状态 + + //MisDataFun.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + //BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + //BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + + case "NullWorkGo"://空托盘放行 0不放行 1放行 + try + { + int a = Convert.ToInt32(m_Value); + //修改地址值 + MIS_BASE.Write_PartPalletGoOver(OpName, a); + if (a == 1) + { + SendMessage.AsyncSendMessage_Notice(OpName, "开启空托盘放行!"); + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "关闭空托盘放行!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + + break; + case "FixAllow"://重新拧紧 + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + MIS_BASE.Write_RepairUpline_MES(opName_SubLine, true); + //MIS_BASE.Write_PalletInfo(opName_SubLine, 4); + //MIS_BASE.Write_UpdatePalletOK(opName_SubLine, true); + MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true); + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.WritePLC(113, OpName, Convert.ToInt32(m_Value)); + Thread.Sleep(500); + MIS_BASE.WritePLC(70, OpName, true); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + } + else if (Convert.ToInt32(m_Value) == 0) + { + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + break; + //强制匹配 + case "ForceMatch": + if (Convert.ToInt32(m_Value) == 1) + { + ForceMatch(OpName); + } + break; + case "PalletGO": + + if (Convert.ToInt32(m_Value) == 1) + { + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true); + } + break; + case "ContinueMatch": + //BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + fun_EngineTypeGetOverPLC(_e); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + // 检查项 检查完成 + case "checkWorkOver": + MIS_BASE.WritePLC(30, OpName,1); + msg = "MES|checkWorkOverIsShow|" + OpName + "|" + 0; + SendMessage.AsyncSendMessage(msg); + break; + // 重新申请上线 + case "againPartLoad": + // 判断是否有工件到位 + MIS_BASE.Read_WorkStart(OpName, out bolVal); + if (bolVal) + { + MIS_BASE.WritePLC(35, OpName, 1); + msg = "【" + OpName + "】" + "重新申请上线完成!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + else + { + msg = "【" + OpName + "】" + "当前无工件到位信号,请确认是否存在工件!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + break; + // 跳过交互 + case "skipWork": + // 判断是否有工件到位 + MIS_BASE.Read_WorkStart(OpName, out bolVal); + if (bolVal) + { + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); // 传递机型 + MIS_BASE.Write_FixAllow(OpName,true); // 允许工作 + MIS_BASE.WritePLC(30, OpName, 1); // 检查完成 + MIS_BASE.Write_MesReadOver(OpName, true); // 保存完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); // 工作完成 + msg = "【" + OpName + "】" + "跳过交互完成!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + else + { + msg = "【" + OpName + "】" + "当前无工件到位信号,请确认是否存在工件!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + break; + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:WebSubmit"); + } + } + + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + //BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + SendMessageFun.SendMessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + + + /// + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + InitOpPosion(Opname); + + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(Opname); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(Opname); + // MOBY数据 + SendMessageFun.SendMessage("5", "1", Opname); + //SendMessageFun.SendMessage("5123", "1111", Opname); + // 物料信息 物料信息 + SendMessage.MaterialList(Opname); + + // 新增查询PLC直通状态 网页显示 + //MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + InitAlarm(Opname); + } + + //分线发送工件到位信号函数 + private void sendmessage(string OpName, int tagValue, string Command) + { + string SendMessage; + SendMessage = "MES|" + Command + "|" + OpName + "|" + tagValue; + SendMessageFun.AsyncSendMessage(SendMessage); + + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + + private void InitOpPosion(string Opname) + { + int S_WorkCheckOver = Convert.ToInt32(MIS_BASE.ReadPLC(30, Opname)); + string S_WorkCheckOver_Msg = "MES|checkWorkOverIsShow|" + Opname + "|" + S_WorkCheckOver; + SendMessage.AsyncSendMessage(S_WorkCheckOver_Msg); + + bool S_WorkStart;//工件到位 DBX0.1 + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + if (S_WorkStart == true) + { + SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + //---------------------------------------------------- + bool S_PartLoad;//申请上线 + MIS_BASE.Read_PartLoad(Opname, out S_PartLoad); + if (S_PartLoad == true) + { + SendMessageFun.SendInfomation("PartLoad", Convert.ToString(Convert.ToInt32(S_PartLoad)), Opname); + } + //---------------------------------------------------- + bool S_EngineGetOver;//传递机型 DBX0.4 + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + if (S_EngineGetOver == true) + { + SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(Opname); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(Opname); + } + //---------------------------------------------------- + bool S_FixAllow;//允许工作 DBX3.1 + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + if (S_FixAllow == true) + { + SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + //---------------------------------------------------- + bool S_MesRead;//允许保存 DBX3.1 + MIS_BASE.Read_QualityData_Read_CF(Opname, out S_MesRead); + if (S_MesRead == true) + { + SendMessageFun.SendInfomation("MesRead", Convert.ToString(Convert.ToInt32(S_MesRead)), Opname); + } + //---------------------------------------------------- + bool S_ReadOver;//保存完成 + MIS_BASE.Read_MesReadOver(Opname, out S_ReadOver); + if (S_ReadOver == true) + { + SendMessageFun.SendInfomation("MesReadOver", Convert.ToString(Convert.ToInt32(S_ReadOver)), Opname); + } + //---------------------------------------------------- + bool S_MaterialVerifyOver;//工作完成 DBX0.3 + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + if (S_MaterialVerifyOver == true) + { + SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + //---------------------------------------------------- + int S_QualityMask;//合格标志 DBX588 + MIS_BASE.Read_QualityMask(Opname, out S_QualityMask); + if (S_QualityMask == 1) + { + SendMessageFun.SendInfomation("QualityMask", Convert.ToString(Convert.ToInt32(S_QualityMask)), Opname); + } + //---------------------------------------------------- + string S_plcStatus = "false";//DBX501.5 PLC直通,1 强制放行 0 正常循环 + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/WorkStart.cs b/MisDataFunction/Function1051/OpcServer/WorkStart.cs new file mode 100644 index 0000000..91e7893 --- /dev/null +++ b/MisDataFunction/Function1051/OpcServer/WorkStart.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using MesServerWork; +using MisDataFunDll; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //线首显示订单信息 + + if (tagValue == 1) + { + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStart, tagValue.ToString()); + } + else + { + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartOut, DateTime.Now.ToString()); + + // 清除工位数据 + MIS_BASE.Write_EngineTypeID_MES(OpName, 0); + MIS_BASE.Write_EngineType_MES(OpName, ""); + MIS_BASE.Write_EngineID_MES(OpName, ""); + MIS_BASE.Write_OrderForm_MES(OpName, ""); + + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + + MIS_BASE.WritePLC(115, OpName, 0); // 清除小机型 + + // 检查项完成 + MIS_BASE.Write_TagTypeID(30, OpName,0); + string message = "MES|checkWorkOverIsShow|" + OpName + "|" + 0; + SendMessage.AsyncSendMessage(message); + + // 重新申请上线 + MIS_BASE.WritePLC(35, OpName, 0); + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:WorkStart"); + } + } + } +} diff --git a/MisDataFunction/Function1051/OpcServer/vssver2.scc b/MisDataFunction/Function1051/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..e8dac030e24a9f14a458a7c97e3861bfe6c809ba GIT binary patch literal 305 zcmXpJVq~~_m%l5bInsUAj6{**Nns+_=kIa%7GYpuXJBCP0n*3#ml{83a^YtL@_m8) zySMi5Jr)At`vLjWcV#zAuz7*y{ek=&alNlvUO?mnfc(Rym#+W!fXD{|`E#_F)P9@i z0ahObh}+|IW22J=<)eKU()5=#;>>D1!j)S|M~B0aa#yyTM1{5*Xa!@xq{zaSYR z%ixq)l$@WEs+U~M;GCbAmRXeRpY5Ix;=1OgXXd54r + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1051/vssver2.scc b/MisDataFunction/Function1051/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..93af295aeee8cbcfcddcf8158fccf2319380e0d8 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+J*A;wn5Mf|oVqjo!1kz6~Y;1b5$DN-M$aezr z|2D3^4dbim`(_rqB$gy%(y7J4sYPX}MS5QNFSudF*!N4xR?RK)JraA004LBDq{cu literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1052/Function02.csproj.vspscc b/MisDataFunction/Function1052/Function02.csproj.vspscc new file mode 100644 index 0000000..0f0f36c --- /dev/null +++ b/MisDataFunction/Function1052/Function02.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1052/Function1052.csproj b/MisDataFunction/Function1052/Function1052.csproj new file mode 100644 index 0000000..097bfab --- /dev/null +++ b/MisDataFunction/Function1052/Function1052.csproj @@ -0,0 +1,170 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {5FEE5C91-8419-49FF-B2C2-47476F0B8C68} + Library + Properties + Function1052 + Function1052 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\dll_common\MesWork.DeviceDriver.dll + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\dll_common\Newtonsoft.Json.dll + + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + {1dc48c83-1842-4de8-acaf-26e1e7f7c58f} + 00_MyLog4Net + + + + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1052/MesServerFunction/Fun_1052.cs b/MisDataFunction/Function1052/MesServerFunction/Fun_1052.cs new file mode 100644 index 0000000..78466e6 --- /dev/null +++ b/MisDataFunction/Function1052/MesServerFunction/Fun_1052.cs @@ -0,0 +1,250 @@ +using MesServerWork; +using System.Collections.Generic; +using System.Threading; +using MisDataFunDll; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = MisDataFun.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string TagID = e.TagID.ToString(); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //PLC 工位合格标志 + case "21": + fun_IsOk(e); + break; + //MES保存实时质量数据 + case "65": + fun_MesSaveNowData(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + case "63": + fun_ReqEarlyFeeding(e); + break; + case "64": + fun_ReqTestResistor(e); + break; + } + break; + } + } + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + /// + /// 允许保存 + /// + /// + /// + public void fun_MesRead(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 提前上料 + /// + /// + /// + public void fun_ReqEarlyFeeding(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ReqEarlyFeeding, e); + } + + /// + /// 请求测试电阻 调用电阻仪 + /// + /// + /// + public void fun_ReqTestResistor(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ReqTestResistor, e); + } + + /// + /// 保存完成 + /// + /// + /// + public void fun_MesReadOver(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + + /// + /// 工位是否合格 + /// + /// + /// + public void fun_IsOk(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(IsOk, e); + } + + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + + /// + /// MES实时保存质量数据 + /// + /// + /// + public void fun_MesSaveNowData(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(MesSaveNowData, e); + } + } +} diff --git a/MisDataFunction/Function1052/MesServerFunction/vssver2.scc b/MisDataFunction/Function1052/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6753ef90a913bdd4b6a6e13279c279421ee GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZA`fUU7iM5!WME)e0i;h@ES~1HVh2BnucGgp xS?rQnl88yC76+#mm8BNxxs~Q6mt^MW>BATXM*6-mS(q3DkP&ZSq?cUG00296EHVH9 literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1052/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1052/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..5767df1 --- /dev/null +++ b/MisDataFunction/Function1052/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,106 @@ +using System; +using System.Data; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code, string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0) + { + string msg = "【" + OpName + "】" + "PLC传递机型为空!"; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + MisDataFun.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + SendMessageFun.SendMessage("123", "111", OpName); + //MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 合格标志暂时改为即时响应式的 + MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + //SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + //第四步,获取是否允许工作 + MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + } + + /// + /// 二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_two(string OpName) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, Convert.ToInt32(PartPallet_Code), OrderForm); + + } + /// + /// 跳过二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_Skip(string OpName) + { + //MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + //MisDataFun.OpName_MIS_Moby_Select(OpName, + //out orderForm, out engineTypeID, out engineType, + //out engineID, out palletCode, out isRepair, out repairCode); + + //EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode), orderForm); + } + } +} diff --git a/MisDataFunction/Function1052/Methods/vssver2.scc b/MisDataFunction/Function1052/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7782f6f99fca64d9060da64295d333bbcfa49824 GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JE?f#+Da^pY%)r2~3P|^c1<5e@?B{0!@>c`- z*BM{*UOT>@pApDk1LQlN`r!fNtLXb?7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?up zk-l$gNk)E3F@tMfdS+g#duoY4P^D91acX#eQMO)kF+*@^Qf_8RNIuZ`^3)`dNT^GI LUT|t&3WyB=bO1u# literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1052/OpcServer/Barcode.cs b/MisDataFunction/Function1052/OpcServer/Barcode.cs new file mode 100644 index 0000000..6d2013c --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/Barcode.cs @@ -0,0 +1,89 @@ +using System; +using System.Windows.Forms; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + if (!EngineGetOver_PLC_NextWorkStep) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + return; + } + //物料验证 + MisDataFun.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + + + + //获取是否允许工作 + MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //此处逻辑有问题 需要考虑到批次扫描 提示PLC未传递机型的情况 + if (IsAllowWork == 1) + { + //BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + SendMessageFun.SendMessage("24", "11", OpName); + + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1052/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1052/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..4cac79f --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/EngineGetOver.cs @@ -0,0 +1,114 @@ +using System; +using System.Data; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + //判断PLC机型与MES机型是否一致 + if (tagValue == 1) + { + bool MesRead = false; + + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + string EngineType;//机型 + string EngineID;//工件编号 + + //上线工位清MES传递机型信号 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + + MIS_BASE.Read_QualityData_Read_CF(OpName, out MesRead); + //第一步,判断允许保存和保存完成信号是否全部被清空,若未清空,则通知复位MES&PLC + if (MesRead) + { + //未能清空信号,请求复位 + string msg = "【" + OpName + "】" + "未能清空MesRead信号,请求复位!"; + SendMessageFun.SendInfomation("AskReset", "1", OpName); + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + return; + } + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + + // 读取MES区数据 校验MES区数据是否符合 同时判断是否此工件已工作过,若已工作过则弹出弹窗提示 + if (EngineTypeID != 0 & EngineID != "" & EngineType != "" & OrderForm != "") + { + DataTable checkTable = MisDataFun.WorkOrderCheck(OpName, EngineID, OrderForm, EngineType); + int result = Convert.ToInt32(checkTable.Rows[0]["result"]); + //int result = 1; + string resultMsg = "";// checkTable.Rows[0]["msg"].ToString(); + if (result != 2) + { + if (result == 3) + { + string msg = "【" + OpName + "】" + resultMsg; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + int parType = Convert.ToInt32(checkTable.Rows[0]["小机型"]); + MIS_BASE.WritePLC(115, OpName, parType); // 托盘类型 1 静 2 动 3 拐 + + //写入到数据库的[北汽福田工位状态监控MOBY]表中 + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineTypeID, EngineTypeID.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineType, EngineType); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineID, EngineID); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.OrderForm, OrderForm); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineType_MES, EngineType); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineID_MES, EngineID); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.OrderForm_MES, OrderForm); + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + SendMessage.ShowMoby(OpName); + SendMessageFun.SendMessage("5123", "1111", OpName); + } + else + { + string msg = "【" + OpName + "】" + resultMsg; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + + return; + } + else + { + string msg = "【" + OpName + "】" + "读取信息存在空值!"; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + + } + else + { + MIS_BASE.Write_FixAllow(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:EngineTypeGetOver_PLC"); + } + } + + + } + + } +} diff --git a/MisDataFunction/Function1052/OpcServer/MesRead.cs b/MisDataFunction/Function1052/OpcServer/MesRead.cs new file mode 100644 index 0000000..11357b7 --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/MesRead.cs @@ -0,0 +1,86 @@ +using MesServerWork; +using MisDataFunDll; +using System; +using System.Collections.Generic; +using System.Threading; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + { + try + { + int EngineTypeID; + string EngineType; + string EngineID; + int PartPallet_Code; + string OrderForm; + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + string OrderForm_MES; + + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int qualityMask; + + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + //MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES); + //保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号 + // 保存质量数据 + qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + + // 保存物料数据 + MisDataFun.Material_Insert(OpName, qualityMask); + + // 测量数据发动机在线状态 + MisDataFun.WorkStartInsert(OpName, qualityMask); + + // 存追溯表数据 + MisDataFun.WorkOrderOpWorkOver(OpName, EngineID, OrderForm); + + // 推送质量数据到MES的页面 + SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + + //对应手动工位的 + //MIS_BASE.Write_ConfirmOkGo(OpName, true); + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //统计在线产量,在线节拍 + SendMessage.SendActuallyCount(OpName, tagValue); + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + + } + + } +} diff --git a/MisDataFunction/Function1052/OpcServer/ReqEarlyFeeding.cs b/MisDataFunction/Function1052/OpcServer/ReqEarlyFeeding.cs new file mode 100644 index 0000000..eb15c8c --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/ReqEarlyFeeding.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Threading; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 申请提前上料 + /// + /// + /// + private void ReqEarlyFeeding(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + + if (tagValue == 1) + { + var dt = MisDataFun.Get_ReqEarlyFeedingData(OpName); + int result = Convert.ToInt32(dt.Rows[0]["result"]); + string msg = dt.Rows[0]["msg"].ToString(); + int EngineTypeID = Convert.ToInt32(dt.Rows[0]["产品型号代码"]); + if (result == 1) + { + MIS_BASE.WritePLC(96, OpName, EngineTypeID); // 产品型号 + MIS_BASE.Write_EngineID_MES(OpName, dt.Rows[0]["工件编号"].ToString()); + int ReadEngineID = Convert.ToInt32(MIS_BASE.ReadPLC(96, OpName)); + if (EngineTypeID != ReadEngineID) + { + MyLog4Net.MyLogHelper.Error("ReqEarlyFeeding", $"写入提前上料机型{EngineTypeID.ToString()} 与 读取到的{ReadEngineID.ToString()}不一致"); + return; + } + if (EngineTypeID == 0 || ReadEngineID == 0) + { + MyLog4Net.MyLogHelper.Error("ReqEarlyFeeding", $"写入提前上料机型{EngineTypeID.ToString()} 与 读取到的{ReadEngineID.ToString()} 其中存在空值"); + return; + } + MIS_BASE.WritePLC(33, OpName, true); // 允许提前上料 + + } + else if (result == 2) + { + MIS_BASE.WritePLC(33, OpName, false); + string msg2 = "【" + OpName + "】" + msg; + MyLog4Net.MyLogHelper.Error("ReqEarlyFeeding", msg2); + SendMessage.AsyncSendMessage_Notice(OpName, msg); + return; + } + } + else + { + MIS_BASE.WritePLC(96, OpName, 0); // 提前上料位置 + MIS_BASE.WritePLC(33, OpName, false); // 允许提前上料 + MIS_BASE.Write_EngineID_MES(OpName, ""); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1052/OpcServer/ReqTestResistor.cs b/MisDataFunction/Function1052/OpcServer/ReqTestResistor.cs new file mode 100644 index 0000000..e3e0b82 --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/ReqTestResistor.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Net.Http; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using MesServerWork; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + private readonly object _lockObject = new object(); + private volatile bool _isTestOk = false; + private string _opName; + private const int DEFAULT_TIMEOUT = 7000; // 默认超时时间(毫秒) + private const int MAX_RETRY_COUNT = 10; // 最大重试次数 + private const int RESULT_LENGTH = 113; // 预期结果长度 + + /// + /// 电阻测试 + /// + private void ReqTestResistor(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + _opName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + TestResistor().GetAwaiter().GetResult(); + } + else + { + ResetPLCValues(); + } + } + catch (Exception err) + { + MyLog4Net.MyLogHelper.Error("电阻测试", $"测试过程发生错误: {err.Message}"); + ErrPLCValues(); + } + } + + /// + /// 执行电阻测试 + /// + private async Task TestResistor() + { + TcpClient tcpClient = null; + try + { + string IP = ConfigurationManager.AppSettings["ResistorDeviceIP_" + _opName]; + string Port = ConfigurationManager.AppSettings["ResistorDevicePort"]; + + using (tcpClient = new TcpClient()) + { + var connectTask = tcpClient.ConnectAsync(IP, Convert.ToInt32(Port)); + if (await Task.WhenAny(connectTask, Task.Delay(DEFAULT_TIMEOUT)) != connectTask) + { + throw new TimeoutException("连接电阻仪超时"); + } + + if (tcpClient.Connected) + { + MyLog4Net.MyLogHelper.Info("电阻测试", "电阻仪链接成功!"); + await SendCommand(tcpClient, "01 09 64 00 05 00 00 00 00 00 73"); + + await Task.Delay(DEFAULT_TIMEOUT); + + var readTask = Task.Run(() => Read(tcpClient)); + + int count = 0; + while (!_isTestOk && count < MAX_RETRY_COUNT) + { + await Task.Delay(1000); + await SendCommand(tcpClient, "03 01 04"); + count++; + } + + if (count >= MAX_RETRY_COUNT && !_isTestOk) + { + MyLog4Net.MyLogHelper.Error("电阻测试", "测试超时,未收到有效结果"); + ErrPLCValues(); + } + } + } + } + catch (Exception ex) + { + MyLog4Net.MyLogHelper.Error("电阻测试", $"测试过程发生错误: {ex.Message}"); + ErrPLCValues(); + } + finally + { + if (tcpClient != null) + { + tcpClient.Close(); + MyLog4Net.MyLogHelper.Info("电阻测试", "电阻仪链接关闭"); + } + } + } + + private void ResetPLCValues() + { + lock (_lockObject) + { + MIS_BASE.WritePLC(202, _opName, 0); + MIS_BASE.WritePLC(203, _opName, 0); + MIS_BASE.WritePLC(204, _opName, 0); + MIS_BASE.WritePLC(34, _opName, false); + } + } + + private void ErrPLCValues() + { + lock (_lockObject) + { + MIS_BASE.WritePLC(202, _opName, 0); + MIS_BASE.WritePLC(203, _opName, 0); + MIS_BASE.WritePLC(204, _opName, 0); + MIS_BASE.WritePLC(34, _opName, true); + } + } + + /// + /// 发送命令到电阻仪 + /// + private async Task SendCommand(TcpClient tcpClient, string command) + { + try + { + // 将空格分隔的HEX字符串转换为字节数组 + string[] hexValues = command.Split(' '); + byte[] commandbyte = new byte[hexValues.Length]; + + for (int i = 0; i < hexValues.Length; i++) + { + commandbyte[i] = Convert.ToByte(hexValues[i], 16); + } + + // 发送HEX格式的数据 + await tcpClient.Client.SendAsync(new ArraySegment(commandbyte), SocketFlags.None); + + // 记录发送的命令 + MyLog4Net.MyLogHelper.Info("电阻测试Send", $"发送命令: {command}"); + } + catch (Exception err) + { + MyLog4Net.MyLogHelper.Error("电阻测试Send", $"发送命令失败: {err.Message}"); + throw; + } + } + + private void Read(TcpClient tcpClient) + { + try + { + while (!_isTestOk) + { + if (tcpClient != null && tcpClient.Connected) + { + byte[] byteCommand = new byte[1024]; + int icommand = tcpClient.Client.Receive(byteCommand); + string hexString = BitConverter.ToString(byteCommand, 0, icommand).Replace("-", " "); + + if (hexString.Length == RESULT_LENGTH) + { + DataAnalysis(hexString); + } + } + } + } + catch (Exception err) + { + MyLog4Net.MyLogHelper.Error("电阻测试Read", err.Message); + } + } + + private void DataAnalysis(string hexString) + { + try + { + var byteArray = HexStringToByteArray(hexString.Replace(" ", "")); + var start = 2; + + var 状态 = BitConverter.ToInt32(byteArray.Skip(start + 0).Take(4).ToArray(), 0); + if (状态 != 2) return; + var 电压V = BitConverter.ToDouble(byteArray.Skip(start + 4).Take(8).ToArray(), 0); + var 电流A = BitConverter.ToDouble(byteArray.Skip(start + 12).Take(8).ToArray(), 0); + var 电阻uΩ = BitConverter.ToDouble(byteArray.Skip(start + 20).Take(8).ToArray(), 0) * 1000000; + var yyyy = BitConverter.ToUInt16(byteArray.Skip(start + 28).Take(2).ToArray(), 0); + var MM = byteArray[start + 30]; + var dd = byteArray[start + 31]; + var HH = byteArray[start + 32]; + var mm = byteArray[start + 33]; + var ss = byteArray[start + 34]; + var datetime = $"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}"; + + lock (_lockObject) + { + MIS_BASE.WritePLC(202, _opName, 电压V); + MIS_BASE.WritePLC(203, _opName, 电流A); + MIS_BASE.WritePLC(204, _opName, 电阻uΩ); + MIS_BASE.WritePLC(34, _opName, true); + _isTestOk = true; + } + + MyLog4Net.MyLogHelper.Info("电阻测试", $"电阻结果写入完毕 【电压】{电压V}【电流】{电流A}【电阻】{电阻uΩ}"); + } + catch (Exception ex) + { + MyLog4Net.MyLogHelper.Error("电阻测试DataAnalysis", $"数据分析错误: {ex.Message}"); + } + } + + public static byte[] HexStringToByteArray(string hex) + { + if (hex.Length % 2 != 0) + { + throw new ArgumentException("十六进制字符串长度必须是偶数"); + } + + byte[] bytes = new byte[hex.Length / 2]; + for (int i = 0; i < hex.Length; i += 2) + { + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + } + return bytes; + } + } +} \ No newline at end of file diff --git a/MisDataFunction/Function1052/OpcServer/WebSubmit.cs b/MisDataFunction/Function1052/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..cd3512e --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/WebSubmit.cs @@ -0,0 +1,352 @@ +using System; +using MesServerWork; +using MisDataSaveDate; +using System.Collections; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName=Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + return; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DeviceDriver_BasicData.CustomeEvetnArgs _e = new DeviceDriver_BasicData.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + string msg; + bool bolVal; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + //MisDataFun.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName,0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + //BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + case "twoWorkSkip"://重新工作工件跳过工作(重新工作工件) + //工作完成 + EngineTypeGetOver_PLC_Work_Skip(OpName); + break; + case "twoWork"://重新工作工件重新工作(重新工作工件) + //允许工作 + EngineTypeGetOver_PLC_Work_two(OpName); + break; + // 检查项 检查完成 + case "checkWorkOver": + MIS_BASE.WritePLC(30, OpName, 1); + string message = "MES|checkWorkOverIsShow|" + OpName + "|" + 0; + SendMessage.AsyncSendMessage(message); + break; + // 跳过交互 + case "skipWork": + // 判断是否有工件到位 + MIS_BASE.Read_WorkStart(OpName, out bolVal); + if (bolVal) + { + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); // 传递机型 + MIS_BASE.Write_FixAllow(OpName, true); // 允许工作 + MIS_BASE.WritePLC(30, OpName, 1); // 检查完成 + MIS_BASE.Write_MesReadOver(OpName, true); // 保存完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); // 工作完成 + msg = "【" + OpName + "】" + "跳过交互完成!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + else + { + msg = "【" + OpName + "】" + "当前无工件到位信号,请确认是否存在工件!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + break; + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + MisDataFun.MesServer_Process_EngineTypeOver(OpName); + + SendMessageFun.SendMessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + + private void sendmessage(string OpName, int tagValue, string Command) + { + string SendMessage; + SendMessage = "MES|" + Command + "|" + OpName + "|" + tagValue; + SendMessageFun.AsyncSendMessage(SendMessage); + + } + + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + + InitOpPosion(Opname); + + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(Opname); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(Opname); + // MOBY数据 + SendMessageFun.SendMessage("5", "1", Opname); + // 物料信息 物料信息 + SendMessage.MaterialList(Opname); + + // 新增查询PLC直通状态 网页显示 + //MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + InitAlarm(Opname); + } + + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + + private void InitOpPosion(string Opname) + { + int S_WorkCheckOver = Convert.ToInt32(MIS_BASE.ReadPLC(30, Opname)); + string S_WorkCheckOver_Msg = "MES|checkWorkOverIsShow|" + Opname + "|" + S_WorkCheckOver; + SendMessage.AsyncSendMessage(S_WorkCheckOver_Msg); + + bool S_WorkStart;//工件到位 DBX0.1 + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + if (S_WorkStart == true) + { + SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + //---------------------------------------------------- + bool S_PartLoad;//申请上线 + MIS_BASE.Read_PartLoad(Opname, out S_PartLoad); + if (S_PartLoad == true) + { + SendMessageFun.SendInfomation("PartLoad", Convert.ToString(Convert.ToInt32(S_PartLoad)), Opname); + } + //---------------------------------------------------- + bool S_EngineGetOver;//传递机型 DBX0.4 + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + if (S_EngineGetOver == true) + { + SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(Opname); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(Opname); + } + //---------------------------------------------------- + bool S_FixAllow;//允许工作 DBX3.1 + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + if (S_FixAllow == true) + { + SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + //---------------------------------------------------- + bool S_MesRead;//允许保存 DBX3.1 + MIS_BASE.Read_QualityData_Read_CF(Opname, out S_MesRead); + if (S_MesRead == true) + { + SendMessageFun.SendInfomation("MesRead", Convert.ToString(Convert.ToInt32(S_MesRead)), Opname); + } + //---------------------------------------------------- + bool S_ReadOver;//保存完成 + MIS_BASE.Read_MesReadOver(Opname, out S_ReadOver); + if (S_ReadOver == true) + { + SendMessageFun.SendInfomation("MesReadOver", Convert.ToString(Convert.ToInt32(S_ReadOver)), Opname); + } + //---------------------------------------------------- + bool S_MaterialVerifyOver;//工作完成 DBX2.3 + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + if (S_MaterialVerifyOver == true) + { + SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + //---------------------------------------------------- + int S_QualityMask;//合格标志 DBX588 + MIS_BASE.Read_QualityMask(Opname, out S_QualityMask); + if (S_QualityMask == 1) + { + SendMessageFun.SendInfomation("QualityMask", Convert.ToString(Convert.ToInt32(S_QualityMask)), Opname); + } + //---------------------------------------------------- + string S_plcStatus = "false";//DBX501.5 PLC直通,1 强制放行 0 正常循环 + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + } + } +} diff --git a/MisDataFunction/Function1052/OpcServer/WorkIsOk.cs b/MisDataFunction/Function1052/OpcServer/WorkIsOk.cs new file mode 100644 index 0000000..3149bce --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/WorkIsOk.cs @@ -0,0 +1,44 @@ +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工位合格标志 + /// + /// + /// + private void IsOk(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + int qualityMask; + MIS_BASE.Read_QualityMask(OpName, out qualityMask); + //判断是否合格 + if (qualityMask == 1) + { + qualityMask = 1; + } else { + qualityMask = 0; + } + //通知WEB修改状态 + string message = "MES|QualityMask|" + OpName + "|" + qualityMask.ToString(); + SendMessage.AsyncSendMessage(message); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1052/OpcServer/WorkStart.cs b/MisDataFunction/Function1052/OpcServer/WorkStart.cs new file mode 100644 index 0000000..7fc448c --- /dev/null +++ b/MisDataFunction/Function1052/OpcServer/WorkStart.cs @@ -0,0 +1,57 @@ +using MesServerWork; +using MisDataFunDll; +using System; +using System.Threading; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue > 0) + { + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStart, tagValue.ToString()); + } + else + { + MIS_BASE.Write_EngineTypeID_MES(OpName, 0); + MIS_BASE.Write_EngineType_MES(OpName, ""); + MIS_BASE.Write_EngineID_MES(OpName, ""); + MIS_BASE.Write_OrderForm_MES(OpName, ""); + + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartOut, DateTime.Now.ToString()); + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + + // 检查项完成 + MIS_BASE.Write_TagTypeID(30, OpName, 0); + string message = "MES|checkWorkOverIsShow|" + OpName + "|" + 0; + SendMessage.AsyncSendMessage(message); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } +} diff --git a/MisDataFunction/Function1052/OpcServer/vssver2.scc b/MisDataFunction/Function1052/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..b884d136322fa97c266a23933f0a62932ef482e6 GIT binary patch literal 332 zcmXpJVq~~_m%l5bInsUAj6{**Nns+3SMy9?E6l*a!N9<<4oLf^W-r#r+{@1h$TB!37A5DWr0OLXGdSnxrDYc7`e(c6gSf7F>6v+{?x`jIAX9(>ZizX? psqX$Drf+I-P-QNI#$`zaX`!Br~;`!LhhFH8&}z(lakD JUoW|s0RY9rD~$jE literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1052/mssccprj.scc b/MisDataFunction/Function1052/mssccprj.scc new file mode 100644 index 0000000..119193d --- /dev/null +++ b/MisDataFunction/Function1052/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function02.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA diff --git a/MisDataFunction/Function1052/packages.config b/MisDataFunction/Function1052/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1052/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1052/vssver2.scc b/MisDataFunction/Function1052/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c770e2832da5f488f76f5e9e407765ea066fd986 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+sITv>>5@ujvVqjoc45V9**6jXXx}TpB$X^2F zSD1-!?6KPc=Bw!YW){07mLy`*sl~ymMP;c)dTyn8$t9WjdHOJhfe{0Osh3<_P?VpA ODWX?aTu_{x%m4rcSvH&i literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1053/DataAccess/DataAccess.cs b/MisDataFunction/Function1053/DataAccess/DataAccess.cs new file mode 100644 index 0000000..cd36930 --- /dev/null +++ b/MisDataFunction/Function1053/DataAccess/DataAccess.cs @@ -0,0 +1,15 @@ + +namespace MesServerFunctions +{ + partial class Function1053 + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1053/DataAccess/vssver2.scc b/MisDataFunction/Function1053/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..d045c266ad5c3d2043cebf9a86e43dacd49db85e GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns)!ADwP26=q;yWME)e2BhO2nUq;L?BxgXRrGx` xi(L{+5;5u2;^5SxveY6yx6-`ilFa-(eHg>QNFSudF*!N4xR?RK)JraA004LBDq{cu literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1053/Db.cs b/MisDataFunction/Function1053/Db.cs new file mode 100644 index 0000000..cce85a9 --- /dev/null +++ b/MisDataFunction/Function1053/Db.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + public class Db + { + + + } +} diff --git a/MisDataFunction/Function1053/Function02.csproj.vspscc b/MisDataFunction/Function1053/Function02.csproj.vspscc new file mode 100644 index 0000000..0f0f36c --- /dev/null +++ b/MisDataFunction/Function1053/Function02.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1053/Function1053.csproj b/MisDataFunction/Function1053/Function1053.csproj new file mode 100644 index 0000000..b07ecd1 --- /dev/null +++ b/MisDataFunction/Function1053/Function1053.csproj @@ -0,0 +1,167 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {CA8A12C5-7BF0-4489-93FA-180B1C492BBA} + Library + Properties + Function1053 + Function1053 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\dll_common\MesWork.DeviceDriver.dll + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\dll_common\Newtonsoft.Json.dll + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + {1dc48c83-1842-4de8-acaf-26e1e7f7c58f} + 00_MyLog4Net + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1053/MesServerFunction/Fun_1053.cs b/MisDataFunction/Function1053/MesServerFunction/Fun_1053.cs new file mode 100644 index 0000000..0ba7185 --- /dev/null +++ b/MisDataFunction/Function1053/MesServerFunction/Fun_1053.cs @@ -0,0 +1,262 @@ +using MesServerWork; +using MisDataFunDll; +using MisDataSaveDate; +using System.Collections.Generic; +using System.Threading; +using System.Xml.Linq; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = MisDataFun.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string TagID = e.TagID.ToString(); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 申请上线 + case "43": + PartLoad(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //PLC 工位合格标志 + case "21": + fun_IsOk(e); + break; + //MES保存实时质量数据 + case "65": + fun_MesSaveNowData(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + //空料握手plc + case "49": + fun_Handshake(e); + break; + //待上料数量plc + case "38": + UpdateWait_NUM_PLC(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + } + break; + } + } + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DeviceDriver_BasicData .CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + /// + /// 允许保存 + /// + /// + /// + public void fun_MesRead(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 保存完成 + /// + /// + /// + public void fun_MesReadOver(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + + /// + /// 工位是否合格 + /// + /// + /// + public void fun_IsOk(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(IsOk, e); + } + + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + + + /// + /// 空料握手plc + /// + public void fun_Handshake(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + //ThreadPool.QueueUserWorkItem(Handshake_Fun, e); + } + + + /// + /// MES实时保存质量数据 + /// + /// + /// + public void fun_MesSaveNowData(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + // ThreadPool.QueueUserWorkItem(MesSaveNowData, e); + } + + + } +} diff --git a/MisDataFunction/Function1053/MesServerFunction/vssver2.scc b/MisDataFunction/Function1053/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6753ef90a913bdd4b6a6e13279c279421ee GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZA`fUU7iM5!WME)e0i;h@ES~1HVh2BnucGgp xS?rQnl88yC76+#mm8BNxxs~Q6mt^MW>BATXM*6-mS(q3DkP&ZSq?cUG00296EHVH9 literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1053/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1053/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..46e4f96 --- /dev/null +++ b/MisDataFunction/Function1053/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,115 @@ +using System; +using System.Data; +using System.Threading; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code, string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0) + { + string msg = "【" + OpName + "】" + "PLC传递机型为空!"; + MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg); + SendMessageFun.AsyncSendMessage_Notice(OpName, msg); + return; + } + + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + MisDataFun.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + //MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 合格标志暂时改为即时响应式的 + MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + //SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + //第四步,获取是否允许工作 + MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + MIS_BASE.Write_WorkStart(OpName, true); + MIS_BASE.Write_FixAllow(OpName, true); + MIS_BASE.Write_EngineTypeGetOver_PLC(OpName, true); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.FixAllow, "1"); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + SendMessageFun.SendMessage("1235", "1111", OpName); + } + + /// + /// 二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_two(string OpName) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, Convert.ToInt32(PartPallet_Code), OrderForm); + + } + /// + /// 跳过二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_Skip(string OpName) + { + //MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + //string orderForm = ""; + //int engineTypeID; + //string engineType = ""; + //string engineID = ""; + //string palletCode = ""; + //int isRepair; + //string repairCode = ""; + ////从监控系统中查询出本工位信息 + //MisDataFun.OpName_MIS_Moby_Select(OpName, + //out orderForm, out engineTypeID, out engineType, + //out engineID, out palletCode, out isRepair, out repairCode); + + //EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode), orderForm); + } + + /// + /// 更新待上料数量 + /// + /// + private void UpdateWait_NUM_PLC(object e) + { + } + } +} diff --git a/MisDataFunction/Function1053/Methods/vssver2.scc b/MisDataFunction/Function1053/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7782f6f99fca64d9060da64295d333bbcfa49824 GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JE?f#+Da^pY%)r2~3P|^c1<5e@?B{0!@>c`- z*BM{*UOT>@pApDk1LQlN`r!fNtLXb?7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?up zk-l$gNk)E3F@tMfdS+g#duoY4P^D91acX#eQMO)kF+*@^Qf_8RNIuZ`^3)`dNT^GI LUT|t&3WyB=bO1u# literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1053/OpcServer/Barcode.cs b/MisDataFunction/Function1053/OpcServer/Barcode.cs new file mode 100644 index 0000000..24a7187 --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/Barcode.cs @@ -0,0 +1,79 @@ +using System; +using System.Data; +using System.Windows.Forms; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + + MisDataFun.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认!"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + //获取是否允许工作 + MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + if (IsAllowWork == 1) + { + // 保存物料信息 + MisDataFun.Material_Insert(OpName, 1); + + SendMessageFun.SendMessage("24", "11", OpName); + + // 物料验证完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认!"); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1053/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1053/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..f46a8c4 --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/EngineGetOver.cs @@ -0,0 +1,72 @@ +using System; +using System.Data; +using System.Windows.Forms; +using System.Xml.Linq; +//using SystemFramework; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + //int tagValue = Convert.ToInt32(msgEvent.TagValue); + if(msgEvent.TagValueUp.ToString() == "6") + { + MIS_BASE.Write_FixAllow(OpName, false); + string Program_No = ""; + MisDataFun.GetEngineType_Order(OpName, Program_No, out int EngineTypeID, out string EngineType, out string EngineID, out string OrderForm, out int isCheckOk, out int planCount, out int haveUplaodCount, out int remainingQuantity, out string msg2); + if (isCheckOk == 2) + { + string msg = "【" + OpName + "】" + msg2; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + MyLog4Net.MyLogHelper.Error("PartLoad", msg); + return; + } + else + { + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID, EngineTypeID.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType, EngineType); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID, EngineID); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm, OrderForm); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString()); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType_MES, EngineType); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID_MES, EngineID); + MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm_MES, OrderForm); + + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, 0, OrderForm); + } + } + } + catch (Exception err) + { + // 保存出错日志 1.申请上线 2.传递机型 3.允许保存 4.扫码 + MisDataSaveDate.FuntionMesRead.Alarm_SaveFileLog4Error(System.Reflection.MethodBase.GetCurrentMethod().Name, e, "Fun1053", err); + ////ApplicationLog.WriteLog(err, "Function02:EngineTypeGetOver_PLC"); + } + } + + } +} diff --git a/MisDataFunction/Function1053/OpcServer/HeartBeat.cs b/MisDataFunction/Function1053/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..b94f253 --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/HeartBeat.cs @@ -0,0 +1,34 @@ +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1053/OpcServer/MesRead.cs b/MisDataFunction/Function1053/OpcServer/MesRead.cs new file mode 100644 index 0000000..af14ba5 --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/MesRead.cs @@ -0,0 +1,88 @@ +using MesServerWork; +using MesWork; +using MisDataFunDll; +using System; +using System.Data; +using System.Threading; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + string OrderForm_MES; + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "0"); + Thread.Sleep(500); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "1"); + if (tagValue == 1) + { + bool isEngineGetOver; + DataRow mobyData = MisDataFun.GetMobyTableByOpName(OpName).Rows[0]; + EngineTypeID_MES = Convert.ToInt32(mobyData["产品型号代码_MES"]); + EngineType_MES = mobyData["发动机型号_MES"].ToString(); + EngineID_MES = mobyData["变速器序列号_MES"].ToString(); + OrderForm_MES = mobyData["订单号_MES"].ToString(); + isEngineGetOver = Convert.ToBoolean(mobyData["允许工作"]); + + if (!isEngineGetOver) + { + string msg2 = "【" + OpName + "】" + "请先开始订单生产后再进行保存,当前未允许工作!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg2); + return; + } + + // 存追溯表数据 + MisDataFun.WorkOrderOpWorkOver(OpName, EngineID_MES, OrderForm_MES); + + // 保存物料数据 + MisDataFun.Material_Insert(OpName, 1); + + // 测量数据发动机在线状态 + MisDataFun.WorkStartInsert(OpName, 1); + + //通知设备,MES的质量数据(和物料数据)保存完成 + //统计在线产量,在线节拍 + SendMessage.SendActuallyCount(OpName, tagValue); + + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesReadOver, "1"); + Thread.Sleep(1000 * 1); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.WorkStart, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.EngineTypeGetOverPLC, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.PartLoad, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesReadOver, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.FixAllow, "0"); + + + string msg = "【" + OpName + "】" + "工件数据保存完成!"; + SendMessage.AsyncSendMessage_Notice(OpName, msg); + } + } + catch (Exception err) + { + // 保存出错日志 1.申请上线 2.传递机型 3.允许保存 4.扫码 + MisDataSaveDate.FuntionMesRead.Alarm_SaveFileLog4Error(System.Reflection.MethodBase.GetCurrentMethod().Name, e, "Fun1053", err); + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + + } + + } +} diff --git a/MisDataFunction/Function1053/OpcServer/PartLoad.cs b/MisDataFunction/Function1053/OpcServer/PartLoad.cs new file mode 100644 index 0000000..b51c56a --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/PartLoad.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading; +//using SystemFramework; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 申请上线(针对上线工位) + /// + /// + /// + private void PartLoad(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + // 清空MOBY表中所有数据 + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.WorkStart, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.EngineTypeGetOverPLC, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.PartLoad, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesReadOver, "0"); + MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.FixAllow, "0"); + Thread.Sleep(500); + // 按照生产排序顺序获取订单相关数据 + // 获取到数据 显示 申请上线、传递机型、允许工作三个点位 + // 显示对应物料信息、 + + if (tagValue == 1) + { + + } + else + { + ////上线工位清MES传递机型信号 + //MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //// 清除报警 + } + } + catch (Exception err) + { + // 保存出错日志 1.申请上线 2.传递机型 3.允许保存 4.扫码 + MisDataSaveDate.FuntionMesRead.Alarm_SaveFileLog4Error(System.Reflection.MethodBase.GetCurrentMethod().Name, e, "Fun1053", err); + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1053/OpcServer/WebSubmit.cs b/MisDataFunction/Function1053/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..242f6fa --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/WebSubmit.cs @@ -0,0 +1,336 @@ +using System; +using MesServerWork; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName=Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + return; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DeviceDriver_BasicData.CustomeEvetnArgs _e = new DeviceDriver_BasicData.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + //BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName,0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + //BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + case "twoWorkSkip"://重新工作工件跳过工作(重新工作工件) + //工作完成 + EngineTypeGetOver_PLC_Work_Skip(OpName); + break; + case "twoWork"://重新工作工件重新工作(重新工作工件) + //允许工作 + EngineTypeGetOver_PLC_Work_two(OpName); + break; + case "SelectOrderForm"://分线接受前端模拟传递机型 + _e.TagValueUp = "6"; + EngineTypeGetOver_PLC(_e); + break; + case "outLineOpNameWorkOver"://分线接受前端模拟工作完成 + _e.TagValueUp = "6"; + _e.TagValue = 1; + MesRead(_e); + break; + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + //BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + SendMessageFun.SendMessage("5123", "1111", OpName); + + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string OpName) + { + InitOpPosion(OpName); + + ////3显示操作指导图片 PicShow_String_FirstOpName + //SendMessage.PicShow_FirstOpName(OpOpNamename); + ////1(直接在界面通过选择机型确认工序内容) + //SendMessage.ProcessList_FirstOpName(OpName); + //// MOBY数据 + //SendMessageFun.SendMessage("5", "1", OpName); + //// 物料信息 物料信息 + //SendMessage.MaterialList(OpName); + + SendMessageFun.SendMessage("315", "111", OpName); + + // 新增查询PLC直通状态 网页显示 + //MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + InitAlarm(OpName); + } + + //分线发送工件到位信号函数 + private void sendmessage(string OpName, int tagValue, string Command) + { + string SendMessage; + SendMessage = "MES|" + Command + "|" + OpName + "|" + tagValue; + SendMessageFun.AsyncSendMessage(SendMessage); + + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + + private void InitOpPosion(string Opname) + { + int S_WorkCheckOver = Convert.ToInt32(MIS_BASE.ReadPLC(30, Opname)); + string S_WorkCheckOver_Msg = "MES|checkWorkOverIsShow|" + Opname + "|" + S_WorkCheckOver; + SendMessage.AsyncSendMessage(S_WorkCheckOver_Msg); + + bool S_WorkStart;//工件到位 DBX0.1 + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + if (S_WorkStart == true) + { + SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + //---------------------------------------------------- + bool S_PartLoad;//申请上线 + MIS_BASE.Read_PartLoad(Opname, out S_PartLoad); + if (S_PartLoad == true) + { + SendMessageFun.SendInfomation("PartLoad", Convert.ToString(Convert.ToInt32(S_PartLoad)), Opname); + } + //---------------------------------------------------- + bool S_EngineGetOver;//传递机型 DBX0.4 + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + if (S_EngineGetOver == true) + { + SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(Opname); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(Opname); + } + //---------------------------------------------------- + bool S_FixAllow;//允许工作 DBX3.1 + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + if (S_FixAllow == true) + { + SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + //---------------------------------------------------- + bool S_MesRead;//允许保存 DBX3.1 + MIS_BASE.Read_QualityData_Read_CF(Opname, out S_MesRead); + if (S_MesRead == true) + { + SendMessageFun.SendInfomation("MesRead", Convert.ToString(Convert.ToInt32(S_MesRead)), Opname); + } + //---------------------------------------------------- + bool S_ReadOver;//保存完成 + MIS_BASE.Read_MesReadOver(Opname, out S_ReadOver); + if (S_ReadOver == true) + { + SendMessageFun.SendInfomation("MesReadOver", Convert.ToString(Convert.ToInt32(S_ReadOver)), Opname); + } + //---------------------------------------------------- + bool S_MaterialVerifyOver;//工作完成 DBX2.3 + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + if (S_MaterialVerifyOver == true) + { + SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + //---------------------------------------------------- + int S_QualityMask;//合格标志 DBX588 + MIS_BASE.Read_QualityMask(Opname, out S_QualityMask); + if (S_QualityMask == 1) + { + SendMessageFun.SendInfomation("QualityMask", Convert.ToString(Convert.ToInt32(S_QualityMask)), Opname); + } + //---------------------------------------------------- + string S_plcStatus = "false";//DBX501.5 PLC直通,1 强制放行 0 正常循环 + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + } + } +} diff --git a/MisDataFunction/Function1053/OpcServer/WorkIsOk.cs b/MisDataFunction/Function1053/OpcServer/WorkIsOk.cs new file mode 100644 index 0000000..3149bce --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/WorkIsOk.cs @@ -0,0 +1,44 @@ +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工位合格标志 + /// + /// + /// + private void IsOk(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + int qualityMask; + MIS_BASE.Read_QualityMask(OpName, out qualityMask); + //判断是否合格 + if (qualityMask == 1) + { + qualityMask = 1; + } else { + qualityMask = 0; + } + //通知WEB修改状态 + string message = "MES|QualityMask|" + OpName + "|" + qualityMask.ToString(); + SendMessage.AsyncSendMessage(message); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1053/OpcServer/WorkStart.cs b/MisDataFunction/Function1053/OpcServer/WorkStart.cs new file mode 100644 index 0000000..c634017 --- /dev/null +++ b/MisDataFunction/Function1053/OpcServer/WorkStart.cs @@ -0,0 +1,49 @@ +using MesServerWork; +using System; +using System.Threading; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + //if (tagValue > 0) + //{ + // MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString()); + // MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.WorkStart, tagValue.ToString()); + //} + //else + //{ + // MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.WorkStartOut, DateTime.Now.ToString()); + // MIS_BASE.Write_MesReadOver(OpName, false); + // MIS_BASE.Write_ConfirmOkGo(OpName, false); + // MIS_BASE.Write_FixAllow(OpName, false); + // MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + // //工作完成 + // MIS_BASE.Write_MaterialVerifyOver(OpName, false); + // MIS_BASE.Write_EngineTypeID_MES(OpName, 0); + // MIS_BASE.Write_EngineType_MES(OpName, ""); + // MIS_BASE.Write_EngineID_MES(OpName, ""); + // MIS_BASE.Write_OrderForm_MES(OpName, ""); + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } +} diff --git a/MisDataFunction/Function1053/OpcServer/vssver2.scc b/MisDataFunction/Function1053/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..b884d136322fa97c266a23933f0a62932ef482e6 GIT binary patch literal 332 zcmXpJVq~~_m%l5bInsUAj6{**Nns+3SMy9?E6l*a!N9<<4oLf^W-r#r+{@1h$TB!37A5DWr0OLXGdSnxrDYc7`e(c6gSf7F>6v+{?x`jIAX9(>ZizX? psqX$Drf+I-P-QNI#$`zaX`!Br~;`!LhhFH8&}z(lakD JUoW|s0RY9rD~$jE literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1053/mssccprj.scc b/MisDataFunction/Function1053/mssccprj.scc new file mode 100644 index 0000000..119193d --- /dev/null +++ b/MisDataFunction/Function1053/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function02.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA diff --git a/MisDataFunction/Function1053/packages.config b/MisDataFunction/Function1053/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1053/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1053/vssver2.scc b/MisDataFunction/Function1053/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c770e2832da5f488f76f5e9e407765ea066fd986 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+sITv>>5@ujvVqjoc45V9**6jXXx}TpB$X^2F zSD1-!?6KPc=Bw!YW){07mLy`*sl~ymMP;c)dTyn8$t9WjdHOJhfe{0Osh3<_P?VpA ODWX?aTu_{x%m4rcSvH&i literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1054/DataAccess/DataAccess.cs b/MisDataFunction/Function1054/DataAccess/DataAccess.cs new file mode 100644 index 0000000..574d619 --- /dev/null +++ b/MisDataFunction/Function1054/DataAccess/DataAccess.cs @@ -0,0 +1,15 @@ + +namespace MesServerFunctions +{ + partial class Function1052 + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1054/DataAccess/vssver2.scc b/MisDataFunction/Function1054/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..d045c266ad5c3d2043cebf9a86e43dacd49db85e GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns)!ADwP26=q;yWME)e2BhO2nUq;L?BxgXRrGx` xi(L{+5;5u2;^5SxveY6yx6-`ilFa-(eHg>QNFSudF*!N4xR?RK)JraA004LBDq{cu literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1054/Db.cs b/MisDataFunction/Function1054/Db.cs new file mode 100644 index 0000000..1190bb0 --- /dev/null +++ b/MisDataFunction/Function1054/Db.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + public class Db + { + + } +} diff --git a/MisDataFunction/Function1054/Function02.csproj.vspscc b/MisDataFunction/Function1054/Function02.csproj.vspscc new file mode 100644 index 0000000..0f0f36c --- /dev/null +++ b/MisDataFunction/Function1054/Function02.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1054/Function1054.csproj b/MisDataFunction/Function1054/Function1054.csproj new file mode 100644 index 0000000..e4bcfac --- /dev/null +++ b/MisDataFunction/Function1054/Function1054.csproj @@ -0,0 +1,167 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {CC45D613-11B9-48AF-B073-6523D6273525} + Library + Properties + Function1054 + Function1054 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\dll_common\MesWork.DeviceDriver.dll + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\dll_common\Newtonsoft.Json.dll + + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {1dc48c83-1842-4de8-acaf-26e1e7f7c58f} + 00_MyLog4Net + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1054/MesServerFunction/Fun_1054.cs b/MisDataFunction/Function1054/MesServerFunction/Fun_1054.cs new file mode 100644 index 0000000..b133096 --- /dev/null +++ b/MisDataFunction/Function1054/MesServerFunction/Fun_1054.cs @@ -0,0 +1,235 @@ +using MesServerWork; +using MisDataFunDll; +using System.Collections.Generic; +using System.Threading; +using System.Xml.Linq; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = MisDataFun.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + // AGV相关变量类型代码处理说明: + // 301:AGV请求进入 + // 302:AGV器具放置完毕 + // 303:AGV退出光栅 + // 304:送料信息验证完成 + // 305:送料信息验证结果 + // 305:任务发送状态 0 没有 1 发送 2 失败 + // 311:请求叫料 + // 312:请求退空 + // 313:请求退料 + // 314:允许AGV进入 + // 315:允许AGV离开 + // 316:器具码扫描完毕 + // 317:退回并重新配送 + // 318:器具号 + // 319:请求上料机型 + // 320:收到状态反馈点 + // 321:转序 + // 322:下空托盘 + // 323:上空托盘 + // 324:点对点 + + // 请求叫料 + case "311": + fun_CallMaterials(e); + break; + // 请求退空 + case "312": + fun_RequestReturns(e); + break; + // 请求退料 + case "313": + fun_RequestReturnMaterial(e); + break; + // 允许AGV进入 + case "314": + fun_AllowAGVEnter(e); + break; + // 允许AGV离开 + case "315": + fun_AllowAGVLeave(e); + break; + // 器具码扫描完毕 + case "316": + fun_ToolCodeScanOver(e); + break; + // 退回并重新配送 + case "317": + fun_ReturnAndRedispatch(e); + break; + // 收到任务状态握手 + case "320": + //MIS_BASE.WritePLC(306, m_OpName, 0); + break; + // 转序 + case "321": + fun_TransferSequence(e); + break; + // 下空托盘 + case "322": + fun_UnloadEmptyTray(e); + break; + // 上空托盘 + case "323": + fun_LoadEmptyTray(e); + break; + // 点对点 + case "324": + fun_PointToPoint(e); + break; + } + break; + } + } + } + + // 叫料流程 + // 1.请求叫料 收到请求叫料后 调用叫料接口 后续收到AGV的 + // 2.收到工厂 请求进入接口(工厂未开发 跳过) 发给PLC AGV请求进入 + // 3.收到允许AGV进入 调用接口(未开发 跳过) 允许进入 + // 4.收到 器具码扫码完成 根据318器具号 调用器具号查询接口 得出校验结果 + // 5.若器具码校验通过 调用 确认物料配送接口 调用成功后 给PLC发送 送料信息验证结果(1 合格 2 不合格) 和 送料信息验证完成 + // 6.收到AGV请求离开接口后(未开发 跳过) 发送给PLC请求离开点位 + // 7.收到PLC允许离开信号后 调用AGV允许离开接口(未开发 跳过) + + // 退空托流程 + // 1.收到请求退空 调用退空托接口 + // 2.如叫料AGV请求进入 请求离开。。。。 只不过不需要扫描器具码部分 + + + // AGV相关方法声明(PLC触发的信号) + /// + /// 请求叫料 + /// + public void fun_CallMaterials(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(CallMaterials, e); + } + + /// + /// 请求退空 + /// + public void fun_RequestReturns(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(RequestReturns, e); + } + + /// + /// 请求退料 + /// + public void fun_RequestReturnMaterial(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(RequestReturnMaterial, e); + } + + /// + /// 允许AGV进入 + /// + public void fun_AllowAGVEnter(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(AllowAGVEnter, e); + } + + /// + /// 允许AGV离开 + /// + public void fun_AllowAGVLeave(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(AllowAGVLeave, e); + } + + /// + /// 器具码扫描完毕 + /// + public void fun_ToolCodeScanOver(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ToolCodeScanOver, e); + } + + /// + /// 退回并重新配送 + /// + public void fun_ReturnAndRedispatch(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ReturnAndRedispatch, e); + } + + /// + /// 转序 + /// + public void fun_TransferSequence(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(TransferSequence, e); + } + + /// + /// 下空托盘 + /// + public void fun_UnloadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(UnloadEmptyTray, e); + } + + /// + /// 上空托盘 + /// + public void fun_LoadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(LoadEmptyTray, e); + } + + /// + /// 点对点 + /// + public void fun_PointToPoint(DeviceDriver_BasicData.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(PointToPoint, e); + } + + } +} diff --git a/MisDataFunction/Function1054/MesServerFunction/vssver2.scc b/MisDataFunction/Function1054/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6753ef90a913bdd4b6a6e13279c279421ee GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZA`fUU7iM5!WME)e0i;h@ES~1HVh2BnucGgp xS?rQnl88yC76+#mm8BNxxs~Q6mt^MW>BATXM*6-mS(q3DkP&ZSq?cUG00296EHVH9 literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1054/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1054/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..3d43608 --- /dev/null +++ b/MisDataFunction/Function1054/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,177 @@ +using System; +using System.Data; +using MesServerWork; +using MisDataFunDll; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code, string OrderForm) + { + //int IsAllowWork; + //int RepairPartStatusPLC = 0; + //int MES_QualityMask = 1; + + + + ////电子看板_装配零件_临时表_增加_北汽 + ////第二步,将零件信息转移到零件_临时表中 + //BaseDataSystemMES.MesServer_Process_EngineTypeOverBQ(OpName); + + ////通知web显示 + //SendMessageFun.SendMessage("123", "111", OpName); + ////MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 合格标志暂时改为即时响应式的 + ////MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + ////SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + ////SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + //MIS_BASE.Read_TagTypeID(201, OpName, out string EngineTypeID_QiaoKe); + + //Db.OP50_OPA90_MatchResult(EngineTypeID, Convert.ToInt32(EngineTypeID_QiaoKe), EngineID, OrderForm, out int MatchResult, out string MatchResultStr); + //if (MatchResult == 1) + //{ + // // 轮毂线 + // MIS_BASE.Write_Match(OpName, true);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName, true);// 匹配完成 + // MIS_BASE.Write_FixAllow(OpName, true); // 允许工作 + // return; + //} + //else if (MatchResult == 2) // 分等待状态 与 报警状态 等待的话就等A60 工作完成时判断清除等待 写入A90 的匹配结果 匹配完成 允许工作 + //{ + // MIS_BASE.WritePLC(29, OpName, true); // 开始等待 通知A60 保存完成时更新下等待状态与匹配状态 + // return; + //} + //else + //{ + // // 将根据轮毂号 工位号 时间 报错内容 存储到数据库中供查询 + // BaseDataSystemMES.HeLi_OoNameAlarmRecord_Add(OpName, EngineID, MatchResultStr); + // // 匹配结果不成功 + // MIS_BASE.Write_Match(OpName, false);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName, true);// 匹配完成 + // return; + //} + + + + + + //// 判断分线是否 传递机型 + //if (EngineGetOver_SubLine) + //{ + // string EngineTypeID_MainLine; + // int EngineTypeID_MainLineQiaoKe; + // // 读取主线桥壳机型 + // MIS_BASE.Read_EngineTypeID(OpName_MainLine, out EngineTypeID_MainLineQiaoKe); + // // 读取分线存储的桥壳机型 + // MIS_BASE.Read_TagTypeID(38, OpName_SubLine, out EngineTypeID_MainLine); + + // if (Convert.ToInt32(EngineTypeID_MainLine) == EngineTypeID) + // { + // Db.OP50_OPA90_MatchResult(EngineTypeID, Convert.ToInt32(EngineTypeID_MainLine), EngineTypeID_MainLineQiaoKe, out int MatchResult); + + // if (MatchResult == 0) // 不匹配 + // { + // // 主线 + // MIS_BASE.Write_Match(OpName_MainLine, false);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName_MainLine, false);// 匹配完成 + // MIS_BASE.Write_FixAllow(OpName_MainLine, false); // 允许工作 + // // 分线 + // MIS_BASE.Write_Match(OpName_SubLine, false);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName_SubLine, false);// 匹配完成 + // MIS_BASE.Write_FixAllow(OpName_SubLine, false); // 允许工作 + + // // 写入分线 等待 0 + // MIS_BASE.WritePLC(29, OpName_SubLine, "0"); + // } + // if (MatchResult == 1) // 允许抓 + // { + // // 主线 + // MIS_BASE.Write_Match(OpName_MainLine, true);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName_MainLine, true);// 匹配完成 + // // 分线 + // MIS_BASE.Write_Match(OpName_SubLine, true);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName_SubLine, true);// 匹配完成 + // MIS_BASE.Write_FixAllow(OpName_MainLine, true); // 允许工作 + + // // 写入分线 等待 0 + // MIS_BASE.WritePLC(29, OpName_SubLine, "0"); + // } + // if (MatchResult == 2) // 等待 + // { + // // 写入分线 等待 1 + // MIS_BASE.WritePLC(29, OpName_SubLine, "1"); + // } + // } + // else // 不匹配 + // { + // // 主线 + // MIS_BASE.Write_Match(OpName_MainLine, false);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName_MainLine, false);// 匹配完成 + // MIS_BASE.Write_FixAllow(OpName_MainLine, false); // 允许工作 + // // 分线 + // MIS_BASE.Write_Match(OpName_SubLine, false);// 匹配结果 + // MIS_BASE.Write_MatchingCompleted(OpName_SubLine, false);// 匹配完成 + // MIS_BASE.Write_FixAllow(OpName_SubLine, false); // 允许工作 + + // // 写入分线 等待 0 + // MIS_BASE.WritePLC(29, OpName_SubLine, "0"); + // } + //} + } + + /// + /// 二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_two(string OpName) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, Convert.ToInt32(PartPallet_Code), OrderForm); + + } + /// + /// 跳过二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_Skip(string OpName) + { + MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + //MisDataFun.OpName_MIS_Moby_Select(OpName, + //out orderForm, out engineTypeID, out engineType, + //out engineID, out palletCode, out isRepair, out repairCode); + + //EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode), orderForm); + } + } +} diff --git a/MisDataFunction/Function1054/Methods/vssver2.scc b/MisDataFunction/Function1054/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7782f6f99fca64d9060da64295d333bbcfa49824 GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JE?f#+Da^pY%)r2~3P|^c1<5e@?B{0!@>c`- z*BM{*UOT>@pApDk1LQlN`r!fNtLXb?7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?up zk-l$gNk)E3F@tMfdS+g#duoY4P^D91acX#eQMO)kF+*@^Qf_8RNIuZ`^3)`dNT^GI LUT|t&3WyB=bO1u# literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1054/OpcServer/vssver2.scc b/MisDataFunction/Function1054/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..b884d136322fa97c266a23933f0a62932ef482e6 GIT binary patch literal 332 zcmXpJVq~~_m%l5bInsUAj6{**Nns+3SMy9?E6l*a!N9<<4oLf^W-r#r+{@1h$TB!37A5DWr0OLXGdSnxrDYc7`e(c6gSf7F>6v+{?x`jIAX9(>ZizX? psqX$Drf+I-P-QNI#$`zaX`!Br~;`!LhhFH8&}z(lakD JUoW|s0RY9rD~$jE literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1054/mssccprj.scc b/MisDataFunction/Function1054/mssccprj.scc new file mode 100644 index 0000000..119193d --- /dev/null +++ b/MisDataFunction/Function1054/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function02.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA diff --git a/MisDataFunction/Function1054/packages.config b/MisDataFunction/Function1054/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1054/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1054/vssver2.scc b/MisDataFunction/Function1054/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c770e2832da5f488f76f5e9e407765ea066fd986 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+sITv>>5@ujvVqjoc45V9**6jXXx}TpB$X^2F zSD1-!?6KPc=Bw!YW){07mLy`*sl~ymMP;c)dTyn8$t9WjdHOJhfe{0Osh3<_P?VpA ODWX?aTu_{x%m4rcSvH&i literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1055/DataAccess/DataAccess.cs b/MisDataFunction/Function1055/DataAccess/DataAccess.cs new file mode 100644 index 0000000..68cdca4 --- /dev/null +++ b/MisDataFunction/Function1055/DataAccess/DataAccess.cs @@ -0,0 +1,15 @@ + +namespace MesServerFunctions +{ + partial class FunctionMES + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1055/DataAccess/vssver2.scc b/MisDataFunction/Function1055/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..d045c266ad5c3d2043cebf9a86e43dacd49db85e GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns)!ADwP26=q;yWME)e2BhO2nUq;L?BxgXRrGx` xi(L{+5;5u2;^5SxveY6yx6-`ilFa-(eHg>QNFSudF*!N4xR?RK)JraA004LBDq{cu literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1055/Db.cs b/MisDataFunction/Function1055/Db.cs new file mode 100644 index 0000000..03abc44 --- /dev/null +++ b/MisDataFunction/Function1055/Db.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataLinkMesWork; +using System.Net.NetworkInformation; + +namespace MesServerFunctions +{ + public class Db + { + public static bool OP051_OP050_NeedWork(string EngineID, string opName,string orderForm, out int MatchResult) + { + DataTable dt = new DataTable(); + MatchResult = 0; + string produceName = "合力_OP050前停判断_下工位是否需要工作"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MatchResult = Convert.ToInt32(dt.Rows[0]["是否需要工作"]); + return true; + } + } + return false; + } + public static bool OP051_OP050_NeedWork_Save(string EngineID, int MatchResult) + { + + string produceName = "合力_OP050是否需要工作_插入"; + SqlParameter[] thisParms = new SqlParameter[2]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@是否需要工作", MatchResult); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + public static bool OPA90_TO_OP50_CheckTwoFinish(out int MainLineAllowWork) + { + DataTable dt; + MainLineAllowWork = 2; + string produceName = "合力_OP050是否允许工作_判断"; + SqlParameter[] thisParms = new SqlParameter[0]; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MainLineAllowWork = Convert.ToInt32(dt.Rows[0]["是否允许工作"]); + return true; + } + } + return false; + } + } +} diff --git a/MisDataFunction/Function1055/Function02.csproj.vspscc b/MisDataFunction/Function1055/Function02.csproj.vspscc new file mode 100644 index 0000000..0f0f36c --- /dev/null +++ b/MisDataFunction/Function1055/Function02.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1055/Function1055.csproj b/MisDataFunction/Function1055/Function1055.csproj new file mode 100644 index 0000000..6ab4d10 --- /dev/null +++ b/MisDataFunction/Function1055/Function1055.csproj @@ -0,0 +1,169 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {86DF6A20-91FC-4B62-AABF-116F933E31AA} + Library + Properties + Function1055 + Function1055 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\..\Common\dll\Newtonsoft.Json.dll + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1055/MesServerFunction/Fun_1055.cs b/MisDataFunction/Function1055/MesServerFunction/Fun_1055.cs new file mode 100644 index 0000000..bd3e090 --- /dev/null +++ b/MisDataFunction/Function1055/MesServerFunction/Fun_1055.cs @@ -0,0 +1,242 @@ +using MesServerWork; +using System.Collections.Generic; +using System.Threading; +using System.Xml.Linq; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = DoWhatPlc.MessageText.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.CustomeEvetnArgs e = new DoWhatPlc.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //PLC 工位合格标志 + case "21": + fun_IsOk(e); + break; + //MES保存实时质量数据 + case "65": + fun_MesSaveNowData(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + //MES 将MES传递的数据回传到这个变量,如果是人为修改的,也需要更新到这个变量 (DBX589 37) + case "37": + MIS_BASE.WritePLC(77, m_OpName, m_Value); // 回写到MES托盘状态 + MIS_BASE.Write_FixAllow(m_OpName, true); // 允许工作 + break; + } + break; + } + } + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + /// + /// 允许保存 + /// + /// + /// + public void fun_MesRead(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 保存完成 + /// + /// + /// + public void fun_MesReadOver(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + + /// + /// 工位是否合格 + /// + /// + /// + public void fun_IsOk(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(IsOk, e); + } + + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + + /// + /// MES实时保存质量数据 + /// + /// + /// + public void fun_MesSaveNowData(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesSaveNowData, e); + } + + + } +} diff --git a/MisDataFunction/Function1055/MesServerFunction/vssver2.scc b/MisDataFunction/Function1055/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6753ef90a913bdd4b6a6e13279c279421ee GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZA`fUU7iM5!WME)e0i;h@ES~1HVh2BnucGgp xS?rQnl88yC76+#mm8BNxxs~Q6mt^MW>BATXM*6-mS(q3DkP&ZSq?cUG00296EHVH9 literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1055/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1055/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..ab76f41 --- /dev/null +++ b/MisDataFunction/Function1055/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,120 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code, string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + BaseDataSystemMES.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + SendMessageFun.SendMessage("123", "111", OpName); + //MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 合格标志暂时改为即时响应式的 + //MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + //SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + //SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + if (MES_QualityMask == 2) + { + // 暂时先屏蔽掉 + ////工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //SendMessageFun.SendInfomation("NgGO", "1", OpName);//显示不合格标志 + //return; + } + + //第三步,用于工件离开后完工数量统计及工件编号追溯 + //BaseDataSystemMES.MaterialPush_EngineIDStatus_Insert(OpName);//更新订单产量 + //MIS_BASE.Read_TagTypeID(201, OpName, out string EngineTypeID_QiaoKe); + Db.OP051_OP050_NeedWork(EngineID, OpName, OrderForm, out int MatchResult); + + if (MatchResult == 2) // 不匹配 没有需要装配的轮毂了 + { + MIS_BASE.Write_Match(OpName, false);// 匹配结果 + MIS_BASE.Write_MatchingCompleted(OpName, false);// 匹配完成 + MIS_BASE.WritePLC(77, OpName, "2"); ;// 托盘是否需要工作 1:需要工作 2:不需要工作 + + } + else if (MatchResult == 1) //匹配 有需要装配的轮毂 + { + MIS_BASE.Write_Match(OpName, true);// 匹配结果 + MIS_BASE.Write_MatchingCompleted(OpName, true);// 匹配完成 + MIS_BASE.WritePLC(77, OpName, "1");// 托盘是否需要工作 1:需要工作 2:不需要工作 + MIS_BASE.Write_FixAllow(OpName, true); // 允许工作 + } + else + { + MIS_BASE.WritePLC(29, OpName, true); // 开始等待 通知A60 保存完成时更新下等待状态与匹配状态 + } + } + + /// + /// 二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_two(string OpName) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, Convert.ToInt32(PartPallet_Code), OrderForm); + + } + /// + /// 跳过二次工作 + /// + /// + private void EngineTypeGetOver_PLC_Work_Skip(string OpName) + { + MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode), orderForm); + } + + + + + } +} diff --git a/MisDataFunction/Function1055/Methods/SubmitToMisweb.cs b/MisDataFunction/Function1055/Methods/SubmitToMisweb.cs new file mode 100644 index 0000000..52ce16f --- /dev/null +++ b/MisDataFunction/Function1055/Methods/SubmitToMisweb.cs @@ -0,0 +1,127 @@ +using System; +using bizFacade; +//using SystemFramework; + +namespace MesServerFunctions +{ + + /// + /// 此类用于向WEB发送各种类型消息 + /// + partial class FunctionMES + { + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + void Sendmessage(string MessageNumm,string Value, string OpName) + { + for (int i=0;i + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + string Sendmessage(char Num,string Value, string OpName) + { + string SendMessage; + string result = ""; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '3': + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '4': + //4订单完工模块刷新完成数量 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" +Value; + result = AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '8'://清除MES生成编号 + + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + } + return result; + } + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + string SendInfomation(string Command, string Value, string OpName) + { + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + return AsyncSendMessage(SendMessage); + } + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + AsyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:SendActuallyCount"); + } + } + } + + + } +} diff --git a/MisDataFunction/Function1055/Methods/UDP.Send.cs b/MisDataFunction/Function1055/Methods/UDP.Send.cs new file mode 100644 index 0000000..aed7cc3 --- /dev/null +++ b/MisDataFunction/Function1055/Methods/UDP.Send.cs @@ -0,0 +1,53 @@ +using bizFacade; +//using SystemFramework; +using MesServerWork; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + private string AsyncSendMessage(string Message) + { + return MIS_BASE.asyncSendMessage(Message); + } + + /// + /// 发送提示消息 + /// + /// + private void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + BaseDataSystemMES.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice|" + opname + "|" + "1"; + MIS_BASE.asyncSendMessage(SendMessage); + } + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + } +} diff --git a/MisDataFunction/Function1055/Methods/vssver2.scc b/MisDataFunction/Function1055/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7782f6f99fca64d9060da64295d333bbcfa49824 GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JE?f#+Da^pY%)r2~3P|^c1<5e@?B{0!@>c`- z*BM{*UOT>@pApDk1LQlN`r!fNtLXb?7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?up zk-l$gNk)E3F@tMfdS+g#duoY4P^D91acX#eQMO)kF+*@^Qf_8RNIuZ`^3)`dNT^GI LUT|t&3WyB=bO1u# literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1055/OpcServer/Barcode.cs b/MisDataFunction/Function1055/OpcServer/Barcode.cs new file mode 100644 index 0000000..1f9ea05 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/Barcode.cs @@ -0,0 +1,90 @@ +using System; +using System.Windows.Forms; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + if (!EngineGetOver_PLC_NextWorkStep) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + return; + } + //物料验证 + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + + + + //获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //此处逻辑有问题 需要考虑到批次扫描 提示PLC未传递机型的情况 + if (IsAllowWork == 1) + { + //BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + SendMessageFun.SendMessage("24", "11", OpName); + + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1055/OpcServer/ConfirmOkGo.cs b/MisDataFunction/Function1055/OpcServer/ConfirmOkGo.cs new file mode 100644 index 0000000..06e6b33 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/ConfirmOkGo.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 合格放行 + /// + /// + /// + private void ConfirmOkGo(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + + BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1055/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..59d2445 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/EngineGetOver.cs @@ -0,0 +1,79 @@ +using System; +using System.Data; +using System.Windows.Forms; +using System.Xml.Linq; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm, OrderForm); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + + //显示当前订单信息 + SendMessage.ShowMoby(OpName); + //判断该订单数据是否已经工作过,有的话则在WEB跳出弹窗选择 并同时禁止工作 + //DataTable dt2 = BaseDataSystemMES.EngineIsTwoWork(OpName, OrderForm, EngineID); + //if (dt2.Rows[0]["result"].ToString() == "1") //已完成 + //{ + // //不允许工作 + // MIS_BASE.Write_FixAllow(OpName, false); + // //通知WEB校验重新工作还是跳过 点重新工作给允许工作,点跳过给工作完成 + // string message = "MES|Engine_Is_TwoWork|" + OpName + "|1"; + // SendMessage.AsyncSendMessage(message); + //} + //else + //{ + // EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + //} + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:EngineTypeGetOver_PLC"); + } + } + + + } + + } +} diff --git a/MisDataFunction/Function1055/OpcServer/FalseGO.cs b/MisDataFunction/Function1055/OpcServer/FalseGO.cs new file mode 100644 index 0000000..14b5771 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/FalseGO.cs @@ -0,0 +1,46 @@ +using System; +using System.Data; +using System.Windows.Forms; +using System.Xml.Linq; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 不合格放行 + /// + /// + /// + private void FalseGO(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + //不合格放行信号 + //MIS_BASE.Write_FalseGO(OpName, true); + //总合格标志2(不合格) + + BaseDataSystemMES.Material_Insert_NG(OpName, 2); + + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/HeartBeat.cs b/MisDataFunction/Function1055/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..93affd3 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/HeartBeat.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/MesRead.cs b/MisDataFunction/Function1055/OpcServer/MesRead.cs new file mode 100644 index 0000000..5fe6452 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/MesRead.cs @@ -0,0 +1,77 @@ +using bizFacade; +using MesServerWork; +using System; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + { + try + { + + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + string NeedWork; + + if (tagValue == 1) + { + // 记录050前停工位的是否需要工作 + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + MIS_BASE.Read_TagTypeID(37, OpName, out NeedWork); + Db.OP051_OP050_NeedWork_Save(EngineID, Convert.ToInt32(NeedWork)); + + int qualityMask; + // 保存质量数据 + qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + // 保存物料数据 + BaseDataSystemMES.Material_Insert(OpName, qualityMask); + + // 测量数据发动机在线状态 + BaseDataSystemMES.WorkStartInsert(OpName, qualityMask); + + // 推送质量数据到MES的页面 + SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + + //对应手动工位的 + //MIS_BASE.Write_ConfirmOkGo(OpName, true); + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //统计在线产量,在线节拍 + //SendMessage.SendActuallyCount(OpName, tagValue); + var result = MesFunctions.EnginePart_OutStation(OpName, EngineID, qualityMask); + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + + } + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/MesReadOver.cs b/MisDataFunction/Function1055/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..f96a7d3 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/MesReadOver.cs @@ -0,0 +1,55 @@ +using System; +//using SystemFramework; +using MesServerWork; +using bizFacade; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + //try + //{ + // DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + // string OpName = Convert.ToString(msgEvent.OpName); + // var tagValue = msgEvent.TagValue.ToString (); + + // if (tagValue == "1" | tagValue.ToLower () == "true") + // { + // int qualityMask; + // MIS_BASE.Read_QualityMask(OpName, out qualityMask); + + // SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);//发给Web页面显示质量数据 + + // if (qualityMask == 1)//全部OK,给出合格放行 + // { + // //如果存在线外扫描工位,根据扫描条码绑定线外数据 需要时解除禁用 + // //BaseDataSystemMES.TransLaunchDataByMainMaterial(OpName, EngineType, EngineID, EngineTypeID); + + // //如果存在线外排队工位,根据排队编号绑定线外数据 需要时解除禁用 + // ////BaseDataSystemMES.MailLineAndSubLineData_InsertByEngineID_Subline(OpName,EngineID, EngineTypeID, EngineType); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + // //MIS_BASE.Write_FalseGO(OpName, false); + // } + // else + // { + // //MIS_BASE.Write_ConfirmOkGo(OpName, false); + // MIS_BASE.Write_FalseGO(OpName, true); + // } + + // } + //} + //catch (Exception err) + //{ + // ////ApplicationLog.WriteLog(err, "Function02:MesReadOver"); + //} + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/MesSaveNowData.cs b/MisDataFunction/Function1055/OpcServer/MesSaveNowData.cs new file mode 100644 index 0000000..63c11b3 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/MesSaveNowData.cs @@ -0,0 +1,40 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Net.Mime.MediaTypeNames; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES保存实时质量数据 + /// + /// + /// + private void MesSaveNowData(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + // 直接发送实时的 质量数据 + string message = MisDataSaveDateMesRead.Funtion.GetRealTimeQualityData(OpName); + //推送质量数据到MES的页面 + SendMessage.AsyncSendMessage("MES|ShowTimelyQuality_Resources|" + OpName + "|" + message); + //SendMessageFun.SendMessageMESToWEB("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/WebSubmit.cs b/MisDataFunction/Function1055/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..d7ca28c --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/WebSubmit.cs @@ -0,0 +1,304 @@ +using System; +using MesServerWork; +using bizFacade; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName=Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + return; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //删除不合格放行记录 + //修改托盘状态 + //Update_PalletStatus(OpName, 1, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 3, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 2, false); + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName,0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + case "twoWorkSkip"://重新工作工件跳过工作(重新工作工件) + //工作完成 + EngineTypeGetOver_PLC_Work_Skip(OpName); + break; + case "twoWork"://重新工作工件重新工作(重新工作工件) + //允许工作 + EngineTypeGetOver_PLC_Work_two(OpName); + break; + + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + Sendmessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + + //工件到位 DBX0.1 + bool S_WorkStart; + bool S_FixAllow; + bool S_EngineGetOver; + bool S_MaterialVerifyOver; + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + Sendmessage("13", "1111", Opname); + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + // 新增查询PLC直通状态 网页显示 + MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + + if (S_WorkStart == true) + { + SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + if (S_FixAllow == true) + { + SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + if (S_MaterialVerifyOver == true) + { + SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + if (S_EngineGetOver == true) + { + SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + Sendmessage("2", "1111", Opname); + SendMessage.ShowMoby(Opname); + // 直接发送实时的 质量数据 + string message = MisDataSaveDateMesRead.Funtion.GetRealTimeQualityData(Opname); + //推送质量数据到MES的页面 + SendMessage.AsyncSendMessage("MES|ShowTimelyQuality_Resources|" + Opname + "|" + message); + } + InitAlarm(Opname); + } + + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/WorkIsOk.cs b/MisDataFunction/Function1055/OpcServer/WorkIsOk.cs new file mode 100644 index 0000000..08819e3 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/WorkIsOk.cs @@ -0,0 +1,45 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工位合格标志 + /// + /// + /// + private void IsOk(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + int qualityMask; + MIS_BASE.Read_QualityMask(OpName, out qualityMask); + //判断是否合格 + if (qualityMask == 1) + { + qualityMask = 1; + } else { + qualityMask = 0; + } + //通知WEB修改状态 + string message = "MES|QualityMask|" + OpName + "|" + qualityMask.ToString(); + SendMessage.AsyncSendMessage(message); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1055/OpcServer/WorkStart.cs b/MisDataFunction/Function1055/OpcServer/WorkStart.cs new file mode 100644 index 0000000..a0905d5 --- /dev/null +++ b/MisDataFunction/Function1055/OpcServer/WorkStart.cs @@ -0,0 +1,53 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Threading; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue == 1) + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartIn, DateTime.Now.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStart, tagValue.ToString()); + } + else + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + Thread.Sleep(500); + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + + MIS_BASE.Write_MatchingCompleted(OpName, false);// 匹配完成 + MIS_BASE.Write_Match(OpName, false);// 匹配结果 + MIS_BASE.WritePLC(77, OpName, "0"); ;// 托盘是否需要工作 1:需要工作 2:不需要工作 + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } +} diff --git a/MisDataFunction/Function1055/OpcServer/vssver2.scc b/MisDataFunction/Function1055/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..b884d136322fa97c266a23933f0a62932ef482e6 GIT binary patch literal 332 zcmXpJVq~~_m%l5bInsUAj6{**Nns+3SMy9?E6l*a!N9<<4oLf^W-r#r+{@1h$TB!37A5DWr0OLXGdSnxrDYc7`e(c6gSf7F>6v+{?x`jIAX9(>ZizX? psqX$Drf+I-P-QNI#$`zaX`!Br~;`!LhhFH8&}z(lakD JUoW|s0RY9rD~$jE literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1055/mssccprj.scc b/MisDataFunction/Function1055/mssccprj.scc new file mode 100644 index 0000000..119193d --- /dev/null +++ b/MisDataFunction/Function1055/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function02.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA diff --git a/MisDataFunction/Function1055/packages.config b/MisDataFunction/Function1055/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1055/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1055/vssver2.scc b/MisDataFunction/Function1055/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c770e2832da5f488f76f5e9e407765ea066fd986 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+sITv>>5@ujvVqjoc45V9**6jXXx}TpB$X^2F zSD1-!?6KPc=Bw!YW){07mLy`*sl~ymMP;c)dTyn8$t9WjdHOJhfe{0Osh3<_P?VpA ODWX?aTu_{x%m4rcSvH&i literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1056/DataAccess/DataAccess.cs b/MisDataFunction/Function1056/DataAccess/DataAccess.cs new file mode 100644 index 0000000..68cdca4 --- /dev/null +++ b/MisDataFunction/Function1056/DataAccess/DataAccess.cs @@ -0,0 +1,15 @@ + +namespace MesServerFunctions +{ + partial class FunctionMES + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1056/DataAccess/vssver2.scc b/MisDataFunction/Function1056/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..d045c266ad5c3d2043cebf9a86e43dacd49db85e GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns)!ADwP26=q;yWME)e2BhO2nUq;L?BxgXRrGx` xi(L{+5;5u2;^5SxveY6yx6-`ilFa-(eHg>QNFSudF*!N4xR?RK)JraA004LBDq{cu literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1056/Db.cs b/MisDataFunction/Function1056/Db.cs new file mode 100644 index 0000000..23ab541 --- /dev/null +++ b/MisDataFunction/Function1056/Db.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + public class Db + { + /// + /// 合力_转线_A92判断工件状态 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OPA92_EngineGetOverCheckWorkType(string EngineID, out int MatchResult, out string MatchResultStr) + { + DataTable dt = new DataTable(); + MatchResult = 2;// 默认是报警 程序出错 + MatchResultStr = "默认是报警 程序出错";// 默认是报警 程序出错 + string produceName = "合力_转线_A92判断工件状态"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@轮毂总成号", EngineID); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MatchResult = Convert.ToInt32(dt.Rows[0]["result"]); + MatchResultStr = dt.Rows[0]["msg"].ToString(); + return true; + } + } + return false; + } + + /// + /// 合力_转线_删除记录数据 同时保存 轮毂 桥壳 关系 + /// + /// + public static void OPA92_DeleteLineData(string EngineID_QiaoKe) + { + DataTable dt = new DataTable(); + string produceName = "合力_转线_删除记录数据"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID_QiaoKe); + DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt); + } + } +} diff --git a/MisDataFunction/Function1056/Function02.csproj.vspscc b/MisDataFunction/Function1056/Function02.csproj.vspscc new file mode 100644 index 0000000..0f0f36c --- /dev/null +++ b/MisDataFunction/Function1056/Function02.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1056/Function1056.csproj b/MisDataFunction/Function1056/Function1056.csproj new file mode 100644 index 0000000..75060ae --- /dev/null +++ b/MisDataFunction/Function1056/Function1056.csproj @@ -0,0 +1,169 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {191419A0-CCEB-4816-BEDC-C39ABF2981A7} + Library + Properties + Function1056 + Function1056 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\..\Common\dll\Newtonsoft.Json.dll + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1056/MesServerFunction/Fun_1056.cs b/MisDataFunction/Function1056/MesServerFunction/Fun_1056.cs new file mode 100644 index 0000000..a6ed400 --- /dev/null +++ b/MisDataFunction/Function1056/MesServerFunction/Fun_1056.cs @@ -0,0 +1,223 @@ +using MesServerWork; +using System.Collections.Generic; +using System.Threading; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = DoWhatPlc.MessageText.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.CustomeEvetnArgs e = new DoWhatPlc.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + // case "MES": + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //MES保存实时质量数据 + case "65": + fun_MesSaveNowData(e); + break; + //MES 系统健康心跳 + case "15": + fun_HeartBeatMIS(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + } + break; + } + } + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + public void fun_WritePLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WritePLC, e); + } + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + /// + /// 允许保存 + /// + /// + /// + public void fun_MesRead(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 保存完成 + /// + /// + /// + public void fun_MesReadOver(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + /// + /// MES实时保存质量数据 + /// + /// + /// + public void fun_MesSaveNowData(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesSaveNowData, e); + } + + } +} diff --git a/MisDataFunction/Function1056/MesServerFunction/vssver2.scc b/MisDataFunction/Function1056/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6753ef90a913bdd4b6a6e13279c279421ee GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZA`fUU7iM5!WME)e0i;h@ES~1HVh2BnucGgp xS?rQnl88yC76+#mm8BNxxs~Q6mt^MW>BATXM*6-mS(q3DkP&ZSq?cUG00296EHVH9 literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1056/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1056/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..bd32165 --- /dev/null +++ b/MisDataFunction/Function1056/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,109 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + DataTable dt; + dt = BaseDataSystemMES.EngineTypeChange(OpName, EngineType); + + //通知web显示 + SendMessageFun.SendMessage("123", "111", OpName); + MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 + SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + + MIS_BASE.Write_FixAllow(OpName, true); + + // 当A92 到位时表示当前一定是第二个件 先判断当前工件是否为已匹配的第二个工件 是的话是工作,不是报警 + Db.OPA92_EngineGetOverCheckWorkType(EngineID, out int MatchResult, out string MatchResultStr); + if (MatchResult == 1) + { + // 轮毂线 + MIS_BASE.Write_Match(OpName, true);// 匹配结果 + MIS_BASE.Write_MatchingCompleted(OpName, true);// 匹配完成 + MIS_BASE.Write_FixAllow(OpName, true); // 允许工作 + + return; + } + else + { + // 将根据轮毂号 工位号 时间 报错内容 存储到数据库中供查询 + // 匹配结果不成功 + MIS_BASE.Write_Match(OpName, false);// 匹配结果 + MIS_BASE.Write_MatchingCompleted(OpName, true);// 匹配完成 + return; + } + + //if (MES_QualityMask == 2) + //{ + // //工作完成 + // //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + // //SendMessageFun.SendInfomation("NgGO", "1", OpName);//显示不合格标志 + // //return; + //} + + + //第三步,用于工件离开后完工数量统计及工件编号追溯 + //BaseDataSystemMES.MaterialPush_EngineIDStatus_Insert(OpName);//更新订单产量 + + ////第四步,获取是否允许工作 + //BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + ////暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + //if (IsAllowWork == 1) + //{ + // //通知PLC允许工作,允许工作在保存完成时清空 + // MIS_BASE.Write_FixAllow(OpName, true); + //} + //else + //{ + // SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + //} + + + + } + + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + + + + + } +} diff --git a/MisDataFunction/Function1056/Methods/SubmitToMisweb.cs b/MisDataFunction/Function1056/Methods/SubmitToMisweb.cs new file mode 100644 index 0000000..52ce16f --- /dev/null +++ b/MisDataFunction/Function1056/Methods/SubmitToMisweb.cs @@ -0,0 +1,127 @@ +using System; +using bizFacade; +//using SystemFramework; + +namespace MesServerFunctions +{ + + /// + /// 此类用于向WEB发送各种类型消息 + /// + partial class FunctionMES + { + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + void Sendmessage(string MessageNumm,string Value, string OpName) + { + for (int i=0;i + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + string Sendmessage(char Num,string Value, string OpName) + { + string SendMessage; + string result = ""; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '3': + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '4': + //4订单完工模块刷新完成数量 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" +Value; + result = AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '8'://清除MES生成编号 + + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + } + return result; + } + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + string SendInfomation(string Command, string Value, string OpName) + { + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + return AsyncSendMessage(SendMessage); + } + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + AsyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:SendActuallyCount"); + } + } + } + + + } +} diff --git a/MisDataFunction/Function1056/Methods/UDP.Send.cs b/MisDataFunction/Function1056/Methods/UDP.Send.cs new file mode 100644 index 0000000..aed7cc3 --- /dev/null +++ b/MisDataFunction/Function1056/Methods/UDP.Send.cs @@ -0,0 +1,53 @@ +using bizFacade; +//using SystemFramework; +using MesServerWork; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + private string AsyncSendMessage(string Message) + { + return MIS_BASE.asyncSendMessage(Message); + } + + /// + /// 发送提示消息 + /// + /// + private void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + BaseDataSystemMES.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice|" + opname + "|" + "1"; + MIS_BASE.asyncSendMessage(SendMessage); + } + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + } +} diff --git a/MisDataFunction/Function1056/Methods/vssver2.scc b/MisDataFunction/Function1056/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7782f6f99fca64d9060da64295d333bbcfa49824 GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JE?f#+Da^pY%)r2~3P|^c1<5e@?B{0!@>c`- z*BM{*UOT>@pApDk1LQlN`r!fNtLXb?7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?up zk-l$gNk)E3F@tMfdS+g#duoY4P^D91acX#eQMO)kF+*@^Qf_8RNIuZ`^3)`dNT^GI LUT|t&3WyB=bO1u# literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1056/OpcServer/Barcode.cs b/MisDataFunction/Function1056/OpcServer/Barcode.cs new file mode 100644 index 0000000..10a0ee6 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/Barcode.cs @@ -0,0 +1,98 @@ +using System; +using System.Windows.Forms; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + if (!EngineGetOver_PLC_NextWorkStep) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + return; + } + //物料验证 + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + //获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //此处逻辑有问题 需要考虑到批次扫描 提示PLC未传递机型的情况 + if (IsAllowWork == 1) + { + //BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + SendMessageFun.SendMessage("24", "11", OpName); + + //工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //if (!BaseDataSystemMES.QualityVerifyStatusOutline(OpName, out AlarmStr)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, OpName); + // return; + //} + //通知PLC允许工作,允许工作在保存完成时清空 + + //将机型信息传递给刷写站工控机 + + + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1056/OpcServer/ConfirmOkGo.cs b/MisDataFunction/Function1056/OpcServer/ConfirmOkGo.cs new file mode 100644 index 0000000..06e6b33 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/ConfirmOkGo.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 合格放行 + /// + /// + /// + private void ConfirmOkGo(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + + BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1056/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..c5b6d6f --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/EngineGetOver.cs @@ -0,0 +1,67 @@ +using System; +using System.Data; +using System.Windows.Forms; +using System.Xml.Linq; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0 || OrderForm.Length == 0) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm, OrderForm); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + //显示当前订单信息 + SendMessage.ShowMoby(OpName); + + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:EngineTypeGetOver_PLC"); + } + } + + + } + + + } +} diff --git a/MisDataFunction/Function1056/OpcServer/FalseGO.cs b/MisDataFunction/Function1056/OpcServer/FalseGO.cs new file mode 100644 index 0000000..4ad2665 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/FalseGO.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 不合格放行 + /// + /// + /// + private void FalseGO(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + //总合格标志2(不合格) + + BaseDataSystemMES.Material_Insert_NG(OpName, 2); + + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/HeartBeat.cs b/MisDataFunction/Function1056/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..93affd3 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/HeartBeat.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/MesRead.cs b/MisDataFunction/Function1056/OpcServer/MesRead.cs new file mode 100644 index 0000000..a577ea9 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/MesRead.cs @@ -0,0 +1,92 @@ +using bizFacade; +using MesServerWork; +using System; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + { + try + { + + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int qualityMask; + + //保存质量数据 + qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + //保存物料数据 + BaseDataSystemMES.Material_Insert(OpName, qualityMask); + + //测量数据发动机在线状态 + BaseDataSystemMES.WorkStartInsert(OpName, qualityMask); + + //推送质量数据到MES的页面 + SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + + + //对应手动工位的 + //MIS_BASE.Write_ConfirmOkGo(OpName, true); + + + //MIS_BASE.Write_FixAllow(OpName, false); + + //MIS_BASE.Write_ConfirmOkGo(OpName, false); + + + //MIS_BASE.Write_FixOver(OpName, false); + //MIS_BASE.Write_MaterialVerifyOver(OpName, false); + + + //统计在线产量,在线节拍 + // SendMessage.SendActuallyCount(OpName, tagValue); + + // 判断050 工位是否有传递机型 有的话 允许050工作 同时删除记录表中轮毂号 + MIS_BASE.Read_EngineGetOver_PLC("OP050", out bool EngineGetOver_PLC_NextWorkStep); + if (EngineGetOver_PLC_NextWorkStep) + { + MIS_BASE.Write_FixAllow("OP050", true); + // 查询050 工位当前到位的工件编号 + MIS_BASE.Read_EngineID("OP050", out string OP050_EngineID); + // 绑定关系 同时 删除记录 + Db.OPA92_DeleteLineData(OP050_EngineID); + } + + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/MesReadOver.cs b/MisDataFunction/Function1056/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..f96a7d3 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/MesReadOver.cs @@ -0,0 +1,55 @@ +using System; +//using SystemFramework; +using MesServerWork; +using bizFacade; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + //try + //{ + // DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + // string OpName = Convert.ToString(msgEvent.OpName); + // var tagValue = msgEvent.TagValue.ToString (); + + // if (tagValue == "1" | tagValue.ToLower () == "true") + // { + // int qualityMask; + // MIS_BASE.Read_QualityMask(OpName, out qualityMask); + + // SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);//发给Web页面显示质量数据 + + // if (qualityMask == 1)//全部OK,给出合格放行 + // { + // //如果存在线外扫描工位,根据扫描条码绑定线外数据 需要时解除禁用 + // //BaseDataSystemMES.TransLaunchDataByMainMaterial(OpName, EngineType, EngineID, EngineTypeID); + + // //如果存在线外排队工位,根据排队编号绑定线外数据 需要时解除禁用 + // ////BaseDataSystemMES.MailLineAndSubLineData_InsertByEngineID_Subline(OpName,EngineID, EngineTypeID, EngineType); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + // //MIS_BASE.Write_FalseGO(OpName, false); + // } + // else + // { + // //MIS_BASE.Write_ConfirmOkGo(OpName, false); + // MIS_BASE.Write_FalseGO(OpName, true); + // } + + // } + //} + //catch (Exception err) + //{ + // ////ApplicationLog.WriteLog(err, "Function02:MesReadOver"); + //} + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/MesSaveNowData.cs b/MisDataFunction/Function1056/OpcServer/MesSaveNowData.cs new file mode 100644 index 0000000..63c11b3 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/MesSaveNowData.cs @@ -0,0 +1,40 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Net.Mime.MediaTypeNames; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES保存实时质量数据 + /// + /// + /// + private void MesSaveNowData(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + // 直接发送实时的 质量数据 + string message = MisDataSaveDateMesRead.Funtion.GetRealTimeQualityData(OpName); + //推送质量数据到MES的页面 + SendMessage.AsyncSendMessage("MES|ShowTimelyQuality_Resources|" + OpName + "|" + message); + //SendMessageFun.SendMessageMESToWEB("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/WebSubmit.cs b/MisDataFunction/Function1056/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..6a088b5 --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/WebSubmit.cs @@ -0,0 +1,294 @@ +using System; +using MesServerWork; +using bizFacade; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName=Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "WritePLC": + if (m_Value_length > 1) return; + fun_WritePLC(_e); + break; + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //删除不合格放行记录 + //修改托盘状态 + //Update_PalletStatus(OpName, 1, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 3, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 2, false); + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName,0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + Sendmessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + + //工件到位 DBX0.1 + bool S_WorkStart; + bool S_FixAllow; + bool S_EngineGetOver; + bool S_MaterialVerifyOver; + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + Sendmessage("13", "1111", Opname); + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + // 新增查询PLC直通状态 网页显示 + MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + + if (S_WorkStart == true) + { + SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + + if (S_FixAllow == true) + { + SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + if (S_MaterialVerifyOver == true) + { + SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + if (S_EngineGetOver == true) + { + SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + Sendmessage("2", "1111", Opname); + SendMessage.ShowMoby(Opname); + // 直接发送实时的 质量数据 + string message = MisDataSaveDateMesRead.Funtion.GetRealTimeQualityData(Opname); + //推送质量数据到MES的页面 + SendMessage.AsyncSendMessage("MES|ShowTimelyQuality_Resources|" + Opname + "|" + message); + } + InitAlarm(Opname); + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + } +} diff --git a/MisDataFunction/Function1056/OpcServer/WorkStart.cs b/MisDataFunction/Function1056/OpcServer/WorkStart.cs new file mode 100644 index 0000000..da1ef0a --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/WorkStart.cs @@ -0,0 +1,46 @@ +using bizFacade; +using MesServerWork; +using System; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue > 0) + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartIn, DateTime.Now.ToString()); + } + else + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + //后加,清空信号 + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } +} diff --git a/MisDataFunction/Function1056/OpcServer/WritePLC.cs b/MisDataFunction/Function1056/OpcServer/WritePLC.cs new file mode 100644 index 0000000..83ede7c --- /dev/null +++ b/MisDataFunction/Function1056/OpcServer/WritePLC.cs @@ -0,0 +1,41 @@ +using System; +using System.Windows.Forms; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void WritePLC(object e) + { + + { + try + { + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1056/OpcServer/vssver2.scc b/MisDataFunction/Function1056/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..b884d136322fa97c266a23933f0a62932ef482e6 GIT binary patch literal 332 zcmXpJVq~~_m%l5bInsUAj6{**Nns+3SMy9?E6l*a!N9<<4oLf^W-r#r+{@1h$TB!37A5DWr0OLXGdSnxrDYc7`e(c6gSf7F>6v+{?x`jIAX9(>ZizX? psqX$Drf+I-P-QNI#$`zaX`!Br~;`!LhhFH8&}z(lakD JUoW|s0RY9rD~$jE literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1056/mssccprj.scc b/MisDataFunction/Function1056/mssccprj.scc new file mode 100644 index 0000000..119193d --- /dev/null +++ b/MisDataFunction/Function1056/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function02.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA diff --git a/MisDataFunction/Function1056/packages.config b/MisDataFunction/Function1056/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1056/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1056/vssver2.scc b/MisDataFunction/Function1056/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c770e2832da5f488f76f5e9e407765ea066fd986 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+sITv>>5@ujvVqjoc45V9**6jXXx}TpB$X^2F zSD1-!?6KPc=Bw!YW){07mLy`*sl~ymMP;c)dTyn8$t9WjdHOJhfe{0Osh3<_P?VpA ODWX?aTu_{x%m4rcSvH&i literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1057/DataAccess/DataAccess.cs b/MisDataFunction/Function1057/DataAccess/DataAccess.cs new file mode 100644 index 0000000..574d619 --- /dev/null +++ b/MisDataFunction/Function1057/DataAccess/DataAccess.cs @@ -0,0 +1,15 @@ + +namespace MesServerFunctions +{ + partial class Function1052 + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1057/DataAccess/vssver2.scc b/MisDataFunction/Function1057/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..d045c266ad5c3d2043cebf9a86e43dacd49db85e GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns)!ADwP26=q;yWME)e2BhO2nUq;L?BxgXRrGx` xi(L{+5;5u2;^5SxveY6yx6-`ilFa-(eHg>QNFSudF*!N4xR?RK)JraA004LBDq{cu literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1057/Db.cs b/MisDataFunction/Function1057/Db.cs new file mode 100644 index 0000000..0e1fdc9 --- /dev/null +++ b/MisDataFunction/Function1057/Db.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + public class Db + { + /// + /// 合力_OPA90是否允许工作_判断 如果允许工作则将两个轮毂状态设为待匹配 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool OP50_OPA90_MatchResult(int EngineTypeID, int EngineTypeID_QiaoKe, string EngineID, string OrderForm, out int MatchResult, out string MatchResultStr) + { + DataTable dt = new DataTable(); + MatchResult = 3;// 默认是报警 程序出错 + MatchResultStr = "默认是报警 程序出错";// 默认是报警 程序出错 + string produceName = "合力_OPA90是否允许工作_判断"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@轮毂机型", EngineTypeID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@轮毂总成号", EngineID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@桥壳_机型", EngineTypeID_QiaoKe); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@订单号", OrderForm); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MatchResult = Convert.ToInt32(dt.Rows[0]["最终结果"]); + MatchResultStr = dt.Rows[0]["最终结果说明"].ToString(); + return true; + } + } + return false; + } + + public static bool OP051_OP050_NeedWork(string EngineID, string opName, string orderForm, out int MatchResult) + { + DataTable dt = new DataTable(); + MatchResult = 0; + string produceName = "合力_OP050前停判断_下工位是否需要工作"; + SqlParameter[] thisParms = new SqlParameter[3]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@桥壳总成号", EngineID); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@订单号", orderForm); + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out dt)) + { + if (dt.Rows.Count > 0) + { + MatchResult = Convert.ToInt32(dt.Rows[0]["是否需要工作"]); + return true; + } + } + return false; + } + } +} diff --git a/MisDataFunction/Function1057/Function02.csproj.vspscc b/MisDataFunction/Function1057/Function02.csproj.vspscc new file mode 100644 index 0000000..0f0f36c --- /dev/null +++ b/MisDataFunction/Function1057/Function02.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1057/Function1057.csproj b/MisDataFunction/Function1057/Function1057.csproj new file mode 100644 index 0000000..142cf1b --- /dev/null +++ b/MisDataFunction/Function1057/Function1057.csproj @@ -0,0 +1,167 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {9377BB04-B518-4E77-8B90-E56FE7980204} + Library + Properties + Function1057 + Function1057 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\..\Common\dll\Newtonsoft.Json.dll + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1057/MesServerFunction/Fun_1057.cs b/MisDataFunction/Function1057/MesServerFunction/Fun_1057.cs new file mode 100644 index 0000000..6a943b5 --- /dev/null +++ b/MisDataFunction/Function1057/MesServerFunction/Fun_1057.cs @@ -0,0 +1,206 @@ +using MesServerWork; +using System.Collections.Generic; +using System.Threading; +using System.Xml.Linq; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = DoWhatPlc.MessageText.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.CustomeEvetnArgs e = new DoWhatPlc.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + } + break; + } + } + } + + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + /// + /// 允许保存 + /// + /// + /// + public void fun_MesRead(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 保存完成 + /// + /// + /// + public void fun_MesReadOver(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + + } +} diff --git a/MisDataFunction/Function1057/MesServerFunction/vssver2.scc b/MisDataFunction/Function1057/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6753ef90a913bdd4b6a6e13279c279421ee GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns+ZA`fUU7iM5!WME)e0i;h@ES~1HVh2BnucGgp xS?rQnl88yC76+#mm8BNxxs~Q6mt^MW>BATXM*6-mS(q3DkP&ZSq?cUG00296EHVH9 literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1057/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1057/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..edaa222 --- /dev/null +++ b/MisDataFunction/Function1057/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,98 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + DataTable dt; + dt = BaseDataSystemMES.EngineTypeChange(OpName, EngineType); + //提示机型发生变化 + if (dt.Rows.Count > 0) + { + string mesValue = Newtonsoft.Json.JsonConvert.SerializeObject(dt);//(recData); + string message = "MES|MaterialList_Dif_Resources|" + OpName + "|" + mesValue; + SendMessage.AsyncSendMessage(message); + } + + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + BaseDataSystemMES.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + SendMessageFun.SendMessage("123", "111", OpName); + MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 + MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + if (MES_QualityMask == 2) + { + ////工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //SendMessageFun.SendInfomation("NgGO", "1", OpName);//显示不合格标志 + //return; + } + + + //第三步,用于工件离开后完工数量统计及工件编号追溯 + //BaseDataSystemMES.MaterialPush_EngineIDStatus_Insert(OpName);//更新订单产量 + + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + } + + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + + + + + } +} diff --git a/MisDataFunction/Function1057/Methods/SubmitToMisweb.cs b/MisDataFunction/Function1057/Methods/SubmitToMisweb.cs new file mode 100644 index 0000000..52ce16f --- /dev/null +++ b/MisDataFunction/Function1057/Methods/SubmitToMisweb.cs @@ -0,0 +1,127 @@ +using System; +using bizFacade; +//using SystemFramework; + +namespace MesServerFunctions +{ + + /// + /// 此类用于向WEB发送各种类型消息 + /// + partial class FunctionMES + { + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + void Sendmessage(string MessageNumm,string Value, string OpName) + { + for (int i=0;i + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + string Sendmessage(char Num,string Value, string OpName) + { + string SendMessage; + string result = ""; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '3': + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '4': + //4订单完工模块刷新完成数量 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" +Value; + result = AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '8'://清除MES生成编号 + + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + } + return result; + } + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + string SendInfomation(string Command, string Value, string OpName) + { + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + return AsyncSendMessage(SendMessage); + } + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + AsyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:SendActuallyCount"); + } + } + } + + + } +} diff --git a/MisDataFunction/Function1057/Methods/UDP.Send.cs b/MisDataFunction/Function1057/Methods/UDP.Send.cs new file mode 100644 index 0000000..aed7cc3 --- /dev/null +++ b/MisDataFunction/Function1057/Methods/UDP.Send.cs @@ -0,0 +1,53 @@ +using bizFacade; +//using SystemFramework; +using MesServerWork; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + private string AsyncSendMessage(string Message) + { + return MIS_BASE.asyncSendMessage(Message); + } + + /// + /// 发送提示消息 + /// + /// + private void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + BaseDataSystemMES.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice|" + opname + "|" + "1"; + MIS_BASE.asyncSendMessage(SendMessage); + } + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + } +} diff --git a/MisDataFunction/Function1057/Methods/vssver2.scc b/MisDataFunction/Function1057/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7782f6f99fca64d9060da64295d333bbcfa49824 GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns+JE?f#+Da^pY%)r2~3P|^c1<5e@?B{0!@>c`- z*BM{*UOT>@pApDk1LQlN`r!fNtLXb?7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?up zk-l$gNk)E3F@tMfdS+g#duoY4P^D91acX#eQMO)kF+*@^Qf_8RNIuZ`^3)`dNT^GI LUT|t&3WyB=bO1u# literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1057/OpcServer/Barcode.cs b/MisDataFunction/Function1057/OpcServer/Barcode.cs new file mode 100644 index 0000000..d9f59f8 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/Barcode.cs @@ -0,0 +1,228 @@ +using System; +using System.Threading; +using System.Windows.Forms; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + + int EngineTypeID;//机型代码 + string EngineType;//机型 + string EngineID;//工件编号 + + string OrderForm; + int Recipe1; + int Recipe2; + + bool IsNotRepeatedNumber = false; + //1:获得申请上线信息后,扫描条码才处理业务 + bool ispartload; + //(115) + int PTO; + //(118)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int NgearSwitch; + //(119)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int RgearSwitch; + //(120)0=不检测;1=检测。检测线上线工位扫描总成条码,根据BOM,查出 + int SpeedSensor; + //(121)例如:5S 400。检测线上线工位扫描总成条码,根据BOM,查出 + string PartTypeMid; + //(122) 0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int Tcu_V; + + //判断是否开启线外上线 + if (!Convert.ToBoolean(MIS_BASE.ReadPLC(64, OpName))) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "若转线上线工件请在系统选择转线工件选项"); + return; + } + + //判断工件是否到位 + MIS_BASE.Read_WorkStart(OpName, out ispartload); + if (!ispartload) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否到位(DBX500.1=1)"); + return; + } + //判断设备是否申请上线 + MIS_BASE.Read_UpdatePalletOK(OpName, out ispartload); + if (!ispartload) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否申请上线(DBX500.3=1)"); + return; + } + // 判读条码是变速器序列号条码号还是物料号 小机型*日月年* 流水号(给起始号 + 数量) + // 选小机型 从北汽福田BOM中选 得先维护BOM + // 变速器序列号 '1333 050 062*16012023*30000001' + + //扫描完变速器序列号条码号 true + bool isGetOver_PLC = false; + //判断上线工位,MES 是否将工件流水号、机型等信息已经写入到PLC了 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out isGetOver_PLC); + //如果工件流水号、机型等信息没有写入PLC,扫描的条码按工件流水号进行验证 + //否则按装配物料进行验证 + if (!isGetOver_PLC) + { + + if (barcode.Split('*').Length > 2) + { + //2: 判断是否重号, 从数据库获得机型、机型代码等信息 + string partSn = barcode; + EngineID = barcode; + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + + //IsRepeatedNumber true 不重号;false 重号; + IsNotRepeatedNumber = BaseDataSystemMES.EngineTypeID_IsNotRepeatedNumber(partSn); + if (IsNotRepeatedNumber) + { + BaseDataSystemMES.GetEngineTypeUpLoadOpName(partSn, OpName, out EngineTypeID, out EngineType, out OrderForm, out Recipe1, out Recipe2); + + + BaseDataSystemMES.UpLoadPTO(EngineType, out PTO, out NgearSwitch, out RgearSwitch, out SpeedSensor, out PartTypeMid, out Tcu_V); + //PTO + MIS_BASE.WritePLC(115, OpName, PTO); + //空挡开关检测 + MIS_BASE.WritePLC(95, OpName, NgearSwitch); + //倒挡开关检测 + MIS_BASE.WritePLC(96, OpName, RgearSwitch); + //里程表检测 + MIS_BASE.WritePLC(97, OpName, SpeedSensor); + //大机型扩展 + MIS_BASE.WritePLC(98, OpName, PartTypeMid); + //TCU + MIS_BASE.WritePLC(122, OpName, Tcu_V); + string tagStartAdr;//= "DB411.10"; + + // 先查询配方号 根据工位号 去moby表查配方号 + // 根据配方号 去配方表查配方数据 + // 写入配方数据 + BaseDataSystemMES.PLCRcipeCurrent(OpName, out byte[] bytes, out tagStartAdr); + DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID("94", OpName, System.Text.Encoding.ASCII.GetString(bytes)); + ////将产品信息写入PLC + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + //写入到数据库的[北汽福田工位状态监控MOBY]表中 + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID_MES, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType_MES, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm_MES, OrderForm); + + //通知web显示 + SendMessage.ShowMoby(OpName); + //在PLC传递机型后进行允许工作 + //MIS_BASE.Write_FixAllow(OpName, true); + SendMessageFun.AsyncSendMessage_Notice(OpName, "扫码成功,请开始工作!"); + //SendMessageFun.SendMessage("1235", "1111", OpName); + + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); + //Thread.Sleep(1000); + //MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号 重号,请确认!"); + } + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号格式不正确,请确认!"); + + } + } + else//验证物料 + { + //物料号 + { + //读取PLC的传递机型信号 + bool tagValue; + MIS_BASE.Read_EngineGetOver_PLC(OpName, out tagValue); + if (tagValue) + { + //验证物料 + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out bool IsSuccess); + if (!IsSuccess)//???? + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + //判断物料是否验证完成 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out int IsAllowWork); + + + if (IsSuccess) + { + if (IsAllowWork == 1) + { + //移到允许保存信号中 + //BaseDataSystemMES.Material_Insert(OpName, 1); + + ////更新订单完工数量及物料 + SendMessageFun.SendMessage("24", "11", OpName); + + //物料验证完成,通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + } + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "产品上线后,PLC获得变速器序列号后,再验证物料!"); + } + + } + } + + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1057/OpcServer/ConfirmOkGo.cs b/MisDataFunction/Function1057/OpcServer/ConfirmOkGo.cs new file mode 100644 index 0000000..06e6b33 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/ConfirmOkGo.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 合格放行 + /// + /// + /// + private void ConfirmOkGo(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + + BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + } +} diff --git a/MisDataFunction/Function1057/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1057/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..fd4ae58 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/EngineGetOver.cs @@ -0,0 +1,79 @@ +using System; +using System.Data; +using System.Windows.Forms; +using System.Xml.Linq; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0 || OrderForm.Length == 0) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm, OrderForm); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + //显示当前订单信息 + SendMessage.ShowMoby(OpName); + //判断该订单数据是否已经工作过,有的话则在WEB跳出弹窗选择 并同时禁止工作 + //DataTable dt2 = BaseDataSystemMES.EngineIsTwoWork(OpName, OrderForm, EngineID); + //if (dt2.Rows[0]["result"].ToString() == "1") //已完成 + //{ + // //不允许工作 + // MIS_BASE.Write_FixAllow(OpName, false); + // //通知WEB校验重新工作还是跳过 点重新工作给允许工作,点跳过给工作完成 + // string message = "MES|Engine_Is_TwoWork|" + OpName + "|1"; + // SendMessage.AsyncSendMessage(message); + //} + //else + //{ + // EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + //} + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:EngineTypeGetOver_PLC"); + } + } + + + } + + + } +} diff --git a/MisDataFunction/Function1057/OpcServer/FalseGO.cs b/MisDataFunction/Function1057/OpcServer/FalseGO.cs new file mode 100644 index 0000000..4ad2665 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/FalseGO.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 不合格放行 + /// + /// + /// + private void FalseGO(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + //总合格标志2(不合格) + + BaseDataSystemMES.Material_Insert_NG(OpName, 2); + + Sendmessage("24", "11", OpName); + + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1057/OpcServer/HeartBeat.cs b/MisDataFunction/Function1057/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..93affd3 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/HeartBeat.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1057/OpcServer/MesRead.cs b/MisDataFunction/Function1057/OpcServer/MesRead.cs new file mode 100644 index 0000000..2496314 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/MesRead.cs @@ -0,0 +1,123 @@ +using bizFacade; +using MesServerWork; +using System; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + { + try + { + + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int qualityMask; + + //保存质量数据 + qualityMask = MisDataSaveDateMesRead.Funtion.MesRead_J07MA150(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + //保存物料数据 + BaseDataSystemMES.Material_Insert(OpName, qualityMask); + + //测量数据发动机在线状态 + BaseDataSystemMES.WorkStartInsert(OpName, qualityMask); + + //推送质量数据到MES的页面d + SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + string SLResult = MIS_BASE.ReadPLC(41, OpName).ToString(); //试漏结果 + int TurnLineWork = Convert.ToInt32(MIS_BASE.ReadPLC(64, OpName)); //是否转线 + // 保存150工位试漏结果 + BaseDataSystemMES.SLResult_Add( SLResult, EngineID, EngineType, EngineTypeID, TurnLineWork); + + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + + //统计在线产量,在线节拍 + SendMessage.SendActuallyCount(OpName, tagValue); + + string awaitOpName = "OPA90"; + // 读取A90 是否在等待 + int isAwait = Convert.ToInt32(MIS_BASE.ReadPLC(29, awaitOpName)); + // 如果是OPA60 的话去再次判断工件匹配状态 + if (isAwait == 1) + { + MIS_BASE.Read_TagTypeID(201, awaitOpName, out string EngineTypeID_QiaoKe); + + string await_EngineID = MIS_BASE.ReadPLC(10, awaitOpName).ToString(); // 读取A90等待工件的工件编号 + int await_EngineTypeID = Convert.ToInt32(MIS_BASE.ReadPLC(9, awaitOpName)); // 读取A90等待工件的机型编号 + string await_OrderForm = MIS_BASE.ReadPLC(39, awaitOpName).ToString(); // 读取A90等待工件的订单号 + Db.OP50_OPA90_MatchResult(await_EngineTypeID, Convert.ToInt32(EngineTypeID_QiaoKe), await_EngineID, await_OrderForm, out int MatchResult, out string MatchResultStr); + if (MatchResult == 1) + { + // 轮毂线 + MIS_BASE.Write_Match(awaitOpName, true);// 匹配结果 + MIS_BASE.Write_MatchingCompleted(awaitOpName, true);// 匹配完成 + MIS_BASE.Write_FixAllow(awaitOpName, true); // 允许工作 + MIS_BASE.WritePLC(29, awaitOpName, false); // 取消等待 + return; + } + } + + string awaitOpName2 = "OP051"; + // 读取A90 是否在等待 + int isAwait2 = Convert.ToInt32(MIS_BASE.ReadPLC(29, awaitOpName2)); + if (isAwait2 == 1 && OpName == "OPA60") + { + string await2_EngineID = MIS_BASE.ReadPLC(10, awaitOpName2).ToString(); // 读取051等待工件的工件编号 + string await2_OrderForm = MIS_BASE.ReadPLC(39, awaitOpName2).ToString(); // 读取051等待工件的订单号 + + + Db.OP051_OP050_NeedWork(await2_EngineID, awaitOpName2, await2_OrderForm, out int MatchResult); + + if (MatchResult == 1) //匹配 有需要装配的轮毂 + { + MIS_BASE.Write_Match(awaitOpName2, true);// 匹配结果 + MIS_BASE.Write_MatchingCompleted(awaitOpName2, true);// 匹配完成 + MIS_BASE.WritePLC(77, awaitOpName2, "1");// 托盘是否需要工作 1:需要工作 2:不需要工作 + MIS_BASE.Write_FixAllow(awaitOpName2, true); // 允许工作 + MIS_BASE.WritePLC(29, awaitOpName2, false); // 取消等待 + } + } + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + + } + } +} diff --git a/MisDataFunction/Function1057/OpcServer/MesReadOver.cs b/MisDataFunction/Function1057/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..f96a7d3 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/MesReadOver.cs @@ -0,0 +1,55 @@ +using System; +//using SystemFramework; +using MesServerWork; +using bizFacade; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + //try + //{ + // DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + // string OpName = Convert.ToString(msgEvent.OpName); + // var tagValue = msgEvent.TagValue.ToString (); + + // if (tagValue == "1" | tagValue.ToLower () == "true") + // { + // int qualityMask; + // MIS_BASE.Read_QualityMask(OpName, out qualityMask); + + // SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);//发给Web页面显示质量数据 + + // if (qualityMask == 1)//全部OK,给出合格放行 + // { + // //如果存在线外扫描工位,根据扫描条码绑定线外数据 需要时解除禁用 + // //BaseDataSystemMES.TransLaunchDataByMainMaterial(OpName, EngineType, EngineID, EngineTypeID); + + // //如果存在线外排队工位,根据排队编号绑定线外数据 需要时解除禁用 + // ////BaseDataSystemMES.MailLineAndSubLineData_InsertByEngineID_Subline(OpName,EngineID, EngineTypeID, EngineType); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + // //MIS_BASE.Write_FalseGO(OpName, false); + // } + // else + // { + // //MIS_BASE.Write_ConfirmOkGo(OpName, false); + // MIS_BASE.Write_FalseGO(OpName, true); + // } + + // } + //} + //catch (Exception err) + //{ + // ////ApplicationLog.WriteLog(err, "Function02:MesReadOver"); + //} + } + } +} diff --git a/MisDataFunction/Function1057/OpcServer/WebSubmit.cs b/MisDataFunction/Function1057/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..fc79ae5 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/WebSubmit.cs @@ -0,0 +1,307 @@ +using System; +using MesServerWork; +using bizFacade; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName=Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //删除不合格放行记录 + //修改托盘状态 + //Update_PalletStatus(OpName, 1, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 3, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 2, false); + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "TurnLineWork"://150工位独有,转线上线标志 + SendMessage.AsyncSendMessage_Notice(OpName, "切换成功!"); + if (Convert.ToInt32(m_Value) == 1) //(0 正常工件 ,1 转线工件) + { + //写入转线标识点 (64)501.6 + MIS_BASE.WritePLC(64, OpName, true); + } + else + { + MIS_BASE.WritePLC(64, OpName, false); + } + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName,0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + Sendmessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + try + { + //工件到位 DBX0.1 + bool S_WorkStart; + bool S_FixAllow; + bool S_EngineGetOver; + bool S_MaterialVerifyOver; + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + Sendmessage("13", "1111", Opname); + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + // 新增查询PLC直通状态 网页显示 + MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + + if (S_WorkStart == true) + { + SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + } + + if (S_EngineGetOver == true) + { + SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + Sendmessage("2", "1111", Opname); + SendMessage.ShowMoby(Opname); + } + if (S_FixAllow == true) + { + SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + if (S_MaterialVerifyOver == true) + { + SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + InitAlarm(Opname); + } + catch (Exception err) + { + + } + + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + } +} diff --git a/MisDataFunction/Function1057/OpcServer/WorkStart.cs b/MisDataFunction/Function1057/OpcServer/WorkStart.cs new file mode 100644 index 0000000..5739456 --- /dev/null +++ b/MisDataFunction/Function1057/OpcServer/WorkStart.cs @@ -0,0 +1,44 @@ +using bizFacade; +using MesServerWork; +using System; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue > 0) + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartIn, DateTime.Now.ToString()); + } + else + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WorkStart"); + } + } + + } +} diff --git a/MisDataFunction/Function1057/OpcServer/vssver2.scc b/MisDataFunction/Function1057/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..b884d136322fa97c266a23933f0a62932ef482e6 GIT binary patch literal 332 zcmXpJVq~~_m%l5bInsUAj6{**Nns+3SMy9?E6l*a!N9<<4oLf^W-r#r+{@1h$TB!37A5DWr0OLXGdSnxrDYc7`e(c6gSf7F>6v+{?x`jIAX9(>ZizX? psqX$Drf+I-P-QNI#$`zaX`!Br~;`!LhhFH8&}z(lakD JUoW|s0RY9rD~$jE literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1057/mssccprj.scc b/MisDataFunction/Function1057/mssccprj.scc new file mode 100644 index 0000000..119193d --- /dev/null +++ b/MisDataFunction/Function1057/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function02.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA diff --git a/MisDataFunction/Function1057/packages.config b/MisDataFunction/Function1057/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1057/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1057/vssver2.scc b/MisDataFunction/Function1057/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..c770e2832da5f488f76f5e9e407765ea066fd986 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+sITv>>5@ujvVqjoc45V9**6jXXx}TpB$X^2F zSD1-!?6KPc=Bw!YW){07mLy`*sl~ymMP;c)dTyn8$t9WjdHOJhfe{0Osh3<_P?VpA ODWX?aTu_{x%m4rcSvH&i literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1058/DataAccess/DataAccess.cs b/MisDataFunction/Function1058/DataAccess/DataAccess.cs new file mode 100644 index 0000000..a7f91fa --- /dev/null +++ b/MisDataFunction/Function1058/DataAccess/DataAccess.cs @@ -0,0 +1,16 @@ + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1058/DataAccess/vssver2.scc b/MisDataFunction/Function1058/DataAccess/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..1083b3a712c174825929c9349a2b942d85272021 GIT binary patch literal 129 zcmXpJVq~~_m%l5bInsUAj6{**Nns-IO!nD3i!d-SGB7Z>0O?()dp`1tLXb? x7P};tBx2I3#lfjXWvNAaZl!t2C7Jno`Y?upg+54&V{&q8aWMmesh3>L007j9D}Dd~ literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1058/Db.cs b/MisDataFunction/Function1058/Db.cs new file mode 100644 index 0000000..64286ed --- /dev/null +++ b/MisDataFunction/Function1058/Db.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + public class Db + { + /// + /// 北汽福田变速器序列号总线上线_获得机型信息 + /// + /// + /// + /// + /// + /// 0 不重号;1 重号;2:失败 + /// + public static bool GetEngineType(string partSn, out int EngineTypeID, out string EngineType, out string EngineID,out int IsRepeatedNumber) + { + DataTable dt = new DataTable(); + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + IsRepeatedNumber = 2; + string produceName = "北汽福田变速器序列号总线上线_获得机型信息"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", partSn); + + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms,out dt)) + { + if(dt.Rows.Count > 0) + { + IsRepeatedNumber = Convert.ToInt32( dt.Rows[0]["IsRepeatedNumber"]); + EngineTypeID = Convert.ToInt32(dt.Rows[0]["EngineTypeID"]); + EngineType = dt.Rows[0]["EngineType"].ToString(); + EngineID = partSn; + return true; + } + } + return false; + } + /// + /// 北汽福田变速器序列号总线上线_增加 + /// + /// + /// + /// + /// + /// + public static bool UpLoadOpNameInsert(string partSn, int EngineTypeID, string EngineType, string OpName) + { + + string produceName = "北汽福田变速器序列号总线上线_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", partSn); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@基本型号代码", EngineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@基本型号", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + // ALTER PROCEDURE[dbo].[北汽福田变速器序列号总线上线_增加] + // @变速器序列号 nvarchar(50)='1333 050 062 0001*146012023*12345678',--'1333 050 062 0001' + //@基本型号代码 int=1, + //@基本型号 nvarchar(50)='1333 050 062 0001', + //@工位号 nvarchar(50) = 'J05PA010' + } +} diff --git a/MisDataFunction/Function1058/Function08.csproj.vspscc b/MisDataFunction/Function1058/Function08.csproj.vspscc new file mode 100644 index 0000000..82c6db2 --- /dev/null +++ b/MisDataFunction/Function1058/Function08.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function08" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/MisDataFunction/Function1058/Function1058.csproj b/MisDataFunction/Function1058/Function1058.csproj new file mode 100644 index 0000000..8be72b1 --- /dev/null +++ b/MisDataFunction/Function1058/Function1058.csproj @@ -0,0 +1,168 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {FC07F99C-0C97-4FEF-9A0E-CA4883400464} + Library + Properties + Function1058 + Function1058 + v4.8 + 512 + + + + + + + + + + + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + AnyCPU + false + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\..\Common\dll\MQTTnet.dll + + + ..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll + + + False + ..\..\..\Common\dll\Newtonsoft.Json.dll + + + + + + ..\..\DLL\System.Net.Http.dll + + + ..\..\packages\System.Net.Security.4.3.2\lib\net46\System.Net.Security.dll + + + ..\..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll + + + ..\..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll + + + ..\..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1058/MesServerFunction/Function1058.cs b/MisDataFunction/Function1058/MesServerFunction/Function1058.cs new file mode 100644 index 0000000..1c5713d --- /dev/null +++ b/MisDataFunction/Function1058/MesServerFunction/Function1058.cs @@ -0,0 +1,253 @@ + +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Threading; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = DoWhatPlc.MessageText.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.CustomeEvetnArgs e =new DoWhatPlc.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + } + break; + } + } + } + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + //{ + // //lock1 = new object(); + // //lock (lock1) + // { + // switch (e.TagTypeCodeID.ToString()) + // { + // //PLC 工件到位 + // case "2": + // fun_WorkStart(e); + // break; + // //PLC 允许保存质量数据 + // case "19": + // fun_MesRead(e); + // break; + // //MES 保存数据完成 + // case "20": + // fun_MesReadOver(e); + // break; + // //PLC 传递机型 + // case "44": + // fun_EngineTypeGetOverPLC(e); + // break; + // //MES 合格放行 + // case "51": + // fun_ConfirmOkGo(e); + // break; + // //MES 不合格放行 + // case "8": + // fun_FalseGo(e); + // break; + // //MES 扫描条码 + // case "Barcode": + // fun_Barcode(e); + // break; + // //WEB 处理页面传递过来的数据 + // case "WebSubmit": + // fun_WebSubmit(e); + // break; + // } + // } + + //} + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //2.MES判断是否扫描完成 + //3.若扫描完成,则MES给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + + /// + /// 保存完成 20 + /// + /// + /// + public void fun_MesReadOver(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 保存完成 19 + /// + /// + /// + public void fun_MesRead(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + public int fun_SubLineLoadPartCountMatch() + { + return SubLineLoadPartCountMatch; + } + + } +} diff --git a/MisDataFunction/Function1058/MesServerFunction/vssver2.scc b/MisDataFunction/Function1058/MesServerFunction/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..775bb6c2cec5286a8a28841a87000cdadd7c9c9a GIT binary patch literal 132 zcmXpJVq~~_m%l5bInsUAj6{**Nns*0KNcIiiZC!RGB7Z>0cq9~9XZ#vUHCzK6@A~# wVwc2{L`*uhI5@SaEVW3_tu!yWBr`uxAI31S(D#MO!o(PWjCcbJz2ssB0KKUy>Hq)$ literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1058/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1058/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..5c44814 --- /dev/null +++ b/MisDataFunction/Function1058/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,288 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 分线上总线的数量 + /// + public static int SubLineLoadPartCount = 2; + /// + /// 分线上总线已经匹配的数量 + /// + public static int SubLineLoadPartCountMatch = 0; + /// + /// 正常逻辑工作 + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0 || OrderForm.Length == 0) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + + //初始化物料临时表 + //第二步,将零件信息转移到零件_临时表中(本地BOM与订单BOM的选择显示关系) + BaseDataSystemMES.MesServer_Process_EngineTypeOver_BQ_FirstOP(OpName); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(OpName); + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(OpName); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(OpName); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(OpName); + + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + // BaseDataSystemMES.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + //SendMessageFun.SendMessage("123", "111", OpName); + + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + // 暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + + + /// + /// 保存MOBY信息 + /// + /// + /// + /// + /// + private void SaveMobyMessage(string OpName, int engineTypeID, string engineType, string engineID, string orderForm) + { + + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineTypeID[OpName] = engineTypeID; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineType.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineType[OpName] = engineType; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineID[OpName] = engineID; + } + if (MIS_BASE.hashtable_EngineGetOver_OrderForm.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_OrderForm[OpName] = orderForm; + } + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + + int isRepair; + int engineTypeID; + + string engineType = ""; + string engineID = ""; + string palletCode = ""; + string orderForm = ""; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + /// + /// 正常匹配分线和总线 + /// + /// + /// 总线工件号 + /// 总线工件机型代码 + /// 总线工件机型 + private void Match(string opName, string engineID, int engineTypeID, string engineType, int PartPallet_Code) + { + try + { + bool m_EngineGetOver_PLC_SubLine; + int engineTypeID_SubLine; + int partPallet_Code_SubLine; + int PalletInfo = 1;//总线托盘状态 + + string opName_SubLine = "";//分线工件信息 + string engineID_SubLine; + string engineType_SubLine; + string AlarmStr; + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + //第一步:获取分线中间交互工位号 + if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName)) + { + opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString(); + } + if (opName_SubLine == "") + { + return; + } + + //第二步:获取分线传递机型信号 + MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine); + if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配 + + //第三步:判断合格标志 + MIS_BASE.Read_PalletInfo(opName_SubLine, out PalletInfo); + if (PalletInfo == 2) return; //若不合格则返回不进行匹配 + string OrderForm; + //第四步:获取分线的信息,匹配验证 + MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm); + //判断分线数据是否合格 + //if (!BaseDataSystemMES.QulityDataVerify(opName, engineID_SubLine, out AlarmStr) && !BaseDataSystemMES.QualityVerifyStatus_Hash_Read(opName)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, opName); + // return; + //} + + if (engineTypeID_SubLine == engineTypeID) + { + BaseDataSystemMES.SubLineLoadPartCountMatch_Select(opName, out SubLineLoadPartCountMatch); + SubLineLoadPartCountMatch = SubLineLoadPartCountMatch + 1; + BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch); + + + BaseDataSystemMES.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移 + MIS_BASE.Write_Match(opName, true);//匹配结果 + MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成 + if(SubLineLoadPartCountMatch== SubLineLoadPartCount) + { + MIS_BASE.Write_FixAllow(opName, true); + SubLineLoadPartCountMatch = 0; + BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch); + + } + + SendMessageFun.SendInfomation("MatchSuccess", "1", opName); + sendmessage(opName, 1, "Match");//匹配结果 + } + else + { + MIS_BASE.Write_Match(opName, false);//匹配结果 + MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成//68:1、取消返修;2、匹配成功 自己监控发送 MES|MatchingCompleted + + //发送匹配完成和匹配结果信息 + SendMessageFun.AsyncSendMessage_Notice(opName,"匹配失败,工件型号不匹配!"); + SendMessageFun.SendInfomation("MatchSuccess", "0", opName); + sendmessage(opName, 0, "Match");//匹配结果 + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog("Match:" + err.ToString()); + + } + } + + + + /// + /// 强制匹配分线和总线 + /// + /// + private void ForceMatch(string opName) + { + try + { + bool m_EngineGetOver_PLC_SubLine; + bool m_EngineGetOver_PLC; + + int engineTypeID_SubLine; + int engineTypeID; + int partPallet_Code_SubLine; + int partPallet_Code; + + string opName_SubLine = "";//分线工件信息 + string engineID_SubLine; + string engineType_SubLine; + string engineID; + string engineType; + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + //获取分线中间交互工位号 + if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName)) + { + opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString(); + } + if (opName_SubLine == "") + { + return; + } + + MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine);//1:读取分线工件到位的传递机型信号。 + + if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配 + + MIS_BASE.Read_EngineGetOver_PLC(opName, out m_EngineGetOver_PLC);//2:读取总线工件到位的传递机型信号。 + + if (!m_EngineGetOver_PLC) return;//必须工件同时到位才能进行匹配 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm);//获取分线的信息 + MIS_BASE.GetEngineTypeFromPLC(opName, out engineTypeID, out engineType, out engineID, out partPallet_Code, out OrderForm); + + BaseDataSystemMES.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移 + + MIS_BASE.Write_Match(opName, true);//匹配结果 + MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成 + + SendMessageFun.SendInfomation("MatchSuccess", "1", opName);//界面显示匹配成功 + + MIS_BASE.Write_FixAllow(opName, true);//允许PLC工作 + + //发送匹配完成和匹配结果信息 + sendmessage(opName, 1, "MatchingComplete");//匹配完成 + sendmessage(opName, 1, "Match");//匹配结果 + } + catch + { + + } + } + } +} diff --git a/MisDataFunction/Function1058/Methods/SubmitToMisweb.cs b/MisDataFunction/Function1058/Methods/SubmitToMisweb.cs new file mode 100644 index 0000000..8d84430 --- /dev/null +++ b/MisDataFunction/Function1058/Methods/SubmitToMisweb.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using bizFacade; +//using SystemFramework; + +namespace MesServerFunctions +{ + + /// + /// 此类用于向WEB发送各种类型消息 + /// + partial class FunctionMES + { + + + // /// + // /// 批量发送WEB消息(Value为BOOL值) + // /// + // /// 消息编号组合 + // /// 消息值组合 + // /// 工位号 + // void Sendmessage(string MessageNumm,string Value, string OpName) + //{ + // for (int i=0;i + // /// 选择发送给WEB的消息 + // /// + // /// 消息类型 + // /// 消息工位 + //void Sendmessage(char Num,string Value, string OpName) + //{ + // string SendMessage; + // switch (Num) + // { + // case '1': + // //1(直接在界面通过选择机型确认工序内容) + // SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + + // case '2': + // //2显示物料 + // SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + + // case '3': + + // //3显示操作指导图片 + // SendMessage = "MES|PicShow|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '4': + // //3显示操作指导图片 + // SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + + // case '5': + // SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '6': + // SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" +Value; + // AsyncSendMessage(SendMessage); + // break; + // case '7': + // SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '8': + // SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '9': + // SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case 'a': + // SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case 'b': + // SendMessage = "MES|ShaftPosition|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case 'c': + // SendMessage = "MES|ShowQuality|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // } + //} + + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + //void SendInfomation(string Command, string Value, string OpName) + //{ + + // string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + //} + + + ///// + ///// 发送在线产量、在线节拍 + ///// + ///// + ///// + //private void SendActuallyCount(string OpName, int tagValue) + //{ + // //当工件离开时,更新在线产量、在线节拍 + // if (tagValue == 0) + // { + // try + // { + // int opNameCount = 0;//在线产量 + // int opNameCountTime = 0;//在线节拍 + + // BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); //基本数据_工作日历_班次产量查询_New + + // SendInfomation("ActuallyCount", opNameCount.ToString() + "&" + opNameCountTime.ToString(), OpName); + + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "Function01:SendActuallyCount"); + // } + // } + //} + + + } +} diff --git a/MisDataFunction/Function1058/Methods/UDP.Send.cs b/MisDataFunction/Function1058/Methods/UDP.Send.cs new file mode 100644 index 0000000..26acece --- /dev/null +++ b/MisDataFunction/Function1058/Methods/UDP.Send.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MesServerWork; +//using BasicData; +using System.Collections; +using bizFacade; +//using SystemFramework; +using System.Data; +using System.Threading; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + ///// + ///// 发送信息到MES通讯服务器或者其他的 + ///// + ///// + //private void AsyncSendMessage(string Message) + //{ + // MIS_BASE.asyncSendMessage(Message); + //} + + /// + /// 发送提示消息 + /// + /// + //private void AsyncSendMessage_Notice(string opname, string notice) + //{ + // //通知Web界面 + // BaseDataSystemMES.Web_Notice_Insert(opname, notice); + // string SendMessage = "MES|Notice|" + opname + "|" + "1"; + // MIS_BASE.asyncSendMessage(SendMessage); + //} + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + + } +} diff --git a/MisDataFunction/Function1058/Methods/vssver2.scc b/MisDataFunction/Function1058/Methods/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..7b1a830e089fcd043adbe14655de6a47457f2ded GIT binary patch literal 199 zcmXpJVq~~_m%l5bInsUAj6{**Nns*}68{X`MHm>E85kHmfOJ~O$9qb7uKbKZz9*0$ zCl&Mcy0#0L?*-(0vZUPDRtw>)==)|CyCjw*V$!L_!Kp=MsYQBjrFqFEnfZD8FouDJ zzHe$tMt({$gKJ)TW?rg$YKcEkrBh;YYIuH8wq9~ELvU$QZe~eHKG68`)FhBds7rue KaB5x(hz$Uptv&Go literal 0 HcmV?d00001 diff --git a/MisDataFunction/Function1058/OpcServer/Barcode.cs b/MisDataFunction/Function1058/OpcServer/Barcode.cs new file mode 100644 index 0000000..f70a8bc --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/Barcode.cs @@ -0,0 +1,220 @@ +using System; +using System.Threading; +using System.Xml.Linq; +using bizFacade; + +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockBarcode = new object(); + + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + lock(lockBarcode) + { + try + { + + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + + int EngineTypeID;//机型代码 + string EngineType;//机型 + string EngineID;//工件编号 + + string OrderForm; + int Recipe1; + int Recipe2; + + bool IsNotRepeatedNumber = false; + //1:获得申请上线信息后,扫描条码才处理业务 + bool ispartload; + //(115) + int PTO; + //(118)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int NgearSwitch; + //(119)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int RgearSwitch; + //(120)0=不检测;1=检测。检测线上线工位扫描总成条码,根据BOM,查出 + int SpeedSensor; + //(121)例如:5S 400。检测线上线工位扫描总成条码,根据BOM,查出 + string PartTypeMid; + //(122) 0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int Tcu_V; + //判断工件是否到位 + MIS_BASE.Read_WorkStart(OpName, out ispartload); + if (!ispartload) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否到位(DBX500.1=1)"); + return; + } + //判断设备是否申请上线 + MIS_BASE.Read_UpdatePalletOK(OpName, out ispartload); + if (!ispartload) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否申请上线(DBX500.3=1)"); + return; + } + // 判读条码是变速器序列号条码号还是物料号 小机型*日月年* 流水号(给起始号 + 数量) + // 选小机型 从北汽福田BOM中选 得先维护BOM + // 变速器序列号 '1333 050 062*16012023*30000001' + + //扫描完变速器序列号条码号 true + bool isGetOver_MES = false; + //判断上线工位,MES 是否将工件流水号、机型等信息已经写入到PLC了 + //MIS_BASE.Read_EngineTypeGetOver_MES(OpName, out isGetOver_MES); + MIS_BASE.Read_EngineGetOver_PLC(OpName, out isGetOver_MES); + //如果工件流水号、机型等信息没有写入PLC,扫描的条码按工件流水号进行验证 + //否则按装配物料进行验证 + if (!isGetOver_MES) + { + + if (barcode.Split(';').Length > 2 || barcode.Split('*').Length > 2) + { + + string partSn = barcode; + EngineID = barcode; + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + SendMessage.ShowMoby(OpName); + + //2: 判断是否重号 + //IsRepeatedNumber true 不重号;false 重号; + IsNotRepeatedNumber = BaseDataSystemMES.EngineTypeID_IsNotRepeatedNumber(partSn); + if (IsNotRepeatedNumber) + { + // 从数据库获得机型、机型代码等信息 + BaseDataSystemMES.GetEngineTypeUpLoadOpName(partSn, OpName, out EngineTypeID, out EngineType, out OrderForm, out Recipe1, out Recipe2); + // 从数据库获得PTO等信息 + BaseDataSystemMES.UpLoadPTO(partSn, out PTO, out NgearSwitch, out RgearSwitch, out SpeedSensor, out PartTypeMid, out Tcu_V); + //PTO + MIS_BASE.WritePLC(115, OpName, PTO); + //空挡开关检测 + MIS_BASE.WritePLC(95, OpName, NgearSwitch); + //倒挡开关检测 + MIS_BASE.WritePLC(96, OpName, RgearSwitch); + //里程表检测 + MIS_BASE.WritePLC(97, OpName, SpeedSensor); + //大机型扩展 + MIS_BASE.WritePLC(98, OpName, PartTypeMid); + //TCU + MIS_BASE.WritePLC(122, OpName, Tcu_V); + // 先查询配方号 根据工位号 去moby表查配方号 + // 根据配方号 去配方表查配方数据 写入配方数据 + string tagStartAdr;//= "DB411.10"; + BaseDataSystemMES.PLCRcipeCurrent(OpName, out byte[] bytes, out tagStartAdr); + DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID("94", OpName, System.Text.Encoding.ASCII.GetString(bytes)); + // 将产品信息写入PLC + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + // 写入到数据库的[北汽福田工位状态监控MOBY]表中 + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + SendMessage.ShowMoby(OpName); + + SendMessageFun.AsyncSendMessage_Notice(OpName, "总成码扫码完成,请扫描后壳码!"); + + + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); + + //Thread.Sleep(1000); + //// 临时增加 清除MES的传递机型 + //MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号 重号,请确认!"); + } + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号格式不正确,请确认!"); + + } + } + else//验证物料 + { + //物料号 + { + //读取PLC的传递机型信号 + bool tagValue; + MIS_BASE.Read_EngineGetOver_PLC(OpName, out tagValue); + if (tagValue) + { + //验证物料 + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out bool IsSuccess); + if (!IsSuccess)//???? + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + //判断物料是否验证完成 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out int IsAllowWork); + + + if (IsSuccess) + { + if (IsAllowWork == 1) + { + //移到允许保存信号中 + //BaseDataSystemMES.Material_Insert(OpName, 1); + + ////更新订单完工数量及物料 + SendMessageFun.SendMessage("245", "111", OpName); + + // 写入到数据库的[北汽福田工位状态监控MOBY]表中 + SendMessage.ShowMoby(OpName); + + SendMessageFun.AsyncSendMessage_Notice(OpName, "扫码完成,请开始工作!"); + + //物料验证完成,通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + } + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "产品上线后,PLC获得变速器序列号后,再验证物料!"); + } + + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:Barcode"); + } + } + + } + + + } +} diff --git a/MisDataFunction/Function1058/OpcServer/ConfirmOkGo.cs b/MisDataFunction/Function1058/OpcServer/ConfirmOkGo.cs new file mode 100644 index 0000000..a978c1f --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/ConfirmOkGo.cs @@ -0,0 +1,35 @@ +using System; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 合格放行 + /// + /// + /// + private void ConfirmOkGo(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + MIS_BASE.Write_MaterialVerifyOver(OpName, true);//工作完成 + SendMessageFun.SendInfomation("OrderFormList","1", OpName); + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:ConfirmOkGo"); + } + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1058/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..db8fde9 --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/EngineGetOver.cs @@ -0,0 +1,98 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockBarcodeEngineTypeGetOver = new object(); + + + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + lock(lockBarcodeEngineTypeGetOver) + { + + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue == 1) + { + bool MesRead = false; + + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + + //上线工位清MES传递机型信号 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + + MIS_BASE.Read_QualityData_Read_CF(OpName, out MesRead); + //第一步,判断允许保存和保存完成信号是否全部被清空,若未清空,则通知复位MES&PLC + if (MesRead) + { + //未能清空信号,请求复位 + SendMessageFun.SendInfomation("AskReset", "1", OpName); + return; + } + string OrderForm; + string OrderForm_MES; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES); + + //判断PLC机型与MES机型是否一致 + if (EngineTypeID_MES == EngineTypeID & EngineID_MES == EngineID & EngineType_MES == EngineType) + { + // 如果机型改变的话 提示机型发生变化 + DataTable dt = BaseDataSystemMES.EngineTypeChange(OpName, EngineType); + if (dt.Rows.Count > 0) + { + string mesValue = Newtonsoft.Json.JsonConvert.SerializeObject(dt);//(recData); + string message = "MES|MaterialList_Dif_Resources|" + OpName + "|" + mesValue; + SendMessage.AsyncSendMessage(message); + } + //写入到数据库的[北汽福田工位状态监控MOBY]表中 + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm, OrderForm); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + return; + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "码块RFID机型与MES机型不匹配!"); + } + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:EngineTypeGetOver_PLC"); + } + } + + } + + + + } +} diff --git a/MisDataFunction/Function1058/OpcServer/FalseGO.cs b/MisDataFunction/Function1058/OpcServer/FalseGO.cs new file mode 100644 index 0000000..54c73c7 --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/FalseGO.cs @@ -0,0 +1,37 @@ +using System; +using MesServerWork; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + + /// + /// 返修放行 + /// + /// + /// + private void FalseGO(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + MIS_BASE.Write_MaterialVerifyOver(OpName, true);//工作完成 + SendMessageFun.SendInfomation("OrderFormList", "1", OpName); + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/HeartBeat.cs b/MisDataFunction/Function1058/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..93affd3 --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/HeartBeat.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/MesRead.cs b/MisDataFunction/Function1058/OpcServer/MesRead.cs new file mode 100644 index 0000000..4705f0a --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/MesRead.cs @@ -0,0 +1,85 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockMesRead = new object (); + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + lock(lockMesRead) + { + try + { + int EngineTypeID; + string EngineType; + string EngineID; + int PartPallet_Code; + string OrderForm; + + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + //保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号 + if (Db.UpLoadOpNameInsert(EngineID, EngineTypeID, EngineType, OpName)) + { + //保存质量数据 + int qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + //推送质量数据到MES的页面 + MIS_BASE.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + + //保存物料数据 + BaseDataSystemMES.Material_Insert(OpName, tagValue); + //测量数据发动机在线状态 + BaseDataSystemMES.WorkStartInsert(OpName, qualityMask); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + + //MisDataSaveDate. + MIS_BASE.Write_MesReadOver(OpName, true); + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + SendMessage.SendActuallyCount(OpName, tagValue);//统计在线产量,在线节拍 + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "保存上线数据失败!"); + } + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + } + + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + + } + + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/MesReadOver.cs b/MisDataFunction/Function1058/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..9b637f2 --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/MesReadOver.cs @@ -0,0 +1,37 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + try + { + //DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + //string OpName = Convert.ToString(msgEvent.OpName); + //int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //if (tagValue == 1) + //{ + + // BaseDataSystemMES.Material_Insert(OpName, tagValue); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/WebSubmit.cs b/MisDataFunction/Function1058/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..4bfd077 --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/WebSubmit.cs @@ -0,0 +1,342 @@ +using System; +using MesServerWork; +using bizFacade; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string opName_SubLine = ""; + string engineID = "";//工件信息 + string[] dataArray = Content.Split('|'); + + if (dataArray.Length != 2) + return; + + + string m_Command = dataArray[0].ToString();//消息类型 + string m_Value = dataArray[1].ToString();//消息参数 + string[] m_Value_array = m_Value.Split('&');//消息参数数量 + int m_Value_length = m_Value_array.Length; //消息参数长度 + + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //修改托盘状态 + + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + + break; + case "FixAllow"://重新拧紧 + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + MIS_BASE.Write_RepairUpline_MES(opName_SubLine, true); + //MIS_BASE.Write_PalletInfo(opName_SubLine, 4); + //MIS_BASE.Write_UpdatePalletOK(opName_SubLine, true); + MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true); + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + } + else if (Convert.ToInt32(m_Value) == 0) + { + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + break; + //强制匹配 + case "ForceMatch": + if (Convert.ToInt32(m_Value) == 1) + { + ForceMatch(OpName); + } + break; + case "PalletGO": + + if (Convert.ToInt32(m_Value) == 1) + { + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true); + } + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + fun_EngineTypeGetOverPLC(_e); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:WebSubmit"); + } + } + + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + SendMessageFun.SendMessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + + + /// + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + bool S_WorkOn;//申请上线 DBX0.1 + bool S_WorkStart;//工件到位 DBX0.1 + bool S_EngineGetOver;//传递机型 DBX0.4 + bool S_FixAllow;//允许工作 DBX3.1 + bool S_MaterialVerifyOver;//工作完成 DBX2.3 + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + + int IsCompleted = 0; + int S_Match = 0; + int PalletInfo_SubLine = 0;//显示分线托盘状态 + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(Opname); + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(Opname); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(Opname); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(Opname); + // 新增查询PLC直通状态 网页显示 + MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + InitAlarm(Opname); + + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + + if (S_WorkStart == true) + { + SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "WorkStart_Subline"); + } + + //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "EngineTypeGetOverMES_Subline"); + + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + if (S_EngineGetOver == true) + { + SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + //sendmessage(Opname, Convert.ToInt32(S_EngineGetOver), "EngineTypeGetOverMES_Subline"); + } + + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + + if (S_FixAllow == true) + { + SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + if (S_MaterialVerifyOver == true) + { + SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + + //MIS_BASE.Read_MatchingCompleted(Opname, out IsCompleted); //DBX1.3 是否匹配 + //MIS_BASE.Read_Match(Opname, out S_Match); //DBX1.4 匹配结果 + + //if (IsCompleted == 1 && S_Match == 1)//发送匹配完成和匹配结果信息 + //{ + // SendMessageFun.SendInfomation("MatchingCompleted", "1", Opname); + // SendMessageFun.SendInfomation("Match", "1", Opname); + // SendMessageFun.SendInfomation("MatchSuccess", "1", Opname);//界面显示匹配成功 + //} + //else if (IsCompleted == 1 && S_Match == 0) + //{ + // SendMessageFun.SendInfomation("MatchSuccess", "0", Opname);//界面显示匹配失败 + //} + + //if (MIS_BASE.hashtable_OpNameRepair == null) + //{ + // MIS_BASE.InitHashtable_MesServerCode(); + //} + //string Opname_SubLine = ""; + //if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(Opname)) + //{ + // Opname_SubLine = MIS_BASE.hashtable_OpNameRepair[Opname].ToString(); + //} + //if (Opname_SubLine == "") + //{ + // return; + //} + + //MIS_BASE.Read_PalletInfo(Opname, out PalletInfo_SubLine); + //sendmessage(Opname, PalletInfo_SubLine, "SubQualityMask"); + //SendMessageFun.SendInfomation("ShowMobySubLine", Opname_SubLine, Opname);//显示分线机型及流水号 + } + + //分线发送工件到位信号函数 + private void sendmessage(string OpName, int tagValue, string Command) + { + string SendMessage; + SendMessage = "MES|" + Command + "|" + OpName + "|" + tagValue; + SendMessageFun.AsyncSendMessage(SendMessage); + + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/WorkStart.cs b/MisDataFunction/Function1058/OpcServer/WorkStart.cs new file mode 100644 index 0000000..0582e8e --- /dev/null +++ b/MisDataFunction/Function1058/OpcServer/WorkStart.cs @@ -0,0 +1,55 @@ +using System; +using bizFacade; +using MesServerWork; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //线首显示订单信息 + + if (tagValue == 1) + { + MIS_BASE.Write_TagTypeID(115, OpName, 0); + MIS_BASE.Write_TagTypeID(95, OpName, 0); + MIS_BASE.Write_TagTypeID(96, OpName, 0); + MIS_BASE.Write_TagTypeID(97, OpName, 0); + MIS_BASE.Write_TagTypeID(98, OpName, ""); + //清空MOBY的产品流水号 + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartIn, DateTime.Now.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStart, tagValue.ToString()); + + } + else + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:WorkStart"); + } + } + } +} diff --git a/MisDataFunction/Function1058/OpcServer/vssver2.scc b/MisDataFunction/Function1058/OpcServer/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..e8dac030e24a9f14a458a7c97e3861bfe6c809ba GIT binary patch literal 305 zcmXpJVq~~_m%l5bInsUAj6{**Nns+_=kIa%7GYpuXJBCP0n*3#ml{83a^YtL@_m8) zySMi5Jr)At`vLjWcV#zAuz7*y{ek=&alNlvUO?mnfc(Rym#+W!fXD{|`E#_F)P9@i z0ahObh}+|IW22J=<)eKU()5=#;>>D1!j)S|M~B0aa#yyTM1{5*Xa!@xq{zaSYR z%ixq)l$@WEs+U~M;GCbAmRXeRpY5Ix;=1OgXXd54r + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1058/vssver2.scc b/MisDataFunction/Function1058/vssver2.scc new file mode 100644 index 0000000000000000000000000000000000000000..93af295aeee8cbcfcddcf8158fccf2319380e0d8 GIT binary patch literal 163 zcmXpJVq~~_m%l5bInsUAj6{**Nns+J*A;wn5Mf|oVqjo!1kz6~Y;1b5$DN-M$aezr z|2D3^4dbim`(_rqB$gy%(y7J4sYPX}MS5 + /// 北汽福田变速器序列号总线上线_获得机型信息 + /// + /// + /// + /// + /// + /// 0 不重号;1 重号;2:失败 + /// + public static bool GetEngineType(string partSn, out int EngineTypeID, out string EngineType, out string EngineID,out int IsRepeatedNumber) + { + DataTable dt = new DataTable(); + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + IsRepeatedNumber = 2; + string produceName = "北汽福田变速器序列号总线上线_获得机型信息"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", partSn); + + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms,out dt)) + { + if(dt.Rows.Count > 0) + { + IsRepeatedNumber = Convert.ToInt32( dt.Rows[0]["IsRepeatedNumber"]); + EngineTypeID = Convert.ToInt32(dt.Rows[0]["EngineTypeID"]); + EngineType = dt.Rows[0]["EngineType"].ToString(); + EngineID = partSn; + return true; + } + } + return false; + } + /// + /// 北汽福田变速器序列号总线上线_增加 + /// + /// + /// + /// + /// + /// + public static bool UpLoadOpNameInsert(string partSn, int EngineTypeID, string EngineType, string OpName) + { + + string produceName = "北汽福田变速器序列号总线上线_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", partSn); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@基本型号代码", EngineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@基本型号", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + // ALTER PROCEDURE[dbo].[北汽福田变速器序列号总线上线_增加] + // @变速器序列号 nvarchar(50)='1333 050 062 0001*146012023*12345678',--'1333 050 062 0001' + //@基本型号代码 int=1, + //@基本型号 nvarchar(50)='1333 050 062 0001', + //@工位号 nvarchar(50) = 'J05PA010' + } +} diff --git a/MisDataFunction/Function1059/Function1059.csproj b/MisDataFunction/Function1059/Function1059.csproj new file mode 100644 index 0000000..2aadbf8 --- /dev/null +++ b/MisDataFunction/Function1059/Function1059.csproj @@ -0,0 +1,113 @@ + + + + + Debug + AnyCPU + {913CE3C1-7D16-4A19-A9B0-BBCDB6770B4B} + Library + Properties + Function1059 + Function1059 + v4.8 + 512 + true + + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\MisData_3.0_2022.08.23.1622.LLX\DLL\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1059/MesServerFunction/Function1059.cs b/MisDataFunction/Function1059/MesServerFunction/Function1059.cs new file mode 100644 index 0000000..67c16df --- /dev/null +++ b/MisDataFunction/Function1059/MesServerFunction/Function1059.cs @@ -0,0 +1,270 @@ + +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Threading; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = DoWhatPlc.MessageText.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.CustomeEvetnArgs e =new DoWhatPlc.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "43": + PartLoad(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //MES保存实时质量数据 + case "65": + fun_MesSaveNowData(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + } + break; + } + } + } + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + //{ + // //lock1 = new object(); + // //lock (lock1) + // { + // switch (e.TagTypeCodeID.ToString()) + // { + // //PLC 工件到位 + // case "2": + // fun_WorkStart(e); + // break; + // //PLC 允许保存质量数据 + // case "19": + // fun_MesRead(e); + // break; + // //MES 保存数据完成 + // case "20": + // fun_MesReadOver(e); + // break; + // //PLC 传递机型 + // case "44": + // fun_EngineTypeGetOverPLC(e); + // break; + // //MES 合格放行 + // case "51": + // fun_ConfirmOkGo(e); + // break; + // //MES 不合格放行 + // case "8": + // fun_FalseGo(e); + // break; + // //MES 扫描条码 + // case "Barcode": + // fun_Barcode(e); + // break; + // //WEB 处理页面传递过来的数据 + // case "WebSubmit": + // fun_WebSubmit(e); + // break; + // } + // } + + //} + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //2.MES判断是否扫描完成 + //3.若扫描完成,则MES给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + + /// + /// 保存完成 20 + /// + /// + /// + public void fun_MesReadOver(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 保存完成 19 + /// + /// + /// + public void fun_MesRead(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + public int fun_SubLineLoadPartCountMatch() + { + return SubLineLoadPartCountMatch; + } + + /// + /// MES实时保存质量数据 + /// + /// + /// + public void fun_MesSaveNowData(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesSaveNowData, e); + } + } +} diff --git a/MisDataFunction/Function1059/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1059/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..895f4c1 --- /dev/null +++ b/MisDataFunction/Function1059/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,279 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 分线上总线的数量 + /// + public static int SubLineLoadPartCount = 2; + /// + /// 分线上总线已经匹配的数量 + /// + public static int SubLineLoadPartCountMatch = 0; + /// + /// 正常逻辑工作 + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + //string OrderForm = "";//订单号 + //DataTable dt; + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0 || OrderForm.Length == 0) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + // BaseDataSystemMES.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + //SendMessageFun.SendMessage("123", "111", OpName); + + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + // 暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + + } + + + /// + /// 保存MOBY信息 + /// + /// + /// + /// + /// + private void SaveMobyMessage(string OpName, int engineTypeID, string engineType, string engineID, string orderForm) + { + + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineTypeID[OpName] = engineTypeID; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineType.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineType[OpName] = engineType; + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_EngineID[OpName] = engineID; + } + if (MIS_BASE.hashtable_EngineGetOver_OrderForm.ContainsKey(OpName)) + { + MIS_BASE.hashtable_EngineGetOver_OrderForm[OpName] = orderForm; + } + } + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + + int isRepair; + int engineTypeID; + + string engineType = ""; + string engineID = ""; + string palletCode = ""; + string orderForm = ""; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + /// + /// 正常匹配分线和总线 + /// + /// + /// 总线工件号 + /// 总线工件机型代码 + /// 总线工件机型 + private void Match(string opName, string engineID, int engineTypeID, string engineType, int PartPallet_Code) + { + try + { + bool m_EngineGetOver_PLC_SubLine; + int engineTypeID_SubLine; + int partPallet_Code_SubLine; + int PalletInfo = 1;//总线托盘状态 + + string opName_SubLine = "";//分线工件信息 + string engineID_SubLine; + string engineType_SubLine; + string AlarmStr; + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + //第一步:获取分线中间交互工位号 + if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName)) + { + opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString(); + } + if (opName_SubLine == "") + { + return; + } + + //第二步:获取分线传递机型信号 + MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine); + if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配 + + //第三步:判断合格标志 + MIS_BASE.Read_PalletInfo(opName_SubLine, out PalletInfo); + if (PalletInfo == 2) return; //若不合格则返回不进行匹配 + string OrderForm; + //第四步:获取分线的信息,匹配验证 + MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm); + //判断分线数据是否合格 + //if (!BaseDataSystemMES.QulityDataVerify(opName, engineID_SubLine, out AlarmStr) && !BaseDataSystemMES.QualityVerifyStatus_Hash_Read(opName)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, opName); + // return; + //} + + if (engineTypeID_SubLine == engineTypeID) + { + BaseDataSystemMES.SubLineLoadPartCountMatch_Select(opName, out SubLineLoadPartCountMatch); + SubLineLoadPartCountMatch = SubLineLoadPartCountMatch + 1; + BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch); + + + BaseDataSystemMES.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移 + MIS_BASE.Write_Match(opName, true);//匹配结果 + MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成 + if(SubLineLoadPartCountMatch== SubLineLoadPartCount) + { + MIS_BASE.Write_FixAllow(opName, true); + SubLineLoadPartCountMatch = 0; + BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch); + + } + + SendMessageFun.SendInfomation("MatchSuccess", "1", opName); + sendmessage(opName, 1, "Match");//匹配结果 + } + else + { + MIS_BASE.Write_Match(opName, false);//匹配结果 + MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成//68:1、取消返修;2、匹配成功 自己监控发送 MES|MatchingCompleted + + //发送匹配完成和匹配结果信息 + SendMessageFun.AsyncSendMessage_Notice(opName,"匹配失败,工件型号不匹配!"); + SendMessageFun.SendInfomation("MatchSuccess", "0", opName); + sendmessage(opName, 0, "Match");//匹配结果 + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog("Match:" + err.ToString()); + + } + } + + + + /// + /// 强制匹配分线和总线 + /// + /// + private void ForceMatch(string opName) + { + try + { + bool m_EngineGetOver_PLC_SubLine; + bool m_EngineGetOver_PLC; + + int engineTypeID_SubLine; + int engineTypeID; + int partPallet_Code_SubLine; + int partPallet_Code; + + string opName_SubLine = "";//分线工件信息 + string engineID_SubLine; + string engineType_SubLine; + string engineID; + string engineType; + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + //获取分线中间交互工位号 + if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName)) + { + opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString(); + } + if (opName_SubLine == "") + { + return; + } + + MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine);//1:读取分线工件到位的传递机型信号。 + + if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配 + + MIS_BASE.Read_EngineGetOver_PLC(opName, out m_EngineGetOver_PLC);//2:读取总线工件到位的传递机型信号。 + + if (!m_EngineGetOver_PLC) return;//必须工件同时到位才能进行匹配 + string OrderForm; + MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm);//获取分线的信息 + MIS_BASE.GetEngineTypeFromPLC(opName, out engineTypeID, out engineType, out engineID, out partPallet_Code, out OrderForm); + + BaseDataSystemMES.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移 + + MIS_BASE.Write_Match(opName, true);//匹配结果 + MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成 + + SendMessageFun.SendInfomation("MatchSuccess", "1", opName);//界面显示匹配成功 + + MIS_BASE.Write_FixAllow(opName, true);//允许PLC工作 + + //发送匹配完成和匹配结果信息 + sendmessage(opName, 1, "MatchingComplete");//匹配完成 + sendmessage(opName, 1, "Match");//匹配结果 + } + catch + { + + } + } + } +} diff --git a/MisDataFunction/Function1059/Methods/SubmitToMisweb.cs b/MisDataFunction/Function1059/Methods/SubmitToMisweb.cs new file mode 100644 index 0000000..8d84430 --- /dev/null +++ b/MisDataFunction/Function1059/Methods/SubmitToMisweb.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using bizFacade; +//using SystemFramework; + +namespace MesServerFunctions +{ + + /// + /// 此类用于向WEB发送各种类型消息 + /// + partial class FunctionMES + { + + + // /// + // /// 批量发送WEB消息(Value为BOOL值) + // /// + // /// 消息编号组合 + // /// 消息值组合 + // /// 工位号 + // void Sendmessage(string MessageNumm,string Value, string OpName) + //{ + // for (int i=0;i + // /// 选择发送给WEB的消息 + // /// + // /// 消息类型 + // /// 消息工位 + //void Sendmessage(char Num,string Value, string OpName) + //{ + // string SendMessage; + // switch (Num) + // { + // case '1': + // //1(直接在界面通过选择机型确认工序内容) + // SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + + // case '2': + // //2显示物料 + // SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + + // case '3': + + // //3显示操作指导图片 + // SendMessage = "MES|PicShow|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '4': + // //3显示操作指导图片 + // SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + + // case '5': + // SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '6': + // SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" +Value; + // AsyncSendMessage(SendMessage); + // break; + // case '7': + // SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '8': + // SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case '9': + // SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case 'a': + // SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case 'b': + // SendMessage = "MES|ShaftPosition|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // case 'c': + // SendMessage = "MES|ShowQuality|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + // break; + // } + //} + + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + //void SendInfomation(string Command, string Value, string OpName) + //{ + + // string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + // AsyncSendMessage(SendMessage); + //} + + + ///// + ///// 发送在线产量、在线节拍 + ///// + ///// + ///// + //private void SendActuallyCount(string OpName, int tagValue) + //{ + // //当工件离开时,更新在线产量、在线节拍 + // if (tagValue == 0) + // { + // try + // { + // int opNameCount = 0;//在线产量 + // int opNameCountTime = 0;//在线节拍 + + // BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); //基本数据_工作日历_班次产量查询_New + + // SendInfomation("ActuallyCount", opNameCount.ToString() + "&" + opNameCountTime.ToString(), OpName); + + // } + // catch (Exception err) + // { + // ////ApplicationLog.WriteLog(err, "Function01:SendActuallyCount"); + // } + // } + //} + + + } +} diff --git a/MisDataFunction/Function1059/Methods/UDP.Send.cs b/MisDataFunction/Function1059/Methods/UDP.Send.cs new file mode 100644 index 0000000..26acece --- /dev/null +++ b/MisDataFunction/Function1059/Methods/UDP.Send.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MesServerWork; +//using BasicData; +using System.Collections; +using bizFacade; +//using SystemFramework; +using System.Data; +using System.Threading; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + ///// + ///// 发送信息到MES通讯服务器或者其他的 + ///// + ///// + //private void AsyncSendMessage(string Message) + //{ + // MIS_BASE.asyncSendMessage(Message); + //} + + /// + /// 发送提示消息 + /// + /// + //private void AsyncSendMessage_Notice(string opname, string notice) + //{ + // //通知Web界面 + // BaseDataSystemMES.Web_Notice_Insert(opname, notice); + // string SendMessage = "MES|Notice|" + opname + "|" + "1"; + // MIS_BASE.asyncSendMessage(SendMessage); + //} + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + + } +} diff --git a/MisDataFunction/Function1059/OpcServer/Barcode.cs b/MisDataFunction/Function1059/OpcServer/Barcode.cs new file mode 100644 index 0000000..f99b4a1 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/Barcode.cs @@ -0,0 +1,239 @@ +using System; +using System.Threading; +using System.Xml.Linq; +using bizFacade; + +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockBarcode = new object(); + + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + lock(lockBarcode) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + //+*************DbName***************** + string DbName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + + int EngineTypeID;//机型代码 + string EngineType;//机型 + string EngineID;//工件编号 + + string OrderForm; + int Recipe1; + int Recipe2; + + bool IsNotRepeatedNumber = false; + //1:获得申请上线信息后,扫描条码才处理业务 + bool ispartload; + //(115) + int PTO; + //(118)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int NgearSwitch; + //(119)0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int RgearSwitch; + //(120)0=不检测;1=检测。检测线上线工位扫描总成条码,根据BOM,查出 + int SpeedSensor; + //(121)例如:5S 400。检测线上线工位扫描总成条码,根据BOM,查出 + string PartTypeMid; + //(122) 0=不检测;1=24V,2=12V。检测线上线工位扫描总成条码,根据BOM,查出 + int Tcu_V; + //判断工件是否到位 + MIS_BASE.Read_WorkStart(OpName, out ispartload); + if (!ispartload) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否到位(DBX500.1=1)"); + return; + } + //判断设备是否申请上线 + //MIS_BASE.Read_UpdatePalletOK(OpName, out ispartload); + //if (!ispartload) + //{ + // SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否申请上线(DBX500.3=1)"); + // return; + //} + // 判读条码是变速器序列号条码号还是物料号 小机型*日月年* 流水号(给起始号 + 数量) + // 选小机型 从北汽福田BOM中选 得先维护BOM + // 变速器序列号 '1333 050 062*16012023*30000001' + + //扫描完变速器序列号条码号 true + bool isGetOver_MES = false; + //判断上线工位,MES 是否将工件流水号、机型等信息已经写入到PLC了 + MIS_BASE.Read_EngineTypeGetOver_MES(OpName, out isGetOver_MES); + + //如果工件流水号、机型等信息没有写入PLC,扫描的条码按工件流水号进行验证 + //否则按装配物料进行验证 + if (!isGetOver_MES) + { + + if (barcode.Split('*').Length > 2) + { + //2: 判断是否重号, 从数据库获得机型、机型代码等信息 + string partSn = barcode; + EngineID = barcode; + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + + //Db.GetEngineType( partSn, out EngineTypeID, out EngineType, out EngineID, out IsRepeatedNumber); + //Db.GetEngineType( partSn, out EngineTypeID, out EngineType, out EngineID, out IsRepeatedNumber); + + //IsRepeatedNumber true 不重号;false 重号; + IsNotRepeatedNumber = BaseDataSystemMES.EngineTypeID_IsNotRepeatedNumber(partSn); + if (IsNotRepeatedNumber) + { + BaseDataSystemMES.GetEngineTypeUpLoadOpName(partSn, OpName, out EngineTypeID, out EngineType, out OrderForm, out Recipe1, out Recipe2); + + //MIS_BASE.Write_EngineID_MES(OpName, EngineID); + //MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + //MIS_BASE.Write_EngineType_MES(OpName, EngineType); + //MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + + BaseDataSystemMES.UpLoadPTO(partSn, out PTO, out NgearSwitch, out RgearSwitch, out SpeedSensor, out PartTypeMid, out Tcu_V); + //PTO + MIS_BASE.WritePLC(115, OpName, PTO); + //空挡开关检测 + MIS_BASE.WritePLC(95, OpName, NgearSwitch); + //倒挡开关检测 + MIS_BASE.WritePLC(96, OpName, RgearSwitch); + //里程表检测 + MIS_BASE.WritePLC(97, OpName, SpeedSensor); + //大机型扩展 + MIS_BASE.WritePLC(98, OpName, PartTypeMid); + //TCU + MIS_BASE.WritePLC(122, OpName, PartTypeMid); + string tagStartAdr;//= "DB411.10"; + + // 先查询配方号 根据工位号 去moby表查配方号 + // 根据配方号 去配方表查配方数据 + // 写入配方数据 + BaseDataSystemMES.PLCRcipeCurrent(OpName, out byte[] bytes, out tagStartAdr); + DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID("94", OpName, System.Text.Encoding.ASCII.GetString(bytes)); + ////将产品信息写入PLC + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + //写入到数据库的[北汽福田工位状态监控MOBY]表中 + //BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID_MES, EngineTypeID.ToString()); + //BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType_MES, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + //BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm_MES, OrderForm); + + + // 工位号],[订单号],[产品型号代码],[变速器序列号],[发动机型号],[机型基本代码],[变速器总成号] ,[托盘号] + // [产品型号代码_MES],[变速器序列号_MES],[发动机型号_MES] + // [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位] + // [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格] + // [工号],[班次],[是否返修件],[合格放行],[不合格放行],[扫描条码] + + //BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, "产品型号代码_MES", EngineTypeID.ToString()); + //BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, "发动机型号_MES", EngineType); + + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); + + //Thread.Sleep(5000); + //MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + + //等待PLC将数据写入RFID;写入PLC的DB块,通知MES验证RFID机型数据是否正确传递 + + //通知web显示 + SendMessage.ShowMoby(OpName); + //SendMessageFun.SendMessage("1235", "1111", OpName); + + SendMessageFun.AsyncSendMessage_Notice(OpName, "扫码完成!"); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号 重号,请确认!"); + } + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号格式不正确,请确认!"); + + } + } + else//验证物料 + { + //物料号 + { + //读取PLC的传递机型信号 + bool tagValue; + MIS_BASE.Read_EngineGetOver_PLC(OpName, out tagValue); + if (tagValue) + { + //验证物料 + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out bool IsSuccess); + if (!IsSuccess)//???? + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + //判断物料是否验证完成 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out int IsAllowWork); + + + if (IsSuccess) + { + if (IsAllowWork == 1) + { + //移到允许保存信号中 + //BaseDataSystemMES.Material_Insert(OpName, 1); + + ////更新订单完工数量及物料 + SendMessageFun.SendMessage("24", "11", OpName); + + //物料验证完成,通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + } + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "产品上线后,PLC获得变速器序列号后,再验证物料!"); + } + + } + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:Barcode"); + } + } + + } + + + } +} diff --git a/MisDataFunction/Function1059/OpcServer/ConfirmOkGo.cs b/MisDataFunction/Function1059/OpcServer/ConfirmOkGo.cs new file mode 100644 index 0000000..a978c1f --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/ConfirmOkGo.cs @@ -0,0 +1,35 @@ +using System; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 合格放行 + /// + /// + /// + private void ConfirmOkGo(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + MIS_BASE.Write_MaterialVerifyOver(OpName, true);//工作完成 + SendMessageFun.SendInfomation("OrderFormList","1", OpName); + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:ConfirmOkGo"); + } + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1059/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..5cf02f9 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/EngineGetOver.cs @@ -0,0 +1,108 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockBarcodeEngineTypeGetOver = new object(); + + + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + lock(lockBarcodeEngineTypeGetOver) + { + + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + //判断PLC机型与MES机型是否一致 + if (tagValue == 1) + { + bool MesRead = false; + + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + + //上线工位清MES传递机型信号 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + + MIS_BASE.Read_QualityData_Read_CF(OpName, out MesRead); + //第一步,判断允许保存和保存完成信号是否全部被清空,若未清空,则通知复位MES&PLC + if (MesRead) + { + //未能清空信号,请求复位 + SendMessageFun.SendInfomation("AskReset", "1", OpName); + return; + } + string OrderForm; + string OrderForm_MES; + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES); + + // 测试的时候用的 plc读取订单号有问题 + // OrderForm = BaseDataSystemMES.GetOrderDataBySn(EngineID); + + if (EngineTypeID_MES == EngineTypeID & EngineID_MES == EngineID & EngineType_MES == EngineType & OrderForm_MES == OrderForm) + { + // + DataTable dt = BaseDataSystemMES.EngineTypeChange(OpName, EngineType); + // 提示机型发生变化 + if (dt.Rows.Count > 0) + { + string mesValue = Newtonsoft.Json.JsonConvert.SerializeObject(dt);//(recData); + string message = "MES|MaterialList_Dif_Resources|" + OpName + "|" + mesValue; + SendMessage.AsyncSendMessage(message); + } + + + //写入到数据库的[北汽福田工位状态监控MOBY]表中 + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm, OrderForm); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + + //显示当前订单信息 + SendMessage.ShowMoby(OpName); + + + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + return; + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "码块RFID机型与MES机型不匹配!"); + } + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:EngineTypeGetOver_PLC"); + } + } + + } + + + + } +} diff --git a/MisDataFunction/Function1059/OpcServer/FalseGO.cs b/MisDataFunction/Function1059/OpcServer/FalseGO.cs new file mode 100644 index 0000000..54c73c7 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/FalseGO.cs @@ -0,0 +1,37 @@ +using System; +using MesServerWork; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + + /// + /// 返修放行 + /// + /// + /// + private void FalseGO(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + MIS_BASE.Write_MaterialVerifyOver(OpName, true);//工作完成 + SendMessageFun.SendInfomation("OrderFormList", "1", OpName); + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/HeartBeat.cs b/MisDataFunction/Function1059/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..93affd3 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/HeartBeat.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/MesRead.cs b/MisDataFunction/Function1059/OpcServer/MesRead.cs new file mode 100644 index 0000000..9bc056d --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/MesRead.cs @@ -0,0 +1,77 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + object lockMesRead = new object (); + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + lock(lockMesRead) + { + try + { + int EngineTypeID; + string EngineType; + string EngineID; + int PartPallet_Code; + string OrderForm; + + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + //保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号 + if (Db.UpLoadOpNameInsert(EngineID, EngineTypeID, EngineType, OpName)) + { + // 保存质量数据 + int qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + // 推送质量数据到MES的页面 + MIS_BASE.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + // 保存物料数据 + BaseDataSystemMES.Material_Insert(OpName, tagValue); + // 测量数据发动机在线状态 + BaseDataSystemMES.WorkStartInsert(OpName, qualityMask); + SendMessage.SendActuallyCount(OpName, tagValue);//统计在线产量,在线节拍 + + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + // MES工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "保存上线数据失败!"); + } + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + } + + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + + } + + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/MesReadOver.cs b/MisDataFunction/Function1059/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..9b637f2 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/MesReadOver.cs @@ -0,0 +1,37 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + try + { + //DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + //string OpName = Convert.ToString(msgEvent.OpName); + //int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //if (tagValue == 1) + //{ + + // BaseDataSystemMES.Material_Insert(OpName, tagValue); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + //} + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/MesSaveNowData.cs b/MisDataFunction/Function1059/OpcServer/MesSaveNowData.cs new file mode 100644 index 0000000..be4c8ce --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/MesSaveNowData.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES保存实时质量数据 + /// + /// + /// + private void MesSaveNowData(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + // 保存质量数据 + MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString(),true); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/PartLoad.cs b/MisDataFunction/Function1059/OpcServer/PartLoad.cs new file mode 100644 index 0000000..e221f64 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/PartLoad.cs @@ -0,0 +1,39 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 申请上线(针对上线工位) + /// + /// + /// + private void PartLoad(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描总成码"); + } + else + { + //上线工位清MES传递机型信号 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/WebSubmit.cs b/MisDataFunction/Function1059/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..0272c32 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/WebSubmit.cs @@ -0,0 +1,343 @@ +using System; +using MesServerWork; +using bizFacade; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string opName_SubLine = ""; + string engineID = "";//工件信息 + string[] dataArray = Content.Split('|'); + + if (dataArray.Length != 2) + return; + + + string m_Command = dataArray[0].ToString();//消息类型 + string m_Value = dataArray[1].ToString();//消息参数 + string[] m_Value_array = m_Value.Split('&');//消息参数数量 + int m_Value_length = m_Value_array.Length; //消息参数长度 + + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + if (MIS_BASE.hashtable_OpNameRepair == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //修改托盘状态 + + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + + break; + case "FixAllow"://重新拧紧 + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + MIS_BASE.Write_RepairUpline_MES(opName_SubLine, true); + //MIS_BASE.Write_PalletInfo(opName_SubLine, 4); + //MIS_BASE.Write_UpdatePalletOK(opName_SubLine, true); + MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true); + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + } + else if (Convert.ToInt32(m_Value) == 0) + { + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + break; + //强制匹配 + case "ForceMatch": + if (Convert.ToInt32(m_Value) == 1) + { + ForceMatch(OpName); + } + break; + case "PalletGO": + + if (Convert.ToInt32(m_Value) == 1) + { + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true); + } + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + fun_EngineTypeGetOverPLC(_e); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:WebSubmit"); + } + } + + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + SendMessageFun.SendMessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + + + /// + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + bool S_WorkStart;//工件到位 DBX0.1 + bool S_EngineGetOver;//传递机型 DBX0.4 + bool S_FixAllow;//允许工作 DBX3.1 + bool S_MaterialVerifyOver;//工作完成 DBX2.3 + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + + int IsCompleted = 0; + int S_Match = 0; + int PalletInfo_SubLine = 0;//显示分线托盘状态 + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(Opname); + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(Opname); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(Opname); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(Opname); + // 新增查询PLC直通状态 网页显示 + MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + InitAlarm(Opname); + + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + + if (S_WorkStart == true) + { + SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "WorkStart_Subline"); + } + + //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "EngineTypeGetOverMES_Subline"); + + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + if (S_EngineGetOver == true) + { + SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + //sendmessage(Opname, Convert.ToInt32(S_EngineGetOver), "EngineTypeGetOverMES_Subline"); + } + + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + + if (S_FixAllow == true) + { + SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + if (S_MaterialVerifyOver == true) + { + SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + + //MIS_BASE.Read_MatchingCompleted(Opname, out IsCompleted); //DBX1.3 是否匹配 + //MIS_BASE.Read_Match(Opname, out S_Match); //DBX1.4 匹配结果 + + //if (IsCompleted == 1 && S_Match == 1)//发送匹配完成和匹配结果信息 + //{ + // SendMessageFun.SendInfomation("MatchingCompleted", "1", Opname); + // SendMessageFun.SendInfomation("Match", "1", Opname); + // SendMessageFun.SendInfomation("MatchSuccess", "1", Opname);//界面显示匹配成功 + //} + //else if (IsCompleted == 1 && S_Match == 0) + //{ + // SendMessageFun.SendInfomation("MatchSuccess", "0", Opname);//界面显示匹配失败 + //} + + //if (MIS_BASE.hashtable_OpNameRepair == null) + //{ + // MIS_BASE.InitHashtable_MesServerCode(); + //} + //string Opname_SubLine = ""; + //if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(Opname)) + //{ + // Opname_SubLine = MIS_BASE.hashtable_OpNameRepair[Opname].ToString(); + //} + //if (Opname_SubLine == "") + //{ + // return; + //} + + //MIS_BASE.Read_PalletInfo(Opname, out PalletInfo_SubLine); + //sendmessage(Opname, PalletInfo_SubLine, "SubQualityMask"); + //SendMessageFun.SendInfomation("ShowMobySubLine", Opname_SubLine, Opname);//显示分线机型及流水号 + } + + //分线发送工件到位信号函数 + private void sendmessage(string OpName, int tagValue, string Command) + { + string SendMessage; + SendMessage = "MES|" + Command + "|" + OpName + "|" + tagValue; + SendMessageFun.AsyncSendMessage(SendMessage); + + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + } +} diff --git a/MisDataFunction/Function1059/OpcServer/WorkStart.cs b/MisDataFunction/Function1059/OpcServer/WorkStart.cs new file mode 100644 index 0000000..a16c909 --- /dev/null +++ b/MisDataFunction/Function1059/OpcServer/WorkStart.cs @@ -0,0 +1,75 @@ +using System; +using bizFacade; +using MesServerWork; +//using SystemFramework; + + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //线首显示订单信息 + + if (tagValue == 1) + { + MIS_BASE.Write_TagTypeID(115, OpName, 0); + MIS_BASE.Write_TagTypeID(95, OpName, 0); + MIS_BASE.Write_TagTypeID(96, OpName, 0); + MIS_BASE.Write_TagTypeID(97, OpName, 0); + MIS_BASE.Write_TagTypeID(98, OpName, ""); + //清空MOBY的产品流水号 + + // 北汽福田工位状态监控MOBY_增加 + // 工位号],[订单号],[产品型号代码],[变速器序列号],[发动机型号],[机型基本代码],[变速器总成号] ,[托盘号] + // [产品型号代码_MES],[变速器序列号_MES],[发动机型号_MES] + // [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位] + // [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格] + // [工号],[班次],[是否返修件],[合格放行],[不合格放行],[扫描条码] + //[到达时间],[离开时间],[持续时间] + + //初始化物料临时表 + //第二步,将零件信息转移到零件_临时表中(本地BOM与订单BOM的选择显示关系) + BaseDataSystemMES.MesServer_Process_EngineTypeOver_BQ_FirstOP(OpName); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartIn, DateTime.Now.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStart, tagValue.ToString()); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(OpName); + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(OpName); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(OpName); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(OpName); + } + else + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:WorkStart"); + } + } + } +} diff --git a/MisDataFunction/Function1059/Properties/AssemblyInfo.cs b/MisDataFunction/Function1059/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5afe3c2 --- /dev/null +++ b/MisDataFunction/Function1059/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Function1059")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Function1059")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("3dcc04c0-32bf-4573-91f6-c4e342a0cf2a")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MisDataFunction/Function1059/mssccprj.scc b/MisDataFunction/Function1059/mssccprj.scc new file mode 100644 index 0000000..f184c61 --- /dev/null +++ b/MisDataFunction/Function1059/mssccprj.scc @@ -0,0 +1,5 @@ +SCC = This is a Source Code Control file + +[Function08.csproj] +SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0" +SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function08", KRHAAAAA diff --git a/MisDataFunction/Function1059/packages.config b/MisDataFunction/Function1059/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1059/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1060/DataAccess/DataAccess.cs b/MisDataFunction/Function1060/DataAccess/DataAccess.cs new file mode 100644 index 0000000..cd36930 --- /dev/null +++ b/MisDataFunction/Function1060/DataAccess/DataAccess.cs @@ -0,0 +1,15 @@ + +namespace MesServerFunctions +{ + partial class Function1053 + { + //针对“MIS.BizFacade.Dll”中没有的存储过程,在此类中新建 + //新建原则:所有的函数用private,只允许在内部使用 + //针对单个工艺特殊,需要新建存储过程,但是存储过程不能被加入到“MIS.BizFacade.Dll”中 + + private void aa() + { + + } + } +} diff --git a/MisDataFunction/Function1060/Db.cs b/MisDataFunction/Function1060/Db.cs new file mode 100644 index 0000000..64286ed --- /dev/null +++ b/MisDataFunction/Function1060/Db.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + public class Db + { + /// + /// 北汽福田变速器序列号总线上线_获得机型信息 + /// + /// + /// + /// + /// + /// 0 不重号;1 重号;2:失败 + /// + public static bool GetEngineType(string partSn, out int EngineTypeID, out string EngineType, out string EngineID,out int IsRepeatedNumber) + { + DataTable dt = new DataTable(); + EngineTypeID = 0; + EngineType = ""; + EngineID = ""; + IsRepeatedNumber = 2; + string produceName = "北汽福田变速器序列号总线上线_获得机型信息"; + SqlParameter[] thisParms = new SqlParameter[1]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", partSn); + + thisParms[2].Direction = ParameterDirection.Output; + if (DataAccess.ExecuteStoredProcedure(produceName, ref thisParms,out dt)) + { + if(dt.Rows.Count > 0) + { + IsRepeatedNumber = Convert.ToInt32( dt.Rows[0]["IsRepeatedNumber"]); + EngineTypeID = Convert.ToInt32(dt.Rows[0]["EngineTypeID"]); + EngineType = dt.Rows[0]["EngineType"].ToString(); + EngineID = partSn; + return true; + } + } + return false; + } + /// + /// 北汽福田变速器序列号总线上线_增加 + /// + /// + /// + /// + /// + /// + public static bool UpLoadOpNameInsert(string partSn, int EngineTypeID, string EngineType, string OpName) + { + + string produceName = "北汽福田变速器序列号总线上线_增加"; + SqlParameter[] thisParms = new SqlParameter[4]; + thisParms[0] = new System.Data.SqlClient.SqlParameter("@变速器序列号", partSn); + thisParms[1] = new System.Data.SqlClient.SqlParameter("@基本型号代码", EngineTypeID); + thisParms[2] = new System.Data.SqlClient.SqlParameter("@基本型号", EngineType); + thisParms[3] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); + return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms); + } + + // ALTER PROCEDURE[dbo].[北汽福田变速器序列号总线上线_增加] + // @变速器序列号 nvarchar(50)='1333 050 062 0001*146012023*12345678',--'1333 050 062 0001' + //@基本型号代码 int=1, + //@基本型号 nvarchar(50)='1333 050 062 0001', + //@工位号 nvarchar(50) = 'J05PA010' + } +} diff --git a/MisDataFunction/Function1060/Function1060.csproj b/MisDataFunction/Function1060/Function1060.csproj new file mode 100644 index 0000000..12f2824 --- /dev/null +++ b/MisDataFunction/Function1060/Function1060.csproj @@ -0,0 +1,109 @@ + + + + + Debug + AnyCPU + {D5DC93C7-91DD-4C82-9444-64180F15A9C9} + Library + Properties + Function1060 + Function1060 + v4.8 + 512 + true + + + true + full + false + ..\..\MisDataFun_Exe\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\MisDataFunDll\MisDataFunDll\bin\Debug\00.1Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {f55da1a0-a982-4479-8c47-0d9a5aaf3e18} + 00MesWorkMqtt + + + {0d1af432-439a-4920-8692-43ae139f5530} + 01_01DoWhatPlc + + + {3e6d1dd5-01c9-435f-9941-61f906ce35bb} + 02_02WebApiCallPLC + + + {f434e066-4c59-47c8-aa82-6f48cc84501a} + 04-DataBaseAccess + + + {f0a0c525-03fd-428a-9b17-7f54aa0e4475} + 07BusinessFacade + + + {d98be764-adeb-488d-9714-61e308aa8201} + 08-WebFun_base + + + {90e76fb4-646d-45e2-95db-0b8ab4e465d6} + 09-MesDataFunction + + + {e4eb6420-906d-4672-947a-ca33ddcdadfc} + 12SendMessageToWeb + + + {55b510c1-59e9-4bfd-ae84-d76d46f6e365} + 02-13.3MIS_FuntionSaveData + + + + \ No newline at end of file diff --git a/MisDataFunction/Function1060/MesServerFunction/Fun_1060.cs b/MisDataFunction/Function1060/MesServerFunction/Fun_1060.cs new file mode 100644 index 0000000..48817f0 --- /dev/null +++ b/MisDataFunction/Function1060/MesServerFunction/Fun_1060.cs @@ -0,0 +1,217 @@ +using MesServerWork; +using System.Collections.Generic; +using System.Threading; + +namespace MesServerFunctions +{ + public partial class FunctionMES + { + object lockFunWork; + //public void FunWork(DoWhatPlc.CustomeEvetnArgs e) + public void FunWork(string recData) + { + + + lockFunWork = new object(); + lock (lockFunWork) + { + List dataArray = DoWhatPlc.MessageText.GetCmdStringList(recData); + //string[] dataArray = recData.Split('|'); + //if (dataArray.Count != 4) + //return; + //消息来源 + string m_Source = dataArray[0].ToString(); + //消息类型 Barcode + string m_Command = dataArray[1].ToString(); + //工位号 + string m_OpName = dataArray[2].ToString(); + //消息参数 + string m_Value = dataArray[3].ToString(); + + DoWhatPlc.CustomeEvetnArgs e = new DoWhatPlc.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + string tagValue; + + switch (m_Source) + { + case "BarCode": + e.OpName = m_OpName; + e.TagValue = m_Value; + fun_Barcode(e); + break; + case "WEB": + e.OpName = m_OpName; + e.TagValue = m_Command + "|" + m_Value; + fun_WebSubmit(e); + break; + case "PLC": + e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); + switch (e.TagValue.ToString().ToLower()) + { + case "false": + tagValue = "0"; + break; + case "true": + tagValue = "1"; + break; + default: + tagValue = e.TagValue.ToString(); + break; + } + e.TagValue = tagValue; + switch (e.TagTypeCodeID.ToString()) + { + //PLC 工件到位 + case "2": + fun_WorkStart(e); + break; + //PLC 允许保存质量数据 + case "19": + fun_MesRead(e); + break; + //MES 保存数据完成 + case "20": + fun_MesReadOver(e); + break; + //PLC 传递机型 + case "44": + fun_EngineTypeGetOverPLC(e); + break; + //MES 合格放行 + case "51": + fun_ConfirmOkGo(e); + break; + //MES 不合格放行 + case "8": + fun_FalseGo(e); + break; + //MES保存实时质量数据 + case "65": + fun_MesSaveNowData(e); + break; + //MES 系统健康心跳 + case "14": + fun_HeartBeatMIS(e); + break; + case "63": + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus); + if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1") + { + SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName); + } + break; + } + break; + } + } + } + //1.工件到位后,PLC给MES传递机型(DBX0.4)(44), + //MES判断条码是否全部扫描完成 + //PLC给出允许保存(DBX100.2)(19),MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20), + //PLC见到保存完成(DBX102.2)(20)为1后,清空允许保存(DBX100.2)(19), + //MES见到允许保存(DBX100.2)(19)为0后,清空保存完成(DBX102.2)(20) + //MES判断总合格标志(INT104)(21)为1后,给出合格放行(DBX2.5)(51) + /// + /// 扫描条码 + /// + /// + /// + public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(Barcode, e); + } + + /// + /// 传递机型 + /// + /// + /// + public void fun_EngineTypeGetOverPLC(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e); + } + + /// + /// 合格放行 + /// + /// + /// + public void fun_ConfirmOkGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(ConfirmOkGo, e); + } + /// + /// 系统健康心跳监测 + /// + /// + /// + public void fun_HeartBeatMIS(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(HeartBeat, e); + } + /// + /// 不合格放行 + /// + /// + /// + public void fun_FalseGo(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(FalseGO, e); + } + + /// + /// 允许保存 + /// + /// + /// + public void fun_MesRead(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesRead, e); + } + + /// + /// 保存完成 + /// + /// + /// + public void fun_MesReadOver(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesReadOver, e); + } + + /// + /// 工件到位离开(清空所有的MES信号) + /// + /// + /// + public void fun_WorkStart(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WorkStart, e); + } + + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + public void fun_WebSubmit(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(WebSubmit, e); + } + + /// + /// MES实时保存质量数据 + /// + /// + /// + public void fun_MesSaveNowData(DoWhatPlc.CustomeEvetnArgs e) + { + ThreadPool.QueueUserWorkItem(MesSaveNowData, e); + } + + } +} diff --git a/MisDataFunction/Function1060/Methods/EngineGetOverBaseWork.cs b/MisDataFunction/Function1060/Methods/EngineGetOverBaseWork.cs new file mode 100644 index 0000000..a9dd932 --- /dev/null +++ b/MisDataFunction/Function1060/Methods/EngineGetOverBaseWork.cs @@ -0,0 +1,96 @@ +using System; +using System.Data; +using bizFacade; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 正常逻辑工作(传递机型) + /// + /// + /// + /// + /// + /// + private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm) + { + int IsAllowWork; + int RepairPartStatusPLC = 0; + int MES_QualityMask = 1; + //string OrderForm = "";//订单号 + //DataTable dt; + + if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0 || OrderForm.Length == 0) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空"); + return; + } + //电子看板_装配零件_临时表_增加_北汽 + //第二步,将零件信息转移到零件_临时表中 + BaseDataSystemMES.MesServer_Process_EngineTypeOverBQ(OpName); + + //通知web显示 + SendMessageFun.SendMessage("1235", "1111", OpName); + MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 + MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志 + SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志 + SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志 + + if (MES_QualityMask == 2) + { + //// 工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //SendMessageFun.SendInfomation("NgGO", "1", OpName);//显示不合格标志 + //return; + } + + + //第三步,用于工件离开后完工数量统计及工件编号追溯 + //BaseDataSystemMES.MaterialPush_EngineIDStatus_Insert(OpName);//更新订单产量 + + //第四步,获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况 + if (IsAllowWork == 1) + { + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + } + + + /// + /// 返修件需要工作 + /// + /// 工位号 + private void IsNeedRepaire_OK(string OpName) + { + string orderForm = ""; + int engineTypeID; + string engineType = ""; + string engineID = ""; + string palletCode = ""; + int isRepair; + string repairCode = ""; + //从监控系统中查询出本工位信息 + BaseDataSystemMES.OpName_MIS_Moby_Select(OpName, + out orderForm, out engineTypeID, out engineType, + out engineID, out palletCode, out isRepair, out repairCode); + + EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm); + } + + + + + } +} diff --git a/MisDataFunction/Function1060/Methods/SubmitToMisweb.cs b/MisDataFunction/Function1060/Methods/SubmitToMisweb.cs new file mode 100644 index 0000000..52ce16f --- /dev/null +++ b/MisDataFunction/Function1060/Methods/SubmitToMisweb.cs @@ -0,0 +1,127 @@ +using System; +using bizFacade; +//using SystemFramework; + +namespace MesServerFunctions +{ + + /// + /// 此类用于向WEB发送各种类型消息 + /// + partial class FunctionMES + { + + /// + /// 批量发送WEB消息(Value为BOOL值) + /// + /// 消息编号组合 + /// 消息值组合 + /// 工位号 + void Sendmessage(string MessageNumm,string Value, string OpName) + { + for (int i=0;i + /// 选择发送给WEB的消息 + /// + /// 消息类型 + /// 消息工位 + string Sendmessage(char Num,string Value, string OpName) + { + string SendMessage; + string result = ""; + switch (Num) + { + case '1': + //1(直接在界面通过选择机型确认工序内容) + SendMessage = "MES|ProcessList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '2': + //2显示物料 + SendMessage = "MES|MaterialList|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '3': + //3显示操作指导图片 + SendMessage = "MES|PicShow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '4': + //4订单完工模块刷新完成数量 + SendMessage = "MES|OrderFormList|" + OpName + "|" + Value; + AsyncSendMessage(SendMessage); + break; + case '5': + SendMessage = "MES|ShowMoby|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '6': + SendMessage = "MES|MaterialCheckPosition|" + OpName + "|" +Value; + result = AsyncSendMessage(SendMessage); + break; + case '7': + SendMessage = "MES|WorkStart|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case '8'://清除MES生成编号 + + break; + case '9': + SendMessage = "MES|ConfirmOkGo|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + case 'a': + SendMessage = "MES|FixAllow|" + OpName + "|" + Value; + result = AsyncSendMessage(SendMessage); + break; + } + return result; + } + /// + /// 向WEB发送信息(value为字符串) + /// + /// 消息种类 + /// 消息内容 + /// 工位号 + string SendInfomation(string Command, string Value, string OpName) + { + string SendMessage = "MES|" + Command + "|" + OpName + "|" + Value; + return AsyncSendMessage(SendMessage); + } + + + /// + /// 发送在线产量、在线节拍 + /// + /// + /// + private void SendActuallyCount(string OpName, int tagValue) + { + //当工件离开时,更新在线产量、在线节拍 + if (tagValue == 0) + { + try + { + int opNameCount = 0;//在线产量 + int opNameCountTime = 0;//在线节拍 + //基本数据_工作日历_班次产量查询_New + BaseDataSystemMES.OpNameCount_New(OpName, out opNameCount, out opNameCountTime); + string SendMessage; + SendMessage = "MES|ActuallyCount|" + OpName + "|" + opNameCount.ToString() + "&" + opNameCountTime.ToString(); + AsyncSendMessage(SendMessage); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:SendActuallyCount"); + } + } + } + + + } +} diff --git a/MisDataFunction/Function1060/Methods/UDP.Send.cs b/MisDataFunction/Function1060/Methods/UDP.Send.cs new file mode 100644 index 0000000..aed7cc3 --- /dev/null +++ b/MisDataFunction/Function1060/Methods/UDP.Send.cs @@ -0,0 +1,53 @@ +using bizFacade; +//using SystemFramework; +using MesServerWork; +using DataLinkMesWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 发送信息到MES通讯服务器或者其他的 + /// + /// + private string AsyncSendMessage(string Message) + { + return MIS_BASE.asyncSendMessage(Message); + } + + /// + /// 发送提示消息 + /// + /// + private void AsyncSendMessage_Notice(string opname, string notice) + { + //通知Web界面 + BaseDataSystemMES.Web_Notice_Insert(opname, notice); + string SendMessage = "MES|Notice|" + opname + "|" + "1"; + MIS_BASE.asyncSendMessage(SendMessage); + } + + /// + /// 发送信息到打印机 + /// + /// + private void asyncSendMessageToMark(string Message) + { + string messageSend = (string)Message; + //UDPClientSend.Send_ALL(ApplicationConfig.MES_MarkPortNum, messageSend); + } + + /// + /// 发送信息到LED + /// + /// + private void asyncSendMessageLED(string OpName) + { + //发送到大屏幕显示 41104 + string strMessage = "MIS|" + OpName + "|" + "0" + "|" + "1"; + //UDPClientSend.Send_ALL(ApplicationConfig.Port_ShowLED_ProductCount, strMessage); + + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/Barcode.cs b/MisDataFunction/Function1060/OpcServer/Barcode.cs new file mode 100644 index 0000000..5d80b2f --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/Barcode.cs @@ -0,0 +1,97 @@ +using System; +//using System.Windows.Forms; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + ///1.扫描配送单号,用于接收物料,扫描单号的时候,将接收的物料信息显示在“物料拉动”Tab区域 + ///2.扫描料箱标签/看板卡,用于追溯物料批次信息 + ///3.扫描零件条码,根据零件图号进行防错 + ///第一步,判断条码类型,根据条码类型,执行对应的存储过程 + ///第二步,条码类型(将扫描的条码保存到对应的表中) + ///第三步,扫描完成之后给出允许工作信号 + /// 处理页面扫描条码 + /// + /// + /// + public void Barcode(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + string barcode = Convert.ToString(msgEvent.TagValue); + string AlarmStr = ""; + + int IsAllowWork; + bool IsSuccess = false; + bool EngineGetOver_PLC_NextWorkStep; + //传递机型是否到位 + MIS_BASE.Read_EngineGetOver_PLC(OpName, out EngineGetOver_PLC_NextWorkStep); + if (!EngineGetOver_PLC_NextWorkStep) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型"); + return; + } + //物料验证 + BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out IsSuccess); + if (!IsSuccess) + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认"); + return; + } + else + { + SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息 + } + + + + + //获取是否允许工作 + BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out IsAllowWork); + + //此处逻辑有问题 需要考虑到批次扫描 提示PLC未传递机型的情况 + if (IsAllowWork == 1) + { + //BaseDataSystemMES.Material_Insert(OpName, 1); + + //更新订单完工数量及物料 + SendMessageFun.SendMessage("24", "11", OpName); + + //工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + //if (!BaseDataSystemMES.QualityVerifyStatusOutline(OpName, out AlarmStr)) + //{ + // SendInfomation("LineoutAlert", AlarmStr, OpName); + // return; + //} + //通知PLC允许工作,允许工作在保存完成时清空 + MIS_BASE.Write_FixAllow(OpName, true); + } + else + { + SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!"); + } + + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:Barcode"); + } + + } + + } + + + } +} diff --git a/MisDataFunction/Function1060/OpcServer/ConfirmOkGo.cs b/MisDataFunction/Function1060/OpcServer/ConfirmOkGo.cs new file mode 100644 index 0000000..ac8affd --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/ConfirmOkGo.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 合格放行 + /// + /// + /// + private void ConfirmOkGo(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + + //BaseDataSystemMES.Material_Insert(OpName, 1); + + ////更新订单完工数量及物料 + //Sendmessage("24", "11", OpName); + + ////工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:ConfirmOkGo"); + } + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/EngineGetOver.cs b/MisDataFunction/Function1060/OpcServer/EngineGetOver.cs new file mode 100644 index 0000000..db74c48 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/EngineGetOver.cs @@ -0,0 +1,90 @@ +using System; +using System.Data; +//using System.Windows.Forms; +using System.Xml.Linq; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// PLC传递机型处理 + /// + /// + /// + private void EngineTypeGetOver_PLC(object e) + { + + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + int EngineTypeID;//机型代码 + int PartPallet_Code;//托盘编号 + + string EngineType;//机型 + string EngineID;//工件编号 + string OrderForm; + string OrderForm_MES; + + int EngineTypeID_MES;//机型代码 + string EngineType_MES;//机型 + string EngineID_MES;//工件编号 + + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES); + + // 测试的时候用的 plc读取订单号有问题 + // OrderForm = BaseDataSystemMES.GetOrderDataBySn(EngineID); + + if (EngineTypeID_MES == EngineTypeID & EngineID_MES == EngineID & EngineType_MES == EngineType) + { + DataTable dt; + dt = BaseDataSystemMES.EngineTypeChange(OpName, EngineType); + //提示机型发生变化 + if (dt.Rows.Count > 0) + { + string mesValue = Newtonsoft.Json.JsonConvert.SerializeObject(dt);//(recData); + string message = "MES|MaterialList_Dif_Resources|" + OpName + "|" + mesValue; + SendMessage.AsyncSendMessage(message); + } + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineTypeID, EngineTypeID.ToString()); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineType, EngineType); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID, EngineID); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.OrderForm, OrderForm); + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.PartPallet_Code, PartPallet_Code.ToString()); + + //显示当前订单信息 + SendMessage.ShowMoby(OpName); + + EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm); + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "PLC机型与MES机型不匹配!"); + } + + + + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:EngineTypeGetOver_PLC"); + } + } + + + } + + + } +} diff --git a/MisDataFunction/Function1060/OpcServer/FalseGO.cs b/MisDataFunction/Function1060/OpcServer/FalseGO.cs new file mode 100644 index 0000000..e6d4179 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/FalseGO.cs @@ -0,0 +1,41 @@ +using System; +using bizFacade; +//using SystemFramework; +using MesServerWork; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 不合格放行 + /// + /// + /// + private void FalseGO(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + if (tagValue == 1) + { + //总合格标志2(不合格) + + //BaseDataSystemMES.Material_Insert_NG(OpName, 2); + + //Sendmessage("24", "11", OpName); + + ////工作完成 + //MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/HeartBeat.cs b/MisDataFunction/Function1060/OpcServer/HeartBeat.cs new file mode 100644 index 0000000..93affd3 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/HeartBeat.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES与PLC心跳监听 + /// + /// + /// + private void HeartBeat(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + //返写在MES心跳中 + MIS_BASE.WritePLC(15, OpName, tagValue); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/MesRead.cs b/MisDataFunction/Function1060/OpcServer/MesRead.cs new file mode 100644 index 0000000..2c468df --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/MesRead.cs @@ -0,0 +1,72 @@ +using bizFacade; +using MesServerWork; +using System; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 允许保存(针对半自动和手动压装工位) + /// + /// + /// + private void MesRead(object e) + { + { + try + { + int EngineTypeID; + string EngineType; + string EngineID; + int PartPallet_Code; + string OrderForm; + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue == 1) + { + MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm); + + //保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号 + if (Db.UpLoadOpNameInsert(EngineID, EngineTypeID, EngineType, OpName)) + { + //保存质量数据 + int qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + //保存物料数据 + BaseDataSystemMES.Material_Insert(OpName, qualityMask); + //测量数据发动机在线状态 + BaseDataSystemMES.WorkStartInsert(OpName, qualityMask); + //推送质量数据到MES的页面 + SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName); + //统计在线产量,在线节拍 + SendMessage.SendActuallyCount(OpName, tagValue); + + //通知设备,MES的质量数据(和物料数据)保存完成 + MIS_BASE.Write_MesReadOver(OpName, true); + //MES工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { + SendMessage.AsyncSendMessage_Notice(OpName, "保存上线数据失败!"); + } + } + else + { + MIS_BASE.Write_MesReadOver(OpName, false); + } + } + + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function08:MesReadOver"); + } + } + + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/MesReadOver.cs b/MisDataFunction/Function1060/OpcServer/MesReadOver.cs new file mode 100644 index 0000000..f96a7d3 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/MesReadOver.cs @@ -0,0 +1,55 @@ +using System; +//using SystemFramework; +using MesServerWork; +using bizFacade; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 保存完成(针对半自动和手动压装工位) + /// + /// + /// + private void MesReadOver(object e) + { + //try + //{ + // DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + // string OpName = Convert.ToString(msgEvent.OpName); + // var tagValue = msgEvent.TagValue.ToString (); + + // if (tagValue == "1" | tagValue.ToLower () == "true") + // { + // int qualityMask; + // MIS_BASE.Read_QualityMask(OpName, out qualityMask); + + // SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);//发给Web页面显示质量数据 + + // if (qualityMask == 1)//全部OK,给出合格放行 + // { + // //如果存在线外扫描工位,根据扫描条码绑定线外数据 需要时解除禁用 + // //BaseDataSystemMES.TransLaunchDataByMainMaterial(OpName, EngineType, EngineID, EngineTypeID); + + // //如果存在线外排队工位,根据排队编号绑定线外数据 需要时解除禁用 + // ////BaseDataSystemMES.MailLineAndSubLineData_InsertByEngineID_Subline(OpName,EngineID, EngineTypeID, EngineType); + + // MIS_BASE.Write_ConfirmOkGo(OpName, true); + // //MIS_BASE.Write_FalseGO(OpName, false); + // } + // else + // { + // //MIS_BASE.Write_ConfirmOkGo(OpName, false); + // MIS_BASE.Write_FalseGO(OpName, true); + // } + + // } + //} + //catch (Exception err) + //{ + // ////ApplicationLog.WriteLog(err, "Function02:MesReadOver"); + //} + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/MesSaveNowData.cs b/MisDataFunction/Function1060/OpcServer/MesSaveNowData.cs new file mode 100644 index 0000000..11c9129 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/MesSaveNowData.cs @@ -0,0 +1,35 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// MES保存实时质量数据 + /// + /// + /// + private void MesSaveNowData(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + int tagValue = Convert.ToInt32(msgEvent.TagValue); + + // 保存质量数据 + MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString()); + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/PartLoad.cs b/MisDataFunction/Function1060/OpcServer/PartLoad.cs new file mode 100644 index 0000000..75debe9 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/PartLoad.cs @@ -0,0 +1,23 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 申请上线 43 + /// + /// + /// + private void PartLoad(object e) + { + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/WebSubmit.cs b/MisDataFunction/Function1060/OpcServer/WebSubmit.cs new file mode 100644 index 0000000..87548a3 --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/WebSubmit.cs @@ -0,0 +1,334 @@ +using System; +using MesServerWork; +using bizFacade; +using System.Threading; +using MisDataSaveDate; +using System.Collections; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 处理WEB页面发送过来的请求(m_Command + "|" + m_Value;) + /// + /// + /// + private void WebSubmit(object e) + { + try + { + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName=Convert.ToString(msgEvent.OpName); + string Content = Convert.ToString(msgEvent.TagValue); + + string[] dataArray = Content.Split('|'); + if (dataArray.Length != 2) + return; + //消息类型 + string m_Command = dataArray[0].ToString(); + //消息参数 + string m_Value = dataArray[1].ToString(); + //消息参数数量 + string[] m_Value_array = m_Value.Split('&'); + //消息参数长度 + int m_Value_length = m_Value_array.Length; + + //工件信息 + string engineID = ""; + if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null) + { + MIS_BASE.InitHashtable_MesServerCode(); + } + if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName)) + { + engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString(); + } + + DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs(); + _e.OpName = OpName; + _e.TagValue = m_Value; + + //根据请求的命令处理逻辑 + switch (m_Command) + { + case "Barcode": + if (m_Value_length > 1) return; + fun_Barcode(_e); + break; + case "ConfirmOkGo"://合格放行 + //删除不合格放行记录 + //修改托盘状态 + //Update_PalletStatus(OpName, 1, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_ConfirmOkGo(OpName, true); + MIS_BASE.Write_FalseGO(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + break; + case "FalseGO"://返修放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 3, false); + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "NgGO"://不合格放行 + //修改托盘状态 + //Update_PalletStatus(OpName, 2, false); + //保存不合格信息(必须保存不合格放行信息,由于B5A的Moby没有不合格标志位) + BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", ""); + MIS_BASE.Write_FalseGO(OpName, true); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + Thread.Sleep(1000); + MIS_BASE.Write_FalseGO(OpName, false); + break; + case "OnLineState"://在线0、离线1、屏蔽2 + try + { + if (m_Value_length > 1) return; + int a = Convert.ToInt32(m_Value); + if (a <= 2) + { + BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString()); + MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value)); + if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES!"); + if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES!"); + } + } + catch + { + + } + break; + case "Reset"://复位,将MES所有的信息都复位了 + SetMoby(OpName);//将MES所有信号清空 + break; + case "FixAllow"://重新拧紧 + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_FixAllow(OpName, true); + break; + case "IsAutoGetEngineID"://自动手动申请编号(线首) + if (m_Value_length > 1) return; + MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value)); + break; + case "PartPalletGoOver"://空托盘放行 + int Is_PartPalletGoOver; + MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver); + if (Is_PartPalletGoOver == 1) + { + MIS_BASE.Write_PartPalletGoOver(OpName, 1); + } + else + { + MIS_BASE.Write_PartPalletGoOver(OpName,0); + } + break; + case "SetMoby"://清空托盘(线首) + SetMoby(OpName);//将MES所有信号清空 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "RepairUplineMES"://返修上线 + MIS_BASE.Write_RepairUpline_MES(OpName, true); + break; + case "CancelRepair"://将返修件置为正常件 + + break; + case "PartPalletCode"://申请写入托盘号 + //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1); + break; + case "WritePartPalletCode"://写入托盘号 + if (m_Value_length > 1) return; + MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value)); + break; + case "Normal"://启用正常拧紧工位 + MIS_BASE.Write_Normal(OpName, 1); + MIS_BASE.Write_UnNormal(OpName, 0); + break; + case "UnNormal"://启用备用拧紧工位 + MIS_BASE.Write_Normal(OpName, 0); + MIS_BASE.Write_UnNormal(OpName, 1); + break; + case "ResetDevice"://复位设备 + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + break; + case "IsNeedRepaire"://返修上线(返修上线点) + if (Convert.ToInt32(m_Value) == 1) + { + //修改托盘状态 + MIS_BASE.Write_PalletInfo(OpName, 3); + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + IsNeedRepaire_OK(OpName); + + } + else if (Convert.ToInt32(m_Value) == 0) + { + //通知修改成功 + MIS_BASE.Write_UpdatePalletOK(OpName, true); + //直接给出工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, true); + } + else + { } + + break; + case "ContinueMatch": + BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true); + break; + //初始化网页信号 + case "IniSingalToWeb": + InitializeSingalToWeb(OpName); + break; + case "Reset_Engine"://返修上线(返修上线点) + SetMoby(OpName);//将MES所有信号清空 + //fun_EngineTypeGetOverPLC(OpName, 0); + //fun_EngineTypeGetOverPLC(OpName, 1); + break; + + + default: break; + } + } + catch(Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:WebSubmit"); + } + } + private void SetMoby(string OpName) + { + try + { + //清空Moby时,需要将MES信号清空 + MIS_BASE.Write_ClearMesMoby(OpName); + + BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName); + + Sendmessage("5123", "1111", OpName); + + MIS_BASE.Write_ResetDevice(OpName, true); + System.Threading.Thread.Sleep(1000); + MIS_BASE.Write_ResetDevice(OpName, false); + } + catch + { + + } + } + /// 网页重现登录,恢复关闭前的页面状态 + /// + /// 工位号 + private void InitializeSingalToWeb(string Opname) + { + bool S_WorkStart;//工件到位 DBX0.1 + bool S_EngineGetOver;//传递机型 DBX0.4 + bool S_FixAllow;//允许工作 DBX3.1 + bool S_MaterialVerifyOver;//工作完成 DBX2.3 + string S_plcStatus;//DBX501.5 PLC直通,1 强制放行 0 正常循环 + + int IsCompleted = 0; + int S_Match = 0; + int PalletInfo_SubLine = 0;//显示分线托盘状态 + + MIS_BASE.Read_WorkStart(Opname, out S_WorkStart); + + //5 显示订单、机型信息 线首工位用 + SendMessage.ShowMoby_FirstOpName(Opname); + //3显示操作指导图片 PicShow_String_FirstOpName + SendMessage.PicShow_FirstOpName(Opname); + //1(直接在界面通过选择机型确认工序内容) + SendMessage.ProcessList_FirstOpName(Opname); + //界面显示物料信息 + SendMessage.MaterialList_FirstOpName(Opname); + // 新增查询PLC直通状态 网页显示 + MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus); + InitAlarm(Opname); + + if (S_plcStatus.ToLower() == "false") + { + SendMessageFun.SendInfomation("PlcStatus", "0", Opname); + } + else + { + SendMessageFun.SendInfomation("PlcStatus", "1", Opname); + } + + if (S_WorkStart == true) + { + SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname); + //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "WorkStart_Subline"); + } + + //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "EngineTypeGetOverMES_Subline"); + + MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver); + if (S_EngineGetOver == true) + { + SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname); + //sendmessage(Opname, Convert.ToInt32(S_EngineGetOver), "EngineTypeGetOverMES_Subline"); + } + + MIS_BASE.Read_FixAllow(Opname, out S_FixAllow); + + if (S_FixAllow == true) + { + SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname); + } + + MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver); + + if (S_MaterialVerifyOver == true) + { + SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname); + } + + //MIS_BASE.Read_MatchingCompleted(Opname, out IsCompleted); //DBX1.3 是否匹配 + //MIS_BASE.Read_Match(Opname, out S_Match); //DBX1.4 匹配结果 + + //if (IsCompleted == 1 && S_Match == 1)//发送匹配完成和匹配结果信息 + //{ + // SendMessageFun.SendInfomation("MatchingCompleted", "1", Opname); + // SendMessageFun.SendInfomation("Match", "1", Opname); + // SendMessageFun.SendInfomation("MatchSuccess", "1", Opname);//界面显示匹配成功 + //} + //else if (IsCompleted == 1 && S_Match == 0) + //{ + // SendMessageFun.SendInfomation("MatchSuccess", "0", Opname);//界面显示匹配失败 + //} + + //if (MIS_BASE.hashtable_OpNameRepair == null) + //{ + // MIS_BASE.InitHashtable_MesServerCode(); + //} + //string Opname_SubLine = ""; + //if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(Opname)) + //{ + // Opname_SubLine = MIS_BASE.hashtable_OpNameRepair[Opname].ToString(); + //} + //if (Opname_SubLine == "") + //{ + // return; + //} + + //MIS_BASE.Read_PalletInfo(Opname, out PalletInfo_SubLine); + //sendmessage(Opname, PalletInfo_SubLine, "SubQualityMask"); + //SendMessageFun.SendInfomation("ShowMobySubLine", Opname_SubLine, Opname);//显示分线机型及流水号 + } + private void InitAlarm(string Opname) + { + FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht); + foreach (DictionaryEntry kv in ht) + { + var TagID = kv.Key.ToString(); + var TagValue = kv.Value.ToString(); + FuntionMesRead.Send_AlarmMsg(TagID, TagValue); + } + + } + } +} diff --git a/MisDataFunction/Function1060/OpcServer/WorkStart.cs b/MisDataFunction/Function1060/OpcServer/WorkStart.cs new file mode 100644 index 0000000..904295e --- /dev/null +++ b/MisDataFunction/Function1060/OpcServer/WorkStart.cs @@ -0,0 +1,91 @@ +using bizFacade; +using MesServerWork; +using System; +using System.Data; +using System.Threading; +//using SystemFramework; + +namespace MesServerFunctions +{ + partial class FunctionMES + { + /// + /// 工件到位与离开时,清空MES自身信号 + /// + /// + /// + private void WorkStart(object e) + { + try + { + int EngineTypeID;//机型代码 + string EngineType;//机型 + string EngineID;//工件编号 + + string OrderForm; + + int PLCRcipe; + + DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; + string OpName = Convert.ToString(msgEvent.OpName); + + int tagValue = Convert.ToInt32(msgEvent.TagValue); + if (tagValue > 0) + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartIn, DateTime.Now.ToString()); + //北汽福田工位状态监控MOBY_查询_订单下达用 + DataTable dt; + dt = BaseDataSystemMES.DownOrderToOpNameMobyList(OpName); + if (dt != null) + { + //开始上线前清空交互区数据 + MIS_BASE.WritePLC(73, OpName, ""); + MIS_BASE.WritePLC(74, OpName, ""); + MIS_BASE.WritePLC(75, OpName, ""); + int workType = 0; + if (dt.Rows.Count > 0) + { + // 正常逻辑 获得机型信息、配方号、 + EngineTypeID = Convert.ToInt32(dt.Rows[0][MobyTagType.EngineTypeID_MES]); + EngineType = dt.Rows[0][MobyTagType.EngineType_MES].ToString(); + OrderForm = dt.Rows[0][MobyTagType.OrderForm_MES].ToString(); + PLCRcipe = Convert.ToInt32(dt.Rows[0][MobyTagType.PLCRcipe]); + EngineID = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss").Replace("-", "").Replace(" ", "").Replace(":", ""); + EngineID = EngineID + "_" + EngineType; //拼接工件编号 按照唯一码加时间来拼接 + // 将产品信息写入PLC + MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); + MIS_BASE.Write_EngineType_MES(OpName, EngineType); + MIS_BASE.Write_EngineID_MES(OpName, EngineID); + MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); + + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.EngineID_MES, EngineID); + // 获得配方数据 + BaseDataSystemMES.PLCRcipeByOpName(OpName, out byte[] bytes, out string tagStartAdr, PLCRcipe); + // 写入配方数据 + DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID("94", OpName, System.Text.Encoding.ASCII.GetString(bytes)); + // MES传递机型 + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); + } + } + } + else + { + BaseDataSystemMES.OpName_MIS_MOBY_Insert(OpName, MobyTagType.WorkStartOut, DateTime.Now.ToString()); + + MIS_BASE.Write_MesReadOver(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_FixAllow(OpName, false); + MIS_BASE.Write_ConfirmOkGo(OpName, false); + MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false); + //工作完成 + MIS_BASE.Write_MaterialVerifyOver(OpName, false); + } + } + catch (Exception err) + { + ////ApplicationLog.WriteLog(err, "Function02:FalseGO"); + } + } + + } +} diff --git a/MisDataFunction/Function1060/Properties/AssemblyInfo.cs b/MisDataFunction/Function1060/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..36f4b02 --- /dev/null +++ b/MisDataFunction/Function1060/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Function1060")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Function1060")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("58215063-87f5-4708-8dda-031524c70b54")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MisDataFunction/Function1060/packages.config b/MisDataFunction/Function1060/packages.config new file mode 100644 index 0000000..b3e1761 --- /dev/null +++ b/MisDataFunction/Function1060/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dll_common/Monitor.MesWork.xml b/dll_common/Monitor.MesWork.xml new file mode 100644 index 0000000..f978604 --- /dev/null +++ b/dll_common/Monitor.MesWork.xml @@ -0,0 +1,2860 @@ + + + + Monitor.MesWork + + + + + AlarmListView 的摘要说明。 + + + + + 从OnDataChange发送int tagID, int tagValue到处理程序 + private void OnDataChange(int tagID, int tagValue) + + + + + + + 从OnDataChange发送int tagID, int tagValue到处理程序 + private void OnDataChange(int tagID, int tagValue) + + + + + 必需的设计器变量。 + + + + + 当时发生的报警总行数 + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + 报警到达 + + + + + 报警到达 + + + + + 报警解除 + + + + + 报警解除 + + + + + 报警确认 + + + + + 报警确认 + + + + + 报警过滤条件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 报警过滤条件 + + + + + 从系统获得 + =null 时,初始化时显示全部报警 + =AlarmItemSelect,初始化时显示AlarmItemSelect条件报警 + + + + + + + + + + 报警到达文字颜色 + + + + + 报警到达文本底色 + + + + + 报警解除文字颜色 + + + + + 报警解除文本底色 + + + + + 报警确认文字颜色 + + + + + 报警确认文本底色 + + + + + 初始化报警显示 + + + + + 报警控件,监控值变化时,图形重绘 + + + + + + 增加TagKey + + + + + =true,调Gif;false不调Gif + + + + + Gif图像 + + + + + Gif图像 + + + + + IsRotation =0不调用Gif;=1调用Gif TagValueType + + + + + IsRotation =0不调用Gif;=1调用Gif + + + + + Tag位置0时颜色 1 + + + + + Tag位置1时颜色 2 + + + + + Tag位置2时颜色 4 + + + + + Tag位置3时颜色 8 + + + + + Tag位置4时颜色 16 + + + + + Tag位置5时颜色 32 + + + + + Tag位置6时颜色 64 + + + + + Tag位置7时颜色 128 + + + + + 设置Tag位置0时颜色 + + + + + 设置Tag位置1时颜色 + + + + + 设置Tag位置2时颜色 + + + + + 设置Tag位置3时颜色 + + + + + 设置Tag位置4时颜色 + + + + + 设置Tag位置5时颜色 + + + + + 设置Tag位置6时颜色 + + + + + 设置Tag位置7时颜色 + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 序号 + + + + + 序号 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + + + + + + 绘制图形 + + + + + + 正常绘制 + + + + + + 显示Gif + + + + + + 增加TagKey + + + + + =true,调Gif;false不调Gif + + + + + Gif图像 + + + + + IsRotation =0不调用Gif;=1调用Gif TagValueType + + + + + IsRotation =0不调用Gif;=1调用Gif + + + + + Tag位置0时颜色 1 + + + + + Tag位置1时颜色 2 + + + + + Tag位置2时颜色 4 + + + + + Tag位置3时颜色 8 + + + + + Tag位置4时颜色 16 + + + + + Tag位置5时颜色 32 + + + + + Tag位置6时颜色 64 + + + + + Tag位置7时颜色 128 + + + + + 设置Tag位置0时颜色 + + + + + 设置Tag位置1时颜色 + + + + + 设置Tag位置2时颜色 + + + + + 设置Tag位置3时颜色 + + + + + 设置Tag位置4时颜色 + + + + + 设置Tag位置5时颜色 + + + + + 设置Tag位置6时颜色 + + + + + 设置Tag位置7时颜色 + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 序号 + + + + + 序号 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + + + + + + 绘制图形 + + + + + + 正常绘制 + + + + + + 显示Gif + + + + + + PlcLinkStatus 的摘要说明。 + + + + + 显示PLC连接状态 + + + + + + PLC连接正常时图形 + + + + + PLC连接正常时图形 + + + + + PLC连接不正常时图形 + + + + + PLC连接不正常时图形 + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + PlcLinkStatusWork 的摘要说明。 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + + + + + + 根据变量是否正确,显示通讯状态 通讯数据交换 + + + + + + 通讯正常 + + + + + 通讯失败 + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + PlcLinkStatusWork 的摘要说明。 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + + + + + + 根据变量是否正确,显示通讯状态 通讯数据交换 + + + + + + 通讯正常 + + + + + 通讯失败 + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + Tag位置1时颜色 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 变量类型 + + + + + 变量类型 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + 显示机床状态 + + + + + + 绘制图形 + + + + + + Tag位置1时颜色 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + 显示机床状态 + + + + + + 绘制图形 + + + + + + 增加TagKey + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + 显示到位信号 + + + + + + 绘制图形 + + + + + + 发动机工位在线显示 + + + + + OpName + 工位名称 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + 发动机号 + + + + + 发动机号 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + OpName + 工位名称 + + + + + 是否进行具体发动机号追踪 + + + + + 是否进行具体发动机号追踪 + + + + + 具体发动机号追踪发动机号 + 发动机号 + + + + + 具体发动机号追踪 + 发动机号 + + + + + 具体发动机号追踪 + Tag位置0时颜色 + + + + + 具体发动机号追踪 + Tag位置1时颜色 + + + + + + + + + + 发动机号的变化,给本控件的发动机号赋值 + 确定被追踪的发动机号 + + + + + + + 发动机号动态追踪设定 + + + + + + + 显示被追踪的发动机 + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + 托盘到位 + + + + + + + 绘制图形 + + + + + + 发动机工位在线显示 + + + + + 当鼠标在上方时出现工件编号 + + + + + Tag位置0时颜色 1 + + + + + Tag位置1时颜色 2 + + + + + Tag位置2时颜色 4 + + + + + Tag位置3时颜色 8 + + + + + Tag位置4时颜色 16 + + + + + Tag位置5时颜色 32 + + + + + Tag位置6时颜色 64 + + + + + Tag位置7时颜色 128 + + + + + 设置Tag位置0时颜色 + + + + + 设置Tag位置1时颜色 + + + + + 设置Tag位置2时颜色 + + + + + 设置Tag位置3时颜色 + + + + + 设置Tag位置4时颜色 + + + + + 设置Tag位置5时颜色 + + + + + 设置Tag位置6时颜色 + + + + + 设置Tag位置7时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + OpName + 工位名称 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + 发动机号 + + + + + 发动机号 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + OpName + 工位名称 + + + + + 是否进行具体发动机号追踪 + + + + + 是否进行具体发动机号追踪 + + + + + 具体发动机号追踪发动机号 + 发动机号 + + + + + 具体发动机号追踪 + 发动机号 + + + + + 具体发动机号追踪 + Tag位置0时颜色 + + + + + 具体发动机号追踪 + Tag位置1时颜色 + + + + + + + + + + 发动机号的变化,给本控件的发动机号赋值 + 确定被追踪的发动机号 + + + + + + + 发动机号动态追踪设定 + + + + + + + 显示被追踪的发动机 + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + + 显示托盘状态 + 1 有托盘(黄色) + 0 无托盘(灰色) + + + + + 托盘到位 + + + + + + + 绘制图形 + + + + + + UserControlButton 的摘要说明。 + + + + + 发动机号 + + + + + 发动机号 + + + + + 当鼠标在上方时出现发动机号 + + + + + + + + + + Button 文本 + + + + + Button 文本 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + Button 文本 + + + + + Button 文本 + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + UserControlButton 的摘要说明。 + + + + + 机床状态 + + + + + 机床状态 + + + + + 工件编号 + + + + + 工件编号 + + + + + 当鼠标在上方时出现工件编号 + + + + + + + + + + Button 文本 + + + + + Button 文本 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + Button 文本 + + + + + Button 文本 + + + + + + + + + + 机床状态 + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + UserControlLable11 的摘要说明。 + + + + + 必需的设计器变量。 + + + + + 变量值 + + + + + 变量值 + + + + + 变量类型 + + + + + 变量类型 + + + + + LableText 变量值 + + + + + LableText 变量值 + + + + + + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + UserControlLable11 的摘要说明。 + + + + + 必需的设计器变量。 + + + + + TagNameID名称 + + + + + LableText 变量值 + + + + + LableText 变量值 + + + + + + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + UserControlButton 的摘要说明。 + + + + + 发动机号 + + + + + 发动机号 + + + + + 当鼠标在上方时出现发动机号 + + + + + + + + + + Button 文本 + + + + + Button 文本 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + Button 文本 + + + + + Button 文本 + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + Tag位置1时颜色 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + 显示心跳控件 + + + + + + 绘制图形 + + + + + + 增加TagKey + + + + + Tag位置0时颜色 1 + + + + + Tag位置1时颜色 2 + + + + + Tag位置2时颜色 4 + + + + + Tag位置3时颜色 8 + + + + + Tag位置4时颜色 16 + + + + + Tag位置5时颜色 32 + + + + + Tag位置6时颜色 64 + + + + + Tag位置7时颜色 128 + + + + + 设置Tag位置0时颜色 + + + + + 设置Tag位置1时颜色 + + + + + 设置Tag位置2时颜色 + + + + + 设置Tag位置3时颜色 + + + + + 设置Tag位置4时颜色 + + + + + 设置Tag位置5时颜色 + + + + + 设置Tag位置6时颜色 + + + + + 设置Tag位置7时颜色 + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 序号 + + + + + 序号 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + 绘制图形 + + + + + + 水平方式显示工件编号。 + + + + + 机床状态 + + + + + 机床状态 + + + + + 工件编号 + + + + + 工件编号 + + + + + 当鼠标在上方时出现工件编号 + + + + + + + + + + Button 文本 + + + + + Button 文本 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + Button 文本 + + + + + Button 文本 + + + + + + + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + 垂直方式显示工件编号。 + + + + + Tag位置0时颜色 1 + + + + + Tag位置1时颜色 2 + + + + + Tag位置2时颜色 4 + + + + + Tag位置3时颜色 8 + + + + + Tag位置4时颜色 16 + + + + + Tag位置5时颜色 32 + + + + + Tag位置6时颜色 64 + + + + + Tag位置7时颜色 128 + + + + + 设置Tag位置0时颜色 + + + + + 设置Tag位置1时颜色 + + + + + 设置Tag位置2时颜色 + + + + + 设置Tag位置3时颜色 + + + + + 设置Tag位置4时颜色 + + + + + 设置Tag位置5时颜色 + + + + + 设置Tag位置6时颜色 + + + + + 设置Tag位置7时颜色 + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + 变量值 + + + + + 机床状态 + + + + + 机床状态 + + + + + 工件编号 + + + + + 工件编号 + + + + + 当鼠标在上方时出现工件编号 + + + + + + + + + + Button 文本 + + + + + Button 文本 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + Button 文本 + + + + + Button 文本 + + + + + Button 文本颜色代码 + + + + + + + + + + 显示工件编号 + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + UserControlButton 的摘要说明。 + + + + + Tag位置0时颜色 1 + + + + + Tag位置1时颜色 2 + + + + + Tag位置2时颜色 4 + + + + + Tag位置3时颜色 8 + + + + + Tag位置4时颜色 16 + + + + + Tag位置5时颜色 32 + + + + + Tag位置6时颜色 64 + + + + + Tag位置7时颜色 128 + + + + + 设置Tag位置0时颜色 + + + + + 设置Tag位置1时颜色 + + + + + 设置Tag位置2时颜色 + + + + + 设置Tag位置3时颜色 + + + + + 设置Tag位置4时颜色 + + + + + 设置Tag位置5时颜色 + + + + + 设置Tag位置6时颜色 + + + + + 设置Tag位置7时颜色 + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + 变量值 + + + + + 机床状态 + + + + + 机床状态 + + + + + 工件编号 + + + + + 工件编号 + + + + + 当鼠标在上方时出现工件编号 + + + + + + + + + + Button 文本 + + + + + Button 文本 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + Button 文本 + + + + + Button 文本 + + + + + Button 文本颜色代码 + + + + + + + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + UserControlLable11 的摘要说明。 + + + + + 必需的设计器变量。 + + + + + TagNameID名称 + + + + + TagNameID名称 + + + + + TagNameID名称 + + + + + TagNameID名称 + + + + + LableText 变量值 + + + + + LableText 变量值 + + + + + + + + + + + + + + + 清理所有正在使用的资源。 + + + + + 设计器支持所需的方法 - 不要使用代码编辑器 + 修改此方法的内容。 + + + + + + + + + + + 增加TagKey + + + + + TagKey 显示选项 + + + + + TagKey 显示选项 + + + + + OpName + 工位名称 + + + + + OpName + 工位名称 + + + + + 是否保存到数据库 + + + + + LineColor设置外园线颜色 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + 变量值 + + + + + 变量值 + + + + + TagBit变量测试位 + + + + + Tag位置1时颜色 + + + + + Tag位置0时颜色 + + + + + TagBit变量测试位 + + + + + LineColor设置外园线颜色 + + + + + 是否保存到数据库 + + + + + + + + + + 绘制图形 + + + + + + 一个强类型的资源类,用于查找本地化的字符串等。 + + + + + 返回此类使用的缓存的 ResourceManager 实例。 + + + + + 重写当前线程的 CurrentUICulture 属性 + 重写当前线程的 CurrentUICulture 属性。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + + 查找 System.Drawing.Bitmap 类型的本地化资源。 + + + + diff --git a/icon/断开状态.png b/icon/断开状态.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae61896eee8d1bebdd65f65c41c0fdd78a0ac96 GIT binary patch literal 4941 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 Uul!inwg3PC07*qoM6N<$f<0{i82|tP literal 0 HcmV?d00001