I
I
Ivan Ivanov2021-04-05 21:43:17
Arduino
Ivan Ivanov, 2021-04-05 21:43:17

Arduino (slave) is not polled when working via the RS-485 protocol, what could be the error?

PC - master, Arduino mega slave. The PC has Simple Scada to display the status of the devices. communication with the Arduino is carried out via the RS-485 protocol using the Insat OPC server.

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

/* PINS
Add more registers if needed
Digital input pins 2,3,4,5,6,7
Digital output pins 8,9,12,13
Analog output pins 10,11 (PWM)
Analog input pins 0,1,2,3,4,5
*/
#define DIR 10 // переключатель прием\передача


modbusDevice regBank;
modbusSlave slave;



void setup()
{   
  regBank.setId(1); ///Set Slave ID


  regBank.add(10003);//№1-предавария
  regBank.add(10004);//№2-авария
  regBank.add(10005);//№2-предавария
  regBank.add(10006);//№3-авария
  regBank.add(10007);//№3-предавария
  regBank.add(10008);//№4-авария
  regBank.add(10009);//№4-предавария-К
  regBank.add(10010);//№1-авария_Ввел доп.регистр 10,т.к. регистр 2 подвисал Simple Scada 
  
// Add Digital Output registers = Modbus Memory Area (COILS)
//Управление нагрузкой (цифровые выходы)
  regBank.add(12);//Вкл нагрузки на D12
  regBank.add(13);//Вкл нагрузки на D13

  slave._device = &regBank;  
  slave.setBaud(9600);  
  // slave.setBaud(19200); 
  
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  pinMode(8,INPUT);
  pinMode(9,INPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(DIR, HIGH); // включаем передачу_всегда начинаем работать с передачи
}
void loop(){
//Контроль за устройствами (цифровые входы)
  while(1){   
  //Digital Input
    byte DI2 = digitalRead(2);  //№1-авария
    if (DI2 >= 1)regBank.set(10010,1);
    if (DI2 <= 0)regBank.set(10010,0);
    byte DI3 = digitalRead(3); //№1-предавария
    if (DI3 >= 1)regBank.set(10003,1);
    if (DI3 <= 0)regBank.set(10003,0);
    byte DI4 = digitalRead(4);//№2-авария
    if (DI4 >= 1)regBank.set(10004,1);
    if (DI4 <= 0)regBank.set(10004,0);
    byte DI5 = digitalRead(5);//№2-предавария
    if (DI5 >= 1)regBank.set(10005,1);
    if (DI5 <= 0)regBank.set(10005,0);
    byte DI6 = digitalRead(6);//№3-авария
    if (DI6 >= 1)regBank.set(10006,1);
    if (DI6 <= 0)regBank.set(10006,0);
    byte DI7 = digitalRead(7);//№3-предавария
    if (DI7 >= 1)regBank.set(10007,1);
    if (DI7 <= 0)regBank.set(10007,0);
    byte DI8 = digitalRead(8);//№4-авария
    if (DI8 >= 1)regBank.set(10008,1);
    if (DI8 <= 0)regBank.set(10008,0);
    byte DI9 = digitalRead(9);//№4-предавария-К
    if (DI9 >= 1)regBank.set(10009,1);
    if (DI9 <= 0)regBank.set(10009,0);
                                
  //Digital output
  //Управление нагрузкой   (цифровые выходы)
   // int DO11 = regBank.get(11);
    int DO12 = regBank.get(12);
      //if (DO12 >= 1)regBank.set(10002,1);
      if (DO12 >= 1)regBank.set(10003,1);
      if (DO12 >= 1)regBank.set(10004,1);
      if (DO12 >= 1)regBank.set(10005,1);
      if (DO12 >= 1)regBank.set(10006,1);
      if (DO12 >= 1)regBank.set(10007,1);
      if (DO12 >= 1)regBank.set(10008,1);
      if (DO12 >= 1)regBank.set(10009,1); 
      if (DO12 >= 1)regBank.set(10010,1); //Ввел доп.регистр 10,т.к. регистр 2 подвисал Simple Scada 
    int DO13 = regBank.get(13);
      if (DO13 <= 0 && digitalRead(13) == HIGH)digitalWrite(13,LOW);
      if (DO13 >= 1 && digitalRead(13) == LOW)digitalWrite(13,HIGH);
  
  slave.run();  
  }
}

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question