这个说明很重要,如果真想你所说L20.0没有被用到其他地方的话,按照你的程序是可以达到控制要求的,因为临时变量不是主动释放的,而是被占用的。
2.这段程序是在仿真的时候发现有问题的,我觉得仿真过不了到了实际cpu上肯定也过不了。
这句话也很重要,但是你使用的是PLCSIM进行仿真的吗?还是其他仿真软件,建议还是使用西门子s7300的官方仿真软件PLCSIM比较正式也比较真石。之所以这么说,是因为你的程序我也仿真 了一下,并且使用了OB1调用了FC,但是仿真结果是正常的 即当m20.1状态由0改变为1时,mw900加1。
用FP和FN好像都是在同一个周期就可以处理完的事情,并不需要等到第二个周期,所以好像也没有下个周期丢失数据的问题。
不对,边沿脉冲指令时一定需要两个周期才能判断前面的逻辑结果是否可以产生上升沿或者下降沿的一个周期是不可能完成的,因为改指令的原理是将存起来 并且与新的状态进行比较。一个周期只能采集一个状态,所以最少两个周期才能实现是否检测到上升或者下降沿。在这说的状态就是指该指令前面的逻辑运算结果。
所以说如果L20.0在这会有可能被其他指令所用的话,是存在丢失数据的问题的楼上几个所说是有一定道理的。
而且很多无论是西门子的官方文件还是其他参考书中很多FN和FP例程都用了L缓冲区,所以比较奇怪为啥我这里就不能用。
有一本书叫STEP7编程技巧,在本网站可以换取,里面有一节正好是将你所说的问题的,并且是不建议使用L作为存储位的。理由已经叙述过,你有兴趣可以找来看一看,网上也有这本书相关的电子资料。
补充个问题, Rossi84说临时变量需要在之前赋值,是在FP前面一条语句赋值?这样会不会导致FP更不能用了?
个人感觉是不需要的!在实践中证明也是不需要的,所以感觉你还是在尝试一下吧!反正我在仿真的时候显示的是正确的结果。
Here is (a bit of a silly) example to outline the differences between "Area-crossing" and "Area-internal" addressing:
LAR1 P#I 7.0 // Load AR1 with Area-crossing pointer to I 7.0
LAR2 P#7.1 // Load AR2 with Area-internal pointer to address 7.1
A [AR1,P#0.0] // = "A I 7.0" (AR1 value is "I 7.0")
A I [AR2,P#0.0] // = "A I 7.1" (AR2 value is "7.1", "I" is part of instruction)
= Q [AR2,P#0.0] // = "= Q 7.1" (AR2 value is "7.1", "Q" is part of instruction)
= Q [AR1,P#0.0] // = "= Q 7.0" (even though AR1 contains value of "I 7.0", the instruction explictly specifies "Q" which "overrules" the "I" memory area in AR1)
And here are the hex values in use to nominate the Memory area (in the most significant Byte of the Adress Register):
Hexadecimal Code
Memory Area
Description
b#16#81
I
Input area
b#16#82
Q
Output area
b#16#83
M
Bit memory area
b#16#84
DB
Data block
b#16#85
DI
Instance data block
b#16#86
L
Local data (L stack)
b#16#87
V
Previous local data
And now to the question which D is used in your example:
Since "Address" is declared as an IN parameter of type Pointer for a Function, it is actually the so called "V" memory area (Local data of the calling block) to which the access take place (the Pointer values are stored in "invisible" TEMP variables of the Block from which you call your Function).
So I guess you would have to call it "VD"
另外,我想在FC中调用PID指令FB41,应该也可以的吧?因为OB35我已经设为1S,用于流量累积.
答:PID 没有例程和经验值可参考, 每个设备都不同,都需要根据现场的设备去调试。有时同样的两套设备P、I、D参数都会不同。 所以PID 的参数也需要根据实际情况一点点试。
下面的步骤供你参考。
PID的调用要在OB35中完成.
在ob35里面插入FB41,方框顶上会有红字,输入一个DB块如“DB20”。系统会问你要不要生成这个DB,选yes就可以。
大部分参数不要填,默认就行,下面是常用参数,用变量连接:
1、MAN_ON:用一个bool量,如m0.0,为true则手动,为false则自动;
2、cycle:T#100MS,这个值与ob35默认的100ms一致;
3、SP_INT:MD2,是hmi发下来的设定值,0-100.0的范围,real型;
4、PV_IN:MD6,实际测量值,比如反馈的氧浓度,要从piw×××转换为实际的工程量(使用FC105);
5、MAN:MD10 (该地址也可以是从上位机设定的地址),是手动状态下的输入值,real型。手动设多少输出将为多少。
6、GAIN: MD100(该地址也可以是从上位机设定的地址如DB 块的地址,这样可以从上位机设P 参数了),默认写1-2吧(系统默认是2),调试的时候再改。
7、TI:MW120, 默认可以写T#30S吧,调试的时候改;
8、DEAD_W:MD122,死区,就是sp和pv的偏差死区,0-100.0的范围,默认0,调试的时候改;
输出:
9、LMN:MD126,把MD126再用fc106转换到pqw××,如果pid运算结果不再有工艺条件其他限制可以用LMN_PER更简单就不用fc106了。
三、用plcsim模拟
1、手动
man_on=true,看输出是否等于man;
2、自动
man_on=false,调整pv或者sp,使得有偏差大于死区,看输出变化,这里的模拟只能说明pid工作了,不能测试实际调节效果啊。
COM_RST: BOOL: 重新启动PID:当该位TURE时:PID执行重启动功能,复位PID内部参数到默认值;通常可以不用,因为一旦参数设定好不会有大的变动了。
1. MMC卡插在CPU的插槽中。CPU要求整机复位(STOP LED灯慢闪烁)。
2. 将模式转换开关扳到MRES位置,并在此位置保持(大约9秒)直到STOP LED灯持续亮。
3. 在接下来的3秒钟内必须将转换开关松开回到STOP模式位置,并再次扳到MRES位置。STOP LED灯在删除过程中闪烁。
如果MMC卡在以上描述的步骤完成后仍继续请求整机复位,则该卡有故障。
注意事项:
如果MMC卡包含的数据对CPU无效,就只可能对它进行复位。另外MMC卡只能由上述步骤初始化。
警告:
不要将MMC卡用于非SIMATIC产品并不要使用第三方设备格式化它。这可能覆写MMC卡的内部结构且无法恢复。这样会导致此MMC卡不能被SIMATIC CPU 识别/接受并无法再在SIMATIC设备中使用。
CP5621和CP5611的区别是什么?我使用的是300的MPI协议,还有他们插槽区别是什么?
答:6GK1 561-1AA01的是CP5611 A2,
6GK1 562-1AA01的是CP5621。
但楼上的几位兄弟的具体描述有一些偏差。CP5611 A2和CP5621都是应用于台式机的插卡。
1. CP5611 A2符合PCI-X(64位)标准,但还是以32位工作的,同时兼容普通的PCI标准,普通PCI插槽是乳白色的。
2. CP5621符合PCI-E标准,本身是PCI-E x1,兼容x4,x8,x16,不能应用在普通PCI和PCI-X插槽上,和笔记本上的PCMCIA Express插槽也不是一回事,PCI-E插槽是黑色的。
3. 西门子目前没有支持笔记本上PCMCIA Express的插卡,CP5512只符合PCMCIA I/II代标准,后续产品CP5711是USB接口的。
4. 对于楼主连接S7-300/400来说,CP5611 A2、CP5621、CP5512和CP5711都可以满足要求,关键在于楼主使用的是台式机还是笔记本,以及其具有的插槽类型。
我认为这才是解决你的问题的最好办法,而不是问如果在FB里面用绝对地址的方法或者可行与否。
FB本来就是为了不引用绝对地址,你在里面用只会造成本FB仅能调用一次。
如果是自己插入的FB,FC ,则可以进行打开,如果需要保护(加锁)可以按照下面的步骤。需要注意加密后的源文件一定要保存好,如果丢失或删除了则自己也无法打开自己的程序了。
如何实现程序块保护:
1.打开程序编辑窗口LAD/FBD/STL;
2.将要进行加密保护的程序块生成转换为源代码文件(通过选择菜单 File—>Generate source 生成);
3.在LAD/FBD/STL 窗口中关闭您的程序块,并在SIMATIC Manager项目管理窗口的source文件夹中打开上一步所生成的source文件;
4.在程序块的声明部分,TITLE行下面的一行中输入” KNOW_HOW_PROTECT”;
5.存盘并编译该source文件(选择菜单FileSave,FileCompile);
6.现在就完成了您程序块的加密保护;
具体步骤还可以上网看FAQ
http://support.automation.siemens.com/CN/view/zh/10025431
如果用普通的move语句虽然也可以传递,但对于数据量较大的传送要有很多的move语句,总是不方便的。所以还是能有类似blkmove这样的语句来解决在DP总线上进行大数据量的传递
答:I/O地址处于过程映像区外的DP通信需要一次传输3字节或大于4字节的一致性数据,调用SFC14/15。
请参考以下链接关于分布式 I/O 数据一致性处理
http://support.automation.siemens.com/CN/view/zh/28991143