技术论坛

LW =指令的问题

作者 主题
游士

经验值: 264
发帖数: 156
精华帖: 0
主题:LW =指令的问题


只看楼主 只看精华 楼主 2012-02-02 17:06:34
标签:
S5程序:
Segment 1
Name :MIN-L00P
Decl :MIN I/Q/D/B/T/C: D KM/KH/KY/KS/KF/KT/KC/KG: KF
Decl :DBSW I/Q/D/B/T/C: B
Decl :DWMI I/Q/D/B/T/C: I BI/BY/W/D: W
Decl :DWMA I/Q/D/B/T/C: I BI/BY/W/D: W

:***

Segment 2
:DO =DBSW
:LW =DWMI
:T FW 250
LOOP :LW =MIN
:DO FW 250
:L DW 0
:<=F
:JC =INC
:DO FW 250
:L DW 0
:L KB 0
:!=F
:JC =INC
:LW =MIN
:DO FW 250
:T DW 0
INC :L FW 250
:I 1
:T FW 250
:LW =DWMA
:<=F
:JC =LOOP
:BE


关于这段程序的一些疑问:
1、MIN的数据类型是D,那么相当于S7里面的哪种数据类型呢?

2、 :DO =DBSW
:LW =DWMI
:T FW 250
这段程序的意思是
OPN DB[DBSW]
L #DWMI
T FW 250
还是
OPN DB[DBSW]
L P##DWMI
T LD0
L DBW[LD 0]
T FW250

我的主要问题就是“LW =”这个指令是直接取数值,还是将这个数值作为地址指针。
后面跟随的操作参数在不同数据类型或其它情况下,结果一样吗?(比如说上面这段程序里的LW =DWMI 和LW =MIN).


谢谢各位大神!
 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=958239&b_id=2&s_id=0&num=9

奇侠

经验值: 7973
发帖数: 2355
精华帖: 73
回复:LW =指令的问题
精华帖精华帖星级3级


只看楼主 只看精华 1楼 2012-02-03 11:07:30
楼主:你的疑惑我帮你看了一下,可参考如下
1、MIN的数据类型是D,那么相当于S7里面的int数据类型(16位整数);
2、 :DO =DBSW
:LW =DWMI
:T FW 250
这段程序的意思是
OPN #DBSW
L P##DWMI
T MW 250

“LW=”这个指令是将后面的数据作为地址指针,P##DWMI是双字指针,装载到累加器中是个32位数据哦。


