[工业互联-19]:如何在QT中增加SOEM主站

2023-10-29

目录

第1章 基本步骤

第2章 详细步骤

2.1.QT安装

2.2.VS安装

2.3.Win10 Debuggers

2.4.QT配置

2.5. SOEM移植

(1)lib库生成

(2)文件移植: 文件整理


第1章 基本步骤

要在QT中添加SOEM主站功能,您需要完成以下步骤:

  1. 下载SOEM库:从SOEM的官方网站(https://github.com/OpenEtherCATsociety/SOEM)下载SOEM库的源代码。

  2. 编译SOEM库:根据您使用的操作系统和编译器,使用CMake或其他适当的构建工具编译SOEM库。

  3. 创建一个QT项目:在QT中创建一个新的项目或打开现有的项目。

  4. 添加SOEM库:将编译得到的SOEM库的头文件(.h)和库文件(.lib/.a)拷贝到您的QT项目中。

  5. 在QT项目中配置SOEM:在您的QT项目中,打开.pro文件(项目文件),将SOEM库的头文件路径和库文件路径添加到INCLUDEPATH和LIBS中。例如:

INCLUDEPATH += /path/to/soem/include
LIBS += -L/path/to/soem/lib -lsoem

  1. 在代码中使用SOEM:在您的QT项目中的代码文件中,包含SOEM的头文件,并使用SOEM提供的功能和API来初始化主站、配置网络、进行数据通信等操作。您可以参考SOEM的文档和示例代码来理解如何使用SOEM库。

  2. 构建和运行QT项目:使用QT的构建工具进行项目构建,并运行生成的可执行文件测试您的SOEM主站应用程序。

请注意:

添加SOEM主站功能并在QT中使用它需要您对SOEM库和EtherCAT协议有一定的了解

在开始之前,建议先熟悉SOEM库的文档和示例,以及EtherCAT网络和通信协议的基本概念。

这将有助于您更好地集成SOEM主站功能到您的QT项目中。

第2章 详细步骤

2.1.QT安装

QT安装十分简单,因为我这个是离线版本,所以电脑不联网安装的时候不需要登陆账号。在这里需要选择MSVC编译器,后面工程编译需要使用MSVCMinGW不行。其他的模块看你需要,我后面可能需要画波形图,所以勾选了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.exesimple_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_hsoem_lib文件夹中拷贝文件了。

  1. 拷贝build文件夹中生成的soem.lib文件到soem_lib文件夹
  2. 拷贝SOEM源码文件夹中soem下的头文件到soem_h文件夹
  3. 拷贝SOEM源码文件夹中oshw\win32下的头文件到soem_h文件夹,wpcap已经拷贝过了,不需要再拷贝了。
  4. 拷贝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函数:

  1. ec_init:
    该函数用于初始化EtherCAT主站。它初始化内部数据结构、打开EtherCAT适配器并初始化EtherCAT通信。

  2. ec_config_init:
    该函数用于初始化EtherCAT网络的配置。它设置EtherCAT网络的物理连接和从站设备的配置参数。

  3. ec_config_map:
    该函数用于指定EtherCAT通信数据的映射。它定义主站应用程序与从站之间的数据交换方式。

  4. ec_slave→state:
    该函数用于读取特定从站的状态(如PREOP、SAFEOP、OP等)。

  5. ec_slave→outputs:
    该函数用于读取或设置特定从站的输出数据。它可以用于向从站发送控制命令或设置从站的输出状态。

  6. ec_slave→inputs:
    该函数用于读取特定从站的输入数据。它可以用于获取从站传输的实际数据或反馈状态。

  7. ec_send_processdata:
    该函数用于发送主站的过程数据(Process Data)到从站。它将主站的输出数据发送到从站。

  8. ec_receive_processdata:
    该函数用于接收从站的过程数据。它读取从站的输入数据或状态反馈。

  9. ec_writestate:
    该函数用于将从站设置为指定的状态(如PREOP、SAFEOP、OP等)。

  10. ec_close:
    该函数用于关闭EtherCAT主站,释放资源并关闭与EtherCAT适配器的连接。

这些仅是SOEM库中部分常用的API函数示例。在实际开发中,您可以根据需求和网络配置使用其他API函数。为了深入了解SOEM库的API和使用方法,建议查阅SOEM的文档和示例代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[工业互联-19]:如何在QT中增加SOEM主站 的相关文章

随机推荐

  • 关于PHPstorm打开laravel的代码提示的工具的方法

    关于PHPstorm打开laravel的代码提示的工具的方法 1 composer 安装 composer require barryvdh laravel ide helper 2 生成模型的工具 php artisan ide help
  • vlc集成c#_c#的一个视频播放库的封装-VLC.DotNet

    VLC的强大是众所周知的 如果你不知道 那你现在就知道了 FFMPEG和VLC的关系 VLC调用了FFMPEG的库 FFMPEG和libav的关系 libav是FFMPEG的开发人员中独立出来一部分后创建的一个新的工程 以上都是段子 没有深
  • QT 鼠标形状设置

    QT提供了十分便捷的设置鼠标形状的方法 在QT界面的根类QWidget中有QCursor cursor void setCursor QCursor void unsetCursor 三个方法 因而对于一切直接或间接继承自QWidget的控
  • Java缓存 @上源码

    用途 提高响应速度 减轻后台处理负担 分类 1 前端 客户端浏览器缓存 CDN加速 代理服务器缓存 nginx 2 后端 本地缓存 Guava Cache Ehcache 分布式缓存 Memcache Redis 数据库缓存 按照存放介质类
  • 奥的斯服务器故障显示m什么意思,奥迪斯电梯故障代码对照表 奥的斯电梯故障解决方法...

    刚从事电梯维保行业 我们除了培训中系统的学习外 实践中总结出来的窍门和技巧同样重要 当我们所见的故障案例和维修的电梯比较多的时候 经验及自然来了 这就是我们经常说熟能生巧 下面是diantijob小编整理的关于奥的斯电梯常见的故障代码和故障
  • h5移动端,通过监听路由回退事件关闭弹窗

    最近在做一个商城项目 项目设计是在移动端浏览器上使用 目前先不内嵌在app内部 在做商品详情页的时候 也调研了其他的app交互 其中有一个交互是在商品详情页 点击当前商品包含的服务详情按钮 会弹窗 点击返回按钮或者手机自带的返回 会关闭弹窗
  • 前后端分离--用户注册功能的实现

    爱旅行 用户注册 Object Obj application getAttribute active itripUser getUserCode 不能 toString 可能obj的值为空 就会出现异常 String activeCode
  • matlab最小分类错误全局二值化算法

    转自 http download csdn net detail hupeng810 1511870 function imagBW kittlerMet imag KITTLERMET binarizes a gray scale ima
  • git clone 遇到问题:fatal: unable to access ‘https://github.comxxxxxxxxxxx‘: Failed to connect to xxxxxxx

    git clone 遇到问题 fatal unable to access https github comxxxxxxxxxxx Failed to connect to xxxxxxxxxxxxx
  • ContOS7镜像下载与安装

    contos7的安装 文章目录 contos7的安装 一 镜像下载 二 安装 一 镜像下载 官网下载链接 http isoredirect centos org centos 7 isos x86 64 阿里云镜像站点 http mirro
  • Vite跨域设置

    Vite跨域设置 步骤一 vite config ts配置 proxy 跨域代理 apis target http env VUE APP BASE API target http url port changeOrigin true re
  • 一起学nRF51xx 6 - uart

    前言 通用异步接收器 发送器提供快速 全双工 内置流量控制的异步串行通信 CTS RTS 在硬件方面支持高达1Mbps波特率 支持奇偶校验和第9位数据生成 用于每个UART接口线的GPIO可从芯片上的GPIO中任选 而且可独立配置 这使得芯
  • CentOS8基础篇3:使用vim编辑文档

    一 vim编辑器 vim 编辑器共有三种工作模式 分别是命令模式 输入模式和末行模式 例2 24 使用vim编辑器创建并编辑文件hello c 二 查看文件内容命令 1 more less 浏览文件全部内容 当文件内容过多时 可以用more
  • 2.2析取范式与合取范式

    2 2析取范式与合取范式 本节给出命题公式的两种规范表示方法 这种规范的表达式能表达真值表所能提供的一切信息 定义2 2命题变项及其否定统称作文宇 仅由有限个文字构成的析取式称作简单析取式仅由有限个文字构成的合取式称作简单合取式 P g p
  • [正能量系列]失业的程序员(三)

    注 本文原型为作者的好友们 全文不完全代表作者本人的意图 本系列前两章 失业的程序员 一 二 一 这段时间我去参加了一个管理培训班 说实话去之前真的很痛苦 我一向认为那些都是骗人的玩意儿 在qq上找我学姐吐槽 说现在的广告真烦 搞这么多培训
  • Qt注册自定义类型

    一 自定义类型注册必要性 如果要在Qt信号槽中使用自定义类型 需要注意使用qRegisterMetaType对自定义类型进行注册 当然在不跨线程时使用自定义类型signal slot来传递 可能不会出现什么问题 一旦涉及跨线程就很容易出错
  • SPSS(基础篇09)--拆分数据文件

    拆分数据文件 文章目录 拆分数据文件 前言 1 在原始文件中拆分 1 1 拆分文件 比较组 1 2 拆分文件 按组来组织输出 1 3 其它用法 2 直接存储为多层 拆分结果单独存为文件 前言 导语 拆分文件是一种很常见的操作 比如 一个数据
  • 关于loss.backward()函数反向传播时叶子节点被释放

    之前写代码的时候遇到的一个问题 一直没有解决 后来稀里糊涂的解决了 我也不知道原因 这里贴出来 希望大家遇到这个问题的时候能有些启发 图来自网上搜索 由于问题是很久以前的了 当时没有保存截图 抱歉了 这个问题的出现其实可以将 loss ba
  • spring-aop组件详解——TargetSource目标源

    TargetSource 目标源 是被代理的target 目标对象 实例的来源 TargetSource被用于获取当前MethodInvocation 方法调用 所需要的target 目标对象 这个target通过反射的方式被调用 如 me
  • [工业互联-19]:如何在QT中增加SOEM主站

    目录 第1章 基本步骤 第2章 详细步骤 2 1 QT安装 2 2 VS安装 2 3 Win10 Debuggers 2 4 QT配置 2 5 SOEM移植 lib库生成 2 文件移植 文件整理 第1章 基本步骤 要在QT中添加SOEM主站