快捷搜索:  汽车  科技

plc中的byte(用PLC的指针实现字符串转byte)

plc中的byte(用PLC的指针实现字符串转byte)这个转换指令一点用也没有啊!!!我了个去!!不模拟不知道,一模拟吓一跳;不管我输入什么字母,srrr结果都是0 ?????但是输入数字结果就对了如下图:输入字符串20,srrr为16进制的14,对的上。这条指令是只能把数字类型的字符串转换成数字,例如字符串格式的数字‘20’,用STRING TO BYTE指令,只能把字符串‘20’,转换成十进制的数字20,字母是无法转换的。

第一步,确定配置

Codesys平台下的倍福Twincat2软件,和MES上位机,进行TCP/IP通信,进行数据的收发,只能收发Byte 不能直接收发字符串(很多PLC之间的通信都有这个问题,很难处理)。

第二步,问题描述

最近调了个改造设备,改造前是德国老外写的程序,MES程序里面数据交互有用到指针的地方没看明白,故在此深入研究一番,老外的程序过于复杂,我就单独把这块功能给拿出来做个功能块程序模拟下,如下图(先不用看这段程序,下面一步一步分解):

plc中的byte(用PLC的指针实现字符串转byte)(1)

第三步:技术逻辑分析

MES和PLC通讯,字节传输,如果我想把PLC的字符串传给MES,必须要把PLC的字符串转变成字节,再传给MES,这不是很简单吗,正好程序有标准得STRING TO BYTE 指令,转一下不久OK了?

于是乎我写了一条这样的指令:srrr为BYTE,sKeyword为字符串。

plc中的byte(用PLC的指针实现字符串转byte)(2)

不模拟不知道,一模拟吓一跳;不管我输入什么字母,srrr结果都是0 ?????

plc中的byte(用PLC的指针实现字符串转byte)(3)

但是输入数字结果就对了如下图:输入字符串20,srrr为16进制的14,对的上。

plc中的byte(用PLC的指针实现字符串转byte)(4)

这条指令是只能把数字类型的字符串转换成数字,例如字符串格式的数字‘20’,用STRING TO BYTE指令,只能把字符串‘20’,转换成十进制的数字20,字母是无法转换的。

我了个去!!

这个转换指令一点用也没有啊!!!

没办法,只有深入研究一下,字母怎么转byte了。

首先我模拟plc需要发一串字符“ABCDEFG”给MES,转换过程的数据结构如下图所示:

plc中的byte(用PLC的指针实现字符串转byte)(5)

“ABCDEFG”转换成BYTE需要7个BYTE作为存储空间,每个字母用一个BYTE,通过ASCII码转换成10进制或16进制表示。

首先大家想到的一般都是每个字符ASCII码转换成数字表示,再组合起来用,发送过去,就可以了。但是这种方法麻烦,如果有上千个字符,一个个转,就相当花时间了。

下面就介绍用指针的方法处理这类问题.如下图:

plc中的byte(用PLC的指针实现字符串转byte)(6)

1/先定义sKeyword字符串,这个是我要发送给MES但是还没想到好方法发过去的字符串;

2/定义一个指针pKeyword指向一个byte,存储字符sKeyword的地址;

3/定义一个指针pSendToMes指向一个byte,存储需要发送给MES的byte的地址(程序里定义strSendDate为2000个byte);

4/定义一个结构strSkeyWordDate 这个作用是把每个字符串的值都按顺序存储在这个结构里 最终发给MES。

程序解析如下:

pKeyword:=ADR(sKeyword);

把sKeyword的地址写入指针pKeyword;

pSendToMes:=ADR(strSkeyWordDate);

把strSkeyWordDate的地址写入指针pSendToMes;

FOR iCounter:=1 TO LEN(sKeyword) BY 1

循环指令,循环字符串sKeyword的长度值,有两个字符就循环两次,三个字符就循坏三次;

DO

pSendToMes^:=pKeyword^;

^为取值指令,把pKeyword存储的地址里第一个byte的值,给pSendToMes的第一个Byte(为什么是第一个byte的值,因为指针指向一个byte)

pKeyword:=pKeyword 1;

指针存储的地址值加1,即指向pKeyword存储里的第二个byte。

pSendToMes:=pSendToMes 1;

指针存储的地址值加1,即指向pSendToMes存储里的第二个byte。

END_FOR

如果我发的字符串为ABCDEFG,那么会经过7个for循还,第一次循环给strSkeyWordDate的第一个字节赋值为41(程序为16进制表示),也就是大写的A,依次反复七次,strSkeyWordDate的前7个字节为16进制的41 42 43 44 45 46 47,ASCII翻译过就是ABCDEFG 这就完美解决了,字符串转Byte的需求。

第四步:技术分析指针数据

结合以上程序如下图,比如sKeyword的值是ABCDEFG,pKeyword为对应第一个字节的地址45492,pKeyword^为地址45492提取的值41,pKeyword 1则是地址加1,地址变为45493,对应的值为42.循环七次得到想要的数据。

plc中的byte(用PLC的指针实现字符串转byte)(7)

OK!就分析到此,我是明白差不多了,有疑问评论区问我!!

猜您喜欢: