查看: 3575|回复: 18
收起左侧

[教程经验] 分享:字位转换几种实现方式

Slimming 2022-7-22 16:57:27 | 显示全部楼层 |阅读模式
邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
本帖最后由 Slimming 于 2022-7-22 17:02 编辑

市面上多家的编程平台定义bool型变量均占用1个byte8位,定义的变量实际在使用中只占用第0位,其余7位均空闲或者记录变量上一次的状态,但是在编程使用过程中因为部分场合需要使用bit型变量,或者bool变量合并的byte变量,尤其是在通讯传输数据时字位合并非常有必要,所以需要进行字位转换。

先拿我之前做的项目举个例子,项目中逻辑不复杂但是通讯数据量大,存在10个从站,每个从站通讯500个bool型变量,如果按照1bool占用的1byte来直接进行通讯,那么会严重浪费cpu资源,如果将8个bool合并成1个byte进行传输,那么通讯的数据量对比之前就是1/8了。


一、系统功能块
回归正文,介绍几种字位转换的方式。先说一下系统自带的功能块。

BIT_AS_BYTE/BYTE_AS_BIT
image.png
汇川codesys平台自带字位转换的FB,功能简单易懂
位转字节BIT_AS_BYTE:输入是8个bit,输出是1个byte。
字节转位BYTE_AS_BIT:输入是1个byte,输出是8个bit。


二、字位转换逻辑

下面再分享一下字位转换的核心和思路,由于我之前是帖子已经讲过字位转换,所以简述不讲太多,详见下面链接:
分享:数据处理—字位转换
http://bbs.inovance.com/forum.php?mod=viewthread&tid=9922
(出处: 汇川技术官网-水滴社区)



一个字word中有16位bit。
字转位的本质,是获取word中的每一个位状态单独提出来,放到新的bool变量中。
位转字的本质,是将所有bool变量按照顺序组合起来,放到新的byte中。

获取状态或者进行组合至少有两种方式:1与或判断,2联合体

1.与或判断
数电或者C语言中,用与或判断数据的用法比较多。在codesys平台中,与或的判断主要是用于bool变量的判断,byte类型其实也可以进行与或判断,相对而言byte类型的与或判断要更复杂难懂一些,但是byte类型在计算机内部识别出来也都是二进制数据。


例如:byte类型a的数据3,我们一般理解的3是十进制的3,即10#3,换算二进制2#11,如果想获取a的每一位状态,那么可以用a的值与上2的i次方即可。
a的第0位状态=10#3 and 2^0
a的第1位状态=10#3 and 2^1
a的第2位状态=10#3 and 2^2……
需要注意的是数据的与或要保证前后数据的类型统一 。
image.png

相反的,想要位合成字,就把每一位的状态与2^i相乘,然后相加,即可得出所有位组成的字。
image.png


2.联合体
联合体的用法之一是多个变量占用相同的内存,可以实现数据的交叉处理。
例如联合体中定义a是byte类型变量,b是8位bit的结构体,如果a被赋值3,那么b中的bit0和bit1也被被置位。



①定义8bit结构体
image.png

②定义联合体
image.png

③联合体引用
image.png


方法和思路介绍完了,写的功能块程序在附件中
字位转换只是简单的数据处理,没必要实例化,所以全都写成了FC函数。另外位地址连续,用指针来配合for循环偏移地址实现会很方便。感兴趣的下载看看吧,欢迎大家交流。
image.png






image.png

字位转换.rar

85.63 KB, 下载次数: 46

售价: 5  [记录]

plc程序

点评

感谢分享  发表于 2023-8-27 09:10
感谢分享,正好需要!  发表于 2023-5-11 09:29




上一篇:React设计模式与最佳实践
下一篇:codesys 读写文件

已有 1 人打赏作者

工控小小白 赏了楼主25水滴
回复 邀请回答送花

使用道具 举报

工控彭于晏 2022-7-22 17:54:54 | 显示全部楼层
感谢分享,昨天刚刚用了这个功能块
回复 送花

使用道具 举报

我爱汇川 2022-7-22 22:09:29 | 显示全部楼层
字位转换几种实现方式
回复 送花

使用道具 举报

我愿人长久 2022-7-22 22:56:51 来自手机 | 显示全部楼层
内容详细,感谢分享经验
回复 送花

使用道具 举报

COLOR 2022-7-22 23:36:52 | 显示全部楼层
内容详细,感谢分享
回复 送花

使用道具 举报

LiyuLi 2022-7-23 06:45:00 | 显示全部楼层
内容详细,感谢分享
回复 送花

使用道具 举报

zjw424260912 2022-7-23 08:03:58 | 显示全部楼层
感谢楼主分享!
回复 送花

使用道具 举报

sun_dbh 2022-7-23 08:24:43 | 显示全部楼层
内容详细,感谢分享!!!
回复 送花

使用道具 举报

zhi_good 2022-7-23 08:44:36 | 显示全部楼层
内容详细,感谢分享
回复 送花

使用道具 举报

like12ok 2022-7-23 09:01:33 | 显示全部楼层
感谢楼主分享,内容非常详细。
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部