技术论坛

 回复:求高手帮我看段程序,要详细每段讲解,

返回主题列表
作者 主题
仪表工1
游士

经验值:165
发帖数:36
精华帖:0
楼主    2016-06-27 21:58:29
主题:求高手帮我看段程序,要详细每段讲解,

1段

  TAR1  #T_AR1                      // SAVE ADRESSREGISTER AR1

  TAR2  #T_AR2                      // SAVE ADRESSREGISTER AR2

2段

  L     P##OUT_ANY                  //  START ADRESS OF ANY-POINTER 

      LAR2                              // INTO AR2

      L     B#16#10                     // ENTER SYNTAX-ID 


      T     B [AR2,P#0.0]               // INTO ANY-POINTE 0 BYTES

      L     #DAT_TYP

      L     W#16#0

      <>I   

      JC    NIL

      L     B#16#0

      JU    TYPE

NIL:  L     #DAT_TYP

      L     W#16#1

      <>I   

      JC    BOOL

      L     B#16#1

      JU    TYPE

BOOL: L     #DAT_TYP

      L     W#16#2

      <>I   

      JC    BYTE

      L     B#16#2

      JU    TYPE

BYTE: L     #DAT_TYP

      L     W#16#3

      <>I   

      JC    CHAR

      L     B#16#3

      JU    TYPE

CHAR: L     #DAT_TYP

      L     W#16#4

      <>I   

      JC    WORD

      L     B#16#4

      JU    TYPE

WORD: L     #DAT_TYP

      L     W#16#5

      <>I   

      JC    INT

      L     B#16#5

      JU    TYPE

INT:  L     #DAT_TYP

      L     W#16#6

      <>I   

      JC    DWOR

      L     B#16#6

      JU    TYPE

DWOR: L     #DAT_TYP

      L     W#16#7

      <>I   

      JC    DINT

      L     B#16#7

      JU    TYPE

DINT: L     #DAT_TYP

      L     W#16#8

      <>I   

      JC    REAL

      L     B#16#8

      JU    TYPE

REAL: L     #DAT_TYP

      L     W#16#9

      <>I   

      JC    DATE

      L     B#16#9                      // ELSE LOAD AREA TYPE "DATE"

      JU    TYPE                        // USE TYPE

DATE: L     #DAT_TYP                    // LOAD TYPE OF DATA

      L     W#16#A                      // IF TYPE OF DATA 

      <>I                               // <> "TIME_OF_DAY" THEN

      JC    TOD                         // ASK FOR TOD (TIME_OF_DAY)

      L     B#16#A                      // ELSE LOAD AREA TYPE "TIME_OF_DAY"

      JU    TYPE                        // USE TYPE

TOD:  L     #DAT_TYP                    // LOAD TYPE OF DATA

      L     W#16#B                      // IF TYPE OF DATA 

      <>I                               // <> "TIME" THEN

      JC    TIME                        // ASK FOR TIME

      L     B#16#B                      // ELSE LOAD AREA TYPE "TIME"

      JU    TYPE                        // USE TYPE

TIME: L     #DAT_TYP                    // LOAD TYPE OF DATA

      L     W#16#C                      // IF TYPE OF DATA 

      <>I                               // <> "S5TIME" THEN

      JC    S5TI                        // ASK FOR S5TIME

      L     B#16#C                      // ELSE LOAD AREA TYPE "S5TIME"

      JU    TYPE                        // USE TYPE

S5TI: L     #DAT_TYP                    // LOAD TYPE OF DATA

      L     W#16#E                      // IF TYPE OF DATA 

      <>I                               // <> "DATE_AND_TIME" THEN

      JC    DT                          // ASK FOR DT (DATE_AND_TIME)

      L     B#16#E                      // ELSE LOAD AREA TYPE "DATE_AND_TIME"

      JU    TYPE                        // USE TYPE

DT:   L     #DAT_TYP                    // LOAD TYPE OF DATA

      L     W#16#13                     // IF TYPE OF DATA 

      <>I                               // <> "STRING" THEN

      JC    STRI                        // ASK FOR STRING

      L     B#16#13                     // ELSE LOAD AREA TYPE "STRING"

      JU    TYPE                        // USE TYPE

STRI: L     #DAT_TYP                    // LOAD PARAMETER TYPE OF DATA

      L     W#16#17                     // IF PARAMETER TYPE OF DATA 

      <>I                               // <> "BLOCK_FB" THEN

      JC    BLFB                        // ASK FOR BLOCK_FB

      L     B#16#17                     // ELSE LOAD PARAMETER TYPE "BLOCK_FB"

      JU    TYPE                        // USE TYPE

BLFB: L     #DAT_TYP                    // LOAD PARAMETER TYPE OF DATA

      L     W#16#18                     // IF PARAMETER TYPE OF DATA 

      <>I                               // <> "BLOCK_FC" THEN

      JC    BLFC                        // ASK FOR BLOCK_FC

      L     B#16#18                     // ELSE LOAD PARAMETER TYPE "BLOCK_FC"

      JU    TYPE                        // USE TYPE

BLFC: L     #DAT_TYP                    // LOAD PARAMETER TYPE OF DATA

      L     W#16#19                     // IF PARAMETER TYPE OF DATA 

      <>I                               // <> "BLOCK_DB" THEN

      JC    BLDB                        // ASK FOR BLOCK_DB

      L     B#16#19                     // ELSE LOAD PARAMETER TYPE "BLOCK_DB"

      JU    TYPE                        // USE TYPE

BLDB: L     #DAT_TYP                    // LOAD PARAMETER TYPE OF DATA

      L     W#16#1A                     // IF PARAMETER TYPE OF DATA 

      <>I                               // <> "BLOCK_SDB" THEN

      JC    BSDB                        // ASK FOR BLOCK_SDB

      L     B#16#1A                     // ELSE LOAD PARAMETER TYPE "BLOCK_SDB"

      JU    TYPE                        // USE TYPE

BSDB: L     #DAT_TYP                    // LOAD PARAMETER TYPE OF DATA

      L     W#16#1C                     // IF PARAMETER TYPE OF DATA 

      <>I                               // <> "COUNTER" THEN

      JC    COUN                        // ASK FOR COUNTER

      L     B#16#1C                     // ELSE LOAD PARAMETER TYPE "COUNTER"

      JU    TYPE                        // USE TYPE

COUN: L     #DAT_TYP                    // LOAD PARAMETER TYPE OF DATA

      L     W#16#1D

      <>I   

      JC    TIMR

      L     B#16#1D

      JU    TYPE

TIMR: L     B#16#2

TYPE: T     B [AR2,P#1.0]

      L     #DAT_LEN

      T     W [AR2,P#2.0]

      L     #DB_NO

      T     W [AR2,P#4.0]

      T     #BLOCK_DB_NO

      L     0

      ==I   

      JC    FLAD

      L     P#DBX 0.0

      JU    OFFD

FLAD: L     P#M 0.0

OFFD: L     #DB_BYTE

      SLD   3

      +D    

      L     #DB_BIT

      +D    

      T     D [AR2,P#6.0]

3段    OPN   DB [#BLOCK_DB_NO]

4段

  

  L     D [AR2,P#6.0]

      LAR1  

      TAR1  #ADDRESS_DESTINATION


      L     #DAT_LEN

      L     2

      -I    

      T     #DAT_LEN_SUB_2


      L     #DAT_LEN_SUB_2

      L     2

      /I    

      T     #LOOP_LIM


      T     #DAT_LEN_SUB_2

      SLD   3

      AD    DW#16#FFFFFFF

      T     #DB_BYTE_LEN


      L     #DB_BYTE_LEN

      L     #ADDRESS_DESTINATION

      +D    

      T     #ADDRESS_DESTINATION


      L     #DAT_LEN_TR

      SLD   3

      AD    DW#16#FFFFFF

      T     #DB_BYTE_LOW


      A     #EN

      JCN   END


      L     0

CYCL: T     #LOOP

      L     #LOOP

      L     #DAT_LEN_SUB_2

      >=I   

      JC    A7d0


      L     #ADDRESS_DESTINATION

      L     #DB_BYTE_LOW

      -D    

      T     #ADDRESS_SOURCE


      L     DBD [#ADDRESS_SOURCE]

      T     DBD [#ADDRESS_DESTINATION]


      L     #ADDRESS_SOURCE

      T     #ADDRESS_DESTINATION


      L     #LOOP

      L     1

      +I    

      JU    CYCL

A7d0: L     #IN_V

      T     W [AR1,P#0.0]

END:  NOP   0

5段

  LAR1  #T_AR1                      // RESTORE ADRESSREGISTER ADR1

   LAR2  #T_AR2                      // RESTORE ADRESSREGISTER ADR2



潇潇
侠客

经验值:625
发帖数:75
精华帖:6
5楼    2016-07-01 01:12:05
精华帖  主题:回复:求高手帮我看段程序,要详细每段讲解,

FB_Data_Shift.pdf

不知道源程序是不是经过测试,因为程序存在违背西门子程序基本原则的问题。

主要是AR2, AR2指向的是FB块背景数据块的起始地址,如果对其赋值,会导致所有读取背景数据块的程序都相应的偏移。所以读到的是错误的数据。(如果有误请大家指正)

我注释了,做了修改。功能主要是每触发一次,数据向高地址根据设定值#i_DAT_LEN_TR做偏移,并用数值i_IN_V填充数据块的起始地址:

      L     #IN_V

      T     W [AR1,P#0.0]

仅供参考。

可阅读的西门子手册是:

指针.pdf




宁超
至圣

经验值:11563
发帖数:1009
精华帖:39
8楼    2016-08-25 09:34:11
精华帖  主题:回复:求高手帮我看段程序,要详细每段讲解,

这个程序应该是个FC,AR2的使用只是在FB中受限制,西门子也没有什么不能使用AR2在FBFC中的编程原则,在FB中用户要使用AR2主要还是因为想要方便,因为指令提供LAR2,TAR2,+AR2这些方便运算,只是使用前要保存好,使用后要恢复。

楼主的功能块中而已经做了相应的处理。


您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。