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

(已结束)2010-9-04-工控擂台-PLC编程-取出16位存储器的部分数据 点击:1534 | 回复:33



饶歌

    
  • 精华:4帖
  • 求助:0帖
  • 帖子:330帖 | 6019回
  • 年度积分:0
  • 历史总积分:23673
  • 注册:2010年2月20日
发表于:2010-09-01 15:13:39
楼主

把16位存储器存储的ASCII码(0-9)的第2位取出来并转换为10进制数——例如ASCII码34,取出第2位就是4。
这个应用很有意义,例如取读到的条形码的第几位。

 

 

下周末结贴,9个最优回帖分别获得20MP、10MP、10MP、10MP、20积分、20积分、20积分、20积分、20积分!

MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。

MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。





yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2010-09-01 15:28:58
1楼
首先:与16进制数0F00做与操作,得到0400,然后,向右移动8位,得到0004.

Good Luck

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-01 16:09:03
2楼

楼上的提取方式很不错。。。。。。

工控十年

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 76回
  • 年度积分:0
  • 历史总积分:311
  • 注册:2009年7月22日
发表于:2010-09-01 16:15:52
3楼
前排围观顺便占座位! 地板就坐

abysmal

  • 精华:1帖
  • 求助:0帖
  • 帖子:12帖 | 2176回
  • 年度积分:6
  • 历史总积分:11194
  • 注册:2001年10月26日
发表于:2010-09-01 20:38:42
4楼
假设ASCII码值为 x,那么按照C++的语法,第二位数 SecondDigit =(x < 10) ? 0: (( x >= 100) ? ((x % 100) /10) : (x %10))

abysmal

  • 精华:1帖
  • 求助:0帖
  • 帖子:12帖 | 2176回
  • 年度积分:6
  • 历史总积分:11194
  • 注册:2001年10月26日
发表于:2010-09-01 21:09:18
5楼
用通常的if语句表达,就是:

if (x < 10)
      SecondDigit = 0;
else if (x >= 100)
      SecondDigit = (x % 100) / 10;
else
      SecondDigit = x % 10;

因为ASCII值只可能从0到127,所以只有这三种情况。

sovish521

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 122回
  • 年度积分:0
  • 历史总积分:551
  • 注册:2008年12月11日
发表于:2010-09-01 22:41:57
6楼

楼上的是正确的,实在搞不懂。。。这个也要拿来摆擂台。。。。。

ANDYLIU008

  • 精华:1帖
  • 求助:2帖
  • 帖子:25帖 | 475回
  • 年度积分:0
  • 历史总积分:1867
  • 注册:2009年12月12日
发表于:2010-09-02 08:20:50
7楼

这个太难太抽象了,不懂

abysmal

  • 精华:1帖
  • 求助:0帖
  • 帖子:12帖 | 2176回
  • 年度积分:6
  • 历史总积分:11194
  • 注册:2001年10月26日
发表于:2010-09-02 11:23:07
8楼
好像题目理解错了。纠正一下:
if (x & 0xff < 0x40 && x & 0xff >= 0x30)
      SecondDigit = x & 0xff - 0x30;

谢谢老菜鸟指出。

工控十年

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 76回
  • 年度积分:0
  • 历史总积分:311
  • 注册:2009年7月22日
发表于:2010-09-03 11:35:07
9楼

和abysmal的思路一样,用PLC实现

 

 

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 10:12:14
10楼

这个题目在实际应用中很广泛,例如取读到的条形码的第几位,把接收到的变频器的ASCII数据转换出来等等。。。

