0

我有一个使用半双工 RS 485 通信(2 条双绞线)连接的设置

  1. 一个使用 minimummodbus 运行 python 脚本的 Master RPi
  2. 一个 arduino ONU 作为 1 号从机,带有一些代码(它只发送一些 int)
  3. 一个 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

换句话说,它是一个或另一个有效。如果我想切换正在工作的那个,我必须拔掉正在工作的那个......

我确信这是一个愚蠢的错误,但我没有看到它......我真的希望你们中的一些人能够指导我解决这个问题。

提前致谢!

4

0 回答 0