如何在西门子程序中取整型数得某几个位信号? 点击:2628 | 回复:11



jackson.lan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 45回
  • 年度积分:0
  • 历史总积分:83
  • 注册:2005年2月17日
发表于:2006-06-20 10:40:00
楼主
请教一个问题:
我在S7-300 315-2 DP中定义了如下三个变量:
1、
符号:test001
地址:IB 30
数据类别:BYTE
2、
符号:test002
地址:IW 31
数据类别:INT
3、
符号:test003
地址:PQD 33
数据类别:DINT

    现在我想分别取该三个变量中的某些位的值,比如test001这个字节变量第一个位的值或者test002这个整型变量的第一位的值,该如何取?
    另外,test003是一个和外围设备通信的双字变量,长度和双整型数一样,这个双整型变量的第一位的值又该如何取?
    我刚接触西门子的东西不久,碰到这个问题还望大家不吝赐教,谢谢!!!



yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2006-06-20 10:44:00
1楼
取 TEST001 第一位值    L  I30.0
取 TEST002 第一位值    L  I31.0
依次类推即可
取某一位的值其实只需要读取这一位即可。

御风而行

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 88回
  • 年度积分:0
  • 历史总积分:199
  • 注册:2002年11月12日
发表于:2006-06-20 10:56:00
2楼
IB30{i30.0,...,I30.7};IW31{IB31,IB32};-可拆位
PQD33{PQW33,PQW34}-不可拆位

jackson.lan

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 45回
  • 年度积分:0
  • 历史总积分:83
  • 注册:2005年2月17日
发表于:2006-06-20 11:10:00
3楼
谢谢 yuanle 和 御风而行 ,那如果要取 PQD 33 的位的话,是否可以先通过 mov 来将 PQD 33 的值赋给一个双整型数,然后再取其中的位,经过逻辑处理后再反过来赋值给 PQD 33 ?请问有没有更好的方法了?

jackson.lan

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 45回
  • 年度积分:0
  • 历史总积分:83
  • 注册:2005年2月17日
发表于:2006-06-20 11:11:00
4楼
谢谢 yuanle 和 御风而行 ,那如果要取 PQD 33 的位的话,是否可以先通过 mov 来将 PQD 33 的值赋给一个双整型数,然后再取其中的位,经过逻辑处理后再反过来赋值给 PQD 33 ?请问有没有更好的方法了?

御风而行

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 88回
  • 年度积分:0
  • 历史总积分:199
  • 注册:2002年11月12日
发表于:2006-06-20 11:44:00
5楼
不太明白你的意思,PQD是模拟量输出,如果程序不赋值,这个单元就按默认值输出,一般为0,即4ma或0v,一般不作读入用

jackson.lan

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 45回
  • 年度积分:0
  • 历史总积分:83
  • 注册:2005年2月17日
发表于:2006-06-20 13:16:00
6楼
    那就用 PID 来说吧,这个是外围设备输入信号吧,这个不只是输入模拟量吧,我配了个博士力士乐的伺服电机,通过PROFIBUS通讯,该伺服电机给PLC的状态字就是PID输入的,控制字是通过PQD输出的,我想操作状态字或控制字的单独位的值呵呵

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:85帖 | 1476回
  • 年度积分:0
  • 历史总积分:2078
  • 注册:2001年11月02日
发表于:2006-06-20 16:00:00
7楼
如果只能按字(或者字节)访问而不能按位访问,那么可以对这个字(或者字节)右移(N-1)次,然后和“1”做个AND,然后判断结果是否为0,如果是,那么说明原先哪个字(或者字节)中的第(N-1)位为Off,反之为On。

Jason.lu9999

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 10回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2006年8月18日
发表于:2006-06-20 17:13:00
8楼
你可以用PQB.*或PIB.*

jackson.lan

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 45回
  • 年度积分:0
  • 历史总积分:83
  • 注册:2005年2月17日
发表于:2006-06-21 09:46:00
9楼
microtomato,你那样子移动,其实还是以字节或字为单位移的,不是以位来移啊,好像不太行吧。
Lao Niao,PQB.*或PIB.*不行,提示语法错误。

microtomato

  • 精华:1帖
  • 求助:0帖
  • 帖子:85帖 | 1476回
  • 年度积分:0
  • 历史总积分:2078
  • 注册:2001年11月02日
发表于:2006-06-21 12:43:00
10楼
jackson.lan兄弟啊,I服了U!是S7-300吗?不是有SHR_W指令吗?这个指令是对指定的字进行移位,如果参数N设置为1,那么每执行1次就是对指定的字右移1位。

御风而行

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 88回
  • 年度积分:0
  • 历史总积分:199
  • 注册:2002年11月12日
发表于:2006-06-26 15:55:00
11楼
我没有用过和伺服电机的profibus通讯,对你的状态控制字的读取不敢妄言,不过我用过其他profibus通讯外围设备,一般在硬件配置里可以定义控制参数地址,比如MW或DB数据块,然后通过这些中间存储实现状态字和控制字的读取,以及控制字的输出,这样也许会简单点。
microtomato和你的方法差不多,都能够实现位的读取,差别不大。

热门招聘
相关主题

官方公众号

智造工程师