Подключение esp32 к OPC серверу

Прошу прощения за неправильное формулирование вопроса в прошлой теме, ответили, что никто не будет разбираться с FLprog, программа позволяет создать графически схему и пишет код, который подключает контроллер к OPC серверу.

Дублирую ниже свою прошлую тему.
Всем привет, столкнулся с подключением esp32 к Trace mode. При подключении Arduino uno всё подключалось великолепно, когда перешел на esp, OPC сервер перестал получать данные с контроллера.

На моменте, где сервер запускается, у меня перманентно остаётся 0. Также код.

int _modbusSlaveDataTable_4[2];
int _modbusSlaveAddresTable_4[2] = {0, 1};
byte _modbusSlaveBufferSize = 0;
byte _modbusSlaveLastRec = 0;
long _modbusSlaveTime;
byte _modbusSlaveBuffer[64];
const unsigned char _modbusSlave_fctsupported[] = {3, 6, 16};
float _gtv1;
int _ultrasonic1O = 0;
unsigned long _ultrasonic1P = 0UL;

void setup()
{

Serial.begin(9600, SERIAL_8N1);
pinMode(14, OUTPUT);
pinMode(27, INPUT);

}
void loop()
{

float _tempVariable_float;
_modbusSlavePoll();





//Плата:1
if (abs((millis() - _ultrasonic1P))>100) {
digitalWrite(14, HIGH);
delayMicroseconds(10);
digitalWrite(14, LOW);
int _ultrasonicTemp=(pulseIn(27, HIGH))/58;
if( _ultrasonicTemp<200) {_ultrasonic1O=_ultrasonicTemp;}
_ultrasonic1P=millis();}
_gtv1 = (_ultrasonic1O);
_gtv1 = (float(_readFloatFromModbus(_modbusSlaveDataTable_4[0], _modbusSlaveDataTable_4[1], 1)));






}

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
float _readFloatFromModbus(uint16_t w1,  uint16_t w2, byte order)
{
 byte b[4];
  byte orderArray[4] ;
  _modbusOrderAray(orderArray,  order);
  for (byte i = 0; i < 8; i++) bitWrite(b[orderArray[0]], i, bitRead(w2, i));
  for (byte i = 0; i < 8; i++) bitWrite(b[orderArray[1]], i, bitRead(w2, (i + 8)));
  for (byte i = 0; i < 8; i++) bitWrite(b[orderArray[2]], i, bitRead(w1, i));
  for (byte i = 0; i < 8; i++) bitWrite(b[orderArray[3]], i, bitRead(w1, (i + 8)));
return  *((float *)&b);
}
int modbusCalcCRC(byte length, byte bufferArray[])
{
  unsigned int temp, temp2, flag;
  temp = 0xFFFF;
  for (unsigned char i = 0; i < length; i++) {
    temp = temp ^ bufferArray[i];
    for (unsigned char j = 1; j <= 8; j++) {
      flag = temp & 0x0001;
      temp >>= 1;
      if (flag)   temp ^= 0xA001;
    }
  }
  temp2 = temp >> 8;
  temp = (temp << 8) | temp2;
  temp &= 0xFFFF;
  return temp;
}
void _modbusOrderAray(byte orderArray[], byte order)
{
  if (order == 1) {
    orderArray[0] = 0;
    orderArray[1] = 1;
    orderArray[2] = 2;
    orderArray[3] = 3;
  }
 if (order == 2) {
    orderArray[0] = 2;
    orderArray[1] = 3;
    orderArray[2] = 0;
    orderArray[3] = 1;
  }
  if (order == 3) {
    orderArray[0] = 1;
    orderArray[1] = 0;
    orderArray[2] = 3;
    orderArray[3] = 2;
  }
  if (order == 4) {
    orderArray[0] = 3;
    orderArray[1] = 2;
    orderArray[2] = 1;
    orderArray[3] = 0;
  } 
}
byte _modbusSlavePoll()
{
byte  avalibleBytes = Serial.available();
if (avalibleBytes == 0) return 0;
if (avalibleBytes != _modbusSlaveLastRec) {
    _modbusSlaveLastRec = avalibleBytes;
    _modbusSlaveTime = millis();
    return 0;
  }
  if (!(_isTimer(_modbusSlaveTime, 5))) return 0;
 _modbusSlaveLastRec = 0;
  byte state = _modbusGetSlaveRxBuffer();
  if (state < 7) {
    return state;
  }
if ((_modbusSlaveBuffer[0] != 1) && (_modbusSlaveBuffer[0] != 0)) return 0;
  byte exception =  _modbusValidateRequest();
  if (exception > 0) {

    if (exception != 255) { _modbusSlaveBuildException( exception );
      _modbusSlaveSendTxBuffer();
    }  
    return exception;
  }

switch ( _modbusSlaveBuffer[1] ) {
 case 3 :
      return process_modbus_FC3(4);
      break;
  case 6 :
      return process_modbus_FC6();
      break;
 case 16 :
      return process_modbus_FC16();
      break;
default:
      break;
  }
  return 25;
}
byte _modbusValidateRequest() {
int msgCRC =
    ((_modbusSlaveBuffer[_modbusSlaveBufferSize - 2] << 8)
     | _modbusSlaveBuffer[_modbusSlaveBufferSize - 1]);
  if ( modbusCalcCRC( _modbusSlaveBufferSize - 2, _modbusSlaveBuffer ) != msgCRC ) { return 255;}
  boolean isSupported = false;
  for (uint8_t i = 0; i < sizeof( _modbusSlave_fctsupported ); i++) {
    if (_modbusSlave_fctsupported[i] == _modbusSlaveBuffer[1]) {
      isSupported = 1;
      break;
    }
  }
 if (!isSupported) { return 1;}
int intRegs = 0;
  byte byteRegs;
    switch ( _modbusSlaveBuffer[1] ) {
case 6 :
if(!(checkModbusAddres(( word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3]) ),4))){return 2;}     
        break;
