Bird
Raised Fist0
PLC Programmingscripting~20 mins

Modbus TCP/IP in PLC Programming - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Modbus TCP/IP Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
💻 Command Output
intermediate
2:00remaining
What is the output of this Modbus TCP/IP read command simulation?
Consider a script that simulates reading holding registers from a Modbus TCP/IP device. What will be the output of the following code snippet?
PLC Programming
registers = {100: 1234, 101: 5678, 102: 9012}
address = 101
value = registers.get(address, None)
print(f"Register {address} value: {value}")
ARegister 101 value: 5678
BRegister 101 value: None
CRegister 100 value: 1234
DKeyError: 101
Attempts:
2 left
💡 Hint
Look at how the dictionary get method works with the given address.
🧠 Conceptual
intermediate
1:30remaining
Which Modbus TCP/IP function code is used to write a single coil?
In Modbus TCP/IP communication, which function code is used to write a single coil (digital output)?
A0x10
B0x05
C0x03
D0x01
Attempts:
2 left
💡 Hint
Function codes are hexadecimal numbers representing specific actions.
🔧 Debug
advanced
2:30remaining
Identify the error in this Modbus TCP/IP client connection code snippet
What error will this Python code raise when trying to connect to a Modbus TCP/IP server?
PLC Programming
from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient('192.168.1.100')
client.connect()
result = client.read_holding_registers(1, 2)
print(result.registers)
client.close()
AAttributeError: 'NoneType' object has no attribute 'registers'
BConnectionRefusedError: [Errno 111] Connection refused
CSyntaxError: invalid syntax
DTypeError: read_holding_registers() missing 1 required positional argument
Attempts:
2 left
💡 Hint
Check if the read_holding_registers call returns None on failure.
🚀 Application
advanced
1:30remaining
How many registers are read by this Modbus TCP/IP read command?
Given the following Modbus TCP/IP read command, how many registers will be read?
PLC Programming
read_holding_registers(address=400, count=10)
A410 registers
B400 registers
C1 register
D10 registers
Attempts:
2 left
💡 Hint
The 'count' parameter specifies how many registers to read.
📝 Syntax
expert
2:30remaining
What error does this Modbus TCP/IP write command produce?
What error will this Python code produce when trying to write multiple registers?
PLC Programming
from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient('192.168.1.100')
client.connect()
result = client.write_registers(10, [100, 200, 300])
print(result)
client.close()
AAttributeError: 'NoneType' object has no attribute 'isError'
BTypeError: write_registers() missing 1 required positional argument
CNo error, prints <WriteMultipleRegistersResponse>
DConnectionError: Failed to connect to server
Attempts:
2 left
💡 Hint
Check the pymodbus write_registers method signature and return type.

Practice

(1/5)
1. What is the main purpose of Modbus TCP/IP in PLC programming?
easy
A. To convert analog signals to digital
B. To program PLCs using ladder logic
C. To allow devices to communicate over Ethernet using simple commands
D. To create graphical user interfaces for PLCs

Solution

  1. Step 1: Understand Modbus TCP/IP function

    Modbus TCP/IP is a communication protocol that enables devices to exchange data over Ethernet networks.
  2. Step 2: Identify the main use

    It uses simple commands to read and write data between devices, facilitating communication.
  3. Final Answer:

    To allow devices to communicate over Ethernet using simple commands -> Option C
  4. Quick Check:

    Modbus TCP/IP = Ethernet communication protocol [OK]
Hint: Modbus TCP/IP is about device communication over Ethernet [OK]
Common Mistakes:
  • Confusing Modbus TCP/IP with PLC programming languages
  • Thinking it converts signals instead of communicating data
  • Assuming it creates user interfaces
2. Which of the following is the correct syntax to read holding registers using Modbus TCP/IP function code in a PLC script?
easy
A. ReadHoldingRegisters(address, quantity)
B. WriteCoils(address, quantity)
C. ReadInputStatus(address, quantity)
D. WriteHoldingRegisters(address, quantity)

Solution

  1. Step 1: Identify function codes for reading registers

    Modbus function code 03 reads holding registers, typically called ReadHoldingRegisters.
  2. Step 2: Match syntax to function

    ReadHoldingRegisters(address, quantity) correctly represents reading holding registers by specifying start address and number of registers.
  3. Final Answer:

    ReadHoldingRegisters(address, quantity) -> Option A
  4. Quick Check:

    Read holding registers = ReadHoldingRegisters() [OK]
