CodeSys中动态切换3D模型

news2024/9/21 8:02:50

文章目录

  • 需求
  • 研究
  • 结果

需求

在前面的【CodeSys开发3d机械臂显示控件】中,我们已经实现了一个可以显示3d模型的控件。但是这个控件是和使用的3d模型绑定死的,在安装这个控件时就已经将模型文件于控件一起安装到codesys中。
假如我想在不同的工程中,对这个控件动态地指定不同的模型,该怎么实现?

研究

首先,不同的工程,把不同的模型文件包含进来是没问题的,因为codesys本身就支持导入文件资源到工程:
在这里插入图片描述
在这里插入图片描述
导入进来的文件也可以进行读、写、复制、删除等操作,【CODESYS开发教程10-文件读写(SysFile库)】。

然后,我们到PLC中的网页控件页面看看,路径为PlcLogic/visu:
在这里插入图片描述前面创建3d控件时,我们提到获取模型文件的二进制数据是利用window.CDSWebVisuAccess.getBinaryFile这个函数来实现的,而这个函数会根据输入的原始的文件名去查找实际的文件名。那原始文件名和实际文件名的对应关系在哪里呢?
在这个application.nativeelements.json文件中
在这里插入图片描述在这里插入图片描述好。先总结一下我们掌握的信息:

1.可以将文件拷贝到PLC中
2.IEC代码可以实现对PlcLogic文件夹中的任意文件进行操作(读、写、删除、复制等)
3.在html控件中访问文件只能通过固定的接口进行。
4.html控件的原始文件名与实际文件名可查。

那么,基于以上事实,我们可以这样实现我们动态更换3D控件的模型:

1.控件使用一个默认模型,假设文件名为myRobot.glb
2.在IEC代码中,通过读取application.nativeelements.json文件的内容,查找myRobot.glb对应的是哪个文件,假设是myRobot123.glb。
3.在IEC代码中,将我们下载到PLC的,准备用来替换原来模型的新模型文件newRobot.glb,拷贝覆盖到原来的模型myRobot123.glb(注意保留myRobot123.glb这个名字,也就是内容覆盖,但是名字不变)。

这样,html控件在加载模型时,就会按照文件路径来加载数据,从而加载了新模型。
下面这个是经过测试的代码:
这个是函数代码。

FUNCTION ReplaceRobotModel : UDINT
VAR_INPUT
	modelFile : STRING(128);
END_VAR
VAR_OUTPUT
END_VAR
VAR
	hFile          : SysTypes.RTS_IEC_HANDLE;//句柄
    iecResult      : SysTypes.RTS_IEC_RESULT;//记录函数执行的结果
	udiSize		   : LWORD; //用来存储文件的大小
	udiRead        : __XWORD;
	
	configFileName : STRING(128) := 'visu/application.nativeelements.json';
	jsonText : STRING(65535) := '';
    startIndex, endIndex : INT;
    targetKey : STRING := 'zygeneralrobot.glb';
	
	targetValue : STRING(128);
	
	targetFile 	: STRING(128) := 'visu/';
	udiCopied   : __XWORD;
	cpResult : RTS_IEC_RESULT;
END_VAR
-------

// 文件的操作 https://blog.csdn.net/halps/article/details/128974489    
	targetValue := configFileName;
	
	hFile := SysFileOpen(szFile:=configFileName, am:=SYSFILE.AM_READ , pResult:=ADR(iecResult));
	
    IF hFile = RTS_INVALID_HANDLE    THEN 
		ReplaceRobotModel := -1;
		RETURN;
	END_IF
	
	 //hFile不是无效句柄,说明成功打开文件  
	//SysFileGetSize函数获取文件的大小,并将结果存储在udisize变量中
	udisize := SysFileGetSize(szFileName:=configFileName, pResult:=ADR(iecResult));
	
	//将文件中的内容读取到指定的缓冲区中。成功读取时,将返回udiRead表示实际读取的字节数,失败时将返回错误代码,并将错误状态存储在iecResult变量中。
	//pbyBuffer是用于存储读取内容的缓冲区
	//ulSize是要读取的字节数
 	//pResult: 这是指向结果的指针,用于接收操作的结果状态。
	udiRead := SysFileread(hFile:=hFile, pbyBuffer:=ADR(jsonText), ulSize:=udiSize, pResult:=ADR(iecResult));
	
	//关闭文件
    iecResult  := SysFileClose(hFile:=hFile);
	
	startIndex := strfindA(ADR(jsonText), ADR(targetKey), 0) + len(targetKey) + 4;  // 添加引号和冒号的长度
	endIndex :=  strfindA(ADR(jsonText), ADR('"'), startIndex) - 1; // 找到下一个引号的位置,减去1得到值的末尾
	IF startIndex > 0 AND endIndex > 0 THEN
	    strMidA(ADR(jsonText), 65535, endIndex - startIndex + 1, startIndex, ADR(targetValue), 255);
	END_IF;

	// 复制替换文件
	StrConcatA(ADR(targetValue), ADR(targetFile), 128);
	cpResult := SysFileCopy(targetFile, modelFile, ADR(udiCopied));
	ReplaceRobotModel := cpResult;
	RETURN;
		

