センサーを読むためにModbusクライアントを作成しています。 Windowsで複数の転送速度で正常に動作するコードがあります。ただし、Linuxで実行すると、転送速度が正しくありません。私はpymodbus==3.1.0
。
最小限の作業例を作成しましたが、転送速度が正しく設定されました。このコードとデバイスコードの唯一の違いは、デバイスをGuiProcess
選択できるpython tkiner guiを実行することです。
from pymodbus.pdu import ModbusRequest
from pymodbus.client import ModbusSerialClient
from pymodbus.transaction import ModbusRtuFramer
from pymodbus.exceptions import ModbusIOException
import time
import multiprocessing
MODUBS_REGISTER_READ_BLOCK = 100
# Communication process
def COMProcess():
client = ModbusSerialClient(
method = 'rtu'
,port= "/dev/ttyS0"
,baudrate=19200
,parity = 'N'
,stopbits=1
,bytesize=8
,timeout=0.1
,RetryOnEmpty = True
,RetryOnInvalid = True
)
connection = client.connect()
time.sleep(2)
while(1):
rr = client.read_holding_registers(0 ,MODUBS_REGISTER_READ_BLOCK,slave=0x12)
time.sleep(1)
client.close()
# Communication process
def GuiProcess():
while(1):
time.sleep(1)
# In the real scenario a tkinter gui is running here
print("elapsed 1 sec")
# Start multiple thread, one for GUI and another for COM
p1 = multiprocessing.Process(target= COMProcess )
p2 = multiprocessing.Process(target= GuiProcess )
p1.start()
p2.start()
p1.join()
p2.join()
実際のデバイスからクライアント情報を出力してみると正しく設定されているようです。ただし、メッセージは物理的に9600ボード(オシロスコープで測定)で送信されます。
ModbusSerialClient(<pymodbus.framer.rtu_framer.ModbusRtuFramer object at 0x7fc3749c6f20> baud[19200])
pymodbus
/dev/ttyS0
シリアルクライアントとシリアルクライアントの間でこの種のソートエラーが発生する可能性がある原因と、特定の転送速度を強制する方法についてのアイデアはありますか?