EasyBuilder Pro 搜尋 HMI 說找不到介面卡?明明裝了 Npcap,兇手是資料夾裡的舊版 WinPcap DLL

目錄9 個章節

現場要把一台 Weintek HMI 的工程檔撈回電腦,偏偏這台不是我設定的,手上也沒有它的 IP。

沒關係,EasyBuilder Pro 的 Utility Manager 可以用”HMI 名稱”搜尋,讓軟體自己在網路上找。

按下搜尋,跳出來的是這個:

無法搜尋到介面卡!請確認 WinPcap 是否已經安裝.

問題是這台電腦明明有裝 Npcap(WinPcap 的後繼版本),Wireshark 也抓封包抓得好好的。

TL;DR
症狀:EasyBuilder Pro 用 HMI 名稱搜尋,跳出”無法搜尋到介面卡”,但電腦其實有裝 Npcap。
原因:C:\EBpro 裡附了一份 WinPcap 4.1.3 的 wpcap.dll、Packet.dll,Windows 會優先載入它們,而它們配套的舊驅動 npf 早就不在電腦上。
解法:把這兩個 DLL 改名備份,程式就會改用系統資料夾裡 Npcap 的相容版 DLL。
還原:把檔名改回來就好。

為什麼裝了 Npcap 還叫我裝 WinPcap?

因為 EasyBuilder 載入的是自己資料夾裡的舊版 WinPcap DLL,根本沒用到你裝的 Npcap。

錯誤訊息看起來像是沒裝,實際上是裝了,只是程式拿錯了 DLL。 那句”請確認 WinPcap 是否已經安裝”,只是程式找不到網卡之後給的制式提示。

ebpro-winpcap-error.png

最讓人困惑的是這三件事同時成立:

  • 電腦上有裝 Npcap 1.89,而且開了 WinPcap 相容模式。
  • Wireshark 4.6.8 抓封包正常,所有網卡都看得到。
  • 只有 EasyBuilder 說它一張網卡都找不到。

我的環境

項目版本/說明
作業系統Windows 11 家用版 23H2(10.0.22631),64 位元
HMI 軟體Weintek EasyBuilder Pro 6.10.02,安裝在 C:\EBpro
出問題的工具Utility Manager(UtilityManagerEx.exe,32 位元)
封包驅動Npcap 1.89,已開啟 WinPcap API-compatible Mode
其他軟體Wireshark 4.6.8,跟 Npcap 一起安裝
目標 HMI名稱 cMT-5BE3,用乙太網路連線

出錯的操作路徑:Utility Manager → 上傳 (HMI→PC) → 乙太網路 → HMI 名稱 → 搜尋(S) 或 搜尋全部(E)。

名稱搜尋跟 WinPcap 有什麼關係?

名稱搜尋要直接收送底層封包,Windows 本身做不到,所以要靠 WinPcap 或 Npcap 這類封包驅動。

IP 連線不需要,名稱搜尋才需要

Utility Manager 連 HMI 有兩種方式。

IP 頁籤是直接用 IP 建一般的 TCP 連線,不需要 WinPcap 或 Npcap。

HMI 名稱頁籤是在網路上送出搜尋封包、等 HMI 回應,就算不知道 IP 也找得到。 它不走一般的 IP 連線,所以要靠封包驅動。

💡 用 IP 連線,像是知道對方電話直接撥過去;用名稱搜尋,則像在整層樓大喊”cMT-5BE3 在哪裡?“等對方回應。要能大喊,就得有 WinPcap/Npcap 這支擴音器。

WinPcap 和 Npcap 是什麼關係?

Npcap 是 Nmap 專案維護的 Windows 封包驅動,WinPcap 停止維護後的接班人。

WinPcapNpcap
狀態已停止維護,最後一版是 4.1.3(2013 年)持續更新中
驅動名稱npf(npf.sys)npcap(npcap.sys)
誰在用老舊軟體,很多工控軟體還在依賴它Wireshark 3.0 之後的安裝檔都改附 Npcap
相容性無有 WinPcap API-compatible Mode,讓舊程式也能用

也就是說,WEINTEK 可能是使用一個 2013 年就停更的東西(十三年了),但畢竟工控本來就是求穩的東西(俗話說,沒事就別亂動它)。