调用。里面的’Application/robotArm.glb’就是新模型存放的位置。

PROGRAM READ_PRG
VAR
	modelFileReplaced : BOOL := FALSE;
	replaceFileResult : UDINT := -123;
END_VAR
------

IF modelFileReplaced = FALSE THEN
	modelFileReplaced  := TRUE;
	replaceFileResult := ReplaceRobotModel(modelFile:= 'Application/robotArm.glb');
END_IF

结果

一番操作后,成功了50%。
意思是:在通过浏览器访问(http://127.0.0.1:8080)PLC的界面时,3d控件中的模型的确是新的模型;但是在CodeSys的编程软件的Visualization页面,显示的还是旧的模型。
不知道为啥。无论在visu中覆盖什么文件,甚至把这个visu文件夹都删除掉,都影响不了Visualization页面。
这应该就说明了,这个Visualization页面,应该是有一个独立的文件夹,但是不知道在哪里。哪怕我用everything来搜关键文件,都没有搜到。
当我用不同的模型时,编译出来的Application.app、Application.core、Application.crc的大小并没有明显的变化,所以资源应该没有被直接编译进文件中。神奇,真相究竟藏在哪里?

之前试过将模型数据编码成base64字符串,然后将字符串变量发送给html控件的,成功了100%,但是,传输的时间太长,20M的模型都要几分钟,感觉鸡肋。有兴趣的可以看看这里:【CodeSys中将文件读取并进行base64编码后存放于string】


参考:
【CODESYS开发教程10-文件读写(SysFile库)】

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

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

相关文章

Numpy中type()、ndim、shape、size、dtype、astype的用法

目录 numpy基础介绍示例分析及总结:itemsize、nbytes函数 numpy基础介绍 Numpy 补充了Python语言所欠缺的数值计算能力,是其它数据分析及机器学习库的底层库。因其完全标准C语言实现,运行效率充分优化。最重要一点是开源免费。numpy的核心是矩阵&#x…

思维导图怎么画好看又简单?5个软件帮助你快速进行思维导图绘制

思维导图怎么画好看又简单?5个软件帮助你快速进行思维导图绘制 思维导图是一种有效的思维整理和展示工具,可以帮助你将复杂的想法进行可视化,提升工作和学习效率。为了让思维导图既好看又简单,选择合适的软件能够大大提高绘制效率…

UE中Camera Clip截面修改

UE中Camera无法修改远截面(FarClipingPlane),只可修改近截面(NearClipingPlane): 至于为什么无法修改远截面,看下代码,尝试继承UE的CameraComponent打印出相机投影矩阵: #include …

python编程知识(实现数据加密和解密)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

在模板中使用 Django 会话

在 Django 中使用会话(session)可以让你在用户访问网站的过程中存储和访问临时数据。我们可以利用会话在速度计算器的例子中存储和显示上次计算的结果。 1、问题背景 在 Django 中,可以使用会话来存储用户数据。在某些情况下,我们…

双绞线如何抑制传导干扰

一.案例简介 产品去做CE认证时,被告知传导抗扰未通过,网络会断连。 剖开网线外皮,发现内部是散装的,非双绞线。因此换成双绞线网线,复测,传导抗扰通过了。 图1 非双绞线和双绞线示意图 为什么…

经销商数据对接方案:借助轻易云数据集成平台实现高效互联

在现在很多品牌方的实际需求中,品牌商与经销商之间的渠道博弈日益激烈。品牌商渴望掌握经销商的销量和库存数据,以便更好地规划生产和库存,提升品牌影响力;经销商则期望在避免库存积压的同时抢占市场,加速资金周转以获…

活动预告|“AI+Security”系列第3期:AI安全智能体,重塑安全团队工作范式

由安全极客、Wisemodel社区、InForSec网络安全研究国际学术论坛和海升集团联合主办的 “AISecurity”系列第3期: AI 安全智能体,重塑安全团队工作范式 线下活动 将于2024年9月11日下午14:00 在中关村智造大街G座路演厅 正式举行 欢迎扫描海报中二…

Javaweb(前端)

目录 Web开发 Web前端 HTMLCSS 盒子模型 JavaScript js引入方式 js基础语法 js函数 js对象(JSONBOMDOM) js事件监听 Vue ​编辑Vue快速入门 Vue常用指令 Vue生命周期 Ajax 原生Ajax Axios YApi(应用网页) 前端工程…

打造一流的研发型企业--- 金发科技研发驱动力初探

2006年3月29日,国家发改委副主任欧新黔亲自为金发科技颁发了“中国改性塑料行业第一位”、“中国合成材料制造业十强”、“中国石油化工全行业百强”三块铜牌证书,金发科技终于成为名符其实的行业“老大”。公司产品销售额增长迅速, 2006年完…

Java健康养老智慧相伴养老护理小程序系统源码代办陪诊陪护更安心

健康养老,智慧相伴 —— 养老护理小程序,代办陪诊陪护更安心 🌈【开篇:智慧养老,新时代的温馨守护】🌈 在这个快节奏的时代,我们总希望能给予家人更多的关爱与陪伴,尤其是家中的长…

【AIGC赋能】短视频创作新纪元:一键生成,爆款不再难!

文章目录 一、AI技术的深度融入:从辅助到主导二、实际应用场景:覆盖创作全流程三、展望未来:AI短视频创作的无限可能 《AI短视频生成与剪辑实战108招:ChatGPT剪映》编辑推荐内容简介作者简介目录前言/序言内页插图 在数字化浪潮的…

IP地址是怎么实现HTTPS访问的?

首先,需要明确的是,IP地址(Internet Protocol Address)是互联网上设备(如服务器、路由器等)的唯一标识符,它允许数据包在网络中正确地路由和传输。然而,IP地址本身并不直接支持HTTPS…

cesium可不可以改变影像底图颜色,如何给地球底图影像添加一层滤镜蒙版?

废话:你的球是不是很丑?是不是没有科技感?是不是没有好看的影像? 因果: 因:客户问,底图可不可以改变颜色,想让球更漂亮一些。 答:可以改变影像饱和度,透明度…

【MATLAB源码-第164期】基于matlab的轴承故障三种谱图:细化谱,功率谱,倒谱对比分析仿真。

操作环境: MATLAB 2022a 1、算法描述 轴承故障分析是一种重要的维护和监控手段,能够帮助工程师及时发现和解决轴承在运行中可能遇到的各种问题。在轴承故障诊断中,通常会使用到三种谱图分析方法:细化谱(Fine Spectr…

基于大数据的电商平台电脑销售数据分析系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着电子商务的蓬勃发展,各大电商平台积累了海量的商品数据。如何从这些数据中提取有价值的信息,对于商家来说至关重要。本项目利用网络爬虫技术从京东电商平台采集各类品牌…

《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

纹理视图和模型视图画的不同步?

这个是什么情况,纹理视图和模型视图画的不同步了 这个是因为材质球没上给模型,材质球再拖一下给模型。

表连接查询之两个left join与递归SQL

一、如下SQL1 SELECT i.*,su1.name as createName,su2.name as updateNameFROM information ileft join sys_user su1 on su1.idi.create_idleft join sys_user su2 on su2.idi.update_id 二、分析 1、SELECT i.*,su.name as createName,sua.name as updateName FROM informati…

EPLAN2022基础教程

EPLAN2022软件介绍 EPLAN是一款专业的电气设计和绘图软件,它可以帮助我创建和管理电气项目,生成各种报表和文档,与其他软件和系统进行交互,优化工程流程和质量。与传统的CAD绘图对比,EPLAN更适合绘制电气原理图。 下…