CodeSys通过C函数接口调用Qt

1.背景介绍

建议先查看之前的文章【CodeSys中调用C语言写的动态库】,了解如何创建一个能够被codesys调用的动态库。
假如想要在函数中使用Qt或者第三方库(比如opencv等),可以在其自动生成的makefile文件中设置好相应的参数。
在这里插入图片描述

2.修改makefile

修改后的makefile:

##############################################################################
#	Copyright:		Copyright CODESYS Development GmbH
#	Program:		Extension API for the Linux SL products
##############################################################################

#
# with this makefile you can influence the build of your component 
#
#
# Hints:
#  - the name of the *Itf.m4 file in this folder will be used as name of the shared object (and component name)
#  - all C files in this folder will be compiled by default
# 

# set versions of your shared object
# must be single digit, decimal
MAJORVER=0
MINORVER=1

# set a component version (must match your IEC library version)
# must be 4 bytes, hexadecimal
CMPVERSION=0x01000000

# set a component ID 
# must be 2 bytes >= 0x2000 and hexadecimal and can be used to differentiate different components
CMPID=0x2000

# set your tools
DOS2UNIX = dos2unix
M4 = m4

# set a compiler
#CC = gcc
CC = g++


#INCLUDEPATH += /usr/include/opencv4
#LIBS += /usr/lib/x86_64-linux-gnu/libopencv_*.so          #添加库

# add some compiler flags (with += )
#CFLAGS += -g

# add some include paths (with +=)
#INCLUDES += -I.

# add some linker flags (with += )
#LDFLAGS += 

# add some libraries that you might need (with += )
#LDLIBS += -lc

# 为了能够使用opencv而做的一些设置
INCLUDES += -I/usr/include/opencv4\
			-I/usr/include/opencv4/opencv2
LDLIBS += /usr/lib/x86_64-linux-gnu/libopencv_*.so

# 必须要把自己创建的Qt静态库放前面,否则可能会报找不到某些函数的定义
# 这些函数的定义在后面的Qt动态库中,不知道为啥会出现这个情况
INCLUDES += -I/home/yong/Desktop/PLC/Library1/Qt/VisionLib
LDLIBS += /home/yong/Desktop/PLC/Library1/Qt/build-VisionLib-Desktop_Qt_5_15_2_GCC_64bit-Profile/libVisionLib.a

# #为了能够使用Qt而做的一些参数设置
INCLUDES += -I/opt/Qt/5.15.2/gcc_64/include\
		    -I/opt/Qt/5.15.2/gcc_64/include/QtCore\
		    -I/opt/Qt/5.15.2/gcc_64/mkspecs/linux-g++\
			-I/opt/Qt/5.15.2/gcc_64/include/QtRemoteObjects
