很长时间没做这类的程序了;小试牛刀用C 语言 编了两个函数 , 1, ASCII 码 转换成整数, 2。 BCD码转换成整数;
虽然对PLC 来讲 ,程序有些臃肿,但还是可以供参考一下的;
CString strT;
BYTE ss[20]={"123456789"},sResult[20];
int StrLen=strlen(ss);
int i,j,k,temp=0,sum=0;
for(i=StrLen-1,j=0;i>=0;i--)
{
temp=ss[i];
temp-=48;
for(k=j;k>0;k--)
{
temp*=10;
}
sum+=temp;
j++;
}
strT="sum = ";
strT+=itoa(sum,sResult,10); // sum 就是ASCII 码转换后的值
iNumber=sum;
MessageBox(strT);
已测试:
short TEMP=0,tempH=0,teMpL=0;
BYTE BL=0,BH=0,
int nBIN=0;
tempL=iNumber & 0xFF; // 假设iNumber 是待转换的 BCD 吗
TEMP=iNumber>>8;
tempH=TEMP & 0xFF;
BL=tempL & 0xF;
TEMP=tempL>>4;
BH=TEMP & 0xF;
BH*=10;
nBIN+=BL;
nBIN+=BH;
/////////////////////
BL=tempH & 0xF;
BL*=100;
TEMP=tempH>>4;
BH=TEMP & 0xF;
BH*=1000;
nBIN+=BL;
nBIN+=BH; // 此时一个字的转换完成了;
28楼:根据你提出的数据“20H 31H 2EH 32H 33H ”显然是ASCII码,是接受R232口过来的数据。这里既有数字又有符号,变成10进制应为“ 1.23”,其“2”字打头的是符号。如:20H 是空格,2EH 是小数点,“3”字打头前10个ASCII码是0-9是个数字。
有的PLC如S7-200,有ASCII码转换16进制数,16进制数转换为ASCII码的指令,你可用此指令先将ASCII码转换为16进制数,再用16进制数转换为BCD码指令,就可实现转换为10进制数。但只限于30H--39H,和41H-46H的ASCII转换。
S7-300没有此转换指令,如只有数字没有符号,可以编程,我上面提供的梯形图就是用S7-300编写的将4位ASCII码转换为4位BCD码,你可看看。
如ASCII码既有数字又有符号,只能用查表法进行ASCII码转换,你可根据你需要的数字和符号,列成表,放在数据区内进行查询,这是比较麻烦的事。