楼主:我转换了你S5的程序到S7,现在提供一下S5转S7的STL Sources源代码给你参考,也许对你更有帮助!
FUNCTION FC 0 : VOID
NAME: MIN_LOOP // MIN-LOOP
VAR_INPUT
MIN :int; // MIN
DBSW :block_db; // DBSW
DWMI :word; // DWMI
DWMA :word; // DWMA
END_VAR
VAR_TEMP
conv_akku1 :dword;
conv_akku2 :dword;
conv_stw :word;
END_VAR
BEGIN
NETWORK
OPN #DBSW ;
L #DWMI;
// // *** Error in Line 62 (FB 1): Invalid operator, can possibly be replaced with the
statement:\"L P##DWMI\" ***
T MW 250;
LOOP:L #MIN;
T conv_akku1;
L STW;
T conv_stw;
L MB 251;
SLW 4;
LAR1;
L conv_stw;
T STW;
L conv_akku1;
L DBW [ AR1, P#0.0 ];
<=I;
JC INC;

T conv_akku1;
L STW;
T conv_stw;
L MB 251;
SLW 4;
LAR1;
L conv_stw;
T STW;
L conv_akku1;
L DBW [ AR1, P#0.0 ];
L 0;
==I;
JC INC;

T conv_akku1;
TAK;
T conv_akku2;
L STW;
T conv_stw;
L MB 251;
SLW 4;
LAR1;
L conv_stw;
T STW;
L conv_akku2;
L conv_akku1;
T DBW [ AR1, P#0.0 ];
INC: L MW 250;
INC 1;
T MW 250;
L #DWMA;
// // *** Error in Line 111 (FB 1): Invalid operator, can possibly be replaced with the
statement:\"L P##DWMA\" ***
<=I;
JC LOOP;

END_FUNCTION
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”
以下网友喜欢您的帖子:

  
游士

经验值: 264
发帖数: 156
精华帖: 0
回复:LW =指令的问题


只看楼主 只看精华 楼主 2楼 2012-02-03 14:05:01
首先感谢一楼哥们的回答,
我还有点疑问
关于变量类型是D,那么转换到S7程序后它应该作为输入还是作为输出应该如何判断呢?
其次为什么LW =MIN系统不认为是指针地址呢?是因为MIN的数据类型是D而DWMA的数据类型是W吗?

第三:P##DWMA这个数据究竟是多少位的数据?
INC: L MW 250;
INC 1;
T MW 250;
L P##DWMA
<=I;
JC LOOP;
这句MW 250和P##DWMA能直接进行比较吗?

疑问真的挺多的,希望能够得到您耐心的解答,谢谢!
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7973
发帖数: 2355
精华帖: 73
回复:LW =指令的问题


只看楼主 只看精华 3楼 2012-02-03 14:38:52
楼主:S5变量类型是D,S5中是作为输入形参。那么转换到S7程序后它也是作为输入形参,STL Sources 的源代码变量声明中VAR_INPUT 已经写的很清楚了。MIN形参的数据类型是Int(整数),也就是说是一个常数,LW=MIN可能是装载常数指针;而LW=DWMA是装载一个地址里面的数据作为指针的,装载的是一个地址(word)。他们之间的区别我也忘的差不多了,楼主最好再查阅一下指令手册。

第三:P##DWMA这个数据是32位指针,MW 250和P##DWMA不能直接进行比较!另外 INC 指令是针对字节操作的指令,不能用于字操作,否则会出现意想不到的后果。楼主应该再检查一下指令用法是否得当!(仅供参考)
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”
以下网友喜欢您的帖子:

  
至圣

经验值: 11247
发帖数: 3299
精华帖: 4
回复:LW =指令的问题


只看楼主 只看精华 4楼 2012-02-04 21:51:41
不错,向一楼学习拉,真是太详细了。
LW= 装载常数地址指针吧
喜欢用SIEMENS,乐水工控生活 打造工业智能家居生活!
以下网友喜欢您的帖子:

  
版主

经验值: 16187
发帖数: 6610
精华帖: 50
回复:LW =指令的问题


只看楼主 只看精华 5楼 2012-02-08 21:23:24
感谢“背影”大侠的认真、严谨、无私,封精致敬。
知其道,用其妙!
以下网友喜欢您的帖子:

  
游士

经验值: 264
发帖数: 156
精华帖: 0
回复:LW =指令的问题


只看楼主 只看精华 楼主 6楼 2012-02-11 14:48:10
大侠,我如果自己转换成以下S7代码,您帮我看看行不行?
FUNCTION FC 61 : VOID
NAME: MIN_L00P // MIN-L00P
VAR_INPUT
MIN :int; // MIN
DBSW :block_db; // DBSW
DWMI :word; // DWMI
DWMA :word; // DWMA
END_VAR
VAR_TEMP
conv_akku1 :dword;
conv_akku2 :dword;
conv_stw :word;
END_VAR
BEGIN
NETWORK
NETWORK
OPN #DBSW ;
L P##DWMI;
T MD 250;
M002:L #MIN;
L DBW[MD250];
<=I;
JC M001;

L DBW[MD250];
L 0;
==I;
JC M001;
L #MIN;
T DBW[MD250];
M001:L MD 250;
L DW#16#10;
+D;
T MD 250;
L P##DWMA;
<=D;
JC M002;

END_FUNCTION

谢谢!
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7973
发帖数: 2355
精华帖: 73
回复:LW =指令的问题


只看楼主 只看精华 7楼 2012-02-11 20:00:32
楼主:我仔细阅读、理解了一下你的S7 STL Sources代码,主要是顺序处理数据块内地址从DWMI至DWMX范围内的字,以一个字的偏移量递增查询,如果等于0或者大于MIN的数据原样保持,如果大于0而小于MIN的数据以MIN写入,我没有发现语法上或指令上的错误!需要注意:这种情况下用双字指针时,DWMI和DWMX这两个变量的值作为地址时,要8的整数倍,不然寻址会发生错乱!切忌啊.......

楼主也可以将此段源代码编译成S7程序仿真测试一下,看看执行结果是不是你想要的。
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”
以下网友喜欢您的帖子:

  
游士

经验值: 264
发帖数: 156
精华帖: 0
回复:LW =指令的问题


只看楼主 只看精华 楼主 8楼 2012-02-12 13:10:27
非常感谢,我再仿真试试,谢谢!
 
以下网友喜欢您的帖子:

  
游侠

经验值: 331
发帖数: 150
精华帖: 1
回复:LW =指令的问题


只看楼主 只看精华 9楼 2012-03-29 11:37:48
在S5中 LW= 指令功能说明
指令 操作数 与RLO的关系 功能
LW= 形式操作数 与RLO无关 将一个形式操作数的位形式装载到累加器ACCU1中,形式操作数的参数形式可以是:KF,FH,KM,KH,KS,KT,KC。
 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
LW =指令的问题
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。