1

関数コードとして使用して modbus でレジスタ値を読み取ることができます。03さらに、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 仕様を誤解している可能性があります。TCPウィッチで使用しているModbus over serial line(RSXXシリアルラインを対象としています)は間違っています。modbus.orgで入手できる文書MODBUS MESSAGING ON TCP/IP IMPLEMENTATION GUIDEを読む必要があります。

于 2013-09-24T14:27:48.313 に答える