Portal编程环境下的半字节交换处理
今天下午,因时间紧迫正在焦头烂额的整理明年的投资预算计划,忙着整理去年及今年的实际产能统计报告,争取下午完成一份明年的投资预算。公司同事过来让我处理一串字符数据(显示12个字节长度)的数据组合方法,一细问实际上是有一个项目中西门子s7-1500与第三方HMI设备的字符显示问题,当第三方HMI显示西门子s7-1500的字符数据,发现每一个字符(byte)中正好都是相反的,让我处理一下。我虽然没有在portal编程环境下,使用过SWAP指令(数据交换)的应用,但是,知道应该有这个指令的调用。于是,打开Portal软件,创建一个测试项目,调用SWAP指令后,发现该指令的数据类型只有word或者dword的2种选择,显然不是我想要的byte的数据类型。考虑到字节byte的移位做法,但是,没有整理出一个合适是思路,一时思路进入死循环,脑子里想不出一个比较快捷合适的方法。手头急需办理的工作实在太急,也没有继续细想,委婉让同事先自己想想其它办法,等我完成手头急需办理的工作后再做考虑。
晚上吃过晚饭,感觉下午的那个问题应该可以找到一个合适的解决方法。于是,再次打开电脑,感觉应该通过移位指令的多次移动,让一个字节(byte)的数据左、右移动来处理半字节之间的交换。
编程思路:
用一个待测试的字节,先右移,保留一个字节的低半字节,同时,用同一个待测试的字节做左移,目的是取这个字节的高半字节,接下去,再重新组合。基本思路方向已定,新建一个测试项目,首先创建一个FC及连接需要的接口变量,图示:

图1,创建一个半字节交换的FC,输入接口处创建一个名称“字节输入”的输入,数据类型为“Byte”,交换数据后的输出,数据类似为“Word”,因为之间处理过程需要几个临时存放的变量区域,我暂时定义了2个temp1和temp2,数据类型仍然为“Word”,定义好接口变量后,比较半字节交换程序:

图2,首先,把待交换的字节进行右移4位,结果存放在临时变量temp1,目的是移出低半字节,同时,把待交换的字节进行左移4位,把结果存放在临时变量的temp2,目的是移出高半字节,这样交换的数据通过右移4位,和左移4位,满足一个字节的交换。但是,如何再次把新数据做重新组合?看了看,数据的加法指令ADD中没有字节的加法应用,难道我还要做把数据进行处理。打开F1帮助,查看数据类型,看到有USINT数据类型是8位整数的数据类型,哈哈,原来如此啊。既然portal软件具备字节的运算,那我的思路可以走通了,但是,问题马上又来了,字节的移位指令的结果的数据类型的word,此处应该是INT。这样如何运算?想不出什么方法转换,先按这个方法测试一下,将FC1在OB1中调用,并写入实参,启动模拟仿真器,创建监控表输入需要测试的实参变量地址,监控字节交换情况,图示:

图3,字节交换结果是我所需要的,再输入了几组字节数据,结果仍然符合我的要求,portal的优势(数据自动适应)应该在此起作用了。回想起来,FC接口变量中,我输出数据类型设置为“word”,应该要修改为“int”了,这样更匹配,也符合数据类型一致的理论,图示:

此,明天把这个测试结果告诉公司同事,至于同事说的关于一串字符有12个字节问题,让公司同事自己去处理了吧。