登录
首页 PLC论坛 西门子SIEMENS
回帖 发帖
正文

主题:请帮忙解答(STEP7 V5.2编程)

点击:9837 回复:9

我用网上的解密软件打开了标准库里的FC95(功能为把十六进制数转换为相应的ASCII),可是前面一些地方实在不明白,请高手指教,程序如下:
     TAR2  #TEMP_AR2                   // Save Address register 2 contents      
// If length to be converted is 0, return immediately
     L     #N
     L     0
     ==I  
     JC    DONE
// Open DB of ptr to hex input digits
     L     P##IN
     LAR1                              // Addr.Reg1 = Ptr to Src. Table
     L     W [AR1,P#0.0]               // load Block No. into accum 1
     T     #BLKNO                      // scrblk = Block No.
     OPN   DB [#BLKNO]                 // opens 1st Block, DB
     L     D [AR1,P#2.0]               // load Block Area Reference
     LAR1                              // load Block Addr.(area ref.)into Addr.Reg1
//---------------------------------------------------------------------------        
// Open ptr to output Ascii Locations as a DI
     L     P##OUT
     LAR2                              // Addr.Reg2 = Ptr to Output  
     L     W [AR2,P#0.0]               // load Block No. into accum 1
     L     0                           // CORRECTION ADDED BY STEVE LOVELL 5/98
     ==I  
     JZ    BEGN
     L     W [AR2,P#0.0]               // CORRECTION ADDED BY STEVE LOVELL 5/98
     T     #BLKNO                      // scrblk = Block No.
     OPN   DI [#BLKNO]                 // opens DI Block
//
// START OF CORRECTION ADDED BY STEVE LOVELL 5/98
//
     L     DW#16#5000000               // OR mask for DIX memory area in ptr
     L     D [AR2,P#2.0]               // load Block Area Reference; start addr.
     OD                                // Force memory area to DIX
     LAR2                              // Save into AR2
     JU    BEG2                        // Jump to label BEG2
//
// END OF CORRECTION
//
BEGN: L     D [AR2,P#2.0]               // start addr.      
     LAR2                              // load Block Addr.(area ref.)into Addr.Reg1
BEG2: NOP   0                           // CORRECTION ADDED BY STEVE LOVELL 5/98
//---------------------------------------------------------------------------        
     L     #N                          // Load length of HEX table
BYTS: T     #N
     L     B [AR1,P#0.0]               // Load byte from table
     T     #TMP1                       // and write it into TMP1 word
     T     #SAVTMP1                    // save a copy of the table's org. value
     L     2                           // number of hex input digits extracted
DIGT: T     #INDX_D                     // 1 byte (2 hex digits); 1 byte=2 nibbles
//-------------
     L     #SAVTMP1                    // save a copy of the table's org. value
     T     #TMP1
     L     2
     L     #INDX_D
     <>I  
     JC    MASK
     L     #TMP1
     SRW   4
     T     #TMP1
//-------------
MASK: L     #TMP1                       // Accum 2
     L     W#16#F                      // Accum 1
     AW                                // TMP1 AW 0x000F (mask off all but lower nibble)
     T     #ABYTE                      // convert from WORD to BYTE
     L     B#16#A                      // Load 0x0A
           JC    A030                        // Jump to Add 0x30
     JU    A037                        // Jump to Add 0x37
// Add 0x30
A030: L     B#16#30
     L     #ABYTE
     +I                                // 0x30 + ABYTE
     T     #ABYTE
     JU    CONT                        // Jump to continue
// Add 0x37
A037: L     B#16#37
     L     #ABYTE
     +I                                // 0x37 + ABYTE
     T     #ABYTE
//---------------------------------------------------------------------------        
// Continue
CONT: L     #ABYTE
     T     B [AR2,P#0.0]               // Write BYTE to ouput
     +AR2  P#1.0                       // Increment pointer to output (by 1 byte)
//---------------------------------------------------------------------------        
     L     #SAVTMP1                    // Copy original table's BYTE value into TMP1          
     T     #TMP1
     L     #INDX_D
     LOOP  DIGT                        // }while (INDX_D <= 2)
//---------------------------------------------------------------------------        
     +AR1  P#1.0
     L     0                           // Clear out TMP1 WORD
     T     #TMP1                       // before reading next byte from table
     L     #N
     LOOP  BYTS                        // }while (N > 0)
     JU    DONE
//---------------------------------------------------------------------------        
DONE: SET  
     SAVE  
     LAR2  #TEMP_AR2                   // Restore Address Register 2 Contents
这是一个FC,怎么程序的开头还要用到OPN   DB [#BLKNO]    和 OPN   DI [#BLKNO] ?而且这两个数据块号是怎么来的?要是我的调用程序里没有这两个数据块呢?
04-11-22 18:01
我做了一个多小时的实验,终于弄懂了!多谢!
原来在于定义形参时本来就是一个指针(比如IN0为Pointer类型),结果在程序里再用到P##IN0,则为指向指针的指针(这一点非常象C语言) 。
比如实参为P#DB1.DBX0.1,即为16#00 01 84 00 00 01,当你再一次用指针指令P##IN0时,即把16#00 01 84 00 00 01做为一个数字,P##IN0则为该数的指针!
所以在用到如下指令后:
比如:L     P##IN0
     LAR1
     L     W[AR1,P#0.0]  //这时取的是头一个字,即块号=1,DB1
     L     D[AR1,P#0.0]  //这时取的是头两个字,即16#00 01 84 00
     L     D[AR1,P#2.0]  //这时取的是后两个字,即P#DBX0.1=16#84 00 00 01
这是我猜测的过程,请高手指正.
04-11-23 14:50
Shyer研究够细呀。加钻鼓励。
还请详细研究OPN指令(HELP on STL)和
间接寻址(http://www.ad.siemens.com.cn/service/e-training/PLC/download/pointer.zip)。
04-11-23 17:53
多谢Karl提供的资料!
04-11-24 10:01
我的在学习啊
05-03-06 10:58
asasa
06-05-30 15:35
dhgfdhgfdgfdgfdgfd
07-06-14 12:36
此程序不是用STL编写的用的,是高级语言如SCL,没有源文件很难解密,有时解出也不对,我用过SCL其它我不知道 。
08-05-28 21:38
在SCL中也就一句话的事,另除了研究一下指针指令外,解开它没有任何意义!
坚定完毕!
08-06-29 11:52
得学习了,要学的真多,我记得我学过汇编语言阿,都看懂了
08-08-19 11:35

工控新闻

更多新闻资讯