ááŒá®ážáá²á·ááá·áº PHDays 9 ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá¬ááºááœá±á·á á¯ááºá ááºáá¯á¶ááᯠáá±á¬ááºáá»ááºááẠááŒáá¯ááºááœá²áá áºáᯠáá»ááºážááá²á·áááºá . áá°áá®áá±á¬á ááºááŸá¯áá¯ááºáááºážá ááºááᯠá¡áá¯áá°ááŒá®áž ááá°áá®áá±á¬áá¯á¶ááŒá¯á¶áá±ážááá·áºáááºáá»ááºáá»á¬áž (áá¯á¶ááŒá¯á¶áá±ážáááŸáá áá¯á¶ááŒá¯á¶áá±ážáááá·áºá ááŒáá·áºáá¬ážáá±á¬áá¯á¶ááŒá¯á¶áá±áž)á áá°áá®áá±á¬á ááºááŸá¯áá¯ááºáááºážáá¯ááºáááºážá ááºááᯠá¡áá¯áá°ááŒá®áž- ááá¡á¬ážá¡á±á¬ááºááŸáá±ááᯠáá°áá±á¬ááºážáá²ááá¯á· á á¯ááºáá°ááá¯ááºááẠ(ááá¯á·áá±á¬áẠááœááºáá¬áááº)á
ááœá²ááŒá¬ážáá±á¬ áá±ážáááºážáá±áž ááá·áºáááºáá»ááºáá»á¬ážááŸááá±á¬áºáááºážá áááºáááºáááºá áá¬á·ááºáá²ááœá²á·á ááºážááŸá¯ááŸá¬ á¡áá°áá°áááºááŒá áºáááº- Siemens Simatic PLC S7-300 á á®ážáá®áž; á¡áá±ážáá±á«áº áá±á¬ááºážááœááŸá¯ááá¯ááºááŸáá·áº ááá¡á¬ážááá¯ááºážáááááᬠ(PLC áá áºáá»á áºááẠááœááºážá¡á¬ážá á¯áá»á¬áž (DI) ááá¯á· áá»áááºáááºáá¬ážáááº)á ááœá±ááŒá±ážáá±á¬ááºážááœááŸá¯ááŸáá·áº áá±áá¯áá áºáááºážááŸá¯á¡ááœáẠáá¯ááºáá±á¬ááºáá±áá±á¬ á¡ááá¯á·ááŸááºáá»á¬áž (PLC (DO) á áá áºáá»á áºáááºá¡ááœááºáá»á¬ážááŸáá·áº áá»áááºáááºáá¬ážáááº) - á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááᯠááŒáá·áºáá«á