看来这个帖子火不起来,我来总结一下。。。。。。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 10:25:08
11楼

        目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。 

        ASCII码是美国标准信息交换码(American Standard Code for Information Interchange),字母和各种字符必须按照特定的规则用二进制编码才能在计算机中表示。编码方式可以有很多种,ASCII码是其中最常见的一种。标准ASCII码用七位二进制编码,有128个。

        ASCII码即美国标准信息交换码(American Standard Code for Information Interchange),是目前计算机中使用最广泛的符号编码。 ASCII码包括32个通用控制字符、10个十进制数码、52个大小写字母和32个专用字符共128个字符。因此ASCII编码方案需要使用7位二进制数进行编码以区分每一个字符(因此ASCII是7位码)。通常使用1个字节(8 个二进制位)表示一个ASCII字符。

         因为1位二进制数可以表示(21=)2种状态:0、1;而2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制数可以表示(27=)128种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用七位二进制数进行编码的,可以表示128个字符。   第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

        最基本的ACSII是7位,但是为了方便处理,填充至8位。最高位有时做奇偶校验,有时为了扩展。扩展的形式有很多,比如就像是86013说的,识别中文,或者是表示特殊字符。比如ÿ、€、、等等。也有极少数情况下,ACSII字符以7位来传输。

   注意:在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

        在工业控制中,1个标准ASCII码占7位,如果用八位表示的话 最高位就是“0”了。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 10:26:28
12楼

        在这里也顺便说说BCD码。

        1位十进制数可以用4位二进制编码表示,这就是所谓的“二进制编码的十进制数(BCD:Binary Coded Decimal)”。常见的BCD码是8421码。

        ASCII码用来在计算机种表示各种字符和字母,而BCD码则用来方便的表示十进制数。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 10:28:08
13楼
数字补丁。。。。。。。。。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 11:04:11
14楼

        回到主题上来。

        综合上述可知,16位存储器存储2个ASCII码,假设存的是ASCII码34,那么16进制存储器的数据就是:高8位为33,低8位为34。

对于该题的实现方法有多种,概述如下:

方法1:也就是yuanle和abysmal说到的方法。把该存储器与FFH(也就是00FFH)作与操作,得到ASCII的第2位数据——存储器的低8位数据,也就是34。(说明:任何一个二进制数与相同位数的全1二进制数做与操作,得到的都是这个数本身;任何一个二进制数与相同位数的全0二进制数做与操作,得到的都是0。因此该方法的原理就很容易明白了。如果要取高8位,那么把该16位数据和FF00H作与操作后,还要右移8位才可以得到。)

        然后把得到的低8位ASCII数据减去48或者30H,就是10进制数了。

 

方法2:把该存储器左移8位,右移8位,就得到结果34了。然后把得到的低8位ASCII数据减去48或者30H,就是10进制数了。

 

方法3:这是特殊的用法,不是每种PLC都支持。对于三菱PLC而言,具有把1个16进制数据存储到4个4位的连续存储器中,而且每个或多个4位的存储器可以随意使用。所以对于三菱这样的PLC来讲。还多一种方法。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 11:15:22
15楼

继续方法3的讲述。

在讲述之前,我们先看看关于三菱PLC这样的用法:

涛声依旧

  • 精华:0帖
  • 求助:1帖
  • 帖子:5帖 | 540回
  • 年度积分:5
  • 历史总积分:18865
  • 注册:2006年12月03日
发表于:2010-09-04 11:16:23
16楼

我觉得不是说的多就是说的有道理,太罗嗦了。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 11:19:43
17楼

1、确实有点啰嗦,只是为了给不了解ASCII的朋友看的。

2、如果你觉得哪个地方说错了,或者说得没道理,欢迎斧正!

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 12:16:33
18楼

上述几种方法的程序如下图所示:

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 12:20:13
19楼

1、该程序模拟测试成功。

2、可以看出,最简单的方法还是三菱的直接取出来的方法——就算取高8位,所需要的程序步数仍然不变。而第1种方法取高8位的话,还需要右移8位才能实现。

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2010-09-04 12:24:20
20楼
引用sovish521 的回复内容:

楼上的是正确的,实在搞不懂。。。这个也要拿来摆擂台。。。。。


你楼上恰恰把题目理解错了,在8楼已经更正。呵呵。。。。。。

热门招聘
相关主题

官方公众号

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