STL语言 循环跳转问题,跪求高手解答

32位存储器间接寻址举例
//DB 块间接寻址举例
OPN DB 1         //打开DB1??   
OPN DI 3          //打开DB3,最多可以同时打开两个DB块
L 4               //装载4到累加器1 中   
SLD 3            //累加器1中数值左移3位 
T MD 20          //将逻辑操作结果传送到MD20中,MD20包含地址指针为P#4.0
                           
L P#20.0          //将地址指针P#20.0装载到MD24中 
T MD 24                                           
L 320             //320转换指针为 P#40.0并装载到MD28中??
T MD 28                                                  
L DBW [MD 20]    //装载DB1.DBW4??
L DBW [MD 24]    //装载DB1.DBW20??
+I                //相加????
L DIW [MD 28]    //装载DB3.DBW40??
-I                //相减?? ????
T DIW 2          //将运算结果传送到DB3.DBW2 中????
JC m1     (这里的跳转指令是什么意思,跳转条件是什么)
//M存储器连续区域操作??????????????????
L 0               //初始化MW100和MD4??
T MW 100                               
T MD 4
OPN DB 1        //打开DB1??
L 100            //循环操作的次数100 次????
NEXT: T MW 100       //将循环100次装载到MW100 中,固定格式??????????????
L MW 2           //进行比较的数值存储于MW2??
L DBW [MD 4]     //与DB块中存储的值进行比较,开始地址为DBW0??
==I               //如果数值相等跳到m1??
JC m1
L MD 4           //将地址指针加2(每个相邻的字地址相差2)。
L P#2.0
+D
T MD 4
L MW 100           //次数减1,跳回next如果MW100等于0跳出循环操作LOOP指令LOOP 指令固定格式??????????????
LOOP NEXT
m1:   FP M 10.0          //如果数值相当,记录MD4指针的数据将转换为数组的位置 
((地址值/P#2.0)+1)值存储于MD8中   (上面这段注释怎么理解,指针数据转换为数组的位置是什么意思,还有他这个计算的公式是根据什么来的)
JCN m2       (这个跳转是在没跳到m1的时候 也就是说m10.0上升沿没有激活的时候跳转吗)
L MD 4
L P#2.0
/D
+ 1
T MD 8
m2:     NOP 0  (最后这个NOP不理解什么意思,如果不加这一段程序会怎样)

以上这段程序是在s7-300的寻址文档里给的示例程序,有好几处看不懂,都标在括号里了,还有一个问题是loop循环程序 比如循环一百次,是每个扫描周期都循环一百次,下个扫描周期又循环一百次吗?

有没有成熟的冒泡程序,比如一百个数找到最大值,最小值的那种

最佳答案

1、还有一个问题是loop循环程序 比如循环一百次,是每个扫描周期都循环一百次,下个扫描周期又循环一百次吗?
是每个扫描周期都循环一百次!
2、有没有成熟的冒泡程序,比如一百个数找到最大值,最小值的那种 ?
、假定100个整型数据,放在DB1中,安放顺序如下:
DWD0
DWD2

DBD198.
下面是西门子的程序
OPN   DB    1                 /////打开DB1这个数据块
      L     100 //装载100到MB0中,因为有100个数据,要进行100次排序.
LL0:  T     MB    0
      L     P#0.0   ////装载地址指针,这是关键,不要搞错了
      LAR1  
      L     99
LL1:  T     MB    2   ////内部循环,进行99次,直到把最大值排到最后
      L     DBW [AR1,P#0.0]
      L     DBW [AR1,P#4.0]
      <I  
      JC    LL2          ////比较前后两个值,如果前面大于后面的,则前后数据交换
      L     DBW [AR1,P#0.0]
      T     #m_temp
      L     DBW [AR1,P#2.0]
      T     DBW [AR1,P#0.0]
      L     #m_temp
      T     DBW [AR1,P#2.0]
LL2:  +AR1  P#2.0     ////指针自动进行加2,因为是整型数,所以要跳过2个字节
      L     MB    2
      LOOP  LL1       ///这个指令自动的将A寄存器里的值减1
      L     MB    0
LOOP  LL0
2、有关指针寻址的资料:
、《关于S7-300和S7-400指针寻址的说明与例程 》下载:
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=F0215
、《step7编程之地址概念详解》连接:
http://wenku.baidu.com/view/b2b4d3375a8102d276a22fd3.html

http://www.chinakong.com/rencai/disp.asp?id=1633&leibie=4
、《西门子STL间接寻址常问问题集》
http://www.ad.siemens.com.cn/download/docMessage.aspx?
ID=6175&loginID=&srno=&sendtime=

提问者对于答案的评价:
谢谢阿铭老师,#m_temp是什么意思

最佳答案作者回复:
#m_temp是编程者自己定义的一个变量名,一般定义标有temp,通常是一个临时的存储单元,具体表示什么?要看相应的程序了。

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc345185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月4日 下午10:35
下一篇 2021年7月4日 下午10:35

相关推荐

发表回复

登录后才能评论