CodeSys中调用C语言写的动态库

文章目录

  • 1.前言
  • 2.前期准备
  • 3.创建CodeSys库工程
    • 3.1.函数名必须包含_cext
    • 3.2.生成m4、c文件
  • 4.搭建编译环境,编译出动态库*.so
    • 4.1.将ExtensionSDK文件夹拷贝到板子的一个目录中。
    • 4.2.创建工程目录,且将前面生成的m4、c文件拷贝到这个工程目录下
    • 4.3.执行make
    • 4.4.实现函数
    • 4.5.执行编译
  • 5.将*.so文件导入到库工程中
  • 6. 将库工程另存为编译库
  • 7.安装并使用编译好的库
  • 8.结语

1.前言

假如我们需要在CodeSys的编程环境中使用我们自己的功能,比如:用第三方的IO板卡通讯、PDF文件生成、相机采集图像并处理等等一些复杂的功能,那就可以使用CodeSys提供的【Extension SDK】功能,通过C语言动态库接口来实现。
这里简单记录一下如何创建能够被CodeSys识别的C语言动态库。

2.前期准备

这里我运行codesys runtime的环境是一个arm64板子,板子上已经安装好了gcc等编译工具链。(一开始我是打算直接在本地的win x64上搞得,但是官方提供的例子是在linux上操作的,那我只好用arm开发板了)
在这里插入图片描述
通过CodeSys开发环境安装的runtime
在这里插入图片描述

3.创建CodeSys库工程

参考这里【CodeSys V3.5创建一个编译库】,创建一个Library工程。
需要注意的是,一定要按照上面例程的流程:先创建标准工程–》工程另存为*.Library文件。只有这样才不会在将工程另存为编译库时报错(会报文档生成库未安装之类的错误),具体我也不知道为啥。
假如直接创建Library工程,然后在工程另存为编译库时报错,就需要安装CODESYS Library Documentation Support:
在这里插入图片描述

在程序组织单元页面中添加POU(函数),注意我们目前是只能通过C的库调用函数,暂时还不能实例化C++的类,但是C的库里面可以包含C++的内容,只要导出到库的函数是C的形式就行,这个可以等下看看我的C文件就知道什么意思了。
在这里插入图片描述

3.1.函数名必须包含_cext

创建函数的时候,函数名必须要包含_cext,否则在后面编译时会报错。
在这里插入图片描述创建好函数并且定义好输入变量、返回值后,在函数节点上右键-》属性-》编译中勾选外部实现。

在这里插入图片描述

3.2.生成m4、c文件

创建好函数后,就可以根据函数导出m4、c文件了。
点击编译-》生成运行时系统文件
在这里插入图片描述

然后选择好文件夹、勾选M4、C,然后点击确定,就可以得到m4、c文件了。
在这里插入图片描述在这里插入图片描述

4.搭建编译环境,编译出动态库*.so

根据【Extension SDK】的指导,
在这里插入图片描述

4.1.将ExtensionSDK文件夹拷贝到板子的一个目录中。

我的这个文件夹是在【C:\Program Files\CODESYS 3.5.19.60\CODESYS\CODESYS Control SL Extension Package\4.10.0.0】里面,具体要看你的CodeSys的安装目录在哪里。
在这里插入图片描述
然后我将其拷贝到板子的一个目录下:

在这里插入图片描述

4.2.创建工程目录,且将前面生成的m4、c文件拷贝到这个工程目录下

我在板子的目录下创建的myPrj文件夹,然后将m4、c文件拷贝到了里面,如下图所示:
在这里插入图片描述

4.3.执行make

cd 到myPrj目录,然后执行

make -f ../ExtensionSDK/makefile newproject

然后就会在此文件夹中生成make文件
在这里插入图片描述

4.4.实现函数

打开c文件,对函数进行实现。
在这里插入图片描述

4.5.执行编译

在对C文件进行实现后,便可以进行编译了。

make all

此时会报错
在这里插入图片描述因为它默认使用的编译器是gcc,是c语言的编译器,而我们在C文件中用到了C++的东西string,所以就报错了。
因此我们还需要改一下make文件,将CC = gcc改成 CC = g++。假如你对make语法熟悉,也可以改一下其他的。
在这里插入图片描述再编译就没问题了。
在这里插入图片描述于是,便在out文件夹中得到了*.so文件。在这里插入图片描述

5.将*.so文件导入到库工程中

