目录
第1章 基本步骤
第2章 详细步骤
2.1.QT安装
2.2.VS安装
2.3.Win10 Debuggers
2.4.QT配置
2.5. SOEM移植
(1)lib库生成
(2)文件移植: 文件整理
第1章 基本步骤
要在QT中添加SOEM主站功能,您需要完成以下步骤:
-
下载SOEM库:从SOEM的官方网站(https://github.com/OpenEtherCATsociety/SOEM)下载SOEM库的源代码。
-
编译SOEM库:根据您使用的操作系统和编译器,使用CMake或其他适当的构建工具编译SOEM库。
-
创建一个QT项目:在QT中创建一个新的项目或打开现有的项目。
-
添加SOEM库:将编译得到的SOEM库的头文件(.h)和库文件(.lib/.a)拷贝到您的QT项目中。
-
在QT项目中配置SOEM:在您的QT项目中,打开.pro文件(项目文件),将SOEM库的头文件路径和库文件路径添加到INCLUDEPATH和LIBS中。例如:
INCLUDEPATH += /path/to/soem/include
LIBS += -L/path/to/soem/lib -lsoem
-
在代码中使用SOEM:在您的QT项目中的代码文件中,包含SOEM的头文件,并使用SOEM提供的功能和API来初始化主站、配置网络、进行数据通信等操作。您可以参考SOEM的文档和示例代码来理解如何使用SOEM库。
-
构建和运行QT项目:使用QT的构建工具进行项目构建,并运行生成的可执行文件测试您的SOEM主站应用程序。
请注意:
添加SOEM主站功能并在QT中使用它需要您对SOEM库和EtherCAT协议有一定的了解。
在开始之前,建议先熟悉SOEM库的文档和示例,以及EtherCAT网络和通信协议的基本概念。
这将有助于您更好地集成SOEM主站功能到您的QT项目中。
第2章 详细步骤
2.1.QT安装
QT安装十分简单,因为我这个是离线版本,所以电脑不联网安装的时候不需要登陆账号。在这里需要选择MSVC编译器,后面工程编译需要使用MSVC,MinGW不行。其他的模块看你需要,我后面可能需要画波形图,所以勾选了QT Charts模块。
2.2.VS安装
VS安装也很简单,只需要选择C++模块就行了。VS这个主要是提供两个功能,一个是编译SOEM代码生成lib文件供QT调用,另一个就是提供MSVC编译器。
2.3.Win10 Debuggers
上一步在安装VS的时候已经勾选了Win10 SDK,但是安装完之后,在QT中识别不到 Debuggers,所以需要安装一下WIn10SDK。这里安装的时候只需要勾选Debugging Tools for Windows就好了。
2.4.QT配置
软件安装完成之后,打开QT,将QT会自动检测到编译器和Debuggers如上图所示。
2.5. SOEM移植
(1)lib库生成
打开VS2017的终端,通过终端进入到SOEM源码的文件加下面,在文件夹下面输入以下指令就好了,编译完成后,可以看到在build文件夹中生成了soem.lib文件。
mkdir build
cd build
cmake .. -G "NMake Makefiles"
nmake
在build文件夹下面也生成了windows中的测试程序,路径在build\test\linux下,一下就是我在中端中测试的结果,测试了slaveinfo.exe和simple_test.exe两个指令
F:\source\SOEM-master\build\test\linux\slaveinfo>slaveinfo.exe
SOEM (Simple Open EtherCAT Master)
Slaveinfo
Usage: slaveinfo ifname [options]
ifname = eth0 for example
Options :
-sdo : print SDO info
-map : print mapping
Available adapters
Description : Microsoft, Device to use for wpcap: \Device\NPF_{AC02A084-A1B6-47F5-BF5D-45E3B31DA4DB}
Description : Microsoft, Device to use for wpcap: \Device\NPF_{5C6F0220-964E-460F-9F00-0BCE757CA244}
Description : Realtek PCIe GbE Family Controller, Device to use for wpcap: \Device\NPF_{554640BB-2AEE-4E52-A972-FFFBD6BE41D0}
End program
F:\source\SOEM-master\build\test\linux\simple_test>simple_test.exe \Device\NPF_{554640BB-2AEE-4E52-A972-FFFBD6BE41D0}
SOEM (Simple Open EtherCAT Master)
Simple test
Starting simple test
ec_init on \Device\NPF_{554640BB-2AEE-4E52-A972-FFFBD6BE41D0} succeeded.
1 slaves found and configured.
Slaves mapped, state to SAFE_OP.
segments : 1 : 29 0 0 0
Request operational state for all slaves
Calculated workcounter 3
Operational state reached for all slaves.
Processdata cycle 1159, WKC 3 , O: 00 00 00 00 00 00 00 00 I: 00 00 00 00 00 00 00 00 T:734597119552360960
ERROR : slave 1 is in SAFE_OP + ERROR, attempting ack.
Processdata cycle 1162, WKC 3 , O: 00 00 00 00 00 00 00 00 I: 00 00 00 00 00 00 00 00 T:734597123992783400
WARNING : slave 1 is in SAFE_OP, change to OPERATIONAL.
Processdata cycle 1164, WKC 3 , O: 00 00 00 00 00 00 00 00 I: 00 00 00 00 00 00 00 00 T:734597124006343840
OK : all slaves resumed OPERATIONAL.
^Cocessdata cycle 1379, WKC 3 , O: 00 00 00 00 00 00 00 00 I: 00 00 00 00 00 00 00 00 T:734597125666392921
(2)文件移植: 文件整理
这一步可以不做,可以直接将编译过的soem源码文件夹复制到QT工程下面,然后向工程里添加头文件和库文件。我是为了让整个工程更加清晰,所以才做的。
新建一个QT工程,在QT工程下面新建一个soem文件夹,用来存放soem的头文件和lib。
我这里又在soem文件夹下面新建了两个文件夹,一个soem_h存储头文件,一个soem_lib存储lib文件。还有一个wpcap文件夹,不是我创建的,是我从SOEM-master\oshw\win32下面拷贝的。这个文件夹下面所有的头文件和lib文件也需要加入到QT工程里面。接下来就是向soem_h和soem_lib文件夹中拷贝文件了。
- 拷贝build文件夹中生成的soem.lib文件到soem_lib文件夹
- 拷贝SOEM源码文件夹中soem下的头文件到soem_h文件夹
- 拷贝SOEM源码文件夹中oshw\win32下的头文件到soem_h文件夹,wpcap已经拷贝过了,不需要再拷贝了。
- 拷贝SOEM源码文件夹中osal\win32下的头文件到soem_h文件夹,还有一个osal文件夹下的osal.h头文件也需要拷贝
(3) 文件移植: 添加文件至QT工程
soem += $$PWD/soem
INCLUDEPATH += \
$${soem}/soem_h\
$${soem}/wpcap/Include \
$${soem}/wpcap/Include/pcap\
LIBS += \
$${soem}/soem_lib/soem.lib \
$${soem}/soem_lib/wpcap/Lib/x64/Packet.lib \
$${seom}/soem_lib/wpcap/Lib/x64/wpcap.lib \
$${soem}/soem_lib/wpcap/Lib/Packet.lib \
$${soem}/soem_lib/wpcap/Lib/wpcap.lib \
在工程的pro文件中加入如上语句,将lib库和头文件加入工程中。添加方式有多种看个人喜好。编写一个简单的测试程序,编译发现报了许多错误。
CC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\ratio(73): error C2065: “INTMAX_MAX”: 未声明的标识符
:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\ratio(73): error C2065: “INTMAX_MAX”: 未声明的标识符
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\ratio(75): note: 参见对正在编译的 类 模板 实例化 "std::_Safe_add<_Ax,_Bx>" 的引用
在pro文件中加入:
DEFINES +=__STDC_LIMIT_MACROS
编译后报错
:-1: error: LNK1104: 无法打开文件“\wpcap\Lib\x64\wpcap.lib”
不太理解,别的库都没问题,就它不行,我把这句话注释掉了,通过右键->添加库的方式把这个库添加了一下。
编译后报错:
soem.lib(osal.c.obj):-1: error: LNK2019: 无法解析的外部符号 __imp_timeBeginPeriod,该符号在函数 osal_getrelativetime 中被引用
这还是缺少库,在main函数中添加
#pragma comment( lib, "Winmm" )
#pragma comment(lib,"ws2_32.lib")
编译后,这次没有问题了。
最终的pro文件所添加的东西如下:
soem += $$PWD/soem
INCLUDEPATH += \
$${soem}/soem_h\
$${soem}/wpcap/Include \
$${soem}/wpcap/Include/pcap\
LIBS += \
$${soem}/soem_lib/soem.lib \
$${soem}/wpcap/Lib/x64/Packet.lib \
# $${seom}/wpcap/Lib/x64/wpcap.lib \
$${soem}/wpcap/Lib/Packet.lib \
$${soem}/wpcap/Lib/wpcap.lib
DEFINES +=__STDC_LIMIT_MACROS
win32: LIBS += -L$$PWD/soem/wpcap/Lib/x64/ -lwpcap
win32:!win32-g++: PRE_TARGETDEPS += $$PWD/soem/wpcap/Lib/x64/wpcap.lib
(3)测试
编写了一个简单的测试代码,可以看到软件检测到了网卡,并成功将从站配置为OP状态。
测试代码链接https://github.com/IJustLoveMyself/csdn-example/tree/main/example3
第3章 SOEM编程
SOEM(Simple Open EtherCAT Master)提供了一组API(应用程序编程接口),用于开发基于EtherCAT的主站应用程序。
以下是SOEM库中一些常用的API函数:
-
ec_init:
该函数用于初始化EtherCAT主站。它初始化内部数据结构、打开EtherCAT适配器并初始化EtherCAT通信。 -
ec_config_init:
该函数用于初始化EtherCAT网络的配置。它设置EtherCAT网络的物理连接和从站设备的配置参数。 -
ec_config_map:
该函数用于指定EtherCAT通信数据的映射。它定义主站应用程序与从站之间的数据交换方式。 -
ec_slave→state:
该函数用于读取特定从站的状态(如PREOP、SAFEOP、OP等)。 -
ec_slave→outputs:
该函数用于读取或设置特定从站的输出数据。它可以用于向从站发送控制命令或设置从站的输出状态。 -
ec_slave→inputs:
该函数用于读取特定从站的输入数据。它可以用于获取从站传输的实际数据或反馈状态。 -
ec_send_processdata:
该函数用于发送主站的过程数据(Process Data)到从站。它将主站的输出数据发送到从站。 -
ec_receive_processdata:
该函数用于接收从站的过程数据。它读取从站的输入数据或状态反馈。 -
ec_writestate:
该函数用于将从站设置为指定的状态(如PREOP、SAFEOP、OP等)。 -
ec_close:
该函数用于关闭EtherCAT主站,释放资源并关闭与EtherCAT适配器的连接。
这些仅是SOEM库中部分常用的API函数示例。在实际开发中,您可以根据需求和网络配置使用其他API函数。为了深入了解SOEM库的API和使用方法,建议查阅SOEM的文档和示例代码。