PLC ááẠááá¡á¬ážáááºááŒááºážá¡áá±á«áºáá°áááºááŒá®áž áááºážááááá¯ááááºááŸáá·áºá¡áá® áá±á¬áá¯á¶ážááᯠááá»á±ááááºááŒá
áºá
á±ááẠááá¯á·ááá¯áẠáá±á¬ááºážáá¬ážááẠáá¯á¶ážááŒááºáá»ááºáá»áá²á·ááẠ(áááºááá¯ááºáá¬á¡ááá¯á·ááŸááºáá»á¬ážááᯠá¡ááœáá·áºá¡ááááº) ááŒá¯áá¯ááºáá²á·áááºá ááá¯á·áá±á¬áºá áá±áá¬á¡á¬ážáá¯á¶ážááœáẠááá·áºáááºáá»ááºáááŸááá² á¡ááá¯á·ááŸááºáá»á¬ážá á¡ááŒá±á¡áá±áá»á¬ážááᯠááááºážáá»á¯ááºááá¯ááºá
á±ááá·áº Manual Control Mode áá«ááŸááááºá
á€áá¯ááºááá¯ááœáá·áºááŒááºážá ááŸá¯ááºááœá±ážááŸá¯ááœáẠáááºáááºáá»ááºáá»á¬ážááẠááœá²ááŒá¬ážáááº- á¡áá¬á¡ááœááºáá²á· áááºáááºáá»ááºááœáẠáááºážááᯠááŒá¯áá¯ááºááẠá¡ááœááºáá°áá¯á¶ážááŒá áºááŒá®áž áá¯á¶ááŒá¯á¶áá±áž ááŒáá·áºáá¬ážáá±á¬ áááºáááºááŸá¯ááœáẠáááºážááẠáá°áá®á áœá¬ ááá¯ááá¯áááºáá²áááºá
ááŒá¿áá¬ááŒá±á¬ááºáá¯á¡ááẠáá«ážáá¯ááᯠááŸá áºáááºá¡ááœááºáž ááŒá±ááŸááºážááá¯ááºáá²á·áááºá ááááá±áá¬á០áá«áááºáá°ááẠ233 ááŸáẠáááŸááá²á·ááẠ(áá°ááẠááŒáá¯ááºááœá²á¡ááœáẠááŒááºáááºáá±áááºááŸá¬ áá áºáááºááŒá¬áááº)á áá¶áá°ážááŸáẠáá¯á¶ážáŠáž- áá«áá±áᬠ- a1exdandyá II - Rubikoidá III - Zeá
ááá¯á·áá±á¬áºáááºážá PHDays áá¬áá¡ááœááºážá áááºáááºáá»áẠáá¯á¶ážáá¯á áá¯á¶ážááᯠáá«áááºáá° áááºáá°áá»áŸ ááá»á±á¬áºááœáŸá¬ážááá¯ááºáá²á·áá±á¬ááŒá±á¬áá·áº á¡áœááºááá¯ááºážááŒáá¯ááºááœá²áá áºáᯠááŒá¯áá¯ááºááŒá®áž á¡áááºáá²áá¯á¶ážá¡áá¯ááºáá áºáá¯ááᯠááœááºáá¡á á±á¬ááá¯ááºážááœáẠáá¯ááºááŒááºááẠáá¯á¶ážááŒááºáá²á·áááºá áá«áááºáá°áá»á¬ážááẠáá áºáá¡ááœááºáž áá¯ááºáááºážáá¬áááºááᯠááŒá®ážááŒá±á¬ááºáááºá á¡áá¶ááá¯ááŸá¬ááœá±áᬠá¡ááŒá±ááᯠá¡áá±ážá áááºááŸáá·áº á áááºáááºá á¬ážááœááºáááºážáááºážááŒáá·áº áá±á¬áºááŒááááºááŒá áºáááºá
ááŒááºáá±á¬ááºááŸá¯á¡á±á¬ááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá áºáá¡ááœááºáž áá±ážááá¯á·áá°áá»á¬ážáá¶á០á¡áá¯ááºá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážááŒá±ááŸááºážáááºážááᯠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž PHDays áá¬áá¡ááœááºáž ááŸááºááŒáá¯ááºááŸá¯ááœáẠááááá±áá¬áááŸááá²á·áá±á¬ Digital Security áá¯áá¹ááá®á០Alexey Kovrizhnykh (a1exdandy) á០ááœá±á·ááŸááá²á·áááºá á¡á±á¬ááºááœáẠáá»áœááºá¯ááºááá¯á·á ááŸááºáá»ááºáá»á¬ážááŸáá·áºá¡áá° áááºážáá á¬áá¬ážááᯠáá»áœááºá¯ááºááá¯á·áááºááŒáá«áááºá
áááŠážááá¯ááºážááŒá¬ážá áááºááŒá¬ááŒááºážá
ááá¯á·ááŒá±á¬áá·áºá á¡áá¯ááºááœáẠá¡á±á¬ááºáá«ááá¯ááºáá»á¬ážáá«ááŸááá±á¬ ááŸááºáááºážáá áºáá¯áá«ááŸááááº-
- block_upload_traffic.pcapng
- DB100.bin
- á¡ááááºá¡ááŒáœááº.txt
hints.txt ááá¯ááºááœáẠá¡áá¯ááºááŒá±ááŸááºážááẠááá¯á¡ááºáá±á¬ á¡áá»ááºá¡áááºááŸáá·áº á¡ááááºá¡ááŒáœááºáá»á¬áž áá«ááŸááááºá á€ááœáẠáááºážá á¡ááŒá±á¬ááºážá¡áá¬áá»á¬áž
- áááºááẠPlcSim ááŸáá¯ááºááœááºáá»á¬ážááᯠStep7 ááá¯á·áááºááá¯ááºáááºáᯠPetrovich áááá±á·áááŒá±á¬áá²á·áááºá
- Siemens Simatic S7-300 á á®ážáá®áž PLC ááᯠáááºáááºáááºááœáẠá¡áá¯á¶ážááŒá¯áá²á·áááºá
- PlcSim ááẠSiemens S7 PLCs á¡ááœáẠáááá¯ááááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºááŸáá·áº á¡ááŸá¬ážááŸá¬ááŒááºááẠááœáá·áºááŒá¯ááá·áº PLC emulator áá áºáá¯ááŒá áºáááºá
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 7702a0401 ..w............. 0206: 0100 0103 0102 0 02 00000030 ................ 0501: 0202 1602 0501 0206 0100 0104 0102a00000040 7502 u............... 0401: 0206 0100 0105 0102 0 02 áááá áááá............áá 0501: 00000050 0202 1602 0501 0206 0100 0106 0102 ............&...... 3402: 4c00000060 0401 0206 0100 0107 0102 .......... L. 2602 : 0501 0202 00000070 4 02a0501 0206 0100 0108 ................ 0102: 3302 0401 3 00000080a 0206 0100 0109 0102 .......... áá 0a02: 0501 0202b 1602 00000090 0501 0206 0100 010......" .....F... 0102b3702: 0401 0206 7c........ 000000 0 0100 .... .. 010c0102: 2202d 0501 0202a4602 0501 000000 0 0206 0100 ................ 010d0102: 3302 0401e 0206 0100d3 000000 0 ...... .... 010e0102: 0 02 0501 0202 1602 0501 0206 000000 ...........#...... 0f0100: 010 0102 6 02 0401 0206 ..... ..... 0100: 010 000000 0 0102 1102 0501 0202 2302 ......%......... 0501: 0206 0100 000000 0 0110 0102..... .....&.3502:0401 0206 0100c0111 0102 5 00000100.......L......
á¡ááẠá¡ááŒá¶ááŒá¯áá¬ážááá·áºá¡ááá¯ááºážá block_upload_traffic.pcapng ááá¯ááºááœáẠPLC ááá¯á· ááá±á¬ááºá¡ááºáá¯ááºá¡ááœá¬ážá¡áᬠá¡ááŸáá¯ááºáá¯á¶áá áºáá¯á¶áá«ááŸááááºá
áá®áá¬áá¶áá¬áá¡ááœááºáž ááŒáá¯ááºááá¯ááºááŸá¯áá±áá¬á á€á¡ááœá¬ážá¡áá¬á¡ááŸáá¯ááºáá¯á¶ááẠáááŸáááẠá¡áááºážáááºááá¯áááºáá²ááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá áá«ááá¯áá¯ááºááá¯á·á TeslaSCADA2 á¡ááœáẠááá±á¬áá»ááºááá¯ááºáá²á script ááᯠáá¬ážáááºááá¯á· ááá¯á¡ááºáá«áááºá RC4 ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºááŸááºáá¬ážáá±á¬ á¡ááŸáá¯ááºáá¯á¶ááẠáááºááá·áºáá±áá¬ááœáẠááŸáááŒá±á¬ááºážááŸáá·áº áááºážááᯠáá¯ááºááŸááºááẠáááºááá·áºáá±á¬á·ááᯠá¡áá¯á¶ážááŒá¯ááááºááᯠááááŸááá¬ážáááºááá¯ááºáááºááŒá áºáááºá S7 áááá¯ááá¯áá±á¬áááá¯ááºážááá·áºááᯠá¡áá¯á¶ážááŒá¯á ááá¯ááºáá±á«áºááŸá áá±áá¬ááááºááá¯á·áá¬ážáá±á¬ á áœáá·áºáá áºáá á¹á ááºážáá»á¬ážááᯠááá°ááá¯ááºáááºá áááºážá¡ááœáẠáá»áœááºá¯ááºááẠSnap7 áááºáá±á·áá»áºá០ááá¯ááºáጠclient ááᯠá¡áá¯á¶ážááŒá¯áá²á·áááºá
á¡ááœá¬ážá¡áᬠá¡ááŸáá¯ááºáá¯á¶á០á¡áá»ááºááŒáá¯ááºáá±á¬ááºááŒááºáž ááááºááá¯á·ááŒááºážáá»á¬ážááᯠáá¯ááºáá°ááŒááºážá
á¡ááŸáá¯ááºáá¯á¶ááŒá®ážá á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááŒáá·áºááŒááºážá¡á¬ážááŒáá·áº áááºážááœáẠá¡áá»ááºááŒáá¯ááºáá±á¬ááºááŒááºáž áá¯á¶ážáá»á¬áž OB1á FC1á FC2 ááŸáá·áº FC3 ááá¯á·áá«ááŸááááºááᯠáááºáá¬ážáááºááá¯ááºáááº-