将在板子上编译得到的so文件,拷贝到我们的windows电脑上,然后在工程中导入。
在这里插入图片描述点击C实现库-》添加-》选择so文件。
在这里插入图片描述但是此时一般会报错:
在这里插入图片描述
库命名空间可以在这里看:
工程信息-》标题
在这里插入图片描述比如我这里是ZY1,那么,so文件就要改成以这个进行结尾:
在这里插入图片描述
好,没问题了,记得要选择正确的设备。
在这里插入图片描述这样,函数的实现就有了。
在这里插入图片描述

6. 将库工程另存为编译库

在这里插入图片描述

然后就得到了我们适用于ARM64的库了
在这里插入图片描述

7.安装并使用编译好的库

我们新建一个标准工程、并且安装、调用刚才的库
在这里插入图片描述在这里插入图片描述在这里插入图片描述执行并查看一下函数有没按照预期运行:
我们的C函数实现的是:a、将传递进来的字符串加上"Hello World and ZY"后保存到返回值b中;b、对返回值a赋值17909;c、对返回值c赋值1.23456.

#include "CmpStd.h"
#include "CmpErrors.h"
#include "CmpItf.h"
#include "FileTransferDep.h"

#include <string>

void CDECL CDECL_EXT myfunction_cext(myfunction_cext_struct *p)
{
    std::string aStr = p->a;
    aStr += "Hello World and ZY";

    p->MyFunction_cext.a = 17909;
    
    memcpy(p->MyFunction_cext.b, aStr.c_str(), aStr.length() + 1);
    
    p->MyFunction_cext.c = 1.23456;
}

可以看到,与预期效果一致。

在这里插入图片描述而且在我们的板子上,可以看到刚才包含进来的库文件已经被上传到板子的特定文件夹中了:
在这里插入图片描述

8.结语

有了这个接口,只要我们对OpenCV、相机驱动库等进行封装,然后提供对应的操作函数给接口,就可以实现PLC的视觉检测功能。完美。

参考:
【CodeSys V3.5创建一个编译库】
【Extension SDK】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚信安慧AntDB数据库与流式处理的有机融合

流式处理的概念 2001年9月11日&#xff0c;美国世贸大楼被袭击&#xff0c;美国国防部第一次将“主动预警”纳入国防的宏观战略规划。而IBM作为当时全球最大的IT公司&#xff0c;承担了大量基础支撑软件研发的任务。其中2009年正式发布的IBM InfoSphere Streams&#xff0c;就是…

R语言——条形图数据可视化的多种方式

本文章将会介绍如何使用R语言中的ggplot2包使用条形图进行数据可视化。将会使用一个“生产企业原材料的订购与运输”的订单数据&#xff0c;该数据来自2021数学建模国赛C题。 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料总体可分为 A B C 三种类…

密码学系列(四)——对称密码2

一、RC4 RC4&#xff08;Rivest Cipher 4&#xff09;是一种对称流密码算法&#xff0c;由Ron Rivest于1987年设计。它以其简单性和高速性而闻名&#xff0c;并广泛应用于网络通信和安全协议中。下面是对RC4的详细介绍&#xff1a; 密钥长度&#xff1a; RC4的密钥长度可变&am…

影像仪激光扫描功能,无缝连接2D/3D混合测量

在现代工业生产领域&#xff0c;影像仪用于质量控制和产品检测&#xff0c;是一个不可或缺的工具。它通过高精度的成像和图像处理技术&#xff0c;可以及时发现产品的缺陷和异常&#xff0c;以保证产品质量的稳定性和一致性。 影像仪的重要性及其面临的挑战 在工业生产方面&a…

分段与分页,LDT与GDT,页目录表与页表简单的认识

综合四篇文章看下分段与分页机制&#xff1a; 分段&#xff1a;LDT与GDT 分页&#xff1a;页目录表与页表 首先明确两个结论&#xff1a; 1.cr3里保存页目录表的基址的地址类型为物理地址&#xff0c;页目录表里的每一项也是页表的物理地址。 2.gdtr的地址和gdt里的描述符里的…

MySQL:开始深入其数据(一)DML

在上一章初识MySQL了解了如何定义数据库和数据表&#xff08;DDL&#xff09;&#xff0c;接下来我们开始开始深入其数据,对其数据进行访问&#xff08;DAL&#xff09;、查询DQL&#xff08;&#xff09;和操作(DML)等。 通过DML语句操作管理数据库数据 DML (数据操作语言) …

Vue3列表触底请求(上手体验hooks新特性)

