Подключение к SCADA через Arduino OPC (usb-serial)

Givizub
Offline
Зарегистрирован: 01.01.2017

Здраавствуйте, пытаюсь настроить работу со SCADA SimpLight посредством Arduino OPC по USB. Удалось получить данные от датчика DS18B20 и вывести переменную в OPC. Но в самой SCADA показания "прыгают".
Например, время опроса 1 с. В мониторе последовательного порта получаю значение 12.78. При этом в SCADA наблюдаю изменение показания примерно в таком порядке 21.78; 78; 0; 1,78; 21,7..
Где может скрываться проблема? Код для работы c датчиком сгенерирован FLProg, потому несколько нечитабельный.

#include <OneWire.h>
#include <OPC.h>
#include <Bridge.h>
#include <SPI.h>

OPCSerial aOPCSerial;

byte _d18x2x1Addr[8] = {0x28, 0xFF, 0x54, 0x1E, 0x88, 0x16, 0x3, 0xC};

OneWire  _ow2(2);
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
unsigned int raw;
float temp1;

float item_temperature1(const char *itemID, const opcOperation opcOP, const float value) {
  temp1 = _d18x2x1O;
  return  temp1;
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Start temperature measurement");

  aOPCSerial.setup();
  aOPCSerial.addItem("T1", opc_read, opc_float, item_temperature1);
}

void loop()
{
  aOPCSerial.processOPCCommands();
  Serial.println (_d18x2x1O);

  if (_isTimer(_d18x2x1Tti, 1000)) {
    _d18x2x1Tti = millis();
    _d18x2x1O =  _readDS18_ow2(_d18x2x1Addr, 0);
  }


}
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 _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
  return  (float)raw / 16.0;
}
float _readDS18_ow2(byte addr[8], byte type_s)
{ byte data[12];
  byte i;
  _ow2.reset();
  _ow2.select(addr);
  _ow2.write(0xBE);
  for ( i = 0; i < 9; i++) {
    data[i] = _ow2.read();
  }
  _ow2.reset();
  _ow2.select(addr);
  _ow2.write(0x44, 1);
  return _convertDS18x2xData(type_s, data);

}

 

 

aleexiy
aleexiy аватар
Offline
Зарегистрирован: 20.10.2017

Похожие картинки выдает SCADA SCADA24 или view24 http://view24.org .

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Что за функция item_temperature1? Объявлена с параметрами, вызывается без параметров.

Какого качество тэгов? Если не будет признака качества будет лажа всякая.

Пробуйте по частям, не температуру сразу выводить, а чтобы хоть константу нормально увидел opc. Попробуйте для интереса не float а целые передавать.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

И еще раз связь идкт через USB значит эта opc библиотека использует serial0 и вы его тоже используете... Это так для размышления.