這裡有兩個重點要記住。

第一,DLL 跟驅動必須是配套的。程式呼叫 wpcap.dll,wpcap.dll 再呼叫 Packet.dll,最後由 Packet.dll 跟驅動溝通。WinPcap 的 DLL 配 WinPcap 的驅動,Npcap 的 DLL 配 Npcap 的驅動。

第二,Npcap 用相容模式安裝時,會要求先移除 WinPcap。所以很常見的情況是:為了 Wireshark 裝了 Npcap,原本的 WinPcap 連同 npf 驅動就一起被移除了。

程式 (EasyBuilder / Wireshark)
   │
   ▼
wpcap.dll   ← 對程式提供功能的"前台"
   │
   ▼
Packet.dll  ← 負責跟驅動溝通的"窗口"
   │
   ▼
驅動程式     ← WinPcap 用 npf.sys;Npcap 用 npcap.sys
   │
   ▼
網卡

Windows 找 DLL 的順序

程式需要某個 DLL 時,Windows 會依序到這些地方找,找到第一個就用它:

  1. 程式自己所在的資料夾(這次的關鍵)
  2. 系統資料夾:64 位元程式用 C:\Windows\System32,32 位元程式跑在 64 位元 Windows 上用 C:\Windows\SysWOW64
  3. Windows 資料夾 C:\Windows
  4. 目前的工作目錄
  5. 環境變數 PATH 列出的資料夾

所以只要程式資料夾裡有一份 wpcap.dll,系統資料夾裡那份就不會被用到,就算系統那份比較新、比較正確也一樣。

我怎麼一步步查出兇手?

從驅動、設定、系統 DLL 一路往下查,最後在 EasyBuilder 自己的安裝資料夾找到兩個舊 DLL。

以下都在 PowerShell 執行,一般權限就可以,不需要系統管理員。

確認封包驅動服務

Get-Service -Name npcap, npf -ErrorAction SilentlyContinue |
    Format-Table Name, Status, StartType -AutoSize
Name  Status  StartType
----  ------  ---------
npcap Running System

只有 Npcap 的驅動在跑,沒有舊版 WinPcap 的 npf 服務。

確認 Npcap 的設定

Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\npcap\Parameters" |
    Select-Object AdminOnly, WinPcapCompatible
AdminOnly         : 0   ← 沒有限制只有系統管理員能用
WinPcapCompatible : 1   ← 已開啟 WinPcap 相容模式

Npcap 本身的設定沒問題。

確認系統資料夾裡的 DLL

foreach ($p in "C:\Windows\System32\wpcap.dll",
               "C:\Windows\SysWOW64\wpcap.dll",
               "C:\Windows\System32\Packet.dll",
               "C:\Windows\SysWOW64\Packet.dll") {
    $v = (Get-Item $p).VersionInfo
    "{0}  {1} {2}" -f $p, $v.ProductName, $v.FileVersion
}
C:\Windows\System32\wpcap.dll   libpcap 1.10.7
C:\Windows\SysWOW64\wpcap.dll   libpcap 1.10.7
C:\Windows\System32\Packet.dll  Npcap 1.89
C:\Windows\SysWOW64\Packet.dll  Npcap 1.89

系統資料夾裡放的是 Npcap 提供的相容版 DLL,也正常。

確認舊驅動 npf.sys 還在不在

Test-Path "C:\Windows\System32\drivers\npf.sys"    # 舊 WinPcap 驅動
Test-Path "C:\Windows\System32\drivers\npcap.sys"  # Npcap 驅動

結果 npf.sys 是 False,npcap.sys 是 True。電腦上完全沒有舊版 WinPcap 的驅動。

前四項查下來全部正常。

系統這邊沒問題,那就只剩程式自己了。

翻 EasyBuilder 的安裝資料夾,找到了

Get-ChildItem "C:\EBpro" -Recurse -Include "wpcap*.dll", "Packet*.dll" |
    ForEach-Object {
        $v = $_.VersionInfo
        "{0}  {1} {2}" -f $_.FullName, $v.ProductName, $v.FileVersion
    }
C:\EBpro\Packet.dll  WinPcap 4.1.0.2980
C:\EBpro\wpcap.dll   WinPcap 4.1.0.2980

