我有一个使用半双工 RS 485 通信(2 条双绞线)连接的设置
- 一个使用 minimummodbus 运行 python 脚本的 Master RPi
- 一个 arduino ONU 作为 1 号从机,带有一些代码(它只发送一些 int)
- 一个 arduino MEGA 作为 2 号从机,带有一些代码(它只发送一些与 uno 不同的 int)
以下是代码:
python中的大师:
import minimalmodbus
from datetime import datetime
import time
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 2)
#'/dev/serial0' ou '/dev/ttyUSB0'
instrument.serial.baudrate = 2400
instrument.serial.bytesize = 8
instrument.serial.parity = minimalmodbus.serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout = 10
instrument.mode = minimalmodbus.MODE_RTU
instrument1 = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
#'/dev/serial0' ou '/dev/ttyUSB0'
instrument1.serial.baudrate = 2400
instrument1.serial.bytesize = 8
instrument1.serial.parity = minimalmodbus.serial.PARITY_NONE
instrument1.serial.stopbits = 1
instrument1.serial.timeout = 10
instrument1.mode = minimalmodbus.MODE_RTU
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL = True
while(1):
try:
val = instrument.read_registers(0,6)
# Registernumber, number of decimals
print val
except IOError:
error_msg = "Failed to read from slave 2"
error_time = datetime.now()
print "IO Error Time",error_time.isoformat(),error_msg
except ValueError:
error_msg = "Failed to read CRC"
error_time = datetime.now()
print "Value Error Time",error_time.isoformat(),error_msg
time.sleep(0.1)
try :
val1 = instrument1.read_registers(0,6)
print val1
except IOError:
error_msg = "Failed to read from slave 1"
error_time = datetime.now()
print "IO Error Time",error_time.isoformat(),error_msg
except ValueError:
error_msg = "Failed to read CRC"
error_time = datetime.now()
print "Value Error Time",error_time.isoformat(),error_msg
time.sleep(0.1)
ONU从机:
#include <ModbusRtu.h>
#define NB_SLAVE 1
uint16_t au16data[6] = {};
Modbus slave(NB_SLAVE,Serial,4); // num du slave, port, num pin pour aiguillage half-duplex
void setup() {
Serial.begin( 2400 ); // baud-rate at 19200
slave.start();
}
void loop() {
au16data[0]= 111;
au16data[1]=250;
au16data[2]=100;
au16data[3]=50;
au16data[4]=50;
au16data[5]=6110;
slave.poll( au16data, 6 );
delay(2000);
}
超级奴隶:
#include <ModbusRtu.h>
#define NB_SLAVE 2
uint16_t au16data[6] = {};
Modbus slave(NB_SLAVE,Serial,4); // num du slave, port, num pin pour aiguillage half-duplex
void setup() {
Serial.begin( 2400 ); // baud-rate at 19200
slave.start();
}
void loop() {
au16data[0]= 222;
au16data[1]=250;
au16data[2]=100;
au16data[3]=50;
au16data[4]=50;
au16data[5]=6110;
slave.poll( au16data, 6 );
delay(2000);
}
所以你知道,我尝试了更快的波特率,但选择了更慢的速度来更快地访问成功的项目......不幸的是,它没有按计划工作。
这是问题所在,当我从主机端运行 python 脚本时,它会从其中一个从属设备读取数组,然后另一个总是会导致:
IO Error Time 2021-10-20T17:59:40.487127 Failed to read from slave 2
然后,当一切仍在运行时,我断开工作的从站,另一个开始通信。如果我重新连接断开的一个,它将无法通信(因为另一个正在通信):
IO Error Time 2021-10-20T18:00:27.553327 Failed to read from slave 1
换句话说,它是一个或另一个有效。如果我想切换正在工作的那个,我必须拔掉正在工作的那个......
我确信这是一个愚蠢的错误,但我没有看到它......我真的希望你们中的一些人能够指导我解决这个问题。
提前致谢!