á€áá¯á¶ážáá»á¬ážááᯠáááºááŸá¬ážááááºá á¥ááá¬á¡á¬ážááŒáá·áºá ááááºá áááºážááŒá±á¬ááºážááᯠpcapng áá±á¬áºáááºá០pcap ááá¯á· ááŒá±á¬ááºážáá²ááŒá®áž á¡á±á¬ááºáá« script ááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáááºá
#!/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 = ''ááááºáá»á¬ážááᯠáááºážá á áºááŒá®ážáá«á áááºážááá¯á·ááẠá¡ááŒá²áááºáž bytes 70 70 (pp) ááŒáá·áº á áááºáááºááᯠáááááŒá¯áááá«áááá·áºáááºá ááá¯ááœáẠáááºážááá¯á·á¡á¬áž ááœá²ááŒááºážá áááºááŒá¬áááºážááᯠáá±á·áá¬ááẠááá¯á¡ááºáá«áááºá assignment á¡ááááºá¡ááŒáœááºá áááºážá¡ááœáẠPlcSim ááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºááŒá±á¬ááºáž á¡ááŒá¶ááŒá¯áá¬ážáááºá
ááá±á¬ááºáá»á¬ážá០áá°áá¬ážáááºááá¯ááºáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬áž ááá°ááŒááºážá
ááááŠážá áœá¬á Simatic Manager áá±á¬á·ááºáá²ááºááᯠá¡áá¯á¶ážááŒá¯á á¡áááºááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬áž (= Q 7) ááŒáá·áº á¡áá¯á¶ážáá»á¬ážá áœá¬ááᯠS0.0-PlcSim áááá¯ááááºááá·áºááœááºážááŒá®áž áááºážááœááºáááŸááá±á¬ PLC ááᯠexample.plc ááá¯ááºááá¯á· ááááºážáááºážááŒááºážááŒáá·áº ááŒáá¯ážáááºážááŒáá«á áá¯á·á ááá¯ááºáá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááá¯ááŒáá·áºááŸá¯ááŒááºážááŒáá·áºá á¡á á±á¬ááá¯ááºážááœááºááŸá¬ááœá±ááœá±á·ááŸááá²á·áá±á¬ áááºááŸáẠ70 70 ááŒáá·áº áá±á«ááºážáá¯ááºáá¯ááºááœááºáá»á¬ážáá¡á ááᯠá¡ááœááºááá°áá¯á¶ážááŒááºááá¯ááºáááºá ááá±á¬ááºáá»á¬ážááŸá±á·ááœááºá ááá±á¬ááºá¡ááœááºá¡á á¬ážááᯠ4-byte á¡áá¯á¶ážáááºááá¯ážá¡ááŒá Ạáá±ážáá¬ážáááºá