Hint: Read holding registers uses ReadHoldingRegisters() function [OK]
Common Mistakes:
  • Using Write functions instead of Read
  • Confusing coils with registers
  • Using incorrect function names
3. Given the following PLC script snippet using Modbus TCP/IP:
response = ReadCoils(10, 5)
print(response)

What is the expected output if coils 10 to 14 are ON, OFF, ON, OFF, ON respectively?
medium
A. [1, 0, 1, 0, 1]
B. Error: Invalid function
C. [ON, OFF, ON, OFF, ON]
D. [True, False, True, False, True]

Solution

  1. Step 1: Understand ReadCoils function output

    ReadCoils returns a list of boolean values representing coil states: True for ON, False for OFF.
  2. Step 2: Map coil states to boolean list

    Coils 10 to 14 states ON, OFF, ON, OFF, ON map to [True, False, True, False, True].
  3. Final Answer:

    [True, False, True, False, True] -> Option D
  4. Quick Check:

    Coil states as booleans = [True, False, True, False, True] [OK]
Hint: ReadCoils returns booleans True/False, not strings or numbers [OK]
Common Mistakes:
  • Expecting numeric 1/0 instead of True/False
  • Using string 'ON'/'OFF' instead of booleans
  • Assuming function returns error
4. A PLC script using Modbus TCP/IP to write to coils is:
WriteCoils(5, [True, False, True])

Which of the following correctly describes the WriteCoils function?
medium
A. The function WriteCoils requires a starting address and a list of boolean values
B. The list should contain integers 1 and 0 instead of booleans
C. The function WriteCoils only writes single coil, not multiple
D. The address 5 is out of range for coils

Solution

  1. Step 1: Check WriteCoils function parameters

    WriteCoils expects a starting address and a list of boolean values to write multiple coils.
  2. Step 2: Verify parameter usage

    The given call correctly provides the starting address and list of boolean values.
  3. Step 3: Analyze options

    The accurate statement is that the function requires a starting address and a list of boolean values. Other statements are incorrect: address range is not specified as invalid, booleans are appropriate (not integers), and the function supports multiple coils.
  4. Final Answer:

    The function WriteCoils requires a starting address and a list of boolean values -> Option A
  5. Quick Check:

    WriteCoils(address, bool list) is correct syntax [OK]
Hint: WriteCoils needs address plus boolean list, not integers [OK]
Common Mistakes:
  • Using integers instead of booleans
  • Assuming WriteCoils writes only one coil
  • Ignoring address range validity
5. You want to read 10 holding registers starting at address 100 and write the sum of their values to register 200 using Modbus TCP/IP in a PLC script. Which approach correctly combines reading, summing, and writing?
hard
A.
values = ReadCoils(100, 10)
sum_val = sum(values)
WriteHoldingRegisters(200, sum_val)
B.
values = ReadHoldingRegisters(100, 10)
sum_val = sum(values)
WriteHoldingRegisters(200, [sum_val])
C.
values = ReadHoldingRegisters(100, 10)
sum_val = sum(values)
WriteCoils(200, sum_val)
D.
values = ReadHoldingRegisters(100, 10)
sum_val = sum(values)
WriteHoldingRegisters(200, sum_val[0])

Solution

  1. Step 1: Read holding registers correctly

    Use ReadHoldingRegisters(100, 10) to get 10 registers starting at 100.
  2. Step 2: Sum the values and write properly

    Sum the list with sum(values), then write the sum as a list [sum_val] to register 200 using WriteHoldingRegisters.
  3. Step 3: Check other options for errors

    values = ReadCoils(100, 10)
    sum_val = sum(values)
    WriteHoldingRegisters(200, sum_val)
    reads coils instead of registers;
    values = ReadHoldingRegisters(100, 10)
    sum_val = sum(values)
    WriteCoils(200, sum_val)
    writes to coils instead of registers;
    values = ReadHoldingRegisters(100, 10)
    sum_val = sum(values)
    WriteHoldingRegisters(200, sum_val[0])
    incorrectly indexes sum_val which is an int, causing error.
  4. Final Answer:

    values = ReadHoldingRegisters(100, 10) sum_val = sum(values) WriteHoldingRegisters(200, [sum_val]) -> Option B
  5. Quick Check:

    Read registers, sum list, write list with sum [OK]
Hint: Read registers, sum list, write sum as single-item list [OK]
Common Mistakes:
  • Reading coils instead of registers
  • Writing to coils instead of registers
  • Passing integer instead of list to WriteHoldingRegisters
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard