Siemens_PLC_Knowledge

1、数据类型的小区别

1.1
你说的情况是存在的,以比较指令为例,在梯形图中操作数的数据类型必须是INT,输入WORD数据类型的变量或十六进制格式的常数都不行。但是在STL中,下面的程序是没问题的:

   L     W#16#100

   L     345

   ==I

   =     M      0.0

其原因在于累加器和没有定义数据类型的MW20一样,是一个没有数据类型的存储单元,W#16#100装入累加器后,它的数据类型属性就丢失了,操作系统将它视为INT格式的256来处理。但是上述程序是不能转换为LAD的。如果将 W#16#100改为256,就可以转换了。

再看一个例子,在STL中调用SFC14:

   CALL  "DPRD_DAT"

    LADDR  :=256

    RET_VAL:=MW6

    RECORD :=P#M 20.0 BYTE 20

输入参数LADDR的数据类型为WORD,输入INT常数256出错(用红色表示),需要改为16#100。如果搞不清楚数据类型,出了错也不知道错在哪里。

所以不管是LAD还是STL,对数据类型都得较真!!数据类型不是理论问题,而是一个实际问题。

——————分割线
1.2

有网友问:S7-300怎样将2013年08月08日8时8分8秒用STL如何转换成ASCII,最好是用FC的形式,进行调用,多谢谢了!

下面是我的回答:

STEP7中的时间用BCD码表示,BCD码可视为特殊的十进制数,可使用TI_S7库中的FC95 HTA来转换。

下面的程序将MB0开始的7个字节中的十六进制数转换为MB10开始的14个字节的ASCII码。

  CALL  "HTA"

   IN :=P#M 0.0

   N  :=W#16#7

   OUT:=P#M 10.0

---------------------我是分割线
1.3
廖老师你好:好久没有向您请教问题了,最近在学习plc的过程中经常遇到例如L LW LD这样的局部变量,我感到非常困惑,不知道这些局部变量在什么地方使用,使用前要做哪些准备,还有就是使用这些局部变量的优点。还有就是看到有用到L#0,L#6,L#7390,L#-7390这些都是哪里来的啊,是之前都有定义吗?最后就是对于指针的迷惑,例如要在系统块FC8的INO引脚上输入指针P#DB5.DBX0.0,如果我直接输入的话显示红色无效的,谢谢廖老师帮学生解惑。

[此贴子已经被作者于2013/4/20 15:34:28编辑过]
LW、LD是局部变量,只能在它所在的块里使用。需要在块的局部变量表里先定义、后使用。在块里只用局部变量、不用全局变量,这样的块不加任何修改就可以移植到其他项目。

L#0,L#6,L#7390,L#-7390是双整数常数。

除非在FC8中定义了INO的参数类型为Pointer,才可以使用实参P#DB5.DBX0.0
谢谢老师,基本清楚了,想追问下就是诸如L0.0,L0.1之类的局部地址在使用之前要定义吗?适合在什么地方用?
不定义也可以使用绝对地址,建议先定义后使用。当然在块的内部使用。

注意OB有20个字节自动生成的局部变量

-----------------我是分割线
1.4

S7-300/400的I/Q区称为过程映像输入区(PII)/过程映像输出区(PIQ),“映像”表示它们就像镜中花、水中月,访问它们并不是访问输入/输出模块,而是访问CPU存储器中的区域。

    只是在过程映像区刷新的时刻,I区和Q区的内容才与输入/输出模块中的实际值相同,因此它们并不能直接反映输入/输出的实际状态。

    S7-300/400的I/Q区与PI/PQ区(外设输入/外设输出区)的关系如下:

    1)访问PI/PQ区时,直接读写输入/输出模块,而I/Q区是输入/输出模块在CPU的存储区中的“映像”。

    使用外设地址可以实现用户程序与I/O模块之间的快速数据传送,因此被称为“立即读”和“立即写”。在每次扫描循环开始时对P/Q区采用批量读/写的方式,因此造成了输入/输出的滞后。

    2)I/Q区可以按位、字节、字和双字访问,PI/PQ区只能按字节(PIB/PQB)、字(PIW/PQW)和双字(PID/PQD)访问。

    I/Q区和PI/PQ区可以使用相同的字节地址。

    3)I/Q区的地址范围比PI/PQ区的小,有的S7-300CPU的I/Q区只有128B,有的CPU可以在组态时修改I/Q区的大小。

    4)如果地址超出了I/Q区允许的范围,必须使用PI/PQ区来访问。例如如果I/Q区只有128B,在访问S7-300的模拟量模块时(其地址区从256号字节开始),则必须使用PI/PQ区的地址。

想问一下在设计中如何用,能举一个例子吗?最好有程序!谢谢。
4)不是有个例子吗?

有时用PI、PQ地址是为了缩短输入、输出的响应时间

————我是分割线

1.5字符串
http://blog.gkong.com/liaochangchu_192696.ashx

————我是分割线
1.6 交换西门子数据的高低字节

以下是引用guangzhixu在2013/11/26 23:19:25的发言:
我想把 DB21.DBD13=0x 0000 1234;转换到DB1.DBD4=0x 1234 0000;应该怎么写呢,用这个TAK、CAW、CAD好像都实现不了。通信来得数据 需要将其中的一些数据进行这种高低字交换,但是又不都是这一种类型的数据,比如我通信来的前几个数据是word, 比如:0x1111,这样就不需要交换,但是后面的数据就是DW的,比如0x 0000 1234,这样就得交换。这两种数据穿插着在通信内容里。。。所以做功能块没有必要,但是单独这样写呢 又太啰嗦容易出错 有没有好一些的办法?请您指教!
CAW用来交换累加器1低16位的两个字节。没有更简单的方法了。