plc ááá¯ááºáá»á¬ážááœá²á·á
ááºážáá¯á¶ááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºááᯠáá»áœááºá¯ááºááá¯á·áááºáá¶áááŸáááŒá®ážáá±á¬ááºá PLC S7 áááá¯ááááºáá»á¬ážááá¯áááºááŸá¯áááºá¡ááœáẠá¡á±á¬ááºáá«áá¯ááºáá±á¬ááºáá»ááºá¡á
á®á¡á
ááºááẠáá±á«áºáá¬áááº-
- Simatic Manager ááá¯á¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·ááẠá¡ááŸáá¯ááºáá¯á¶ááŸáááŸááá±á¬ S7-PlcSim ááœáẠááááºááá¯á·ááœá²á·á ááºážáá¯á¶ááᯠáááºáá®ážáá«áááºá ááá±á¬ááºá¡ááœááºá¡á á¬ážáá»á¬ážááẠáá°áá®ááá«ááẠ(áá¯ááºááœááºáá»á¬ážááᯠááá¯á¡ááºáá±á¬ ááœáŸááºááŒá¬ážáá»ááºá¡áá±á¡ááœááºááŒáá·áº ááŒáá·áºááœááºážááŒááºážááŒáá·áº á¡á±á¬ááºááŒááºáááº) ááŸáá·áº áááºážááá¯á·á ááœá²ááŒá¬ážáááºááŸááºááŸá¯áá»á¬áž (OB1á FC1á FC2á FC3)á
- PLC ááᯠááá¯ááºáá áºáá¯ááœáẠááááºážáááºážáá«á
- áá»áœááºá¯ááºááá¯á·ááẠááá¬ááºááá¯ááºááŸá ááá±á¬ááºáá»á¬ážáá«ááŸááá±á¬ á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠtraffic dump á០ááá±á¬ááºáá»á¬ážááŒáá·áº á¡á á¬ážááá¯ážáá«áááºá áá¯ááºááœááºáá»á¬ážáá¡á ááᯠáááºááŸááºááŒáá·áº áá¯á¶ážááŒááºáááºá
- áá»áœááºá¯ááºááá¯á·ááẠáááŸááá¬áá±á¬ááá¯ááºááᯠS7-PlcSim ááœááºáááºááŒá®áž Simatic Manager ááŸá ááááºááá¯á·áá¬ážáá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááŒáá·áºááŸá¯áá«á
Blocks áá»á¬ážááᯠá¥ááá¬á¡á¬ážááŒáá·áº á¡á±á¬ááºáá«áá¯ááºááŒáá·áº á¡á á¬ážááá¯ážááá¯ááºáá«áááºá
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)Alexey ááẠááá¯ááááºáá²áá±á¬áºáááºáž ááŸááºáááºáá±á¬áááºážááŒá±á¬ááºážááᯠáá»áŸá±á¬ááºááŸááºážáá²á·áááºá áá«áááºáá°áá»á¬ážááẠNetToPlcSim áááá¯ááááºááᯠá¡áá¯á¶ážááŒá¯ááŒá®áž PlcSim ááẠááœááºáááºáá±á«áºááœáẠáááºááœááºááá¯ááºá á±áááºá Snap7 ááŸáá áºááá·áº PlcSim ááá¯á· ááá±á¬ááºáá»á¬ážááᯠá¡ááºáá¯ááºáá¯ááºáᬠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áááºáááºážáá»ááºááᯠá¡áá¯á¶ážááŒá¯á PlcSim á០ááá±á¬áá»ááºáá áºáá¯á¡ááŒá Ạá€áá¯ááºááœááºáá»á¬ážááᯠáá±á«ááºážáá¯ááºáá¯ááºááẠáá»áœááºá¯ááºááá¯á· áá°ááá«áááºá
S7-PlcSim ááœáẠáááŸááá¬áá±á¬ ááá¯ááºááá¯ááœáá·áºááŒááºážááŒáá·áºá áááºááẠSimmatic Manager ááᯠá¡áá¯á¶ážááŒá¯á áá±ážáá¬ážáá±á¬ áá¯á¶ážáá»á¬ážááᯠáááºááá¯ááºáááºá áááºáá ááºáá á¹á ááºážááááºážáá»á¯ááºááŸá¯áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠblock FC1 ááœááºááŸááºáááºážáááºáá¬ážáááºá á¡áá°ážáááááŒá¯áááá·áºá¡áá»ááºááŸá¬ ááœáá·áºááá¯ááºáá±á¬á¡áá«ááœáẠPLC ááááºážáá»á¯ááºááŸá¯á¡á¬áž M0 ááŸáá·áº M2.2 áá áºááŸááºáá¬ááºáááºááá¯ážáá»á¬ážáá±á«áºááœáẠá¡ááŒá±áá¶á PLC ááááºážáá»á¯ááºááŸá¯á¡á¬áž manual mode ááá¯á· áááºááŸááºáá±ážááá·áº #TEMP2.3 variable ááŒá áºáááºá #TEMP0 áááºááá¯ážááᯠfunction FC3 á០áááºááŸááºáááºá

