1

我可以使用03函数代码读取 modbus 中的寄存器值,此外,我还可以通过 Modbus 协议用寄存器内部的相同值重写当前存在的值,但是当我尝试修改时寄存器的内容会引发错误说socket.timeout: timed out。如何通过 Modbus 协议修改寄存器的内容。

这是代码。

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()
4

1 回答 1

3

PyMdobus将使您的生活更轻松!

此超时可能意味着您的 modbus 服务器没有回答您的查询。这通常附加在错误的帧格式、大小或 CRC 错误上。

查看评论/代码,您可能会误解 modbus 规范!您使用Modbus over serial lineTCP 女巫(针对 RSXX 串行线路)是错误的。您应该阅读modbus.org 上提供的文档MODBUS MESSAGING ON TCP/IP IMPLEMENTATION GUIDE

于 2013-09-24T14:27:48.313 回答