私の会社は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()
そして、ここではサーモスタットが実行する方法である:あなたがあなたのアイデアを思い付くかどう
はだから私はそんなに感謝します。
あなたは言う:「私はシリアルポートアナライザを使用して何が起こっているかを見ました」。アナライザーで得られた結果のコピーを提供していただけますか? –