рдЗрдВрдбрд╕реНрдЯреНрд░рд┐рдпрд▓ рдирд┐рдиреНрдЬрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рд▓рд╛рд╡рд░ рдкрд╛рдКрд▓ рдареЗрд╡реВрди: рдкреЙрдЭрд┐рдЯрд┐рд╡реНрд╣ рд╣реЕрдХ рдбреЗрдЬ 9 рд╡рд░ рдкреАрдПрд▓рд╕реА рдХрд╕реЗ рд╣реЕрдХ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ

рдЗрдВрдбрд╕реНрдЯреНрд░рд┐рдпрд▓ рдирд┐рдиреНрдЬрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рд▓рд╛рд╡рд░ рдкрд╛рдКрд▓ рдареЗрд╡реВрди: рдкреЙрдЭрд┐рдЯрд┐рд╡реНрд╣ рд╣реЕрдХ рдбреЗрдЬ 9 рд╡рд░ рдкреАрдПрд▓рд╕реА рдХрд╕реЗ рд╣реЕрдХ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ

рд╢реЗрд╡рдЯрдЪреНрдпрд╛ PHDays 9 рдордзреНрдпреЗ рдЖрдореНрд╣реА рдЧреЕрд╕ рдкрдВрдкрд┐рдВрдЧ рдкреНрд▓рд╛рдВрдЯ рд╣реЕрдХ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕реНрдкрд░реНрдзрд╛ рдЖрдпреЛрдЬрд┐рдд рдХреЗрд▓реА - рд╕реНрдкрд░реНрдзрд╛ рдФрджреНрдпреЛрдЧрд┐рдХ рдирд┐рдиреНрдЬрд╛. рд╕рд╛рдЗрдЯрд╡рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдорд╛рдкрджрдВрдбрд╛рдВрд╕рд╣ (рдХреЛрдгрддреЗрд╣реА рд╕реБрд░рдХреНрд╖рд╛, рдХрдореА рд╕реБрд░рдХреНрд╖рд╛, рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛) рддреАрди рд╕реНрдЯрдБрдб рд╣реЛрддреЗ, рддреНрдпрд╛рдЪ рдФрджреНрдпреЛрдЧрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдЕрдиреБрдХрд░рдг рдХрд░рдд: рджрд╛рдмрд╛рдЦрд╛рд▓реА рдЕрд╕рд▓реЗрд▓реА рд╣рд╡рд╛ рдлреБрдЧреНрдпрд╛рдд рдЯрд╛рдХрд▓реА рдЧреЗрд▓реА (рдЖрдгрд┐ рдирдВрддрд░ рд╕реЛрдбрд▓реА рдЧреЗрд▓реА).

рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдорд╛рдкрджрдВрдб рдЕрд╕реВрдирд╣реА, рд╕реНрдЯрдБрдбрдЪреА рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд░рдЪрдирд╛ рд╕рдорд╛рди рд╣реЛрддреА: рд╕реАрдореЗрдиреНрд╕ рд╕рд┐рдореЕрдЯрд┐рдХ рдкреАрдПрд▓рд╕реА S7-300 рдорд╛рд▓рд┐рдХрд╛; рдЖрдкрддреНрдХрд╛рд▓реАрди рдбрд┐рдлреНрд▓реЗрд╢рди рдмрдЯрдг рдЖрдгрд┐ рджрд╛рдм рдореЛрдЬрдгреНрдпрд╛рдЪреЗ рд╕рд╛рдзрди (рдкреАрдПрд▓рд╕реА рдбрд┐рдЬрд┐рдЯрд▓ рдЗрдирдкреБрдЯ (рдбреАрдЖрдп) рд╢реА рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реЗ); рдлреБрдЧрд╡рдгреЗ рдЖрдгрд┐ рд╣рд╡реЗрдЪреНрдпрд╛ рдбрд┐рдлреНрд▓реЗрд╢рдирд╕рд╛рдареА рдХрд╛рд░реНрдпрд░рдд рд╡рд╛рд▓реНрд╡ (рдкреАрдПрд▓рд╕реА (рдбреАрдУ) рдЪреНрдпрд╛ рдбрд┐рдЬрд┐рдЯрд▓ рдЖрдЙрдЯрдкреБрдЯрд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ) - рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреА рдкрд╣рд╛.

рдЗрдВрдбрд╕реНрдЯреНрд░рд┐рдпрд▓ рдирд┐рдиреНрдЬрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рд▓рд╛рд╡рд░ рдкрд╛рдКрд▓ рдареЗрд╡реВрди: рдкреЙрдЭрд┐рдЯрд┐рд╡реНрд╣ рд╣реЕрдХ рдбреЗрдЬ 9 рд╡рд░ рдкреАрдПрд▓рд╕реА рдХрд╕реЗ рд╣реЕрдХ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ

PLC рдиреЗ, рдкреНрд░реЗрд╢рд░ рд░реАрдбрд┐рдВрдЧрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдордиреБрд╕рд╛рд░, рдмреЙрд▓ рдбрд┐рдлреНрд▓реЗрдЯ рдХрд┐рдВрд╡рд╛ рдлреБрдЧрд╡рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ (рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╛рд▓реНрд╡реНрд╣ рдЙрдШрдбрд▓реЗ рдЖрдгрд┐ рдмрдВрдж рдХреЗрд▓реЗ). рддрдерд╛рдкрд┐, рд╕рд░реНрд╡ рд╕реНрдЯрдБрдбрдордзреНрдпреЗ рдореЕрдиреНрдпреБрдЕрд▓ рдХрдВрдЯреНрд░реЛрд▓ рдореЛрдб рд╣реЛрддрд╛, рдЬреНрдпрд╛рдореБрд│реЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдирд┐рд░реНрдмрдВрдзрд╛рдВрд╢рд┐рд╡рд╛рдп рд╡рд╛рд▓реНрд╡реНрд╣рдЪреА рд╕реНрдерд┐рддреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреЗ рд╢рдХреНрдп рдЭрд╛рд▓реЗ.