case 3 :
case 16 :
 if(!(checkModbusRange((word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3])), (word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5])),4))){return 2;}    
 break;
}
  return 0; // OK, no exception code thrown
}
bool checkModbusAddres(int addr, byte table)
{
return (!(( modbusSlaveIndexForAddres(addr,table)) == -1));
}
int modbusSlaveIndexForAddres(int addr, byte table)
{
int tableSize = 0;
switch (table) {
case 4:
tableSize = 2;
break;
}
for (byte i = 0; i < tableSize; i++) {if((modbusSlaveAddresFromIndex(i,table)) == addr){return  i;}}
return -1;
}
int modbusSlaveAddresFromIndex(byte index, byte table)
{
switch (table) {
case 4:
return _modbusSlaveAddresTable_4[index];
break;
}
return -1;
}
bool checkModbusRange(int startAddr, int addrNumber, byte table)
{
for (int i=0; i < addrNumber; i++) {if(!(checkModbusAddres((startAddr+i),table))){return false;}}
return true;
}
void  _modbusSlaveBuildException( byte exception ) {
  byte func = _modbusSlaveBuffer[1];  
  _modbusSlaveBuffer[0] = 1;
  _modbusSlaveBuffer[1] = func + 0x80;
  _modbusSlaveBuffer[ 2 ] = exception;
  _modbusSlaveBufferSize = 3;}
void _modbusSlaveSendTxBuffer()
{
 if(_modbusSlaveBuffer[0] == 0) {return;}
byte i = 0;
  int crc = modbusCalcCRC( _modbusSlaveBufferSize,_modbusSlaveBuffer );
  _modbusSlaveBuffer[ _modbusSlaveBufferSize ] = crc >> 8;
  _modbusSlaveBufferSize++;
  _modbusSlaveBuffer[ _modbusSlaveBufferSize ] = crc & 0x00ff;
  _modbusSlaveBufferSize++;
Serial.write( _modbusSlaveBuffer, _modbusSlaveBufferSize );
  delay (5);
Serial.flush();
  _modbusSlaveBufferSize = 0;
}
byte _modbusGetSlaveRxBuffer()
{
  boolean bBuffOverflow = false;
 _modbusSlaveBufferSize = 0;
  while (Serial.available() ) {
    _modbusSlaveBuffer[ _modbusSlaveBufferSize ] = Serial.read();
    _modbusSlaveBufferSize ++;
    if (_modbusSlaveBufferSize >= 64) bBuffOverflow = true;
  }
  if (bBuffOverflow) {return -3; }
  return _modbusSlaveBufferSize;
}
byte process_modbus_FC3(byte table)
{
  int startAddr = word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3] );
  int byteRegsno = word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5] );
  int i;
  int value;
