1 | #!/usr/bin/env python3 |
---|
2 | |
---|
3 | import pylibmodbus |
---|
4 | import time |
---|
5 | |
---|
6 | # Siemens LOGO! 8 Modbus TCP Configuration |
---|
7 | PLC_IP = "192.168.1.103" # Change this to your LOGO! 8 IP |
---|
8 | PLC_PORT = 502 # Default Modbus TCP Port |
---|
9 | |
---|
10 | # NQ Register Mapping |
---|
11 | NQ_START_COIL = 0 # First NQ coil (adjust as needed) |
---|
12 | NQ_TOTAL_COUNT = 1024 # Adjust based on the number of NQ outputs |
---|
13 | CHUNK_SIZE = 5 # Reduce the number of coils read at a time |
---|
14 | |
---|
15 | # NQ Holding Register Mapping (Adjust based on LOGO! 8 settings) |
---|
16 | NQ_START_REGISTER = 64 # First NQ register (check Siemens LOGO! register map) |
---|
17 | |
---|
18 | |
---|
19 | |
---|
20 | def main(): |
---|
21 | """Read all NQ (Network Output) values from Siemens LOGO! 8 in chunks.""" |
---|
22 | modbus = pylibmodbus.ModbusTcp(PLC_IP, PLC_PORT) |
---|
23 | |
---|
24 | try: |
---|
25 | if modbus.connect() == -1: |
---|
26 | print("❌ Failed to connect to Siemens LOGO! 8 PLC") |
---|
27 | return |
---|
28 | |
---|
29 | print("✅ Connected to Siemens LOGO! 8 PLC") |
---|
30 | |
---|
31 | # Read NQ outputs in smaller chunks |
---|
32 | for start in range(NQ_START_COIL, NQ_TOTAL_COUNT, CHUNK_SIZE): |
---|
33 | end = min(start + CHUNK_SIZE, NQ_TOTAL_COUNT) |
---|
34 | nq_coils = modbus.read_bits(start, end - start) |
---|
35 | |
---|
36 | if nq_coils is not None: |
---|
37 | for i, value in enumerate(nq_coils): |
---|
38 | if ( value != 0 ): |
---|
39 | print(f"🔹 NQ{start + i + 1} (Coil {start + i}) = {value}") |
---|
40 | else: |
---|
41 | print(f"⚠ Failed to read NQ outputs for Coils {start} to {end - 1}") |
---|
42 | |
---|
43 | time.sleep(0.1) # Small delay to avoid overloading LOGO! 8 |
---|
44 | # Read NQ outputs register |
---|
45 | for start in range(NQ_START_REGISTER, NQ_START_REGISTER + NQ_TOTAL_COUNT, CHUNK_SIZE): |
---|
46 | end = min(start + CHUNK_SIZE, NQ_START_REGISTER + NQ_TOTAL_COUNT) |
---|
47 | nq_registers = modbus.read_registers(start, end - start) |
---|
48 | |
---|
49 | if nq_registers is not None: |
---|
50 | for i, value in enumerate(nq_registers): |
---|
51 | if ( value != 0): |
---|
52 | print(f"🔹 NQ{start + i - NQ_START_REGISTER + 1} (Register {start + i}) = {value}") |
---|
53 | else: |
---|
54 | print(f"⚠ Failed to read NQ outputs for Registers {start} to {end - 1}") |
---|
55 | |
---|
56 | time.sleep(0.1) # Small delay to avoid overloading LOGO! 8 |
---|
57 | |
---|
58 | except Exception as e: |
---|
59 | print(f"❌ Exception: {e}") |
---|
60 | |
---|
61 | finally: |
---|
62 | modbus.close() |
---|
63 | print("🔌 Disconnected from Siemens LOGO! 8 PLC") |
---|
64 | |
---|
65 | if __name__ == "__main__": |
---|
66 | main() |
---|
67 | |
---|