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

news2024/12/27 1:30:19

目录

第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的文档和示例代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用OpenCV创建一张灰度黑色图像并设置某一列为白色

这段代码首先创建了一个400行600列的单通道灰度图像。然后,它遍历图像中的每个像素。如果像素位于列索引为30的列中,则将该像素的值设置为255。在灰度图像中,0表示黑色,255表示白色。因此,这段代码将图像的第30列设置为白色。 在 OpenCV 中,cv::Mat 构造函数的调用 cv::…

【算法 -- LeetCode】(13)罗马数字转整数

1、题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

哈希表和字符串专题1—205. 同构字符串 1002. 查找共用字符 925. 长按键入 844.比较含退格的字符串 C++实现

文章目录 205. 同构字符串1002. 查找共用字符925. 长按键入844.比较含退格的字符串栈模拟双指针 205. 同构字符串 class Solution { public:bool isIsomorphic(string s, string t) {unordered_map<char, char> map1;unordered_map<char, char> map2;for(int i0, j…

AI绘画:StableDiffusion炼丹Lora攻略-实战萌宠图片生成

Lora攻略-实战萌宠图片生成 写在前面的话一&#xff1a;准备二、Lora作用1.AI模特2.炼衣服Lora3.改变画风/画面背景Lora模型究竟是什么&#xff1f; 三、如何炼制自己的Lora模型&#xff1f;四、炼丹前的准备&#xff08;**下载整合包**&#xff09;五、选择合适的大模型六、高…

管理类联考——逻辑——记忆篇——数字编码——公式

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

MySQL练习题(2)

创建如下员工标表 插入数据 1-- 按员工编号升序排列不在10号部门工作的员工信息 2-- 查询姓名第二个字母不是A且薪水大于1000元的员工信息&#xff0c;按薪水降序排列 4-- 求每个部门的平均薪水 5-- 求每个部门的最高薪水 6-- 求每个部门…

Coverity 2021.9 for win Coverity 2022.6 for linux

Coverity是一款快速、准确且高度可扩展的静态分析 (SAST) 解决方案&#xff0c;可帮助开发和安全团队在软件开发生命周期 (SDLC) 的早期解决安全和质量缺陷&#xff0c;跟踪和管理整个应用组合的风险&#xff0c;并确保符合安全和编码标准。Coverity 是一款精确的综合静态分析与…

JVM04-优化JVM内存分配以及内存持续上升问题和CPU过高问题排查

1-JVM内存分配 1.1-JVM内存分配性能问题 JVM内存分配不合理最直接的表现就是频繁的GC&#xff0c;这会导致上下文切换等性能问题&#xff0c;从而降低系统的吞吐量、增加系统的响应时间。因此&#xff0c;如果你在线上环境或性能测试时&#xff0c;发现频繁的GC&#xff0c;且…

密码学入门——分组密码模式

文章目录 参考书一、简介二、ECB模式三、CBC模式四、CFB模式五、OFB模式六、CTR模式 参考书 图解密码技术&#xff0c;第三版 一、简介 分组密码工作模式指的是将明文分成固定长度的块&#xff0c;并对每个块应用相同的加密算法进行加密的过程。这些块的长度通常是64位或128…

leetcode 654. 最大二叉树

2023.7.9 又是一道递归构造二叉树的题&#xff0c;和昨天做的那道题从中序与后序遍历序列构造二叉树类似&#xff0c;5分钟AC了。 大致思路就是通过找到数组中的最大值&#xff0c;并将其作为根节点&#xff0c;然后递归地构建左子树和右子树&#xff0c;最终返回整个最大二叉树…

PMP项目管理-敏捷

敏捷知识体系&#xff1a; 传统项目特点 1> 一开始就对详细的需求进行很高的投入 2> 价值只有到项目结束的时候才能体现, 风险较高 3> 一开始就要编写很多的文档 4> 客户参与度不高, 澄清完需求之后基本不参与 5> 需要花大量的时间来汇报当前的项目状态 6> 无…

Freertos-mini智能音箱项目---IO扩展芯片PCA9557

项目上用到的ESP32S3芯片引脚太少&#xff0c;选择了PCA9557扩展IO&#xff0c;通过一路i2c可以扩展出8个IO。这款芯片没有中断输入&#xff0c;所以更适合做扩展输出引脚用&#xff0c;内部寄存器也比较少&#xff0c;只有4个&#xff0c;使用起来很容易。 输入寄存器 输出寄存…

线程本地变量交换框架-TransmitterableThreadLocal(阿里开源)

上文 &#xff1a;秒级达百万高并发框架-Disruptor TransmitterableThreadLocal介绍 TransmitterableThreadLocal简称TTL 是阿里巴巴开源的一个框架。TransmittableThreadLocal是对Java中的ThreadLocal进行了增强和扩展。它旨在解决在线程池或异步任务调用链中&#xff0c;Thre…

MAC电脑查看SHA256方式

背景 现在很多网站下载大文件时&#xff0c;以往通过查看文件大小来确定是否下载正确&#xff0c;但是很多情况下&#xff0c;文件下载后大小差不多&#xff0c;但是很多时候却时候出现无法安装的问题&#xff0c;有可能还是下载的文件出现错误&#xff0c;导致文件无法正常使…

机器学习 day25(softmax在神经网络模型上的应用)

输出层采用softmax 在识别手写数字的模型中&#xff0c;预测y只有两个结果&#xff0c;所以输出层采用sigmoid激活函数且只有一个神经元。若预测y有10个结果&#xff08;0-9&#xff09;&#xff0c;该模型的前向传播计算方式与识别数字的模型完全相同&#xff0c;即隐藏层的…

dubbo概念及基本架构

一. Dubbo概念 1、Dubbo是一个开源的高性能&#xff0c;轻量级的Java RPC框架 RPC&#xff1a;远程服务调用 2、RPC的远程服务调用和SOA的服务治理两种功能。 二. Dubbo架构 0、服务提供方首先启动 1、服务提供方启动后&#xff0c;将其注射到注册中心里 2、消费者想调用提供…

线程随机性

目录 线程随机性的展现 执行start()的顺序不代表执行run()的顺序 在使用多线程技术时&#xff0c;代码运行的结果与代码执行顺序或者调用顺序无关。线程是一个子任务&#xff0c;而CPU是以不确定的方式&#xff0c;或者说是以随机的时间来调用线程中的run方法的。所以说线程执…

nvm 下载nodejs 失败

解决办法&#xff1a; 1.查看nvm安装路径 nvm root2、在安装路径下找到setting.txt,添加两句话 node_mirror: http://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/3.再执行nvm install 就可以了。

【uniapp开发小程序】实现读取手机剪切板第一条,识别并以姓名/手机号/收货地址格式输出

效果图&#xff1a; 完整代码&#xff1a; <template><view class""><text>测试</text><view click"pasteContent()" class"content">点击此处可快速识别 您的收货信息</view></view> </templat…

使用chatGPT + AI 绘图生成自己的专属头像

案例介绍 微信头像是朋友认识我们时的第一印象,或许是可爱、妖娆,或许是帅气、成熟,还有自然、厚重、调皮… 我们都有自己独特的故事,独特的思想,独特的爱好,对于头像当然有着自己独到的设计眼光。 接下来请允许我向大家展示如何使用chatGPT、AI绘图工具生成出自己的专属…