首页 上一页 1 2 下一页 尾页

怎样编程将ASCII码的数据传送给组态王? 点击:7185 | 回复:32



wyb2866255

    
  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2010-10-21 09:39:17
楼主
最近接了个项目,除了正常探伤测长外,又增加称重,电子秤由用户提供,该电子秤与组态王无通讯协议,只得选用CP340将称重数据传送给PLC,该数据为ASCII码,而S7-300无此指令(我没有找到),只得自己编写,在编程过程中,得到一点经验,觉得值得讨论,为了加强对此印象,提出望大家参与,如何编程才能使PLC将正确数据传送给组态王。



miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-11-13 14:05:01
21楼

很长时间没做这类的程序了;小试牛刀用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);

 

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-11-13 14:06:33
22楼

 

已测试:

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; // 此时一个字的转换完成了;

wyb2866255

  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2010-11-13 15:27:39
23楼
20楼:又看到你的回帖,用C语言编出,很好!这回你说的“BCD码转换成 BIN 码(十进制),传到组态王中显示,对吧! 直接把BCD码传到组态王中显示会乱码,因为组态王默认只显示BIN码; ”你理解对了。在PLC里编程应该用PLC语言编,我在4楼编的程序,就是先通过自己编程将ASCII码变为BCD码,再用现成的b_I指令将BCD码转换为BIN码。你是个很执着的人,我喜欢你的性格,我是个年近70的人,喜欢与爱学习的人交朋友,估计你的年龄不会太大,我们就做忘年交吧!

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-11-14 11:19:24
24楼

没看出来的,你将近70岁了,性格怎么就像年轻人呢!

我一直都是这样理解的,只不过可能你没理解我的话,或我描述不够清楚;

 

wyb2866255

  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2010-11-14 20:18:52
25楼

24楼网友:不打不成交吗,过去的事情就让它过去吧,以后多联系,祝你好运!

whb816658

  • 精华:0帖
  • 求助:1帖
  • 帖子:3帖 | 69回
  • 年度积分:0
  • 历史总积分:374
  • 注册:2008年8月01日
发表于:2010-11-15 10:22:59
26楼

都是高手,我啥时候也可以啊!痛苦,临渊羡鱼不如退而结网。

azhao5211314

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:45
  • 注册:2008年5月10日
发表于:2011-01-06 13:33:09
27楼
看了你们的讨论很精彩 能请教一下下面的问题吗?各位帮帮忙 请问怎样把图里的最大扭矩值变成10进制显示在触摸屏上,这里先谢谢了

azhao5211314

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:45
  • 注册:2008年5月10日
发表于:2011-01-06 14:37:47
28楼
图没上去最大扭矩值20H 31H 2EH 32H 33H 将其变为10进制显示,高手帮帮忙 是接受R232口过来的数据

wyb2866255

  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2011-01-06 20:04:31
29楼

         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码转换,你可根据你需要的数字和符号,列成表,放在数据区内进行查询,这是比较麻烦的事。

azhao5211314

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:45
  • 注册:2008年5月10日
发表于:2011-01-08 15:37:52
30楼

非常感谢您的回复!我接收的是一个拧紧枪的数据数据长度78byte,用欧姆龙PLC我看见有指令也像您说的一样有长度限制。拧紧枪每次拧紧完成发出一个最大扭矩值20H 31H 2EH 32H 33H,我不知道怎样去把他用10进制显示到触摸屏上,我怎样转换,您能用您说的先将ASCII码转换为16进制数,再用16进制数转换为BCD码指令,就可实现转换为10进制数的方法做个小例子吗?在这里先感谢了

wyb2866255

  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2011-01-09 00:05:37
31楼
   30楼:PLC的ASCII码转换为16进制数的指令只是用于数字,对符号是无法变换的。你要转换的是“20H 31H 2EH 32H 33H ”吧? 这种既带数字又带符号的ASCII码,可以在上位机或触摸屏中用循环判断语句编程,即将ASCII码通过循环判断转换为字符串的方法来实现:先建立一个空串$,用循环判断的语句,从最高字节开始依次判断,如第一字节=20H,这是空格,将$=" ",第二字节=31H,是数“1”,将$=" "+"1"......最后串为:$=" "+"1"+"."+"2"+"3",将$送显示就可以了。

红红大猪

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 105回
  • 年度积分:0
  • 历史总积分:136
  • 注册:2018年4月20日
发表于:2019-09-03 16:54:01
32楼

谢谢楼主分享


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页