无符号数据类型的转换、比较及运算解决方案

已锁定

tingal_cai

  • 帖子

    82
  • 精华

    1
  • 被关注

    1

论坛等级:侠客

注册时间:2021-11-03

普通 普通 如何晋级?

无符号数据类型的转换、比较及运算解决方案

3205

28

2022-11-17 20:23:06

star star star

无符号数据类型的转换、比较及运算解决方案

 

最近这段时间,重庆疫情猖獗,单日新增破4K+,除了特殊及重要工作岗位的人员和机构,大部分都处于居家办公状态。当然,现场项目也就没办法进行了,利用这个空档,专门来解决之前没解决完的西门子200Smart PLC没有无符号数据的转换、比较和运算功能的问题。



开发背景

对于自动化工程师,我们在项目实际应用过程中,经常会遇到对工件计件、脉冲计数、运行时间记录等情况,并且希望寄存器拥有更大的数据存储容量,所以这个时候,我们会选择无符号数据类型,但奈何西门子200smart又没有无符号数据类型的转换、比较及运算指令(I_DI、DI_I、除了Byte以外的整数和双整数比较指令、ADD、SUB、MUL、DIV等基础指令均为有符号指令),这就严重限制了我们对无符号数据类型的处理使用。


开发目的

解决西门子200smart没有无符号数据类型的转换、比较及运算指令的痛点,扩展并增强200smart运用无符号数据类型在实际项目中的数据处理能力。


有符号和无符号数据类型的区别

无符号数据类型主要包括UByte、Uint、UDint,分别对应200smart的Byte(严格来讲,Byte应为Signed Byte,简称SByte或SB,但200Smart中Byte为UByte,此处西门子规定有点混乱)、Word、DWord数据类型;有符号数据类型主要包括SByte、Int、Dint,其中,Signed Byte数据类型在200smart的转换、比较及运算指令中是缺失的。有符号数据和无符号数据的本质是,数据的最高位是主要参与了数据的符号记录还是容量存储,如果是前者,则-128≤SByte≤127,-32768≤Int≤32767,-2147483648≤Dint≤2147483647,对于只需要正数的情况来说,数据存储器的容量就相当于减半;如果是后者,则0≤Byte≤255,0≤Word≤65535,0≤DWord≤4294967295,容量得到正常释放。



解决方案

1. 转换

无符号数据类型的转换相对比较容易。如果是小转大,先清空目标数据,然后直接将源数据传送至目标数据的低字节或字;如果是大转小,则要先判断目标数据是否会溢出,如果会,则直接将目标数据赋最大值,如果不会,将源数据的低字节或字传送至目标数据,这里,我增加了大转小的间接溢出功能(如有溢出,SM1.1会置位)。

有 无符号数据的转换,当然就有无符号和实型数据的相互转换需求。这里我增加了"B_R"、"W_R"、"DW_R"、"ROUND_B"、"ROUND_W"、"ROUND_DW"、"TRUNC_B"、"TRUNC_W"和"TRUNC_DW",分别是无符号字节转实型、无符号整型转实型、无符号双整型转实型、实型四舍五入小数后转无符号字节、实型四舍五入小数后转无符号整型、实型四舍五入小数后转无符号双整型、实型丢弃小数后转无符号字节、实型丢弃小数后转无符号整型、实型丢弃小数后转无符号双整型。关于整型和实型数据的相互转换,我在这里不详细说明,有兴趣的朋友可以去查阅相关资料。

另外,由于系统没有SByte数据类型,当然就没有相应的转换指令,基于此,我增加了"SB_I"、"SB_DI"和"SB_R",即有符号字节转有符号整型、有符号字节转有符号双整型和有符号字节转实型。

2. 比较

无符号数据类型的比较是利用系统现有有符号比较指令实现的。具体办法是将数分成负数和非负数两部分,那么两个相互比较的数就有四种排列组合,即非负数和非负数比较、非负数和负数比较、负数和负数比较、负数和非负数比较,四种情况比较后即可得到想要的bool结果。其实从应用结果来看,可以归纳成同号比较和异号比较。

另外,我的无符号数据比较指令中没有"=="指令,是因为可以利用系统现有有符号"=="比较指令进行比较,而不影响比较结果。

同样,由于系统没有SByte数据类型,我增加了">SB"、">=SB"、"<SB"、"<=SB",即有符号字节大于比较指令、有符号字节大于等于比较指令、有符号字节小于比较指令和有符号字节小于等于比较指令。

3. 运算

无符号数据类型的运算解决方案我还在思考中,目前初步想到的是用门电路去做,但这样做带来缺点很明显。有比较好的解决思路的兄弟朋友可以提供参考一下,感谢支持。运算指令后面完善后奉上。

 

说明:

1. 此程序为无偿奉献,不喜勿喷,程序已做测试和应用,但仍可能存在BUG,使用者风险自担;

2. 程序软件版本为STEP 7-MicroWIN SMART V2.6,请使用不低于此版本的软件打开;

3. 双精度整型LDint和双精度浮点型LReal在实际应用中较少,故本次不涉及。若后期应用的多,可随时增加。

 

附件:

无符号数据转换、比较及运算指令.rar



无符号数据类型的转换、比较及运算解决方案 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有7561条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。