化改進(jìn))
已完成第一階段基礎(chǔ)優(yōu)化未改動(dòng)上料、搬運(yùn)、測(cè)試、吹掃等具體工藝動(dòng)作。主要改動(dòng)[PLCController.cs]增加完整PlcSignalSnapshot包含采集序列號(hào)、時(shí)間、信號(hào)值、連接狀態(tài)、數(shù)據(jù)有效性。批量讀取完全部信號(hào)后才發(fā)布SnapshotChanged避免 U/V/W 等組合條件讀取到半更新?tīng)顟B(tài)。PLC 斷線時(shí)發(fā)布無(wú)效快照等待流程不再錯(cuò)誤使用舊緩存判斷聯(lián)鎖。新增StopPollingAsync()停止輪詢時(shí)等待舊任務(wù)退出避免重啟輪詢產(chǎn)生短暫并發(fā)讀取。[PlcSignalSnapshot.cs]新增 PLC 快照、信號(hào)變化和事件參數(shù)模型供后續(xù)工藝流程統(tǒng)一使用。[PlcCondition.cs]PlcConditionWaiter已由Task.Delay循環(huán)檢查改為“PLC 完整快照變化時(shí)喚醒”。保留原有調(diào)用方式、超時(shí)、取消、仿真和每 5 秒未滿足條件日志。等待前、訂閱后均立即檢查一次避免信號(hào)已到位但漏觸發(fā)。讀取無(wú)效或 PLC 斷線時(shí)日志會(huì)明確顯示“PLC快照無(wú)效”或“PLC未連接”。驗(yàn)證dotnet build MaxWell.sln --no-restore --verbosity:minimal已通過(guò)0個(gè)錯(cuò)誤。項(xiàng)目原有警告仍存在未在本階段擴(kuò)散處理。上機(jī)先驗(yàn)證單站搬運(yùn)的下降到位、頂升到位等待。PLC 斷線后等待日志顯示“PLC未連接”且不觸發(fā)工藝動(dòng)作。PLC 恢復(fù)連接后新的有效快照能正常繼續(xù)滿足等待條件。自動(dòng)模式反復(fù)啟動(dòng)、停止、復(fù)位確認(rèn)同站沒(méi)有重復(fù)輪詢或重復(fù)流程。六站并行運(yùn)行確認(rèn) PLC 通訊無(wú)新增斷連。本階段通過(guò)后下一步建議只替換TransportProduct的測(cè)試位下降/頂升等待作為第一個(gè)低風(fēng)險(xiǎn)工藝驗(yàn)證點(diǎn)。第二階段優(yōu)化已完成。修改文件TransportProduct.cs第一階段基礎(chǔ)文件 PLCController.cs本階段改動(dòng)測(cè)試位下降到位等待改為統(tǒng)一快照事件等待。測(cè)試位頂升到位等待改為統(tǒng)一快照事件等待。刪除TransportProduct內(nèi)部的while Task.Delay判斷。不再由搬運(yùn) Worker 重復(fù)讀取 PLC。保留原有PLC 寫(xiě)入順序WriteLoadingComplete搬運(yùn)握手電學(xué)保護(hù)判斷自動(dòng)化 SOT 回調(diào)超時(shí)處理取消處理輔控錯(cuò)誤日志。支持信號(hào)已經(jīng)滿足時(shí)立即繼續(xù)避免等待事件訂閱后漏掉當(dāng)前狀態(tài)。核心邏輯現(xiàn)在是先檢查當(dāng)前 PLC 快照 | |-- 已滿足立即執(zhí)行下一步 | |-- 未滿足等待完整快照變化 | |-- 條件滿足繼續(xù) |-- 超時(shí)返回失敗 |-- 取消退出流程驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤本階段上機(jī)驗(yàn)證建議測(cè)試位已經(jīng)下降到位時(shí)確認(rèn)立即執(zhí)行搬運(yùn)。測(cè)試位未下降時(shí)改變 PLC 下降到位信號(hào)確認(rèn)能夠被喚醒。搬運(yùn)啟動(dòng)后改變頂升到位信號(hào)確認(rèn)能夠進(jìn)入預(yù)測(cè)試。信號(hào)長(zhǎng)時(shí)間不滿足確認(rèn)正常超時(shí)。搬運(yùn)等待過(guò)程中點(diǎn)擊停止或復(fù)位確認(rèn)等待能夠取消。六個(gè)工站同時(shí)執(zhí)行搬運(yùn)確認(rèn)沒(méi)有新增 PLC 或 socket 斷連。連續(xù)執(zhí)行多顆器件確認(rèn)沒(méi)有重復(fù)寫(xiě)入上料完成指令。本階段上機(jī)驗(yàn)證通過(guò)后下一階段建議優(yōu)化PreTest.cs中“等待測(cè)試位頂升到位”的重復(fù)等待邏輯。第三階段優(yōu)化已完成。修改文件PreTest.cs本階段改動(dòng)將預(yù)測(cè)試前“等待測(cè)試位頂升到位”的while Task.Delay邏輯刪除。改為使用統(tǒng)一的PlcConditionWaiter.WaitAsync。等待過(guò)程由 PLC 完整快照變化觸發(fā)。保留原有超時(shí)配置LifterUpWaitTimeoutMs。保留取消機(jī)制。保留預(yù)測(cè)試超時(shí)異常等待測(cè)試位頂升到位超時(shí)預(yù)測(cè)試未開(kāi)始。保留測(cè)試位已經(jīng)到位時(shí)立即進(jìn)入預(yù)測(cè)試的行為。刪除不再使用的LifterUpPollIntervalMs。沒(méi)有修改預(yù)測(cè)試命令順序和主控板通訊邏輯?,F(xiàn)在流程如下進(jìn)入預(yù)測(cè)試 | 檢查當(dāng)前 PLC 快照 | |-- 頂升到位記錄日志開(kāi)始預(yù)測(cè)試 | |-- 未到位等待 PLC 快照變化 | |-- 頂升到位開(kāi)始預(yù)測(cè)試 |-- 超時(shí)拋出預(yù)測(cè)試超時(shí)異常 |-- 停止/復(fù)位取消等待驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤第三階段上機(jī)測(cè)試測(cè)試位已頂升到位確認(rèn)預(yù)測(cè)試立即開(kāi)始。測(cè)試位未頂升改變 PLC 頂升到位信號(hào)確認(rèn)流程自動(dòng)繼續(xù)。頂升信號(hào)長(zhǎng)時(shí)間不成立確認(rèn)超時(shí)并進(jìn)入原有故障處理。頂升等待過(guò)程中點(diǎn)擊停止或復(fù)位確認(rèn)流程可以取消。六個(gè)工站同時(shí)執(zhí)行預(yù)測(cè)試確認(rèn)沒(méi)有新增 PLC 或主控板通訊斷連。連續(xù)測(cè)試多顆器件確認(rèn)不會(huì)重復(fù)進(jìn)入預(yù)測(cè)試。本階段上機(jī)驗(yàn)證通過(guò)后下一階段建議優(yōu)化UnLoadProduct.cs中的吹掃開(kāi)始和吹掃完成等待。第四階段優(yōu)化已完成。修改文件UnLoadProduct.cs本階段改動(dòng)新增WaitForPurgeStartAsync等待開(kāi)始吹掃標(biāo)志位true。使用統(tǒng)一PlcConditionWaiter。由 PLC 完整快照變化觸發(fā)不再由業(yè)務(wù)循環(huán)主動(dòng)等待。新增WaitForPurgeCompleteAsync等待吹掃完成標(biāo)志位5。明確使用數(shù)值精確匹配避免將其他非零狀態(tài)誤判為完成。修正吹掃超時(shí)時(shí)間計(jì)算原代碼PurgeTimeoutMinutes*6000*10006分鐘實(shí)際會(huì)被計(jì)算成約10小時(shí)?,F(xiàn)改為privatestaticreadonlyintPurgeTimeoutMschecked((int)TimeSpan.FromMinutes(PurgeTimeoutMinutes).TotalMilliseconds);實(shí)際等待時(shí)間為 6 分鐘。保留原有業(yè)務(wù)順序等待開(kāi)始吹掃 - 等待吹掃完成5 - 寫(xiě)非強(qiáng)制鎖定 - 寫(xiě)吹掃完成 - 判斷上料位光電 - 進(jìn)入人工下料驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤第四階段上機(jī)驗(yàn)證開(kāi)始吹掃信號(hào)已經(jīng)為真時(shí)確認(rèn)立即進(jìn)入吹掃等待。開(kāi)始吹掃信號(hào)從假變真時(shí)確認(rèn)流程自動(dòng)喚醒。吹掃狀態(tài)為1、2、3、4時(shí)確認(rèn)不會(huì)誤判完成。吹掃完成狀態(tài)變?yōu)?時(shí)確認(rèn)進(jìn)入人工下料。6 分鐘內(nèi)未完成時(shí)確認(rèn)返回吹掃超時(shí)錯(cuò)誤。吹掃等待期間點(diǎn)擊停止或復(fù)位確認(rèn)可以取消。六個(gè)工站同時(shí)執(zhí)行吹掃確認(rèn)沒(méi)有新增 PLC 或 socket 斷連。本階段驗(yàn)證通過(guò)后下一階段建議優(yōu)化ManualMaterialRemovalService的取料完成等待。第五階段優(yōu)化已完成。修改文件ManualMaterialRemovalService.cs改動(dòng)內(nèi)容刪除人工/自動(dòng)化取料階段內(nèi)部的while Task.Delay(200)PLC 條件輪詢。取料完成條件改為統(tǒng)一PlcConditionWaiter.WaitAsync安全光幕恢復(fù)當(dāng)前封裝要求的 U/V/W 光電均無(wú)器件載盤(pán)條件成立。PLC 條件滿足后仍按原順序?qū)慦riteUnloadingCompleteWriteNonForceLockWriteRunLightOff自動(dòng)化邏輯保持自動(dòng)化開(kāi)啟才發(fā)送EQPEOUSend。發(fā)送失敗最多重試 3 次。發(fā)送失敗后繼續(xù)等待現(xiàn)場(chǎng)取料不會(huì)卡設(shè)備。自動(dòng)化關(guān)閉時(shí)不發(fā)送通知也不啟動(dòng) 20 分鐘提醒。自動(dòng)化開(kāi)啟時(shí)PLC 取料等待和 20 分鐘提醒并行。取料完成后立即繼續(xù)不會(huì)等待提醒計(jì)時(shí)器。提醒只顯示一次提醒后仍繼續(xù)等待 PLC 現(xiàn)場(chǎng)條件。核心流程發(fā)送自動(dòng)化取料通知最多3次 | 啟動(dòng) PLC 取料條件等待 | -- 自動(dòng)化關(guān)閉只等待 PLC 條件 | -- 自動(dòng)化開(kāi)啟PLC 條件等待 與 20分鐘提醒并行 | -- 取料完成立即寫(xiě)PLC完成握手 -- 提醒到期彈窗一次繼續(xù)等待 -- 超時(shí)不寫(xiě)取料完成返回失敗 -- 停止/復(fù)位取消等待驗(yàn)證dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤上機(jī)驗(yàn)證自動(dòng)化關(guān)閉時(shí)確認(rèn)不發(fā)送EQPEOUSend也不出現(xiàn) 20 分鐘提醒。自動(dòng)化開(kāi)啟且取料完成時(shí)確認(rèn)立即寫(xiě)取料完成、非強(qiáng)制鎖定、關(guān)閉 RUN 燈。自動(dòng)化發(fā)送失敗 3 次時(shí)確認(rèn)仍繼續(xù)等待人員取料。到達(dá)提醒時(shí)間但未取料時(shí)確認(rèn)只提示一次流程繼續(xù)等待。取料等待期間關(guān)閉自動(dòng)化確認(rèn)不會(huì)再?gòu)椬詣?dòng)化提醒。取料等待期間停止、復(fù)位、結(jié)批確認(rèn)等待正常取消。六工站同時(shí)等待取料確認(rèn)不新增 PLC/socket 斷連。下一階段建議優(yōu)化LoadProduct.cs的上料許可和器件到位等待。這是高風(fēng)險(xiǎn)流程建議只先遷移“初始上料許可”這一組條件確認(rèn)通過(guò)后再處理多器件掃碼。第六階段優(yōu)化已完成。修改文件LoadProduct.cs本階段只處理“初始上料許可等待”強(qiáng)制鎖定 - 等待允許上料 - 等待載盤(pán)到位 - 確認(rèn)吹掃完成標(biāo)志位 ! 5 - RUN藍(lán)燈閃爍 - 允許操作員上料具體改動(dòng)新增WaitForInitialLoadingPermitAsync方法。初始上料條件統(tǒng)一由PlcConditionWaiter判斷。等待由 PLC 完整快照變化觸發(fā)。PLC 條件已經(jīng)滿足時(shí)立即繼續(xù)不會(huì)漏掉當(dāng)前狀態(tài)。保留原有超時(shí)值PlcPollingTimeoutMs。將超時(shí)時(shí)間轉(zhuǎn)換為T(mén)imeSpan避免直接使用毫秒數(shù)字。保留原有強(qiáng)制鎖定、RUN 藍(lán)燈閃爍和后續(xù)掃碼邏輯。本階段未修改器件放置檢測(cè)單器件掃碼三器件順序掃碼掃碼失敗重試第 2、3 顆器件等待。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤上機(jī)驗(yàn)證允許上料已經(jīng)為真時(shí)確認(rèn)立即進(jìn)入上料提示。允許上料從假變真時(shí)確認(rèn)自動(dòng)喚醒。載盤(pán)未到位時(shí)確認(rèn)不會(huì)進(jìn)入掃碼。吹掃完成標(biāo)志為5時(shí)確認(rèn)不會(huì)允許上料。等待期間點(diǎn)擊停止或復(fù)位確認(rèn)能夠取消。六個(gè)工站同時(shí)等待初始上料許可確認(rèn)無(wú)新增 PLC/socket 斷連。連續(xù)開(kāi)批、結(jié)批、重新開(kāi)批確認(rèn)沒(méi)有殘留等待任務(wù)。本階段上機(jī)驗(yàn)證通過(guò)后下一階段建議只優(yōu)化LoadProduct的“第 2、3 顆器件等待上料條件”隨后再處理掃碼前器件到位等待。第七階段優(yōu)化已完成。修改文件LoadProduct.cs本階段只優(yōu)化三器件流程中第 2、3 顆的上料等待。新增方法WaitForNextDeviceLoadingPermitAsync等待條件允許上料標(biāo)志位 true 上料位載盤(pán)檢測(cè) true流程變?yōu)榈?顆掃碼成功 - PLC切換下一顆位置 - 等待第2顆上料許可 - 掃碼第2顆 - PLC切換下一顆位置 - 等待第3顆上料許可 - 掃碼第3顆優(yōu)化內(nèi)容第 2、3 顆不再直接調(diào)用通用等待方法。使用明確的“下一顆上料許可”方法。通過(guò) PLC 完整快照變化喚醒。當(dāng)前條件已經(jīng)滿足時(shí)立即繼續(xù)。日志明確顯示等待第 2 顆或第 3 顆上料許可。保留原有超時(shí)、取消和失敗處理。保留原有缺料報(bào)警和對(duì)應(yīng)相位光電檢測(cè)。沒(méi)有修改掃碼順序和掃碼結(jié)果寫(xiě)入邏輯。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤上機(jī)驗(yàn)證第 1 顆掃碼成功后確認(rèn)等待第 2 顆上料許可。第 2 顆掃碼成功后確認(rèn)等待第 3 顆上料許可。允許上料已經(jīng)為真時(shí)確認(rèn)立即進(jìn)入下一步。載盤(pán)未到位時(shí)確認(rèn)不會(huì)提前掃碼。PLC 信號(hào)從假變真時(shí)確認(rèn)流程自動(dòng)喚醒。等待過(guò)程中點(diǎn)擊停止或復(fù)位確認(rèn)流程能夠取消。第 2 或第 3 顆超時(shí)確認(rèn)進(jìn)入原有退料和錯(cuò)誤處理。六個(gè)工站同時(shí)執(zhí)行三器件掃碼確認(rèn)沒(méi)有新增 PLC/socket 斷連。第七階段上機(jī)驗(yàn)證通過(guò)后下一階段建議優(yōu)化LoadProduct的單器件和三器件“掃碼前器件到位 安全光幕 缺料報(bào)警”組合等待。第八階段優(yōu)化已完成修改文件LoadProduct.cs主要內(nèi)容新增CreateDevicePlacementBeforeScanConditions統(tǒng)一處理安全光幕、封裝類型對(duì)應(yīng)的 U/V/W 光電檢測(cè)。新增WaitForDevicePlacementBeforeScanAsync人工輸入和自動(dòng)掃碼共用器件到位等待邏輯。新增WaitForScanConditionsAsync統(tǒng)一處理允許掃碼、安全光幕及第 2、3 顆器件的附加條件。WaitForPlcConditionsAsync增加operationName日志可明確區(qū)分當(dāng)前等待步驟。保留原有掃碼順序、掃碼失敗重試、黃燈/紅燈、退料和 PLC 握手時(shí)序。封裝類型仍通過(guò)PackageType.ini決定檢測(cè)哪些光電位置不再固定判斷 U/V/W 全部信號(hào)。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤 255 個(gè)已有警告建議上機(jī)驗(yàn)證單器件、UV/UVW 等不同封裝類型上料分別測(cè)試人工輸入、自動(dòng)掃碼、第 2/3 顆等待、掃碼失敗重試以及光幕觸發(fā)場(chǎng)景。第九階段優(yōu)化已完成修改文件UnLoadProduct.cs本階段內(nèi)容將WaitForUnloadPermissionAsync從獨(dú)立while Task.Delay循環(huán)改為統(tǒng)一使用PlcConditionWaiter。統(tǒng)一判斷以下三個(gè)條件上料位載盤(pán)檢測(cè)為真允許取料標(biāo)志位為真安全光幕為假。等待過(guò)程中不再頻繁讀取 PLC減少通信壓力。強(qiáng)制鎖定只在進(jìn)入等待前解除一次避免重復(fù)寫(xiě) PLC。兩個(gè)下料入口統(tǒng)一使用UnloadTimeoutMs。修復(fù)原代碼超時(shí)時(shí)間錯(cuò)誤原UnloadTimeoutMinutes * 6000 * 1000實(shí)際約為 5 小時(shí)現(xiàn)在統(tǒng)一為配置含義對(duì)應(yīng)的 5 分鐘。保留仿真模式、掃碼失敗退料、人工下料和 PLC 完成握手邏輯。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤 255 個(gè)已有警告建議上機(jī)驗(yàn)證允許取料未到位、光幕觸發(fā)、載盤(pán)缺失、正常允許取料及等待超時(shí)等場(chǎng)景。第十階段優(yōu)化已完成。修改文件StationInitializationService.csStationControlViewModel.Mode.cs主要優(yōu)化初始化等待從while ReadSignalFresh Task.Delay改為PlcConditionWaiter快照事件等待。初始化支持兩個(gè)結(jié)束條件初始化完成標(biāo)志位為真允許清料標(biāo)志位為真。允許清料信號(hào)出現(xiàn)時(shí)立即返回清料結(jié)果不需要繼續(xù)等待初始化超時(shí)。統(tǒng)一使用PlcSignalValueConverter刪除StationInitializationService中重復(fù)的 PLC 布爾轉(zhuǎn)換代碼。初始化等待日志增加正確的工站號(hào)避免多工站同時(shí)初始化時(shí)日志全部顯示為站號(hào)0。保留仿真模式、取消機(jī)制、初始化失敗返回及后續(xù)測(cè)試單元初始化邏輯。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤 255 個(gè)已有警告建議上機(jī)驗(yàn)證初始化完成標(biāo)志正常變?yōu)檎娉跏蓟^(guò)程中允許清料標(biāo)志變?yōu)檎娉跏蓟瑫r(shí)多個(gè)工站同時(shí)初始化復(fù)位取消初始化流程。第十一階段優(yōu)化已完成。修改文件PlcSignalValueConverter.csBatchLifecycleService.cs主要優(yōu)化新增公共方法PlcSignalValueConverter.TryGetBooleanbool按原值處理數(shù)值型只有 0才判定為真0、負(fù)數(shù)判定為假字符串支持true/false和數(shù)值無(wú)法解析、空值返回false不會(huì)誤放行。BatchLifecycleService刪除內(nèi)部重復(fù)的TryToBoolean方法。開(kāi)批檢查統(tǒng)一使用公共轉(zhuǎn)換方法允許清料標(biāo)志位補(bǔ)盤(pán)標(biāo)志位。結(jié)批檢查統(tǒng)一使用公共轉(zhuǎn)換方法封裝類型對(duì)應(yīng)的 U/V/W 光電吹掃位器件檢測(cè)測(cè)試位器件檢測(cè)。保留ReadSignalFresh開(kāi)批和結(jié)批屬于安全邊界檢查仍讀取當(dāng)前 PLC 實(shí)時(shí)值沒(méi)有改動(dòng)開(kāi)批、結(jié)批的業(yè)務(wù)順序。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤 255 個(gè)已有警告第十一階段建議上機(jī)驗(yàn)證負(fù)數(shù)、0、1、5、空值以及字符串型 PLC 信號(hào)的判定結(jié)果。第十一階段優(yōu)化已完成。修改文件PlcSignalValueConverter.csBatchLifecycleService.cs主要優(yōu)化新增公共方法PlcSignalValueConverter.TryGetBooleanbool按原值處理數(shù)值型只有 0才判定為真0、負(fù)數(shù)判定為假字符串支持true/false和數(shù)值無(wú)法解析、空值返回false不會(huì)誤放行。BatchLifecycleService刪除內(nèi)部重復(fù)的TryToBoolean方法。開(kāi)批檢查統(tǒng)一使用公共轉(zhuǎn)換方法允許清料標(biāo)志位補(bǔ)盤(pán)標(biāo)志位。結(jié)批檢查統(tǒng)一使用公共轉(zhuǎn)換方法封裝類型對(duì)應(yīng)的 U/V/W 光電吹掃位器件檢測(cè)測(cè)試位器件檢測(cè)。保留ReadSignalFresh開(kāi)批和結(jié)批屬于安全邊界檢查仍讀取當(dāng)前 PLC 實(shí)時(shí)值沒(méi)有改動(dòng)開(kāi)批、結(jié)批的業(yè)務(wù)順序。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤 255 個(gè)已有警告第十一階段建議上機(jī)驗(yàn)證負(fù)數(shù)、0、1、5、空值以及字符串型 PLC 信號(hào)的判定結(jié)果。第十二階段優(yōu)化已完成。修改文件StationControlViewModel.Safety.cs主要優(yōu)化WaitForAllStationPositionsEmptyAsync從while Task.Delay改為統(tǒng)一使用PlcConditionWaiter。復(fù)位清空條件統(tǒng)一為當(dāng)前配方PackageType.ini對(duì)應(yīng)的 U/V/W 光電均無(wú)器件吹掃位無(wú)器件測(cè)試位無(wú)器件。未選擇封裝類型時(shí)按 U/V/W 全相位檢查避免誤判為空站。超時(shí)后保留當(dāng)前實(shí)際占用位置如上料位 U 相、吹掃位、測(cè)試位便于現(xiàn)場(chǎng)排查。補(bǔ)齊MaxWell.Driver.M.Model引用并移除重復(fù) using。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore --verbosity:minimal 0 個(gè)錯(cuò)誤 237 個(gè)已有警告建議上機(jī)驗(yàn)證不同封裝類型的復(fù)位清料、吹掃位殘留、測(cè)試位殘留、無(wú)配方復(fù)位以及兩分鐘超時(shí)提示。第十三階段優(yōu)化已完成重點(diǎn)優(yōu)化正式測(cè)試前AllowTestingFlag等待邏輯使用PlcConditionWaiter監(jiān)聽(tīng) PLC 快照變化減少無(wú)效輪詢和線程占用。保留 10 秒 PLC 信號(hào)有效性檢查。保留正式測(cè)試 33 分鐘總超時(shí)。流量、溫度、氣密報(bào)警出現(xiàn)時(shí)立即退出并進(jìn)入異常處理。統(tǒng)一使用PlcSignalValueConverter解析 PLC 布爾值。避免正式測(cè)試流程重復(fù)讀取 PLC降低通信沖突風(fēng)險(xiǎn)。驗(yàn)證結(jié)果dotnet build MaxWell.sln --no-restore編譯錯(cuò)誤0git diff --check通過(guò)現(xiàn)有項(xiàng)目警告仍存在但不是本階段新增的編譯錯(cuò)誤。第十四階段優(yōu)化已完成修改文件MainBoard.cs主要內(nèi)容恢復(fù)MainBoardDriver.ExecuteAsync的連接級(jí)互斥鎖。重試期間持續(xù)占用鎖避免遲到響應(yīng)被下一條指令讀取。SendRawAsync原始報(bào)文接口也加入同一把鎖。拆分SendRawCoreAsync避免重復(fù)加鎖造成死鎖。確保異常、取消、超時(shí)后始終釋放鎖。該優(yōu)化可以降低多工站同時(shí)運(yùn)行時(shí)出現(xiàn)以下問(wèn)題的概率Socket 收發(fā)交叉。主控響應(yīng)錯(cuò)幀。無(wú)響應(yīng)。數(shù)據(jù)包解析失敗。TCP 連接頻繁斷開(kāi)。驗(yàn)證結(jié)果MainBoard.cs編譯目標(biāo)通過(guò)。git diff --check通過(guò)。完整解決方案編譯時(shí)受到正在運(yùn)行的MaxWell進(jìn)程占用 DLL 文件影響未終止該進(jìn)程。第十五階段優(yōu)化完成聚焦 TCP 斷鏈與半包發(fā)送問(wèn)題。修改TcpConnector.csSocket.Send改為循環(huán)發(fā)送確保整條報(bào)文完整寫(xiě)入。識(shí)別Receive0、遠(yuǎn)端 FIN/RST、SocketException。通信異常后作廢舊 Socket下次請(qǐng)求自動(dòng)建立新連接。Socket.Connected增加Poll Available校驗(yàn)避免誤判連接仍有效。原始讀寫(xiě)、關(guān)閉、重建連接統(tǒng)一加鎖。WriteBufferSize2000仍可使用它僅作為單次分塊大小不是 TCP 最大報(bào)文限制。MainBoard.cs主控響應(yīng)超時(shí)、CRC 錯(cuò)誤、幀錯(cuò)位時(shí)主動(dòng)關(guān)閉當(dāng)前連接。第十四階段的命令級(jí)重試會(huì)在下一次嘗試時(shí)使用新 Socket避免遲到舊響應(yīng)污染新命令。驗(yàn)證通信項(xiàng)目和設(shè)備項(xiàng)目CoreCompile通過(guò)。git diff --check通過(guò)。完整解決方案仍無(wú)法構(gòu)建因?yàn)檫\(yùn)行中的MaxWell進(jìn)程占用了bin\Debug\MaxWell.Models.dll。第十六階段優(yōu)化完成修改文件ElectricalTestDataCollector.cs本階段優(yōu)化內(nèi)容主控返回大量數(shù)據(jù)時(shí)每次最多讀取64組。避免SavedDataGroups9602時(shí)一次性構(gòu)造超大報(bào)文。防止ReadDataLength轉(zhuǎn)換為ushort時(shí)溢出。避免單個(gè)工站長(zhǎng)時(shí)間占用主控通信鎖。未讀取完的數(shù)據(jù)由下一次采集周期繼續(xù)讀取。增加空數(shù)據(jù)保護(hù)避免空幀繼續(xù)進(jìn)入溫度換算、曲線和 CSV。增加取消檢查停止測(cè)試時(shí)不會(huì)繼續(xù)發(fā)起讀取。日志記錄本次請(qǐng)求數(shù)量、實(shí)際接收數(shù)量和剩余數(shù)量。驗(yàn)證結(jié)果MaxWell.Driver.M項(xiàng)目構(gòu)建通過(guò)。編譯錯(cuò)誤0git diff --check通過(guò)現(xiàn)有項(xiàng)目警告仍保留未新增編譯錯(cuò)誤。第十七階段優(yōu)化完成主要完善主控板批量數(shù)據(jù)讀取的協(xié)議邊界。修改內(nèi)容DebugToolCommands.cs單次最多讀取64組。單次最大數(shù)據(jù)長(zhǎng)度為6400字節(jié)。防止讀取數(shù)量過(guò)大導(dǎo)致ushort溢出或 Socket 報(bào)文過(guò)大。校驗(yàn)響應(yīng)長(zhǎng)度必須是100字節(jié)數(shù)據(jù)組的整數(shù)倍。解析失敗改為拋出明確異常不再返回null掩蓋通訊故障。ManualHardwareService.cs手動(dòng)讀取數(shù)據(jù)限制為最多64組。手動(dòng)采集接口同步增加數(shù)量校驗(yàn)。超過(guò)限制時(shí)提示分批讀取。FormMainDriver.cs調(diào)試工具讀取前校驗(yàn)范圍1~64。輸入非法數(shù)量時(shí)不發(fā)送主控指令。驗(yàn)證結(jié)果MaxWell.Communication構(gòu)建通過(guò)。MaxWell.Device構(gòu)建通過(guò)。MaxWell.Driver.M構(gòu)建通過(guò)。MaxWell.DebugTool構(gòu)建通過(guò)。編譯錯(cuò)誤0git diff --check通過(guò)。建議上機(jī)驗(yàn)證輸入64組應(yīng)正常發(fā)送輸入65或更大數(shù)量應(yīng)直接提示分批讀取。已完成第十九階段優(yōu)化重點(diǎn)解決 PLC 輪詢與業(yè)務(wù)讀寫(xiě)的競(jìng)態(tài)問(wèn)題。主要修改批量讀取原子化AuxPLC.cs整批 PLC 地址讀取期間禁止其他寫(xiě)入插入。避免生成不同時(shí)間點(diǎn)混合的 PLC 快照。開(kāi)批、結(jié)批統(tǒng)一使用有效快照BatchLifecycleService.cs移除業(yè)務(wù)流程中的ReadSignalFresh。開(kāi)批前清料、補(bǔ)盤(pán)檢查以及結(jié)批物料檢查都基于同一份完整快照。PLC 未連接、快照無(wú)效或信號(hào)缺失時(shí)直接禁止操作并返回明確原因。修復(fù) PLC 釋放順序DeviceManager.cs釋放順序調(diào)整為停止 PLC 輪詢 - 等待輪詢?nèi)蝿?wù)退出 - 釋放 AuxPLC Socket避免關(guān)閉工站或重連時(shí)出現(xiàn)“已釋放對(duì)象仍在讀取 PLC”。保留ReadSignalFresh兼容能力該方法仍保留給 DebugTool 診斷使用。生產(chǎn)流程、等待條件、實(shí)時(shí)顯示不再使用該方法。驗(yàn)證結(jié)果編譯錯(cuò)誤0 git diff --check通過(guò)現(xiàn)場(chǎng)建議驗(yàn)證PLC 正常輪詢時(shí)執(zhí)行開(kāi)批、結(jié)批。PLC 斷線后執(zhí)行開(kāi)批確認(rèn)禁止操作并提示 PLC 快照無(wú)效。批量讀取期間執(zhí)行 PLC 寫(xiě)入確認(rèn)不會(huì)出現(xiàn)報(bào)文交叉。關(guān)閉工站或重新連接工站確認(rèn)不再出現(xiàn)釋放對(duì)象和輪詢線程沖突。