Hello,
I think your mistake coming from how you format your message.
request_packet = struct.pack(
"<4B H H H 3B B H",
0x50, 0x00, # Subheader (2B)
0x00, 0xFF, # Network Number & PLC Number (2B)
0x0C, 0x00, # Request Length (2B)
0x01, 0x04, # Command Code (Read Word Device - 0x0401)
0x00, 0x00, # Subcommand (2B)
0x01, 0x20, 0xA8, # Start Address (D12001 - 3B) - these should be 3B for head device number only so your 12001 should look like this 0x2E, 0xE1, 0x00
0xA8, #Device code (D in binary message is A8 - 1B)
0x01, 0x00 # Number of Points to Read (2B) )
Try to format this way and see what is coming back.