今天我们来聊一聊业务开发中的触底请求&#xff0c;其实就是分页的一种&#xff0c;只不过传统的分页感觉很丑而已&#xff0c;正好我的小博客最近在做触底分页&#xff0c;借此机会来说一说具体怎么实现的&#xff0c;以及来带领大家使用一下Vue3中的新特性hooks函数。 案例和…

uniapp小程序uView自定义tabbar

两年没接触小程序&#xff0c;又重新拾请来 前言 工具&#xff1a;HBuilder X 3.99版本 微信开发者工具 1.06 语言&#xff1a;vue2 uView 一、创建项目 先使用HBuilder X工具创建一个空白uni-app项目 uviewTest 二、安装和配置 HBuilder X找到工具-》插件安装-》插件市场 u…

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…

vscode不能远程连接ubuntu18.04.6

目录 问题解决Portable Mode 安装vscode 补充说明学习资料 问题 vscode远程ssh连接ubuntu18.04.6时&#xff0c;出现如下提示框&#xff0c;单击Learn More后&#xff0c;定位到问题。Can I run VS Code Server on older Linux distributions? 原始是&#xff1a;需要glibc …

Mac 配置Clion Qt 调试显示变量值

背景 使用Clion开发Qt程序&#xff0c;在进行调试时&#xff0c;会看不到Qt类的变量值&#xff0c;只有指针形式&#xff0c;对于调试很不方便。 环境&#xff1a; Macbook ProCPU&#xff1a;M3Qt 5.15.13CLion 2023.3.4 解决方案 为了让Clion能显示Qt类的值&#xff0c;…

Ubuntu常用状态命令

目录 一、温度 1&#xff0c;查看CPU温度 2&#xff0c;查看硬盘温度 二、CPU状态 1&#xff0c;显示CPU的详细信息&#xff0c;包括型号、频率、缓存等 2&#xff0c;显示CPU架构、CPU核心数、线程数、频率等信息 三、登录状态 1&#xff0c;查看成功登录的用户 2&am…

4核8g服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

【代码解读】OpenCOOD框架之model模块(以PointPillarFCooper为例)

point_pillar_fcooper PointPillarFCooperPointPillarsPillarVFEPFNLayerPointPillarScatterBaseBEVBackboneDownsampleConvDoubleConv SpatialFusion检测头 &#xff08;紧扣PointPillarFCooper的框架结构&#xff0c;一点一点看代码&#xff09; PointPillarFCooper # -*- c…

在两台CentOS 7服务器上部署MinIO集群---准确

环境说明&#xff1a; 2台Centos7服务器 IP地址分别为172.16.1.9和172.16.1.10 1. 创建minio用户和目录 在两台服务器上执行以下命令&#xff1a; sudo useradd -m -d /app/minio minio sudo mkdir -p /app/minioData sudo mkdir -p /app/minio/logs sudo chown -R mini…

数据结构与算法(数组,栈,队列,链表,哈希表,搜索算法,排序算法,查找算法,策略算法,递归算法,二叉搜索树BST,动态规划算法)

文章目录 1 课程介绍1.1 前置知识1.2 为什么要学习算法1.3 大厂面试常见数据结构题目(基础)1.4 数据结构和算法的关系 2 数据结构2.1 数据结构概述2.1.1 数据结构是什么2.1.2 数据结构分类2.1.2.1 线性结构2.1.2.2 非线性结构2.1.2.3 小总结 2.1.3 数据结构范围 2.2 数组Array2…

leetcode 2.27

leetcode hot 100 哈希1.字母异位词分组2.最长连续序列 双指针1.盛最多水的容器2.和为 K 的子数组 数组1.除自身以外数组的乘积 哈希 1.字母异位词分组 49. 字母异位词分组 方法一&#xff1a;排序 由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符…

Redis之一: 简介及环境安装搭建

什么是NoSQL? NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。&#xff08;例如谷歌或Facebook每天为他们的用户收集万亿比特的数据&#xf…

python:时间序列谐波拟合与残差分析(利用最小二乘法确定模型参数)

作者&#xff1a;CSDN _养乐多_ 在科学研究中&#xff0c;经常需要对实验数据进行拟合&#xff0c;以找出其中的规律。本文介绍了如何使用Python中的NumPy、Matplotlib和SciPy库进行谐波拟合&#xff0c;并对拟合结果进行残差分析。 从下图可以看出&#xff0c;谐波拟合曲线…

Python算法100例-2.6 分糖果

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.运行结果 1&#xff0e;问题描述 10个小孩围成一圈分糖果&#xff0c;老师分给第1个小孩10块&#xff0c;第2个小孩2块&#xff0c;第3个小孩8块&…