duhuaiguo
級(jí)別: *
|
This is the main handler of the MMI profile container Parameters : fb_in_offset First byte in the input container fb_out_offset First byte in the output container db_address Number of the database to use con_len Length of container in bytes (min.32) Example : The terminal is configured to be on input and output byte 64, 32 bytes allocated and database to communcate with is 51: fb_in_offset = 64 fb_out_offset = 64 db_address = 51 con_len = 32 The function block handles one complete container in one scan. If read index, FC111 is called. If write index, FC112 is called. Note that the control byte is not set until next scan, to avoid timing problems L #fb_in_offset // Incontainer start address T MW 496 // Remember incontainer start T MW 500 L #fb_in_offset // Incontainer start address SLD 3 // LAR1 L IB [AR1,P#0.0] // Get the proper control byte from inp.container T MB 486 // Store it L #fb_out_offset // Outcontainer start address T MW 498 // Store it T MW 502 L #m_110 // Previous input control byte T MB 479 // Store it L 0 T MB 474 // Clear error code A M 479.0 R M 479.0 // Clear error flag A M 486.6 // Terminal present ? JC WEI1 // L 1 // Error 1 : Comm error JU FEH // WEI1: A M 486.5 // Does the terminal toggle the toggle bit ? AN M 486.5 L S5T#2S // Timeout timer SD "Terminal timeout" AN "Terminal timeout" JC WEI2 L 2 // Error 2 : Terminal not in RUN JU FEH WEI2: A M 486.7 // Test if new container A M 479.7 // Compare old container byte with the new one O AN M 486.7 AN M 479.7 JC ENDE // No new container A M 486.7 // Pulse = M 479.7 L MW 498 // Outcontainer pointer L 4 +I T MW 498 // First data position : 4 L MW 496 // Incontainer pointer L 4 +I T MW 496 // First index position : 4 // LOOP: NOP 0 L MW 496 // Incontainer pointer ITD SLD 3 T MD 504 // Make it double word L IB [MD 504] // Get first index byte T MB 486 // Store it L MB 486 L 0 ==I JC DONE // Jump out if index is 0 A M 486.7 // Is it a read index ? JC ANK1 CALL "READ INDEX OP PANEL" // Then call read index function DataBase:=#db_address ANK1: NOP 0 L MB 478 // Check return value from FC111 L 0 ==I JC WEI3 // Was there an error return ? AN M 479.0 S M 479.0 // Then, set error bit L MB 478 JU FEH // Jump to error WEI3: AN M 486.7 // Is it a write index ? JC WEI4 CALL "WRITE INDEX OP PANEL" // Then call write index function DataBase:=#db_address L MB 478 // Check return value from FC112 L 0 ==I JC WEI4 // Was there an error return ? AN M 479.0 S M 479.0 // Then set error bit L MB 478 // JU FEH // Jump to error WEI4: L MW 496 // Check if incontainer is done L MW 500 -I L #con_len <I A( L MW 498 // .. or that outcontainer is done L MW 502 -I L #con_len <I ) JC LOOP // Continue id conatiner not completed DONE: L #fb_in_offset // Container done ! SLD 3 LAR1 L IB [AR1,P#0.0] // Get input control byte T MB 486 // Store it JU ENDE //------- ERROR HANDLING --------- FEH: T MB 474 // Store error code FEH1: L MW 498 ITD SLD 3 T MD 504 L 0 // Write controlbyte to output container T QB [MD 504] L 1 L MW 498 +I T MW 498 L MW 502 -I // INTERNES MERKERBYTE SICHERN L 32 <I JC FEH1 ENDE: NOP 0 NOP 0 AN M 486.6 S M 486.6 // Set the COM-bit AN M 486.5 = M 486.5 // Toggle the Toggel-bit A M 479.0 = M 486.4 //---------------------- L MB 486 // Delay answer one scan to avoid timing problems T #out_this_cycle L #fb_out_offset SLD 3 LAR1 L #out_last_cycle T QB [AR1,P#0.0] L #out_this_cycle T #out_last_cycle L MB 479 T #m_110 NOP 0 |
---|---|
|