LDLIBS += /opt/Qt/5.15.2/gcc_64/lib/*.so
LDFLAGS += -Wl,-rpath,/opt/Qt/5.15.2/gcc_64/lib

# include of the SDK makefiles
SDKDIR=/home/yong/Desktop/PLC/ExtensionSDK
include ${SDKDIR}/makefile


主要是做了三个修改:

2.1.将编译器由c改成c++

在这里插入图片描述

2.2.使能opencv库

在这里插入图片描述

2.3.使能Qt库

在这里插入图片描述
这里特别注意一下这个:-Wl,-rpath,/opt/Qt/5.15.2/gcc_64/lib,这条语句是指定了运行时搜索库的路径,没有这句的话,虽然可以编译通过,但是运行时codesys就直接报错,无法下载了。可以看看这个资料的介绍【GCC/G++选项 -Wl,-rpath=】
我是如何知道需要写这个的?我是从QtCreator的编译输出看到的:
在这里插入图片描述

3.在代码中使用Qt库函数

这样操作之后,在include对应的头文件后,就可以在函数中使用opencv、Qt了。
在这里插入图片描述

4.注意事项

4.1.复杂Qt功能(预编译等)的处理

在实际的操作中发现,这种方式虽然可以调用Qt的一般函数、一般的类。但是假如想声明、实例化自己的Qt类(带属性、信号、槽),还是得用qmake(进行预编译)来操作才行,单单一个gcc还是比较难做到。
所以,在上面介绍的基础上,我叠加了一种可控性更好的方式:用QtCreator将所需函数编译成静态库,再在对应的c文件中调用。这样既可以利用到QtCreator的便利,又保证了去耦性,为将来的分工合作提供了基础。而且静态库会编译到最终的*.so文件中,就不用携带多个*.so了,符合codesys的要求。(或者也可以通过-Wl,-rpath来解决?)

4.2.多线程的问题

貌似codesys通过这种方式调用的c接口里面,不支持多线程。假如强行创建貌似会出问题,比如卡住或者别的的问题,还得再研究、实验一下。

4.3.QApplication的使用

通过这种方式使用QApplication时,需要加上一句代码,否则会导致codeSys runtime崩溃退出:

---
qputenv("QT_QPA_PLATFORM", "offscreen"); // 加这句
QApplication app(argc, argv);
---

主要原因是我们编写的这个库默认是在无UI界面的的环境中运行的,而QApplication默认是以xcb之类的界面输出的。通过设置QT_QPA_PLATFORM =offscreen就没问题了。
或者你也可以使用QCoreApplication,但是,假如用的是QCoreApplication,那么在QPainter的drawText时会引发崩溃(可能还有其他坑)。最好还是使用QApplication。

CoDeSys 是一种功能强大的PLC软件编程工具,它支持IEC61131-3标准IL 、ST、 FBD 、LD、 CFC、 SFC 六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等。 CoDeSys是可编程逻辑控制PLC的完整开发环境(CoDeSys是Controlled Developement System的缩写),在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,系统的编辑器和调试器的功能是建立在高级编程语言的基础上(如Visual C++)。 现在国内PLC用户使用的版本多为CoDeSys V2.3, 最新的版本是CoDeSys V3。V3 在软件架构上有了很大的改善,朝安全软件的方向发展,目前正在申请TUV关于EN 61508的SIL认证。 CoDeSys软件还可以编辑显示器界面(Visualization),具有很多的控制模块(Motion),可以放置图片等强大的功能,典型的用户有ifm等。 CoDeSys功能总览:如何构建一个工程、怎么样构建一个工程、怎么样测试工程、调试、附加联机功能。CoDeSys的附加功能、工具等。 ABB Bachmann,IFM易福门,EPEC派芬,HOLLYSYS和利时,intercontrol的PROSYD1131,赫思曼公司iFlex 系列、力士乐的RC系列,TT control 公司TTC系列[1] 控制器等PLC厂家都是使用Codesys平台开发自己的编程软件的。 国内首家采用codesys平台的国产PLC 和声 HSC C3系列控制器也已大批量产业应用。 同时,也有运动控制厂家如:Scheider Electric, Banchman, GoogolTech在在使用Codesys平台开发自己的编程软件。 CoDeSys 软件商是德国Smart software solution GmbH,该公司位于德国巴伐利亚州肯普腾市。 这个是CoDeSys的编程手册,中文版的。希望大家享用。
### MODBUS主站开发教程与实现方法 MODBUS是一种广泛应用的工业通信协议,用于在电子控制器之间传输数据。以下是关于如何进行MODBUS主站开发的相关内容: #### 一、MODBUS主站的功能概述 MODBUS主站通常负责发起通信并读取或写入从站的数据。它可以支持多种通信方式,包括RTU、ASCII、TCP/IP等[^1]。通过这些协议,主站可以监控多个从站的状态,并执行必要的操作。 #### 二、开发环境的选择 不同的开发需求可能需要选择适合的开发工具和平台。以下是一些常见的选项: - **Modbus Master Emulator**: 这是一个多功能的仿真工具,能够模拟MODBUS主站的行为,适用于测试阶段。它支持多种协议类型,并能同时管理多个连接。 - **CODESYS EtherCAT Master**: 如果项目涉及更复杂的工业网络(如EtherCAT),则可以通过CODESYS集成MODBUS功能来完成主站开发[^2]。 - **Qt5.6 + libmodbus**: 对于希望基于C/C++构建应用程序的情况,在Windows环境下使用Qt框架配合libmodbus库是一个可行方案[^3]。 #### 三、具体实现步骤详解 虽然不建议按顺序描述过程,但仍需提及几个核心要点以便理解整个流程: - 配置硬件接口参数(波特率、校验位等)以匹配目标设备的要求; - 初始化所选API或者驱动程序实例化对象代表物理链路实体; - 编写函数调用命令去访问远程节点上的资源位置——即所谓的“寄存器”。 下面给出一段简单的Python代码示例展示如何利用pymodbus库来进行基本交互: ```python from pymodbus.client.sync import ModbusTcpClient as ModbusClient def read_holding_registers(ip_address, port=502): client = ModbusClient(host=ip_address, port=port) try: connection_status = client.connect() if not connection_status: raise Exception('Connection failed') result = client.read_holding_registers(address=0x00, count=10, unit=1) if hasattr(result, 'registers'): return result.registers finally: client.close() print(read_holding_registers('localhost')) ``` 此脚本尝试建立到指定IP地址的服务端链接并通过请求获取一批保持型寄存器中的数值列表作为响应结果返回给调用者处理显示出来。 #### 四、其他推荐资料 对于深入学习以及实际动手实践来说,“FreeModbus”提供了非常有价值的参考资料包涵完整的案例分析还有详细的指导手册帮助开发者快速掌握技巧[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值