Modbus и два сериал порта

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Написал короткую программульку по работе нескольких устройств через RS485. При отладке, по отдельности, все работает хорошо, а в общем - нет.  Не хотят работать 54 и 68 строки вместе. Любую из них отключаю, и все работает, как надо, а вместе - не хотят. Хотя бы направление - в какую сторону думать, чтобы побороть сие несовместимоть.

#include <ModbusMaster.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 5);

 //**************************************************************
uint8_t RegWrite(int adress, uint16_t StartReg, uint8_t qty, float fl)
  {
    if(qty == 2){
      Conv.f = fl;
      node.setTransmitBuffer(0x0,Conv.u[1]);
      node.setTransmitBuffer(0x1,Conv.u[0]);
    }
    else {
      node.setTransmitBuffer(0x0,fl);
      node.setTransmitBuffer(0x1,0);
    }
    node.SlaveAddr(adress);
    transmiss ();
    float err=node.writeMultipleRegisters(StartReg,qty);
    delay(200); 
    
    Serial.print("Error  "); Serial.println(err);
    node.clearTransmitBuffer();
    return (err);
  }
  
 //**************************************************************
 float RegRead( int adress, uint16_t StartReg, uint8_t qty)
 {
  node.SlaveAddr(adress);
  transmiss();
  node.clearTransmitBuffer();
  uint8_t buf = node.readInputRegisters(StartReg, qty);
  delay(200);

  if(qty == 2){
    Conv.u[1] = node.getResponseBuffer(1);
    Conv.u[0] = node.getResponseBuffer(0);
    }
  else  {
    Conv.f = node.getResponseBuffer(0);  
    }
    
  Serial.print("Adres: "); Serial.print(StartReg,HEX);
  Serial.print(" =|= Value: "); Serial.println(Conv.f);
  return (Conv.f);
 }
 //**************************************************************

 
 void loop()
{
   while (Serial.available() > 0) {
      inChar = Serial.read();
       delay(4);
      if(isDigit(inChar) || isPunct(inChar))     val += (char)inChar;
      if(isAlpha(inChar) )  comand = (char)inChar;
      if(isPunct(inChar)) inString += (char)inChar;
   
      if (inChar == '\n' && comand == "a" && val.toInt() < 8) {
        RegWrite(addrs[Status], regis[Status], qty[Status], val.toFloat());
        comand = val = inString = ""; 
    }}
   
  addr++;  if(addr > 9)addr = 1;
  
  // Read function 4
  datas = RegRead(addrs[addr], regis[addr], qty[addr]);
  
  // function 10
  if(result =! 0)  RegWrite(addrs[cmi], regis[cmi], qty[cmi], datas);
}

 

Densl
Offline
Зарегистрирован: 28.11.2018

Что значит вместе не хотят работать? Не принимает одна из них, или зависает МК?

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Не зависает, но перестает читать из Serial порта, шлет в него обрывки фраз, а  софтовый порт перестает совсем работать (молчит как рыба в воде).

Densl
Offline
Зарегистрирован: 28.11.2018

У меня есть предположения, но я честно говоря не понимаю о чем вы.Что делает функция RegRead и regWrite, почему в представленном коде создаётся объект softwareSerial но не используется ни где)

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Извините упустил.Я не всю программу предоставил, а только те функции которые глючат.

// Modbus communication runs at 9600 baud
  Serial.begin(9600); mySerial.begin(9600);

// Modbus slave ID 1
  node.begin(16, mySerial);
  transmiss();

Зачем форум не нужным засорять.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

 RegRead читает регистр на внешним устройстве по пртоколу Modbus RTU

regWrite пишет в регистр внешнего устройства по пртоколу Modbus RTU.

ModbusMaster node;

 

nik182
Offline
Зарегистрирован: 04.05.2015

По Вашим незасоряющим кускам нельзя ничего сказать. Уже 5 сообщений, а до сих пор не ясно как всё взаимодействует. Приведите программу полностью, что бы можно было загрузить в МС и посмотреть что и как.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

это тоже не вся программа но это то на чем я пытаюсь вылечить данный баг.

Фаил Main.ino

#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include "function.h"

//Схема: 
// * RX - RO - цифровой вывод 10(соединить с TX другого устройства)
// * TX - DI - цифровой вывод 11(cоединить с RX другого устройства)
SoftwareSerial mySerial(2, 5);