2、FB 和FC的区别

2.1

  1. FB有背景数据块,FC没有背景数据块。这是最本质的区别。

背景数据块是每个被控对象的专用存储区,就好像被控对象在银行的私人保险箱。临时变量是多个FB、FC的被控对象公用的数据区,就好像布告栏,大家都可以往上面贴布告,先贴的布告将被后贴的覆盖。

  1. FB和FC的局部数据都有IN、OUT、IN_OUT和TEMP,FC的返回值RET_VAL实际上是输出参数。因此有无静态变量(STAT)是二者的局部变量的本质区别。FC没有静态变量。

  2. 功能块的输出参数不仅与来自外部的输入参数有关,还与用静态变量保存的内部状态数据有关。功能因为没有静态变量,相同的输入参数产生的执行结果是相同的。

  3. 不能给功能的局部变量设置初始值,可以给功能块的局部变量(不包括TEMP)设置初始值。初始值需要专用的存储区来保持,FC因为没有背景数据块,所以不能设置初始值。

3、通讯的知识
3.1
小釉:有一个问题一直不是很明白,为什么在同一条总线上,可以跑不通的协议呢

比如 profibus dp网络有et200m和hmi,两者的通信协议肯定是不一样的。

为什么可以在一块运行,这样做是不是对于et200m和cpu的通信速度有影响呢,感觉hmi和plc通信的速度要慢一些相对于et200m

westcowboy: ET200M与PLC通信,其中的IO数据更新方式为循环数据交换;而HMI与PLC通信,IO数据更新为非循环数据交换。这是2者数据更新速度不一样的根本原因。

另外,PLC与ET200M通过DP通信,走的协议是Profibus-DP;而PLC与HMI通信,通常走的是S7通信。

HITIAR: 还要从网络模型上说起,总线是物理层和链路层上的东西,是传输介质和电气规程约定。协议是传输层上的东西,实际就是通信约定,是需要通信设备之间能听懂的交流语言。就像我们大家说话一样,可以通过电话传播语音,也可以通过空气或其它方式传播,至于我们说的是汉语还是哪种语言,只要通话的人能听懂就行了。所以同一条总线跑不同的协议是正常的。

再举个例子:以太网大家都很熟悉,通过网线和交换机构成了一个网络,设备可以收发电子邮件,可以下载,可以浏览等,这就同时使用了HTTP、FTP、SMTP等协议。

所以同一条总线跑不同的协议是正常的。总线和协议本身就是两回事,不用太纠结。这就是建立网络模型的好处。

小釉:这样做是不是对于et200m和cpu的通信速度有影响呢?

HITIAR:举个例子说,高速公路限速160公里,可以跑轿车也可以跑货车。影响车速的原因有哪些呢?发动机和公路拥堵哪个是主因呢?所以,通信速率是由控制器的运算能力和通信设备端口设计以及对端设备的通信速率来决定的,网络只是规定了一个最高通信速率而已。

西门子的设备的通信也是遵循这些原理的,至于每一种通信协议具体是如何约定的我就不能说明白了

3.2

由于网络连接器的接触不好,或者由于干扰等问题,使用时间较长的DP网络可能出现 “闪断”的情况,即偶尔瞬间断开,很快又恢复正常。如果没有下载OB86,闪断时CPU将会停机。现在普遍采用下载一个空的OB86来解决闪断造成停机的问题。

但是这样做也有风险,如果不是闪断,而是实实在在的网络故障或从站的故障的话,如果不停机,可能会引起灾难性的后果。为此可以采用下面的措施来判断是闪断还是持久性的从站故障。

1)在OB86中判断是哪个网络哪个从站的故障。如果是“进入的事件”(故障出现),将该从站专用的M位置位。如果该从站的故障是“离开的事件”(故障消失),将该从站专用的M位复位。

2)在OB1中,用该M位起动200ms的定时,定时时间到时调用SFC 46(STP),使CPU停机。如果是闪断(该M为为1的时间不到200ms),该定时器的定时中止,不会停机。

3)用一个字来记录调用OB86的次数,用HMI显示调用OB86的次数。

如果闪断的故障出现很频繁,则必须对硬件进行处理,例如更换DP连接器,解决接地、屏蔽、等电位连接、抗干扰等方面的问题

4、编程指令使用
4.1 P 上升沿触发指令
廖老师:请教给问题。
在这里插入图片描述

正RLO边沿检测指令 -(P)- 作用是不是会受程序扫描时间影响?

(1)我在FC块里面用到-(P)- ,发现程序比较长的时候就出现图中情况,根本不能用来检测上升沿;

da
(2)当我把OB1其他的程序都删掉时,只调用这个FC块时,就可以检测上升沿,不会有问题。

(3)另一个是我尝试要是-(P)-指令要是不在FC块,直接在OB1中,也是不会有问题。

听迷糊的,求解???

P线圈(上升沿检测指令)上面的地址用来保存上一扫描周期的RLO的值,不能使用FB、FC的临时局部变量。改为全局变量或FB的静态变量就可以了。

因为调用程序时同一级FB、FC的临时变量公用同一片地址区,前面调用的块的临时变量被后面调用的块的临时变量覆盖,所以上升沿检测指令不能正常运行。

在OB1中只调用一个FC,公用的地址区变成该FC独用,所以没有问题。

OB1的临时变量的地址区是OB1单独使用的,所以程序放在OB1里也没有问题。

5、西门子官网资料
https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1411657&b_id=66

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值