рд╣рд╛ рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЬрдЯрд┐рд▓рддреЗрдордзреНрдпреЗ рд╕реНрдЯрдБрдб рднрд┐рдиреНрди рдЖрд╣реЗрдд: рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдЯрдБрдбрд╡рд░ рд╣реЗ рдХрд░рдгреЗ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдЯрдБрдбрд╡рд░ рддреЗ рддреНрдпрд╛рдЪрдкреНрд░рдорд╛рдгреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рд╣реЛрддреЗ.

рд╕рд╣рд╛рдкреИрдХреА рдкрд╛рдЪ рд╕рдорд╕реНрдпрд╛ рджреЛрди рджрд┐рд╡рд╕рд╛рдВрдд рд╕реБрдЯрд▓реНрдпрд╛; рдкреНрд░рдердо рд╕реНрдерд╛рдирд╛рд╡рд░реАрд▓ рд╕рд╣рднрд╛рдЧреАрдиреЗ 233 рдЧреБрдг рдорд┐рд│рд╡рд▓реЗ (рддреНрдпрд╛рдиреЗ рд╕реНрдкрд░реНрдзреЗрдЪреНрдпрд╛ рддрдпрд╛рд░реАрд╕рд╛рдареА рдПрдХ рдЖрдард╡рдбрд╛ рдШрд╛рд▓рд╡рд▓рд╛). рддреАрди рд╡рд┐рдЬреЗрддреЗ: I рд╕реНрдерд╛рди - a1exdandy, II - Rubikoid, III - Ze.

рддрдерд╛рдкрд┐, PHDays рджрд░рдореНрдпрд╛рди, рд╕рд╣рднрд╛рдЧреАрдВрдкреИрдХреА рдХреЛрдгреАрд╣реА рддрд┐рдиреНрд╣реА рд╕реНрдЯрдБрдбрд╡рд░ рдорд╛рдд рдХрд░реВ рд╢рдХрд▓рд╛ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдСрдирд▓рд╛рдЗрди рд╕реНрдкрд░реНрдзрд╛ рдШреЗрдгреНрдпрд╛рдЪреЗ рдард░рд╡рд▓реЗ рдЖрдгрд┐ рдЬреВрдирдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдХрдареАрдг рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реЗ. рд╕рд╣рднрд╛рдЧреАрдВрдирд╛ рдПрдХрд╛ рдорд╣рд┐рдиреНрдпрд╛рдЪреНрдпрд╛ рдЖрдд рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдХрд░рд╛рдпрдЪреЗ рд╣реЛрддреЗ, рдзреНрд╡рдЬ рд╢реЛрдзрд╛рдпрдЪрд╛ рд╣реЛрддрд╛ рдЖрдгрд┐ рд╕рдорд╛рдзрд╛рдирд╛рдЪреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдЖрдгрд┐ рдордиреЛрд░рдВрдЬрдХ рдкрджреНрдзрддреАрдиреЗ рд╡рд░реНрдгрди рдХрд░рд╛рдпрдЪреЗ рд╣реЛрддреЗ.

рдХрдЯрдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрдореНрд╣реА рдорд╣рд┐рдиреНрдпрд╛рднрд░рд╛рдд рдкрд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдорд╛рдзрд╛рдирд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЛ, рддреЗ рдбрд┐рдЬрд┐рдЯрд▓ рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреА рдХрдВрдкрдиреАрдЪреНрдпрд╛ рдЕреЕрд▓реЗрдХреНрд╕реА рдХреЛрд╡реНрд░реАрдЭреНрдирд┐рдЦ (a1exdandy) рдпрд╛рдВрдирд╛ рдЖрдврд│рд▓реЗ, рдЬреНрдпрд╛рдиреЗ PHDays рджрд░рдореНрдпрд╛рди рд╕реНрдкрд░реНрдзреЗрдд рдкреНрд░рдердо рдХреНрд░рдорд╛рдВрдХ рдкрдЯрдХрд╛рд╡рд▓рд╛. рдЦрд╛рд▓реА рдЖрдореНрд╣реА рддреНрдпрд╛рдЪрд╛ рдордЬрдХреВрд░ рдЖрдордЪреНрдпрд╛ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрд╕рд╣ рд╕рд╛рджрд░ рдХрд░рддреЛ.

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рддрд░, рдХрд╛рд░реНрдпрд╛рдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдлрд╛рдпрд▓реАрдВрд╕рд╣ рд╕рдВрдЧреНрд░рд╣рдг рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ:

  • block_upload_traffic.pcapng
  • DB100.bin
  • hints.txt

hints.txt рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдХрд╛рд░реНрдп рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдорд╛рд╣рд┐рддреА рдЖрдгрд┐ рд╕реВрдЪрдирд╛ рдЖрд╣реЗрдд. рддреНрдпрд╛рдЪреА рд╕рд╛рдордЧреНрд░реА рдпреЗрдереЗ рдЖрд╣реЗрддрдГ

  1. рдкреЗрдЯреНрд░реЛрд╡рд┐рдЪрдиреЗ рдорд▓рд╛ рдХрд╛рд▓ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдХреА рддреБрдореНрд╣реА PlcSim рд╡рд░реВрди Step7 рдордзреНрдпреЗ рдмреНрд▓реЙрдХ рд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛.
  2. рд╕реАрдореЗрдиреНрд╕ рд╕рд┐рдореЕрдЯрд┐рдХ S7-300 рдорд╛рд▓рд┐рдХрд╛ PLC рд╕реНрдЯрдБрдбрд╡рд░ рд╡рд╛рдкрд░рд▓реА рдЧреЗрд▓реА.
  3. PlcSim рдПрдХ PLC рдПрдореБрд▓реЗрдЯрд░ рдЖрд╣реЗ рдЬреЛ рддреБрдореНрд╣рд╛рд▓рд╛ Siemens S7 PLC рд╕рд╛рдареА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕ рдЖрдгрд┐ рдбреАрдмрдЧ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ.

