P
I'm able to read the register value in modbus using 03 as the function code. and moreover I'm also able to re-write the currently existing value with the same value which is inside the register via Modbus protocol. but when I try to modify the contents of the register, it raises an error saying socket.timeout: timed out. How can I modify the contents of a register via Modbus protocol?
Here is the code.<pre>
import struct
import binascii
import socket
import time
import sys
class main:
def __init__(self):
self.server_socket = ''
def send_packet(self):
self.server_socket = socket.create_connection(('192.168.1.51', 5050), 0.4)
message=struct.pack('>BBHHBBBBBBB',14,16,295,3,6,0,1,48,0,56,21) //(slaveid,function_code,register_address,quantity of registers,total bytes, values....)
message += struct.pack('>H',self.computeCRC(message))
message_hex = binascii.b2a_hex(message)
message_bcd = ''.join('{0:04b}'.format(int(char)) for char in str(int(output_hex, 16)))
print message_hex
print message_bcd
self.server_socket.send(message)
res = self.server_socket.recv(1024)
print binascii.b2a_hex(res)
def computeCRC(self,data):
result = []
for byte in range(256):
crc = 0x0000
for _ in range(8):
if (byte ^ crc) & 0x0001:
crc = (crc >> 1) ^ 0xa001
else: crc >>= 1
byte >>= 1
result.append(crc)
crc = 0xffff
for a in data:
idx = result[(crc ^ ord(a)) & 0xff];
crc = ((crc >> 8) & 0xff) ^ idx
swapped = ((crc << 8) & 0xff00) | ((crc >> 8) & 0x00ff)
return swapped
obj = main()
obj.send_packet()</pre>
Here is the code.<pre>
import struct
import binascii
import socket
import time
import sys
class main:
def __init__(self):
self.server_socket = ''
def send_packet(self):
self.server_socket = socket.create_connection(('192.168.1.51', 5050), 0.4)
message=struct.pack('>BBHHBBBBBBB',14,16,295,3,6,0,1,48,0,56,21) //(slaveid,function_code,register_address,quantity of registers,total bytes, values....)
message += struct.pack('>H',self.computeCRC(message))
message_hex = binascii.b2a_hex(message)
message_bcd = ''.join('{0:04b}'.format(int(char)) for char in str(int(output_hex, 16)))
print message_hex
print message_bcd
self.server_socket.send(message)
res = self.server_socket.recv(1024)
print binascii.b2a_hex(res)
def computeCRC(self,data):
result = []
for byte in range(256):
crc = 0x0000
for _ in range(8):
if (byte ^ crc) & 0x0001:
crc = (crc >> 1) ^ 0xa001
else: crc >>= 1
byte >>= 1
result.append(crc)
crc = 0xffff
for a in data:
idx = result[(crc ^ ord(a)) & 0xff];
crc = ((crc >> 8) & 0xff) ^ idx
swapped = ((crc << 8) & 0xff00) | ((crc >> 8) & 0x00ff)
return swapped
obj = main()
obj.send_packet()</pre>