找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 110|回复: 0

关于批量复制命令的用法介绍

[复制链接]

9

主题

1

回帖

63

积分

管理员

积分
63
发表于 2025-8-29 22:25:35 | 显示全部楼层 |阅读模式
关于新增了一个批量复制的命令,这个命令可以代替好多循环。直接用系统底层自带的命令,写程序的时候可以减少单片机的占用。写程序能用系统自带的命令完成任务的时候绝对不要去用循环。一个底层自带的命令能完成的任务可能占用cpu的量不到1%。但是有可能一个循环就能把cpu占用率给提高20%。单片机运行它不存在死机的情况,但是cpu占满之后,它会把程序任务内容延后去运行,这样的话就会造成单位时间内程序,往后拖之后时间不准确。本来你一个程序是10毫秒之内能运行完的,但是你程序你要写的特别长特别大,特别占用cpu的时候这个程序需要20毫秒才能运行完,那么咱的单片机的程序规定的运行间隔是10毫秒。这样的话默认你就算20号秒运行完一次程序,他也会认为你只用了10毫秒,实际时间被拖长了一倍。这样的话,本来你1秒闪烁一次的一个指示灯的程序。实际可能会出现这个只是登两秒闪烁一次。为了程序运行的稳定。现在新增加了读取硬件参数二这个选项。方便随时去观察cpu的峰值占用率和平时的实时占用率。只要各种状态下,cpu的峰值占用率不超过100%,程序运行时间就不会不准,好了,言归正传,现在咱们来说说批量复制这个命令。




首先咱要明确一点,批量复制这条命令是在表达式里边自己写的。命令格式为。批量复制(被更改的目标, 被复制的数据源 ,批量复制的数量)
在没有批量复制这个命令的时候,如果说咱想让一个数等于另一个数,那就只能一条一条的去写。比如说180的输入,180个输出,咱想让输出的状态等于输入的状态。原来没有批量复制的命令的时候,咱就要去写180条命令。一直就写输出一等于输入1,输出2等于输入2,输出3等于输入3。...........,这样写起来特别麻烦,还特别消耗cpu的资源。现在一条命令完成了,原来需要180条命令的程序,这些就特别牛逼了。
咱先看被红色框选起来的选项,这个批量复制命令。现阶段最新版的模块支持全局整数掉电自动保存上电自动能读取。上次掉电前的状态而不用做任何设置。这样就让咱们多了很多用法,后期会加入输出和位变量的掉电保存。这段是我测试批量复制命令的时候的一个附带的用法就是把保存到全局整数里边的所有的输出的状态,直接通过批量复制命令,把全局整数里边的每一位直接写入到输出,一个全局整数能写32个输出的状态。批量复制(输出85 , 全局整数92[0] , 32)这个命令代表的是,就是把全局总数92的第0位开始的32位的状态批量写入到输出85开始往后延续的32个输出,这行命令只是上电的时候执行一次,这样就间接实现了输出状态的掉电保存。


下边咱们来说说绿色框内的内容。批量复制(全局整数92[0] , 输出85 , 32)以这个命令为例,这个命令跟刚才的执行方式不一样,那个只是上电执行一次,这个是一直执行,这段内容的含义就是把32个输出状态直接写到全局整数的32位里边儿。然后把全局整数转换成数组,这样还要规定一下全局整数转换成数组的格式还有字节顺序。为了匹配modbus协议写入的时候需要的数据格式。

蓝色框里边的内容就是每隔90毫秒刷新一次所有输出的状态。那个命令里边儿,正常是直接用的数组的内容就是16进制数据往外写的,现在你直接写全局整数也可以,它会自动转换,前边咱已经规定了转换的方式,还有字节数不够的话它会自动补齐。这样写的话就省了一步把全局整数转换成数组,然后下边写程序的时候直接就是写数组几加数组几。当然因为这种方法转换起来需要的步骤比较多,然后比较麻烦,现在。就郭工更新了一个最新的转换方法,就是可以直接把输出提取到数组里边。这样的话就省了好多步骤,一步就直接到位了,程序占用能立马少了很多很多。

下边我给大家分享一下最新国功优化过后的程序写法。






现在这个新的写法里边,有一点需要特别注意的是你往这个数字文里边批量复制内容的时候,你必须先把这个数组给填充相应字节的内容,有内容的时候它才可以批量复制的时候去替换。如果说没有任何内容,每次上电的时候这个数字里边的数据是空的,那么你批量复制就不能用,这条命令不会正常执行。比如说我现在我要把48个输出的状态写到这个数组里边,那么它就是48位48位,那就是8位一个字节6*8 48,所以说我先在这个数组里需要填充6个字节的任意数据。填充这个数据,我喜欢把它放到商店初始化里边,因为这个只有刚开始的时候填充一遍就行,后期他会自己一直的去替换。就不用管了。我现在用的数组而非全局数组。所以说我这段程序它放到主函数里边运行是完全没问题的。我这段程序我要是给他放到函数里边去运行的话,那么函数运行的开始就要执行一次把数组赋值的命令。不然的话,程序每次在函数里边运行一遍之后,所有的数组内容会被清空,而非全局数组。咱全局数组够多而又够用的情况下,建议在商店初始化里边用全局数组把全局数组赋值为一个固定的数据,后边写程序无论你放到主程序里边或者说是函数里边都能正常运行,虽然说数组赋值这个命令占不了多少资源,但是每次运行还是感觉不爽,强迫症吧。批量复制(数组0_0_0 , 输出37 , 48)这段程序的意思就是把输出37开始的48个输出的状态复制到数组0从第0个字节第0位开始,直接复制48位。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|信科电子 ( 冀ICP备13013222号-1 )

GMT+8, 2025-12-24 23:44 , Processed in 0.136174 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表