DB100.bin рдлрд╛рдЗрд▓рдордзреНрдпреЗ DB100 PLC рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЖрд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ: 00000000: 0100 0102 6e02 0401 0206 0100 0101 0102 ....n......... 00000010: 1002 0501 0202 2002 . ..... ......... 0501: 0206 0100 0102 00000020 0102 7702 0401 0206a0100 ..w............. 0103: 0102 0 02 00000030 0501 0202 ................ 1602: 0501 0206 0100 0104 0102 00000040 7502a0401 0206 u............... 0100: 0105 0102 0 02 0501 00000050 режрезрежреи рейрекрежреи............рек. 0202: 1602 0501 0206 0100 0106 0102 3402 4 ......... & ..... 00000060: 0401C0206 0100 0107 0102 2602 0501 0202 00000070 рдПрд▓ ......... 4. .. 02 : 0501 0206 0100 0108 0102a3302 0401 3 00000080................ 0206: 0100 0109 0102 0a 02 0501 0202 1602 .......... 00000090a0501: 0206 0100b 010 0102 3702 0401 0206 7 ......".....F... 000000b0: 0100 010 0102c 2202 0501 0202........4602 .... .. 0501c000000: 0d 0206 0100a010 0102 3302 0401 0206 0100 ................ 3d000000: 0 010e 0102 0d02 0501 0202 1602 0501 0206 000000 0 0100 010 0102. .... 6e02: 0401 0206 0100 010 000000 0 0102 1102 ........#...... 0501f0202: 2302 0501 0206 0100 000000 0..... 0110..... ..... 0102: 3502 0401 0206 0100 0111 0102 5 00000100 ......%......... 1202: 0501 0202 2502 0501 0206 0100..... 0112 00000110..... .....&. 0102: 3302 0401 0206c0100 0113 0102 2602 ....L......

рдирд╛рд╡рд╛рдкреНрд░рдорд╛рдгреЗрдЪ, block_upload_traffic.pcapng рдлрд╛рдИрд▓рдордзреНрдпреЗ PLC рд╡рд░ рдмреНрд▓реЙрдХ рдЕрдкрд▓реЛрдб рдЯреНрд░реЕрдлрд┐рдХрдЪрд╛ рдбрдВрдк рдЖрд╣реЗ.

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдХреЙрдиреНрдлрд░рдиреНрд╕ рджрд░рдореНрдпрд╛рди рд╕реНрдкрд░реНрдзреЗрдЪреНрдпрд╛ рдард┐рдХрд╛рдгреА рд╣рд╛ рдЯреНрд░реЕрдлрд┐рдХ рдбрдВрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдереЛрдбреЗ рдХрдареАрдг рд╣реЛрддреЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, TeslaSCADA2 рд╕рд╛рдареА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓рдордзреАрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ. рддреНрдпрд╛рд╡рд░реВрди рд╣реЗ рд╕рдордЬрдгреЗ рд╢рдХреНрдп рд╣реЛрддреЗ рдХреА RC4 рд╡рд╛рдкрд░реВрди рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд▓реЗрд▓рд╛ рдбрдВрдк рдХреБрдареЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгрддреА рдХреА рд╡рд╛рдкрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓. S7 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреНрд▓рд╛рдпрдВрдЯ рд╡рд╛рдкрд░реВрди рд╕рд╛рдЗрдЯрд╡рд░реАрд▓ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХреНрд╕рдЪреЗ рдбрдВрдк рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдпрд╛рд╕рд╛рдареА рдореА Snap7 рдкреЕрдХреЗрдЬрдордзреАрд▓ рдбреЗрдореЛ рдХреНрд▓рд╛рдпрдВрдЯ рд╡рд╛рдкрд░рд▓рд╛.

рдЯреНрд░реЕрдлрд┐рдХ рдбрдВрдкрдордзреВрди рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдХрд╛рдврдгреЗ

рдбрдВрдкрдЪреА рд╕рд╛рдордЧреНрд░реА рдкрд╛рд╣рддрд╛, рдЖрдкрдг рд╕рдордЬреВ рд╢рдХрддрд╛ рдХреА рддреНрдпрд╛рдд рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдУрдмреА 1, рдПрдлрд╕реА 1, рдПрдлрд╕реА 2 рдЖрдгрд┐ рдПрдлрд╕реА 3 рдЖрд╣реЗрдд:

рдЗрдВрдбрд╕реНрдЯреНрд░рд┐рдпрд▓ рдирд┐рдиреНрдЬрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рд▓рд╛рд╡рд░ рдкрд╛рдКрд▓ рдареЗрд╡реВрди: рдкреЙрдЭрд┐рдЯрд┐рд╡реНрд╣ рд╣реЕрдХ рдбреЗрдЬ 9 рд╡рд░ рдкреАрдПрд▓рд╕реА рдХрд╕реЗ рд╣реЕрдХ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ

рд╣реЗ рдмреНрд▓реЙрдХреНрд╕ рдХрд╛рдврд▓реЗрдЪ рдкрд╛рд╣рд┐рдЬреЗрдд. рд╣реЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЦрд╛рд▓реАрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╕рд╣, рдпрд╛рдкреВрд░реНрд╡реА pcapng рдлреЙрд░рдореЕрдЯрдордзреВрди pcap рдордзреНрдпреЗ рд░рд╣рджрд╛рд░реА рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реА рдЖрд╣реЗ:

#!/usr/bin/env python2

import struct
from scapy.all import *

packets = rdpcap('block_upload_traffic.pcap')
s7_hdr_struct = '>BBHHHHBB'
s7_hdr_sz = struct.calcsize(s7_hdr_struct)
tpkt_cotp_sz = 7
names = iter(['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin'])
buf = ''

for packet in packets:
    if packet.getlayer(IP).src == '10.0.102.11':
        tpkt_cotp_s7 = str(packet.getlayer(TCP).payload)
        if len(tpkt_cotp_s7) < tpkt_cotp_sz + s7_hdr_sz:
            continue
        s7 = tpkt_cotp_s7[tpkt_cotp_sz:]
        s7_hdr = s7[:s7_hdr_sz]
        param_sz = struct.unpack(s7_hdr_struct, s7_hdr)[4]
        s7_param = s7[12:12+param_sz]
        s7_data = s7[12+param_sz:]
        if s7_param in ('x1ex00', 'x1ex01'):  # upload
            buf += s7_data[4:]
        elif s7_param == 'x1f':
            with open(next(names), 'wb') as f:
                f.write(buf)
            buf = ''

