2016-09-29 9 views
-2

私の会社はModbus機能を備えたいくつかのルームサーモスタットを購入しました。それらは中国出身です。私がModbus RTUでそれらと通信すると、面白いことが起こります。デバイスは時には私に全く反応しません。そして、次の世論調査では、時には彼らが応答します。しかし、結局のところ、しばらくしてから1時間か2日かかって、彼らは完全に応答を停止し、私はmodbusマスターからいくつかのエラーを受けています。私はシリアルポートアナライザを使って何が起こっているのかを見ました。私はすべてのハードウェアチェックポイント(終端抵抗など)を行った。そして私は多くのモードバスのマスターを試しました。しかし、サーモスタットが1つだけ接続されていても、問題が発生します。具体的には、私はPythonを使って独自のModbusマスターを開発しました。その良い点は、私はminimalmodbusライブラリを使用し、各ポーリング後にポートを閉じる機会があることです。しかし、たとえ私のmodbusマスタープログラムがポーリングを続けても、サーモスタットは完全に応答を停止します。どういうわけか私はプログラミングでその問題を解決しなければなりません。私はその通信の問題を解決するために常にサーモスタットを電気的に再起動しません。Modbusデバイスは理由なしで通信を停止します

は、ここに私のコードです:

import os 
import sys 
import sqlite3 
import time 
import datetime 
import minimalmodbus 
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True 

PORT_NAME   = '/com5' 
SLAVE1_ADDRESS  = 1 
SLAVE2_ADDRESS  = 2 
SLAVE3_ADDRESS  = 3 
BAUDRATE   = 9600 # baud (pretty much bits/s). Use 2400 or 38400 bits/s. 
TIMEOUT    = 0.4 # seconds. At least 0.2 seconds required for 2400 bits/s. 
MODE    = minimalmodbus.MODE_RTU 

sqlite_file = 'ModbusTable.db' 

instrument1 = minimalmodbus.Instrument(PORT_NAME, SLAVE1_ADDRESS, MODE) 
instrument1.serial.baudrate = BAUDRATE 
instrument1.serial.timeout = TIMEOUT 
instrument1.debug = False 
instrument1.precalculate_read_size = True 

instrument2 = minimalmodbus.Instrument(PORT_NAME, SLAVE2_ADDRESS, MODE) 
instrument2.serial.baudrate = BAUDRATE 
instrument2.serial.timeout = TIMEOUT 
instrument2.debug = False 
instrument2.precalculate_read_size = True 

instrument3 = minimalmodbus.Instrument(PORT_NAME, SLAVE3_ADDRESS, MODE) 
instrument3.serial.baudrate = BAUDRATE 
instrument3.serial.timeout = TIMEOUT 
instrument3.debug = False 
instrument3.precalculate_read_size = True 

print ('Okuyor') 


while 1: 

    # Connecting to the database file 
    conn = sqlite3.connect(sqlite_file) 
    c = conn.cursor() 

    try: 
     values1 = instrument1.read_registers(40005, 2) 
    except IOError: 
     print ('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())+"Failed to read from instrument1") 

    # C) Updates the pre-existing entry    
    c.execute("""UPDATE ModbusData SET SetPoint = ? ,ActualTemp = ? WHERE ID= ? """, 
     (values1[0],values1[1],1)) 

    time.sleep(0.5) 

    try: 
     values2 = instrument2.read_registers(40005, 2) 
    except IOError: 
     print ('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())+"Failed to read from instrument2") 

    # C) Updates the pre-existing entry    
    c.execute("""UPDATE ModbusData SET SetPoint = ? ,ActualTemp = ? WHERE ID= ? """, 
     (values2[0],values2[1],2)) 

    time.sleep(0.5) 

    try: 
     values3 = instrument3.read_registers(40005, 2) 
    except IOError: 
     print ('Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())+"Failed to read from instrument3") 

    # C) Updates the pre-existing entry    
    c.execute("""UPDATE ModbusData SET SetPoint = ? ,ActualTemp = ? WHERE ID= ? """, 
     (values3[0],values3[1],3)) 

    time.sleep(0.5) 

    # Committing changes and closing the connection to the database file 
    conn.commit() 
    conn.close() 

そして、ここではサーモスタットが実行する方法である:あなたがあなたのアイデアを思い付くかどう

enter image description here

だから私はそんなに感謝します。

+0

あなたは言う:「私はシリアルポートアナライザを使用して何が起こっているかを見ました」。アナライザーで得られた結果のコピーを提供していただけますか? –

答えて

1

あなたのスクリーンショットの外観によって、私はあなたがサーモスタットの返信に十分に長く待たずにいると思います。 最初のリクエスト:設定した時間枠内に「instrument1」からの返信が届きません。したがって、あなたのプログラムは "instrument2"へのリクエストを送信しますが、 "instrument1"に対する遅れた応答を受け取ります。あなたのログの残りの部分はすべてに関するものです:1つの要求は、前の要求からの応答を受け取ります。

+0

その後、私は何時間も待っていますか? –

関連する問題