ááŒá¿áá¬ááá¯ááŒá±ááŸááºážáááºá áááºááẠFC3 áá¯ááºáá±á¬ááºáá»ááºááᯠááá¯ááºážááŒá¬ážá
áááºááŒá¬ááŒá®áž áá¯áá¹áááá
áºáá¯ááŒááºááŒá
áºáá¬á
á±ááẠáá¯ááºáá±á¬ááºáááá·áºá¡áá¬áá»á¬ážááᯠáá¬ážáááºááẠááá¯á¡ááºáááºá
ááŒáá¯ááºááá¯ááºááŸá¯ááá¯ááºááŸá Low Security stand ááŸá PLC signal processing blocks áá»á¬ážááᯠá¡áá¬ážáá°áááºážáááºážááŒáá·áº á á®á ááºáá±ážáá²á·áá±á¬áºáááºáž #TEMP0 variable ááááºááá¯ážááᯠáááºááŸááºáááºá¡ááœááºá DB1 block ááœáẠáá»áœááºá¯ááºááááºáá»á¬áááºážáááºážááᯠDB7 ááá±á¬á·ááœáẠáá±ážááẠáá¯á¶áá±á¬ááºáá«áááºá block áá áºáá¯ááŸá áááºááá¯ážááᯠá á áºáá±ážááŒááºážááẠááá¯ážááŸááºážááŒá®áž block programming language á áááºáá²áá±á¬ á¡ááááᬠáááá¯á¡ááºáá«á áááºááŸá¬ážáááºááŸá¬á áá¯á¶ááŒá¯á¶áá±ážá¡ááá·áºááœááºá manual control ááá¯áááŸááááºááŸá¬ ááá¯ááááºáá²áááºááŒá áºááŒá®áž STL áá¬áá¬á áá¬ážá ááŸá¯ááºááœá±ážááŸá¯áá»á¬áž (SXNUMX 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 áá¬áá¬á áá¬ážá á¡áá±ážá áááºááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááá¯ááºá áœááºážáá»á¬ážááᯠáááºááá¯ááºáá¬áááºá áœá²á á¬á¡á¯ááºááœáẠááœá±á·ááŸáááá¯ááºáááº- . á€áá±áá¬ááœáẠáá»áœááºá¯ááºáá¯ááºáá±á¬ááºááŒá®ážáá±á¬áẠáá°áá®áá±á¬áá¯ááºááᯠáááºááŒáá«ááẠ- á¡ááœáŸááºážáá»á¬ážááŸáá·áº ááááºážááŸááºáá»á¬ážááᯠá¡áááºááŒá±á¬ááºážááŒááºážááŸáá·áº áá¯ááºáá±á¬ááºáá»áẠá¡ááºáááá¯áá®áááºááŸáá·áº á¡áá»áá¯á·áá±á¬ STL áá¬áá¬á áá¬áž áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáá±á¬áºááŒááá·áº ááŸááºáá»ááºáá»á¬áž áá±á«ááºážááá·áºááŒááºážá áá±ážááœááºážáá¯ááºáá¬ážáá±á¬ ááá±á¬ááºááœáẠDB100 ááá±á¬ááºááœááºááŸááá±á¬ ááá¯ááºáá¯ááºá¡áá»áá¯á·ááᯠáá¯ááºáá±á¬ááºááá·áº virtual machine áá áºáá¯áá«ááŸááááºááᯠáá»áœááºá¯ááºáá»ááºáá»ááºáž áááááŒá¯áá«á Virtual machine áááºážááœáŸááºáá»ááºáá»á¬ážááœáẠáááºáááºáá¯áẠ1 byte ááŸáá·áº argument áá»á¬ážá bytes á argument áá áºáá¯á á®á¡ááœáẠone byte áá«áááºáááºá ááá·áºááœááºážá ááºážá á¬ážáá¬ážáá±á¬ ááœáŸááºááŒá¬ážáá»ááºá¡á¬ážáá¯á¶ážááœáẠá¡ááŒááºážá¡áá¯á¶ááŸá áºáá¯ááŸááááºá áá»áœááºá¯ááºááẠáááºážááá¯á·ááááºááá¯ážáá»á¬ážááᯠááŸááºáá»ááºáá»á¬ážááœáẠ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 ááá±á¬ááºááœáẠbytecode ááá¯ááœá²ááŒááºážá áááºááŒá¬ááẠá¡áá±ážá á¬áž disassembler áá áºáá¯áá±ážááá¯ááºááŒáá«á áá¯á·á
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ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá« virtual machine code ááᯠáááŸááááº-
á ááºáá¯ááºá¡áá¯
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)áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºážá á€áááá¯ááááºááẠDB101 á០áá¬ááºáá±á¬ááºáá áºáá¯á á®ááᯠáá°áá®áá±á¬áááºááá¯ážáá áºáá¯á¡áá áá¬áá°áá®áá»áŸááŸáá á±ááẠá á áºáá±ážáááºá á á áºáá±ážááŸá¯á¡á¬ážáá¯á¶ážááᯠáá»á±á¬áºááŒááºáááºá¡ááœáẠáá±á¬ááºáá¯á¶ážá á¬ááŒá±á¬ááºážááŸá¬ n0w u 4r3 7h3 m4573r ááŒá áºáááºá á€ááá¯ááºážááᯠblock DB101 ááœááºáá¬ážááŸááá«áá manual PLC ááááºážáá»á¯ááºááŸá¯ááᯠá¡áááºááœááºážáá¬ážááŒá®ážá áááºážááẠáá®ážáá¯á¶ážáá»á¶ááᯠáá±á«ááºááœá²ááẠááá¯á·ááá¯áẠááá»á±ááááºááŒá áºááá¯ááºáááºááŒá áºáááºáâš
áá«áá«áá²! Alexey ááẠá
ááºááŸá¯áááºáá»á¬ááŸáá·áºááá¯ááºáááºáá±á¬ ááŒáá·áºáá¬ážáá±á¬á¡ááááá¬ááᯠááá¯ááºááŒáá²á·ááẠáá«áááºáá°á¡á¬ážáá¯á¶ážááᯠáá»á±ážáá°ážá¡áá»á¬ážááŒá®ážáááºáá«áááºá
source: www.habr.com
