天天看點

基于Windows的SOEM上位機程式設計步驟

作者:争取個有趣的靈魂

一、檢測SOEM運作環境

1、準備事項

  • 從 http://openethercatsociety.github.io/ 下載下傳SOEM 1.3.1 源代碼
  • 下載下傳wincap https://www.winpcap.org/archive/4.1beta3-WinPcap.exe 并安裝
  • VS2015(個人使用VS2015,其他類似)

2、編譯SOEM庫

2.1 打開VS2015 x64 x86相容工具指令提示符

基于Windows的SOEM上位機程式設計步驟

2.2 指令行轉到SOEM-1.3.1目錄下

cd E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1
           
基于Windows的SOEM上位機程式設計步驟

2.3 編譯生成lib庫

make_libsoem_lib.bat "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" x86
           

其中“D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" 為VS目錄

基于Windows的SOEM上位機程式設計步驟

上述指令生成lib檔案

基于Windows的SOEM上位機程式設計步驟

過程指令如下:

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>make_libsoem_lib.bat "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" x86

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>REM @echo off

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>rem give path as arg

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>if "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" == "" goto exit_err_arg

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>if NOT EXIST "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" goto exit_err_arg

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>rem call cvarsall to load the env

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>call "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\vcvarsall.bat" x86
'"D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\vcvarsall.bat"' 不是内部或外部指令,也不是可運作的程式
或批處理檔案。

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>rem cd to folder containing .bat file

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>cd /d "make_libsoem_lib.bat\.."

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>rem compile and build library

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>if EXIST obj goto skip_obj

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>MKDIR obj

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>cl.exe @make\cl_libsoem.rsp /errorReport:prompt
用于 x86 的 Microsoft (R) C/C++ 優化編譯器 19.00.24210 版
版權所有(C) Microsoft Corporation。保留所有權利。

cl /c /Zi /W3 /WX- /Od /Oy- /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Gm /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"obj\\" /Fd"obj\vc100.pdb" /Gd /TC /analyze-  /Odi /I "oshw\win32\wpcap\include" /I "osal" /I "osal\win32" /I "oshw\win32" /I "soem"
   oshw\win32\nicdrv.c
   oshw\win32\oshw.c
   soem\ethercatbase.c
   soem\ethercatcoe.c
   soem\ethercatconfig.c
   soem\ethercatdc.c
   soem\ethercatfoe.c
   soem\ethercatmain.c
   soem\ethercatprint.c
   soem\ethercatsoe.c
   osal\win32\osal.c

    ......
nicdrv.c
E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1\soem\ethercattype.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1\osal\win32\osal_defs.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的 字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\oshw\win32\nicdrv.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1\osal\win32\osal_win32.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
正在生成代碼...

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>if EXIST lib\win32 goto skip_lib

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>MKDIR lib\win32

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>lib.exe @make\lib_libsoem.rsp /nologo /errorReport:prompt

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>echo make done
make done

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>goto :eof

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>
           

3、生成測試檔案

3.1 編譯生成測試檔案(非必須,但可用于測試)

部分測試檔案無法在Windows下生成

make_test_win32_all.bat "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" x86
           

過程編譯代碼

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>make_test_win32_all.bat "D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE" x86
用于 x86 的 Microsoft (R) C/C++ 優化編譯器 19.00.24210 版
版權所有(C) Microsoft Corporation。保留所有權利。

cl /c /Zi /W3 /WX- /Od /Oy- /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Gm /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"obj\\" /Fd"obj\vc100.pdb" /Gd /TC /analyze-  /Odi /I "oshw\win32\wpcap\include" /I "osal" /I "osal\win32" /I "oshw\win32" /I "soem"
   oshw\win32\nicdrv.c
   oshw\win32\oshw.c
   soem\ethercatbase.c
   soem\ethercatcoe.c
   soem\ethercatconfig.c
   soem\ethercatdc.c
   soem\ethercatfoe.c
   soem\ethercatmain.c
   soem\ethercatprint.c
   soem\ethercatsoe.c
   osal\win32\osal.c

    ......

eepromtool.c
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\soem\ethercattype.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\osal\win32\osal_defs.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\oshw\win32\nicdrv.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\soem\ethercatbase.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\soem\ethercatmain.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
e:\ethercat\上位機\soem-1.3.1\soem-1.3.1\soem\ethercatcoe.h: warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode 格式以防止資料丢失
make done

E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1>
           

3.2 使用simple_test測試

轉到simple_test目錄下

cd E:\EtherCAT\上位機\SOEM-1.3.1\SOEM-1.3.1\test\win32\simple_test
           

擷取裝置驅動

simple_test.exe
           
基于Windows的SOEM上位機程式設計步驟

運作測試檔案

基于Windows的SOEM上位機程式設計步驟

二、在Windows下建立上位機工程

目标是在C++中生成動态連結庫(.dll)後可以被C#調用。
           

1、建立C# winform工程,用于調用C++的dll

如果不熟悉,建議看C++建立步驟,現在C++控制台上完成調試。

基于Windows的SOEM上位機程式設計步驟

2、建立C++ 庫工程

基于Windows的SOEM上位機程式設計步驟

項目大概基本布局如圖:

基于Windows的SOEM上位機程式設計步驟

3、部署C++運作環境

3.1 拷貝SOEM-1.3.1到項目檔案中

基于Windows的SOEM上位機程式設計步驟

3.2 添加附加包含目錄

SOEM-1.3.1\osal;
SOEM-1.3.1\osal\win32;
SOEM-1.3.1\oshw\win32\wpcap\Include\pcap;
SOEM-1.3.1\oshw\win32\wpcap\Include;
SOEM-1.3.1\oshw\win32;
SOEM-1.3.1\soem;
           
基于Windows的SOEM上位機程式設計步驟

3.3 添加附加庫目錄

SOEM-1.3.1\lib\win32
SOEM-1.3.1\oshw\win32\wpcap\Lib
           
基于Windows的SOEM上位機程式設計步驟

3.4 添加附加依賴項

libsoem.lib
Packet.lib
wpcap.lib
           
基于Windows的SOEM上位機程式設計步驟

注意事項

事項1:

LINK : warning LNK4098: 預設庫“LIBCMTD”與其他庫的使用沖突;請使用

/NODEFAULTLIB:library

解決方案1:

【連接配接器】->【輸入】->【忽略指定庫】,輸入:msvcrt.lib

解決方案2:

【連接配接器】->【指令行】,輸入:/NODEFAULTLIB:msvcrt.lib

基于Windows的SOEM上位機程式設計步驟

事項2:

warning C4819: 該檔案包含不能在目前代碼頁(936)中表示的字元。請将該檔案儲存為 Unicode

格式以防止資料丢失

解決方案:

點選報警,進入觸發報警的檔案,點選菜單欄中“檔案->進階儲存選項”,選擇“Unicode 1200”即可。

基于Windows的SOEM上位機程式設計步驟

事項3:

調試C#時,無法在C++中打斷點

基于Windows的SOEM上位機程式設計步驟

屬性->調試 中啟用“本機代碼調試”

基于Windows的SOEM上位機程式設計步驟
基于Windows的SOEM上位機程式設計步驟

事項4:

C4996 'strcpy': This function or variable may be unsafe.

在使用vs編寫c++程式時使用strcpy函數會報錯

“屬性”->“c/c++”->“預處理器”,在“預處理定義”中加入下面語句:_CRT_SECURE_NO_WARNINGS

繼續閱讀