рдкрд░рд┐рдгрд╛рдореА рдмреНрд▓реЙрдХреНрд╕рдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗрд▓реНрдпрд╛рд╡рд░, рддреБрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрдИрд▓ рдХреА рддреЗ рдиреЗрд╣рдореА рдмрд╛рдЗрдЯреНрд╕ 70 70 (pp) рдиреЗ рд╕реБрд░реВ рд╣реЛрддрд╛рдд. рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╢рд┐рдХрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ. рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЗрд╢рд╛рд░рд╛ рд╕реВрдЪрд┐рдд рдХрд░рддреЛ рдХреА рдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ PlcSim рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.

рдмреНрд▓реЙрдХреНрд╕рдордзреВрди рдорд╛рдирд╡реА-рд╡рд╛рдЪрдиреАрдп рд╕реВрдЪрдирд╛ рдорд┐рд│рд╡рдгреЗ

рдкреНрд░рдердо, рд╕рд┐рдореЕрдЯрд┐рдХ рдореЕрдиреЗрдЬрд░ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рд╡рд╛рдкрд░реВрди рдЕрдиреЗрдХ рдмреНрд▓реЙрдХреНрд╕ (= Q 7) рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕реВрдЪрдирд╛рдВрд╕рд╣ рд▓реЛрдб рдХрд░реВрди S0.0-PlcSim рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛, рдЖрдгрд┐ рдПрдореБрд▓реЗрдЯрд░рдордзреНрдпреЗ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗрд▓реЗ PLC example.plc рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХрд░реВрдпрд╛. рдлрд╛рдИрд▓рдЪреА рд╕рд╛рдордЧреНрд░реА рдкрд╛рд╣реВрди, рдЖрдкрдг рд╕реНрд╡рд╛рдХреНрд╖рд░реА 70 70 рджреНрд╡рд╛рд░реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рдмреНрд▓реЙрдХреНрд╕рдЪреА рд╕реБрд░реБрд╡рд╛рдд рд╕рд╣рдЬрдкрдгреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реВ рд╢рдХрддрд╛, рдЬреЗ рдЖрдореНрд╣реА рдЖрдзреА рд╢реЛрдзрд▓реЗ рд╣реЛрддреЗ. рдмреНрд▓реЙрдХреНрд╕рдЪреНрдпрд╛ рдЖрдзреА, рд╡рд░рд╡рд░ рдкрд╛рд╣рддрд╛, рдмреНрд▓реЙрдХрдЪрд╛ рдЖрдХрд╛рд░ 4-рдмрд╛рдЗрдЯ рд▓рд┐рдЯрд▓-рдПрдВрдбрд┐рдпрди рд╡реНрд╣реЕрд▓реНрдпреВ рдореНрд╣рдгреВрди рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ.

рдЗрдВрдбрд╕реНрдЯреНрд░рд┐рдпрд▓ рдирд┐рдиреНрдЬрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рд▓рд╛рд╡рд░ рдкрд╛рдКрд▓ рдареЗрд╡реВрди: рдкреЙрдЭрд┐рдЯрд┐рд╡реНрд╣ рд╣реЕрдХ рдбреЗрдЬ 9 рд╡рд░ рдкреАрдПрд▓рд╕реА рдХрд╕реЗ рд╣реЕрдХ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ

рдЖрдореНрд╣рд╛рд▓рд╛ рдкреАрдПрд▓рд╕реА рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рд╕рдВрд░рдЪрдиреЗрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдорд┐рд│рд╛рд▓реНрдпрд╛рдирдВрддрд░, рдкреАрдПрд▓рд╕реА рдПрд╕7 рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рдХреГрддреА рдпреЛрдЬрдирд╛ рджрд┐рд╕реВрди рдЖрд▓реА:

  1. рд╕рд┐рдореЕрдЯрд┐рдХ рдореЕрдиреЗрдЬрд░ рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА S7-PlcSim рдордзреНрдпреЗ рдПрдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддрдпрд╛рд░ рдХрд░рддреЛ рдЬрд╕реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдбрдВрдкрдордзреВрди рдорд┐рд│рд╛рд▓реЗ рд╣реЛрддреЗ. рдмреНрд▓реЙрдХрдЪреЗ рдЖрдХрд╛рд░ рдЬреБрд│рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд (рд╣реЗ рдмреНрд▓реЙрдХреНрд╕рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрд╕рд╣ рднрд░реВрди рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ) рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ (OB1, FC1, FC2, FC3).
  2. рдкреАрдПрд▓рд╕реА рдлрд╛рдИрд▓рдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХрд░рд╛.
  3. рдЖрдореНрд╣реА рдкрд░рд┐рдгрд╛рдореА рдлрд╛рдЗрд▓рдордзреАрд▓ рдмреНрд▓реЙрдХреНрд╕рдЪреА рд╕рд╛рдордЧреНрд░реА рдЯреНрд░реЕрдлрд┐рдХ рдбрдВрдкрдордзреАрд▓ рдмреНрд▓реЙрдХреНрд╕рд╕рд╣ рдкреБрдирд░реНрд╕реНрдерд┐рдд рдХрд░рддреЛ. рдмреНрд▓реЙрдХреНрд╕рдЪреА рд╕реБрд░реБрд╡рд╛рдд рд╕реНрд╡рд╛рдХреНрд╖рд░реАрджреНрд╡рд╛рд░реЗ рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ.
  4. рдЖрдореНрд╣реА рдкрд░рд┐рдгрд╛рдореА рдлрд╛рдЗрд▓ S7-PlcSim рдордзреНрдпреЗ рд▓реЛрдб рдХрд░рддреЛ рдЖрдгрд┐ рд╕рд┐рдореЕрдЯрд┐рдХ рдореЕрдиреЗрдЬрд░рдордзреАрд▓ рдмреНрд▓реЙрдХреНрд╕рдЪреА рд╕рд╛рдордЧреНрд░реА рдкрд╛рд╣рддреЛ.