EasyBuilder Pro 自己的資料夾裡,放了一份 WinPcap 4.1.3 的 DLL(4.1.3 的 DLL 檔案版本就是 4.1.0.2980,不是我看錯)。

兇手就住在程式自己家裡😆

確認 Utility Manager 是幾位元

讀執行檔 PE 標頭裡的 Machine 欄位,就能判斷程式是幾位元:

$bytes   = [System.IO.File]::ReadAllBytes("C:\EBpro\UtilityManagerEx.exe")
$peStart = [BitConverter]::ToInt32($bytes, 60)
$machine = [BitConverter]::ToUInt16($bytes, $peStart + 4)
"0x{0:X4}" -f $machine   # 0x014C = 32 位元,0x8664 = 64 位元

結果是 0x014C,32 位元。

這代表它如果在自己的資料夾找不到 DLL,就會去 C:\Windows\SysWOW64 找,而那裡剛好有 Npcap 的相容版 DLL。解法的方向就出來了。

真正的原因是什麼?

EasyBuilder 用的是自己附的舊版 WinPcap DLL,而這個 DLL 配套的舊驅動早就不在電腦上了。

【出問題時】

UtilityManagerEx.exe(32 位元)
   │  Windows 先找"程式自己的資料夾"
   ▼
C:\EBpro\wpcap.dll、Packet.dll   ← WinPcap 4.1.3(舊)
   │  舊版 Packet.dll 只認得舊驅動 NPF
   ▼
npf.sys   ✘ 不存在(電腦上只有 Npcap 的 npcap.sys)
   │
   ▼
一張網卡都列不出來
   │
   ▼
"無法搜尋到介面卡!請確認 WinPcap 是否已經安裝."

💡 EasyBuilder 手上拿的是舊電視的遙控器(舊版 DLL),但家裡的電視已經換成新的了(Npcap 驅動)。新電視好好的,舊遙控器就是配對不上,所以程式才說”找不到電視”。

常見的發生經過

  1. 電腦上先裝了 EasyBuilder Pro,資料夾裡附有 WinPcap 4.1.3 的 DLL。
  2. 後來為了抓封包、除錯通訊,裝了 Wireshark。Wireshark 3.0 之後附的是 Npcap。
  3. Npcap 用 WinPcap 相容模式安裝時會要求先移除 WinPcap,舊的 npf 驅動就不見了。
  4. EasyBuilder 還是照樣載入自己資料夾裡的舊 DLL,找不到配套的驅動,名稱搜尋就失敗了。

我這台的 Wireshark 4.6.8 跟 Npcap 1.89 是同一天裝的,在那之前有沒有裝過 WinPcap 已經查不到了,但結果一樣:現在電腦上只有 Npcap 的驅動。

身為 IOT 工控人,沒想到裝了 Wireshark 後,Weintek 居然會無法連線搜尋…如果以前我一定慌了,花很久的時間爬文、測試,現在有 AI 可以協助處理,真的是太美好了。

怎麼確認你也是同一個問題?

跑下面這段 PowerShell,看 EasyBuilder 資料夾裡的 DLL 是不是 WinPcap 4.1.x 就知道。

# ============================================================
# EasyBuilder Pro "無法搜尋到介面卡" 問題檢查
# 使用前請把 $EBproPath 改成你的 EasyBuilder Pro 安裝路徑
# ============================================================
$EBproPath = "C:\EBpro"

# [1] 封包驅動服務:npcap = Npcap,npf = 舊版 WinPcap
Write-Host "`n[1] 封包驅動服務"
Get-Service -Name npcap, npf -ErrorAction SilentlyContinue |
    Format-Table Name, Status, StartType -AutoSize

# [2] Npcap 是否開啟 WinPcap 相容模式(1 = 有開)
Write-Host "[2] Npcap WinPcap 相容模式(1 = 有開)"
$npcapParam = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\npcap\Parameters" -ErrorAction SilentlyContinue
if ($npcapParam) {
    $npcapParam.WinPcapCompatible
} else {
    "找不到 Npcap 設定(可能沒有安裝 Npcap)"
}