//                 сми2   вкл/выкл  Т.реак  Т.колн   Уров
uint8_t addrs[]  = {100,8,8,8,8,8,8,8,8,8};
uint8_t qty[]    = {2,2,2,2,2,2,2,1,1,1};
uint16_t regis[] = {27,0xA000,0xA002,0xA004,0xA006,0xA008,
                              0xA00A,0xA00B,0xA00C,0xa400};
uint8_t ID = 1;
String comand = "c", val, inString;
char inChar;
const byte Status = 9, cmi = 0;
bool flag;

void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

// Modbus communication runs at 9600 baud
  Serial.begin(9600); mySerial.begin(9600);

// Modbus slave ID 1
  node.begin(16, mySerial);
  transmiss();
}

void loop()
{
   while (Serial.available() > 0) {
      inChar = Serial.read(); delay(200);
      
      if(isDigit(inChar) || isPunct(inChar))val += (char)inChar;
      if(isAlpha(inChar)) comand = (char)inChar;
      if(isPunct(inChar)) inString += (char)inChar;
   
      if (inChar == '\n' && comand == "a" && val.toInt() < 8) {
        RegWrite(addrs[Status], regis[Status], qty[Status], val.toFloat());
        comand = val = inString = ""; 

    }}
   
  ID++;  if(ID > 9)ID = 1;
  
  // Read function 4
  datas = RegRead(addrs[ID], regis[ID], qty[ID]);
  
  // function 10
  if(result =! 0)  RegWrite(addrs[cmi], regis[cmi], qty[cmi], datas);
}

файл function.h

#define MAX485_DE      3
#define MAX485_RE_NEG  4

void preTransmission(){
    digitalWrite(MAX485_RE_NEG, 1);
    digitalWrite(MAX485_DE, 1);}

void postTransmission(){
    digitalWrite(MAX485_RE_NEG, 0);
    digitalWrite(MAX485_DE, 0);}

 //**************************************************************
    //Для конвертации
union
{
  uint16_t u[2];
  float f;
}Conv;

 //**************************************************************
// instantiate ModbusMaster object
ModbusMaster node;
uint8_t result;
uint16_t data[6];
float datas;

 //**************************************************************
  void transmiss (void)
 {
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
 }
 //**************************************************************
uint8_t RegWrite(int adress, uint16_t StartReg, uint8_t qty, float fl)
  {
    if(qty == 2){
      Conv.f = fl;
      node.setTransmitBuffer(0x0,Conv.u[1]);
      node.setTransmitBuffer(0x1,Conv.u[0]);
    }
    else {
      node.setTransmitBuffer(0x0,fl);
      node.setTransmitBuffer(0x1,0);
    }
    node.SlaveAddr(adress);
    transmiss ();
    float err=node.writeMultipleRegisters(StartReg,qty);
    delay(200); 
    
    Serial.print("Error  "); Serial.println(err);
    node.clearTransmitBuffer();
    return (err);
  }
  
 //**************************************************************
 float RegRead( int adress, uint16_t StartReg, uint8_t qty)
 {
  node.SlaveAddr(adress);
  transmiss();
  node.clearTransmitBuffer();
  uint8_t buf = node.readInputRegisters(StartReg, qty);
  delay(200);

  if(qty == 2){
    Conv.u[1] = node.getResponseBuffer(1);
    Conv.u[0] = node.getResponseBuffer(0);
    }
  else  {
    Conv.f = node.getResponseBuffer(0);  
    }
    
  Serial.print("Adres: "); Serial.print(StartReg,HEX);
  Serial.print(" =|= Value: "); Serial.println(Conv.f);
  return (Conv.f);
 }
 //**************************************************************

Выдрал из основной проги и пытаюсь на этом баг победить. Не уживаются в даном случае строка 40 и 55.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

nik182 пишет:
По Вашим незасоряющим кускам нельзя ничего сказать. Уже 5 сообщений, а до сих пор не ясно как всё взаимодействует. Приведите программу полностью, что бы можно было загрузить в МС и посмотреть что и как.

По моим кускам было в полне понятно что я рабораюю с двумя портами и что они гдето глючат между собой и если у вас  небыло такого глюка и вы не знаете ( я не знаю потому и спрашиваю) всю подноготню работы двух портов то наврятли и поможете. А тот кто знает ему и первого топика будет достаточно.

Densl
Offline
Зарегистрирован: 28.11.2018

Я с модбас не работал, поэтому пас.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

На Modbus не смотрите там все правильно приходит и уходит. Глюк в связки двух портов а как они пересекаться могут не пойму.

Densl
Offline
Зарегистрирован: 28.11.2018

А у вас какой контроллер?

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

нано 168