센서를 읽기 위해 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
직렬 클라이언트와 직렬 클라이언트 사이에 이러한 유형의 정렬 오류가 발생할 수 있는 원인 과 특정 전송 속도를 강제하는 방법 에 대한 아이디어가 있습니까 ?