# [3] 列出系統資料夾與 EasyBuilder 資料夾中的 pcap DLL 版本
Write-Host "`n[3] pcap DLL 位置與版本"
$dllList = @(
    "C:\Windows\System32\wpcap.dll",
    "C:\Windows\System32\Packet.dll",
    "C:\Windows\SysWOW64\wpcap.dll",
    "C:\Windows\SysWOW64\Packet.dll",
    "$EBproPath\wpcap.dll",
    "$EBproPath\Packet.dll"
)
foreach ($dll in $dllList) {
    if (Test-Path $dll) {
        $info = (Get-Item $dll).VersionInfo
        "{0,-32} {1} {2}" -f $dll, $info.ProductName, $info.FileVersion
    } else {
        "{0,-32} (不存在)" -f $dll
    }
}

怎麼判讀:

檢查結果判斷建議
有 npcap、沒有 npf,EasyBuilder 資料夾裡的 DLL 是 WinPcap 4.1.x跟本文同一個問題照下面的方案 B 做
有 npcap,但 WinPcapCompatible 不是 1,或 SysWOW64\wpcap.dll 不存在Npcap 沒開相容模式先重裝 Npcap 並勾選 WinPcap API-compatible Mode,再做方案 B
npcap 和 npf 都沒有完全沒裝封包驅動裝 Npcap 並勾選相容模式,EasyBuilder 資料夾裡有舊 DLL 的話一樣要做方案 B
有 npf(舊 WinPcap 還在),但搜尋還是失敗不是 DLL 的問題往網路方向查:網段、交換器、防火牆、多網卡

有哪幾種解法可以選?

三條路:改用 IP、把舊 DLL 改名、移除 Npcap 換回 WinPcap。我選的是改名。

方案做法優點缺點
A. 改用 IP 連線切到”IP”頁籤,直接輸入 HMI 的 IP什麼都不用改,馬上可用必須知道 HMI 的 IP,去撈別人設定的 HMI 時就沒辦法
B. 把舊 DLL 改名(本次採用)把 C:\EBpro 的 wpcap.dll、Packet.dll 改名備份,讓程式改用系統裡 Npcap 的相容版 DLLWireshark 照常能用、隨時可以改回來、不用裝或移除任何軟體不是 Weintek 官方做法;EasyBuilder 更新或重裝後,舊 DLL 可能又被放回來
C. 移除 Npcap,改裝 WinPcap 4.1.3回到 EasyBuilder 原本預期的環境跟 EasyBuilder 預期的環境一致Wireshark 4.x 需要 Npcap,移除後就不能抓封包;WinPcap 2013 年就停更,在 Windows 11 上驅動可能不穩定

💡 理論上還有一種變化做法:重裝 Npcap 時不勾相容模式,再另外裝 WinPcap 4.1.3 讓兩者並存。步驟比較多,WinPcap 在新系統上的穩定性也有疑慮,這個我沒有實測。

因為我在電腦裝 Wireshark 懶得做那麼多測試,所以直接走方案 B。

為了 EasyBuilder 把 Npcap 拆掉、換回停更十三年的 WinPcap,等於為了一支舊遙控器把新電視退貨,Wireshark 還會跟著不能用。

方案 A 是知道 IP 時最省事的做法,但我這次就是不知道 IP >.<

舊 DLL 要怎麼改名?

關掉 Utility Manager,把 C:\EBpro 的 wpcap.dll、Packet.dll 改名,重開就好。

動手前先確認兩件事

  1. Npcap 有開 WinPcap 相容模式:前面查的 WinPcapCompatible 要是 1,而且 C:\Windows\SysWOW64\wpcap.dll 要存在。沒開的話,舊 DLL 改名後程式會完全找不到 wpcap.dll,可能連 Utility Manager 都打不開。這時要先重裝 Npcap,安裝時勾選”Install Npcap in WinPcap API-compatible Mode”。
  2. 找到 EasyBuilder Pro 的安裝路徑:我的是 C:\EBpro,你裝在別的地方的話,下面指令的路徑要跟著改。