byte index;
  _modbusSlaveBuffer[ 2 ]  = byteRegsno * 2;
  _modbusSlaveBufferSize = 3;
  for (i = startAddr; i < startAddr + byteRegsno; i++) {
index = modbusSlaveIndexForAddres(i, table);
if (table == 4) {value = _modbusSlaveDataTable_4[index]; } 
  _modbusSlaveBuffer[ _modbusSlaveBufferSize ] = highByte(value);
    _modbusSlaveBufferSize++;
    _modbusSlaveBuffer[ _modbusSlaveBufferSize ] = lowByte(value);
    _modbusSlaveBufferSize++;
  }
   _modbusSlaveSendTxBuffer();
  return _modbusSlaveBufferSize + 2;
}
byte process_modbus_FC6()
{
 int addres = word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3] );
 int index;
index = modbusSlaveIndexForAddres(addres, 4);
_modbusSlaveDataTable_4[index] =word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5] );
  _modbusSlaveBufferSize = 6;
  _modbusSlaveSendTxBuffer();
  return _modbusSlaveBufferSize + 2;
}
byte process_modbus_FC16(  ) 
{
byte func = _modbusSlaveBuffer[1];
  int startAddr = _modbusSlaveBuffer[2] << 8 | _modbusSlaveBuffer[3];
  int byteRegsno = _modbusSlaveBuffer[4] << 8 | _modbusSlaveBuffer[5];
  int i;
 int index;
  _modbusSlaveBuffer[4]   = 0;
  _modbusSlaveBuffer[5]   = byteRegsno;
  _modbusSlaveBufferSize = 6;
  for (i = 0; i < byteRegsno; i++) {
index = modbusSlaveIndexForAddres((startAddr+i), 4);
_modbusSlaveDataTable_4[index] =word( _modbusSlaveBuffer[ 7 + i * 2 ],  _modbusSlaveBuffer[8 + i * 2 ]);
  }
  _modbusSlaveSendTxBuffer();
  return _modbusSlaveBufferSize +2;
}

И поэтому ты решил создать ЕЩЕ одну ТАКУЮ ЖЕ тему? Что с тобой не так?

так я не создавал вопрос про FLprog, есть отдельно код, вопрос вообще не по нему

Ну тогда жди и БОЛЬШЕ новых тем не создавай.

Слегка не разобрался с интерфейсом форума, увидел под твоим ответом кнопку Вопрос решён, решил, что моя тема была закрыта, прости

А я вапще ни одного вопроса в теме не вижу. Только информация, доведенная до нашего сведения.

2 лайка

будем вежливы и просим ТС держать нас в курсе.

2 лайка

Мы рады за неё.

А во фразе:

Вам что-то непонятно?

Зачем Вы опять выложили код, любезно “написанный” FLprog’ом?

1 лайк

Нет, Евгений Петрович, в первой теме кода не было - за исправление ошибки ТС тут плюс. Но суть от этого не меняется… )

Возможно, я на ссылки Я-диска не хожу (если самому край-горла не надо), т.к. задолбался его капчи вводить. Оно мне нужно? И какое ему собачье дело робот я или нет? Вот правда, задолбал.

На удивление, у меня без капчи открылось в той теме, поэтому я и посмотрел.

Очевидно, у тебя свой яндекс диск. У меня аналогично без каптч.

Да, но задалбливать капчей он не перестает. Сегодня было исключение из правил.
Причем капчу требует ввести если проходишь по ссылке с форума (там перенаправление идет через out.arduino.ru (или как-то так)). А вот если ссылку скопировать (когда есть такая возможность) и вставить в браузер - то капчу не требует ввести.

ЗЫ: Кстати, @Alexander , может быть это из-за отсутствия ssl ? Адрес такой: http ://out.arduino.ru/?redirect= .

Хм…
Поменял на https

Если из-за бугра заходишь, то всегда ОК. Ну а если из дома - по разному. Поэтому не думаю, что это решит проблемы.

Проверка (ссылка на архив с Яндекс диска):

Сцуко, запросило капчу. Значит «дело было не в бобине»…

Птичка “Я не робот” это же не каптча? Если что - я из далёка.

А Вы нажмите, Вас заставят дебильный фигурки нумеровать