рдмреНрд▓реЙрдХ рдмрджрд▓рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЦрд╛рд▓реАрд▓ рдХреЛрдбрд╕рд╣:

with open('original.plc', 'rb') as f:
    plc = f.read()
blocks = []
for fname in ['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin']:
    with open(fname, 'rb') as f:
        blocks.append(f.read())

i = plc.find(b'pp')
for block in blocks:
    plc = plc[:i] + block + plc[i+len(block):]
    i = plc.find(b'pp', i + 1)

with open('target.plc', 'wb') as f:
    f.write(plc)

рдЕрд▓реЗрдХреНрд╕реАрдиреЗ рдХрджрд╛рдЪрд┐рдд рдЕрдзрд┐рдХ рдХрдареАрдг, рдкрд░рдВрддреБ рддрд░реАрд╣реА рдпреЛрдЧреНрдп рдорд╛рд░реНрдЧ рд╕реНрд╡реАрдХрд╛рд░рд▓рд╛. рдЖрдореНрд╣реА рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдХреА рд╕рд╣рднрд╛рдЧреА NetToPlcSim рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рдкрд░рддреАрд▓ рдЬреЗрдгреЗрдХрд░реБрди PlcSim рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рд╕рдВрдкреНрд░реЗрд╖рдг рдХрд░реВ рд╢рдХрддреАрд▓, Snap7 рджреНрд╡рд╛рд░реЗ PlcSim рд╡рд░ рдмреНрд▓реЙрдХреНрд╕ рдЕрдкрд▓реЛрдб рдХрд░реВ рд╢рдХрддреАрд▓ рдЖрдгрд┐ рдирдВрддрд░ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди PlcSim рд╡рд░реВрди рд╣реЗ рдмреНрд▓реЙрдХреНрд╕ рдПрдХ рдкреНрд░рдХрд▓реНрдк рдореНрд╣рдгреВрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддреАрд▓.

рдкрд░рд┐рдгрд╛рдореА рдлрд╛рдЗрд▓ S7-PlcSim рдордзреНрдпреЗ рдЙрдШрдбреВрди, рддреБрдореНрд╣реА рд╕рд┐рдореЕрдЯрд┐рдХ рдореЕрдиреЗрдЬрд░ рд╡рд╛рдкрд░реВрди рдУрд╡реНрд╣рд░рд░рд╛рдИрдЯ рдХреЗрд▓реЗрд▓реЗ рдмреНрд▓реЙрдХреНрд╕ рд╡рд╛рдЪреВ рд╢рдХрддрд╛. рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпреЗ рдмреНрд▓реЙрдХ FC1 рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реА рдЬрд╛рддрд╛рдд. рд╡рд┐рд╢реЗрд╖ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ #TEMP0 рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓, рдЬреЗ рдЪрд╛рд▓реВ рдХреЗрд▓реНрдпрд╛рд╡рд░ M2.2 рдЖрдгрд┐ M2.3 рдмрд┐рдЯ рдореЗрдорд░реА рдореВрд▓реНрдпрд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд PLC рдирд┐рдпрдВрддреНрд░рдг рдореЕрдиреНрдпреБрдЕрд▓ рдореЛрдбрд╡рд░ рд╕реЗрдЯ рдХрд░рддреЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ. #TEMP0 рдореВрд▓реНрдп рдлрдВрдХреНрд╢рди FC3 рджреНрд╡рд╛рд░реЗ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ.

рдЗрдВрдбрд╕реНрдЯреНрд░рд┐рдпрд▓ рдирд┐рдиреНрдЬрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рд▓рд╛рд╡рд░ рдкрд╛рдКрд▓ рдареЗрд╡реВрди: рдкреЙрдЭрд┐рдЯрд┐рд╡реНрд╣ рд╣реЕрдХ рдбреЗрдЬ 9 рд╡рд░ рдкреАрдПрд▓рд╕реА рдХрд╕реЗ рд╣реЕрдХ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ

рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ FC3 рдлрдВрдХреНрд╢рдирдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреЗ рдЖрдгрд┐ рдХрд╛рдп рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ рддрд╛рд░реНрдХрд┐рдХ рдкрд░рдд рдпреЗрдИрд▓.

рд╕реНрдкрд░реНрдзрд╛ рд╕реНрдерд│рд╛рд╡рд░реАрд▓ рд▓реЛ рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреА рд╕реНрдЯрдБрдбрд╡рд░реАрд▓ PLC рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕рдЪреА рдорд╛рдВрдбрдгреА рдЕрд╢рд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реА рд╣реЛрддреА, рдкрд░рдВрддреБ #TEMP0 рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдореВрд▓реНрдп рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, DB1 рдмреНрд▓реЙрдХрдордзреНрдпреЗ рдорд╛рдЭреА рдирд┐рдиреНрдЬрд╛ рдорд╛рд░реНрдЧ рд▓рд┐рд╣рд┐рдгреЗ рдкреБрд░реЗрд╕реЗ рд╣реЛрддреЗ. рдмреНрд▓реЙрдХрдордзреАрд▓ рдореВрд▓реНрдп рддрдкрд╛рд╕рдгреЗ рд╕реЛрдкреЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдмреНрд▓реЙрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖реЗрдЪреЗ рд╕рдЦреЛрд▓ рдЬреНрдЮрд╛рди рдЖрд╡рд╢реНрдпрдХ рдирд╡реНрд╣рддреЗ. рдЕрд░реНрдерд╛рдд, рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░рд╛рд╡рд░, рдореЕрдиреНрдпреБрдЕрд▓ рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд│рд╡рдгреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рд╣реЛрдИрд▓ рдЖрдгрд┐ STL рднрд╛рд╖реЗрдЪреА рдЧреБрдВрддрд╛рдЧреБрдВрдд рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (S7 PLC рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдорд╛рд░реНрдЧ).

рд░рд┐рд╡реНрд╣рд░реНрд╕ рдмреНрд▓реЙрдХ FC3