改名步驟

  1. 完全關閉 Utility Manager(只關上傳對話框不算,舊 DLL 已經載進記憶體了)。其他 EasyBuilder 工具最好也一起關掉。

  2. 用 PowerShell 把舊版 DLL 改名備份:

    # 把 EasyBuilder Pro 資料夾中的舊版 WinPcap DLL 改名備份(不是刪除)
    Rename-Item "C:\EBpro\wpcap.dll"  "wpcap.dll.winpcap413.bak"
    Rename-Item "C:\EBpro\Packet.dll" "Packet.dll.winpcap413.bak"

    在檔案總管直接改也行:wpcap.dll 改成 wpcap.dll.winpcap413.bak,Packet.dll 改成 Packet.dll.winpcap413.bak。

  3. 重開 Utility Manager,照原本的路徑再搜一次:上傳 (HMI→PC) → 乙太網路 → HMI 名稱 → 搜尋。

我的 C:\EBpro 用一般權限就能改名。如果你的 EasyBuilder 裝在 C:\Program Files 底下,可能要用系統管理員身分開 PowerShell,或在檔案總管按”繼續”取得權限。

搜到了。

錯誤沒再跳出來,網路上的 HMI 也找到了,工程檔順利上傳。改名後的載入路徑變成這樣:

【改名之後】

UtilityManagerEx.exe(32 位元)
   │  程式資料夾裡找不到 wpcap.dll → 改到系統資料夾找
   ▼
C:\Windows\SysWOW64\wpcap.dll、Packet.dll   ← Npcap 1.89 提供的相容版
   │
   ▼
npcap.sys   ✔ 正常運作
   │
   ▼
列出網卡 → 搜尋到 HMI

怎麼還原

改完出現其他問題,或想恢復原狀,就先關閉 Utility Manager,再把檔名改回來:

Rename-Item "C:\EBpro\wpcap.dll.winpcap413.bak"  "wpcap.dll"
Rename-Item "C:\EBpro\Packet.dll.winpcap413.bak" "Packet.dll"

檔案只是改名沒有刪除,所以可以完整還原。

改完之後要注意什麼?

  1. EasyBuilder 更新或重裝後,安裝程式可能會把舊版 DLL 放回 C:\EBpro。名稱搜尋又跳同樣的錯誤時,先檢查這兩個檔案是不是又回來了。
  2. C:\EBpro 裡其他會用到 wpcap.dll 的 EasyBuilder 工具,也會跟著改用系統的 Npcap 版本。
  3. 這不是 Weintek 的官方做法。原理是 Npcap 官方提供的 WinPcap 相容機制,但遇到異常的話,建議先還原,再問原廠。
  4. 名稱搜尋送出的封包過不了路由器。電腦和 HMI 要在同一個區域網路裡,例如同一台交換器、同一個 VLAN,中間隔著路由器或防火牆的話,DLL 問題解決了也搜不到。
  5. 多張網卡在同一個網段時要小心。我這台的有線網卡和 Wi-Fi 都在 192.168.10.x,封包有可能從錯的網卡送出去。搜尋結果不穩定的話,先暫時關掉 Wi-Fi 再試。
  6. VMware、VPN(例如 eCatcher)這類虛擬網卡也會被列進網卡清單。一般不影響搜尋,但結果怪怪的話,可以先停用這些虛擬網卡再測。

至於第 2 點那些工具改用 Npcap 之後會不會出狀況,我目前只驗證過 Utility Manager 的名稱搜尋跟上傳,其他的還沒碰到。

常見問題

Q:為什麼 Wireshark 抓得到網卡,EasyBuilder 卻抓不到?
A:Wireshark 用的是 Npcap 自己的 DLL(在 C:\Windows\System32\Npcap\),DLL 跟驅動是配套的。EasyBuilder 用的是自己資料夾裡的舊版 WinPcap DLL,跟現在的驅動配不起來。

Q:可以直接把 C:\EBpro 裡的 DLL 刪掉嗎?
A:不建議。改名的效果跟刪除一樣,之後想還原時,把檔名改回來就好。

Q:用 IP 連線也會遇到這個問題嗎?
A:不會。IP 連線走一般的 TCP 通訊,不需要 WinPcap 或 Npcap,只有”HMI 名稱”搜尋這類要收送底層封包的功能才會受影響。

Q:EasyBuilder 更新之後又跳同樣的錯誤怎麼辦?
A:先看 C:\EBpro 裡的 wpcap.dll、Packet.dll 是不是又被安裝程式放回來了,是的話照上面的步驟再改名一次。