STL рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рддреАрд▓ FC3 рдмреНрд▓реЙрдХрдЪреА рд╕рд╛рдордЧреНрд░реА:

      L     B#16#0
      T     #TEMP13
      T     #TEMP15
      L     P#DBX 0.0
      T     #TEMP4
      CLR   
      =     #TEMP14
M015: L     #TEMP4
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D   
      JC    M016
      L     DW#16#0
      T     #TEMP0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  
M00d: L     B [AR1,P#0.0]
      T     #TEMP5
      L     W#16#1
      ==I   
      JC    M007
      L     #TEMP5
      L     W#16#2
      ==I   
      JC    M008
      L     #TEMP5
      L     W#16#3
      ==I   
      JC    M00f
      L     #TEMP5
      L     W#16#4
      ==I   
      JC    M00e
      L     #TEMP5
      L     W#16#5
      ==I   
      JC    M011
      L     #TEMP5
      L     W#16#6
      ==I   
      JC    M012
      JU    M010
M007: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M003
      JU    M001
      JU    M002
      JU    M004
M003: JU    M005
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP0
      JU    M006
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP1
      JU    M006
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP2
      JU    M006
M00f: +AR1  P#1.0
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      T     #TEMP11
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      TAR1  #TEMP4
      OPN   DB   101
      L     P#DBX 0.0
      LAR1  
      L     #TEMP11
      +AR1  
      LAR2  #TEMP9
      L     B [AR2,P#0.0]
      T     B [AR1,P#0.0]
      L     #TEMP4
      LAR1  
      JU    M006
M008: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    M005
M00b: L     #TEMP3
      T     #TEMP0
      JU    M006
M00a: L     #TEMP3
      T     #TEMP1
      JU    M006
M00c: L     #TEMP3
      T     #TEMP2
      JU    M006
M00e: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M011: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M012: L     #TEMP15
      INC   1
      T     #TEMP15
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #TEMP4
      L     B#16#0
      T     #TEMP6
      JU    M006
M014: L     #TEMP4
      LAR1  
      L     #TEMP13
      L     L#1
      +I    
      T     #TEMP13
      JU    M006
M006: L     #TEMP0
      T     MB   100
      L     #TEMP1
      T     MB   101
      L     #TEMP2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    M005
M010: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #TEMP4
M005: TAR1  #TEMP4
      CLR   
      =     #TEMP16
      L     #TEMP13
      L     L#20
      ==I   
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M017
      L     #TEMP13
      L     L#20
      <I    
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M018
      JU    M019
M017: SET   
      =     #TEMP14
      JU    M016
M018: CLR   
      =     #TEMP14
      JU    M016
M019: CLR   
      O     #TEMP14
      =     #RET_VAL
      JU    M015
M016: CLR   
      O     #TEMP14
      =     #RET_VAL

рдХреЛрдб рдмрд░рд╛рдЪ рдореЛрдард╛ рдЖрд╣реЗ рдЖрдгрд┐ STL рдмрджреНрджрд▓ рдЕрдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛ рддреЛ рдХреНрд▓рд┐рд╖реНрдЯ рд╡рд╛рдЯреВ рд╢рдХрддреЛ. рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдЪреМрдХрдЯреАрдд рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдирд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдд рдХрд╛рд╣реА рдЕрд░реНрде рдирд╛рд╣реА; STL рднрд╛рд╖реЗрдЪреНрдпрд╛ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╕реВрдЪрдирд╛ рдЖрдгрд┐ рдХреНрд╖рдорддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдореЕрдиреНрдпреБрдЕрд▓рдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд: S7-300 рдЖрдгрд┐ S7-400 рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрд╕рд╛рдареА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рд╕реНрдЯ (STL).. рдпреЗрдереЗ рдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╕рдорд╛рди рдХреЛрдб рд╕рд╛рджрд░ рдХрд░реЗрди - рд▓реЗрдмрд▓реЗ рдЖрдгрд┐ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреЗ рдирд╛рд╡ рдмрджрд▓рдгреЗ рдЖрдгрд┐ рдСрдкрд░реЗрд╢рди рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЖрдгрд┐ рдХрд╛рд╣реА STL рднрд╛рд╖рд╛ рд░рдЪрдирд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░реНрдпрд╛ рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдЬреЛрдбрдгреЗ. рдорд▓рд╛ рддрд╛рдмрдбрддреЛрдм рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдкреНрд░рд╢реНрдирд╛рддреАрд▓ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЖрд╣реЗ рдЬреЗ DB100 рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╕реНрдерд┐рдд рдХрд╛рд╣реА рдмрд╛рдпрдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ, рдЬреНрдпрд╛рдЪреА рд╕рд╛рдордЧреНрд░реА рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ. рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╕реВрдЪрдирд╛рдВрдордзреНрдпреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдХреЛрдбрдЪреЗ 1 рдмрд╛рдЗрдЯ рдЖрдгрд┐ рд╡рд┐рддрд░реНрдХрд╛рдВрдЪреЗ рдмрд╛рдЗрдЯреНрд╕, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рддрд░реНрдХрд╛рд╕рд╛рдареА рдПрдХ рдмрд╛рдЗрдЯ рдЕрд╕рддреЗ. рд╕рд░реНрд╡ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реЗрд▓реНрдпрд╛ рд╕реВрдЪрдирд╛рдВрдордзреНрдпреЗ рджреЛрди рдпреБрдХреНрддрд┐рд╡рд╛рдж рдЖрд╣реЗрдд; рдореА рддреНрдпрд╛рдВрдЪреА рдореВрд▓реНрдпреЗ X рдЖрдгрд┐ Y рдореНрд╣рдгреВрди рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реА рдЖрд╣реЗрдд.

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдХреЛрдб]

# ╨Ш╨╜╨╕╤Ж╨╕╨░╨╗╨╕╨╖╨░╤Ж╨╕╤П ╤А╨░╨╖╨╗╨╕╤З╨╜╤Л╤Е ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╤Е
      L     B#16#0
      T     #CHECK_N        # ╨б╤З╨╡╤В╤З╨╕╨║ ╤Г╤Б╨┐╨╡╤И╨╜╨╛ ╨┐╤А╨╛╨╣╨┤╨╡╨╜╨╜╤Л╤Е ╨┐╤А╨╛╨▓╨╡╤А╨╛╨║
      T     #COUNTER_N      # ╨б╤З╨╡╤В╤З╨╕╨║ ╨╛╨▒╤Й╨╡╨│╨╛ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨░ ╨┐╤А╨╛╨▓╨╡╤А╨╛╨║
      L     P#DBX 0.0
      T     #POINTER        # ╨г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤В╨╡╨║╤Г╤Й╤Г╤О ╨╕╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╤О
      CLR   
      =     #PRE_RET_VAL

# ╨Ю╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨╕╨║╨╗ ╤А╨░╨▒╨╛╤В╤Л ╨╕╨╜╤В╨╡╤А╨┐╤А╨╡╤В╨░╤В╨╛╤А╨░ ╨▒╨░╨╣╤В-╨║╨╛╨┤╨░
LOOP: L     #POINTER
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D                   # ╨Я╤А╨╛╨▓╨╡╤А╨║╨░ ╨▓╤Л╤Е╨╛╨┤╨░ ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤П ╨╖╨░ ╨┐╤А╨╡╨┤╨╡╨╗╤Л ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л
      JC    FINISH
      L     DW#16#0
      T     #REG0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  

# ╨Ъ╨╛╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╤П switch - case ╨┤╨╗╤П ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ ╤А╨░╨╖╨╗╨╕╤З╨╜╤Л╤Е ╨╛╨┐╨║╨╛╨┤╨╛╨▓
M00d: L     B [AR1,P#0.0]
      T     #OPCODE
      L     W#16#1
      ==I   
      JC    OPCODE_1
      L     #OPCODE
      L     W#16#2
      ==I   
      JC    OPCODE_2
      L     #OPCODE
      L     W#16#3
      ==I   
      JC    OPCODE_3
      L     #OPCODE
      L     W#16#4
      ==I   
      JC    OPCODE_4
      L     #OPCODE
      L     W#16#5
      ==I   
      JC    OPCODE_5
      L     #OPCODE
      L     W#16#6
      ==I   
      JC    OPCODE_6
      JU    OPCODE_OTHER

# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 01: ╨╖╨░╨│╤А╤Г╨╖╨║╨░ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨╕╨╖ DB101[X] ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А Y
# OP01(X, Y): REG[Y] = DB101[X]
OPCODE_1: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]   # ╨Ч╨░╨│╤А╤Г╨╖╨║╨░ ╨░╤А╨│╤Г╨╝╨╡╨╜╤В╨░ X (╨╕╨╜╨┤╨╡╨║╤Б ╨▓ DB101)
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]   # ╨Ч╨░╨│╤А╤Г╨╖╨║╨░ ╨░╤А╨│╤Г╨╝╨╡╨╜╤В╨░ Y (╨╕╨╜╨┤╨╡╨║╤Б ╤А╨╡╨│╨╕╤Б╤В╤А╨░)
      JL    M003            # ╨Р╨╜╨░╨╗╨╛╨│ switch - case ╨╜╨░ ╨╛╤Б╨╜╨╛╨▓╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П Y
      JU    M001            # ╨┤╨╗╤П ╨▓╤Л╨▒╨╛╤А╨░ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛╨│╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕.
      JU    M002            # ╨Я╨╛╨┤╨╛╨▒╨╜╤Л╨╡ ╨║╨╛╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╨╕ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╤О╤В╤Б╤П ╨╕ ╨▓ ╨┤╤А╤Г╨│╨╕╤Е
      JU    M004            # ╨╛╨┐╨╡╤А╨░╤Ж╨╕╤П╤Е ╨╜╨╕╨╢╨╡ ╨┤╨╗╤П ╨░╨╜╨░╨╗╨╛╨│╨╕╤З╨╜╤Л╤Е ╤Ж╨╡╨╗╨╡╨╣
M003: JU    LOOPEND
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG0           # ╨Ч╨░╨┐╨╕╤Б╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П DB101[X] ╨▓ REG[0]
      JU    PRE_LOOPEND
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG1           # ╨Ч╨░╨┐╨╕╤Б╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П DB101[X] ╨▓ REG[1]
      JU    PRE_LOOPEND
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG2           # ╨Ч╨░╨┐╨╕╤Б╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П DB101[X] ╨▓ REG[2]
      JU    PRE_LOOPEND

# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 02: ╨╖╨░╨│╤А╤Г╨╖╨║╨░ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П X ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А Y
# OP02(X, Y): REG[Y] = X
OPCODE_2: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    LOOPEND
M00b: L     #TEMP3
      T     #REG0
      JU    PRE_LOOPEND
M00a: L     #TEMP3
      T     #REG1
      JU    PRE_LOOPEND
M00c: L     #TEMP3
      T     #REG2
      JU    PRE_LOOPEND

# ╨Ю╨┐╨║╨╛╨┤ 03 ╨╜╨╡ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╨▓ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╡, ╨┐╨╛╤Н╤В╨╛╨╝╤Г ╨┐╤А╨╛╨┐╤Г╤Б╤В╨╕╨╝ ╨╡╨│╨╛
...

# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 04: ╤Б╤А╨░╨▓╨╜╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ X ╨╕ Y
# OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
OPCODE_4: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          # ╨┐╨╡╤А╨▓╤Л╨╣ ╨░╤А╨│╤Г╨╝╨╡╨╜╤В - X
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[X]
      LAR2  #TEMP10         # REG[Y]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12         # ~(REG[Y] & REG[X])
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW                    # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - ╨░╨╜╨░╨╗╨╛╨│ ╨┐╤А╨╛╨▓╨╡╤А╨║╨╕ ╨╜╨░ ╤А╨░╨▓╨╡╨╜╤Б╤В╨▓╨╛
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 05: ╨▓╤Л╤З╨╕╤В╨░╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ Y ╨╕╨╖ X
# OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
OPCODE_5: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I                    # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 06: ╨╕╨╜╨║╤А╨╡╨╝╨╡╨╜╤В #CHECK_N ╨┐╤А╨╕ ╤А╨░╨▓╨╡╨╜╤Б╤В╨▓╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ X ╨╕ Y
# OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
OPCODE_6: L     #COUNTER_N
      INC   1
      T     #COUNTER_N
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          #  REG[X]     
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          #  REG[X]  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[Y]
      LAR2  #TEMP10         # REG[X]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #POINTER
      L     B#16#0
      T     #TEMP6
      JU    PRE_LOOPEND
M014: L     #POINTER
      LAR1  
# ╨Ш╨╜╨║╤А╨╡╨╝╨╡╨╜╤В ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П #CHECK_N
      L     #CHECK_N
      L     L#1
      +I    
      T     #CHECK_N
      JU    PRE_LOOPEND

PRE_LOOPEND: L     #REG0
      T     MB   100
      L     #REG1
      T     MB   101
      L     #REG2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    LOOPEND

OPCODE_OTHER: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #POINTER

LOOPEND: TAR1  #POINTER
      CLR   
      =     #TEMP16
      L     #CHECK_N
      L     L#20
      ==I   
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
# ╨Т╤Б╨╡ ╨┐╤А╨╛╨▓╨╡╤А╨║╨╕ ╨┐╤А╨╛╨╣╨┤╨╡╨╜╤Л, ╨╡╤Б╨╗╨╕ #CHECK_N == #COUNTER_N == 20
      JC    GOOD
      L     #CHECK_N
      L     L#20
      <I    
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
      JC    FAIL
      JU    M019
GOOD: SET   
      =     #PRE_RET_VAL
      JU    FINISH
FAIL: CLR   
      =     #PRE_RET_VAL
      JU    FINISH
M019: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL
      JU    LOOP
FINISH: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL

рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдЪреНрдпрд╛ рд╕реВрдЪрдирд╛рдВрдЪреА рдХрд▓реНрдкрдирд╛ рдЖрд▓реНрдпрд╛рд╡рд░, DB100 рдмреНрд▓реЙрдХрдордзреНрдпреЗ рдмрд╛рдпрдХреЛрдб рдкрд╛рд░реНрд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд▓рд╣рд╛рди рдбрд┐рд╕реЗрдореНрдмрд▓рд░ рд▓рд┐рд╣реВ:

import string
alph = string.ascii_letters + string.digits

with open('DB100.bin', 'rb') as f:
    m = f.read()

pc = 0

while pc < len(m):
    op = m[pc]
    if op == 1:
        print('R{} = DB101[{}]'.format(m[pc + 2], m[pc + 1]))
        pc += 3
    elif op == 2:
        c = chr(m[pc + 1])
        c = c if c in alph else '?'
        print('R{} = {:02x} ({})'.format(m[pc + 2], m[pc + 1], c))
        pc += 3
    elif op == 4:
        print('R0 = 0; R{} = (R{} == R{})'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 5:
        print('R0 = 0; R{} = R{} - R{}'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 6:
        print('CHECK (R{} == R{})n'.format(
            m[pc + 1], m[pc + 2]))
        pc += 3
    else:
        print('unk opcode {}'.format(op))
        break

рдкрд░рд┐рдгрд╛рдореА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХреЛрдб рдорд┐рд│рддреЛ:

рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдХреЛрдб

R1 = DB101[0]
R2 = 6e (n)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[1]
R2 = 10 (?)
R0 = 0; R1 = R1 - R2
R2 = 20 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[2]
R2 = 77 (w)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[3]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[4]
R2 = 75 (u)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[5]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[6]
R2 = 34 (4)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[7]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[8]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[9]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[10]
R2 = 37 (7)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[11]
R2 = 22 (?)
R0 = 0; R1 = R1 - R2
R2 = 46 (F)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[12]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[13]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[14]
R2 = 6d (m)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[15]
R2 = 11 (?)
R0 = 0; R1 = R1 - R2
R2 = 23 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[16]
R2 = 35 (5)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[17]
R2 = 12 (?)
R0 = 0; R1 = R1 - R2
R2 = 25 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[18]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[19]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, рд╣рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбреАрдмреА 101 рд╡рд░реВрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпрд╛рдЪреНрдпрд╛ рд╕рдорд╛рдирддреЗрд╕рд╛рдареА рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рддрдкрд╛рд╕рддреЛ. рд╕рд░реНрд╡ рдЪреЗрдХ рдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рдЪреА рдЕрдВрддрд┐рдо рдУрд│ рдЖрд╣реЗ: n0w u 4r3 7h3 m4573r. рдЬрд░ рд╣реА рдУрд│ рдмреНрд▓реЙрдХ DB101 рдордзреНрдпреЗ рдареЗрд╡рд▓реА рдЕрд╕реЗрд▓, рддрд░ рдореЕрдиреНрдпреБрдЕрд▓ PLC рдирд┐рдпрдВрддреНрд░рдг рд╕рдХреНрд░рд┐рдп рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдлреБрдЧрд╛ рдлреБрдЯрдгреЗ рдХрд┐рдВрд╡рд╛ рдбрд┐рдлреНрд▓реЗрдЯ рдХрд░рдгреЗ рд╢рдХреНрдп рд╣реЛрдИрд▓.тАи

рдЗрддрдХрдВрдЪ! рдЕреЕрд▓реЗрдХреНрд╕реАрдиреЗ рдФрджреНрдпреЛрдЧрд┐рдХ рдирд┐рдиреНрдЬрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЙрдЪреНрдЪ рдкрд╛рддрд│реАрдЪреЗ рдЬреНрдЮрд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реЗ :) рдЖрдореНрд╣реА рд╡рд┐рдЬреЗрддреНрдпрд╛рд▓рд╛ рд╕рдВрд╕реНрдорд░рдгреАрдп рдмрдХреНрд╖рд┐рд╕реЗ рдкрд╛рдард╡рд▓реА. рд╕рд░реНрд╡ рд╕рд╣рднрд╛рдЧреАрдВрдирд╛ рдЦреВрдк рдЦреВрдк рдзрдиреНрдпрд╡рд╛рдж!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